[tbb] 28/64: Imported Upstream version 4.0+r233

Graham Inggs ginggs at moszumanska.debian.org
Mon Jul 3 12:27:53 UTC 2017


This is an automated email from the git hooks/post-receive script.

ginggs pushed a commit to branch master
in repository tbb.

commit b206109de0490b534304e87f3bdc5d9884e6279f
Author: Graham Inggs <ginggs at debian.org>
Date:   Mon Jul 3 14:13:46 2017 +0200

    Imported Upstream version 4.0+r233
---
 CHANGES                                            |   91 +-
 Makefile                                           |   14 +-
 build/Makefile.rml                                 |    4 +-
 build/Makefile.tbb                                 |    3 +-
 build/Makefile.tbbmalloc                           |   10 +-
 build/Makefile.tbbproxy                            |  116 +
 build/Makefile.test                                |   31 +-
 build/SunOS.suncc.inc                              |    7 +-
 build/big_iron.inc                                 |   74 +
 build/common_rules.inc                             |    2 +-
 build/generate_tbbvars.bat                         |   12 +-
 build/generate_tbbvars.sh                          |   12 +-
 build/index.html                                   |    7 +-
 build/linux.gcc.inc                                |    4 +-
 build/linux.icc.inc                                |    9 +-
 build/linux.inc                                    |    2 +-
 build/{linux.gcc.inc => linux.xl.inc}              |  100 +-
 build/macos.icc.inc                                |    3 +
 build/vsproject/index.html                         |    7 +-
 build/vsproject/tbb.vcproj                         |    4 +-
 build/vsproject/tbbmalloc.vcproj                   |    2 +-
 build/windows.gcc.inc                              |    2 +-
 build/windows.inc                                  |    7 +
 build/xbox360.cl.inc                               |    2 +-
 doc/Release_Notes.txt                              |   61 +-
 doc/html/a00001.html                               |    7 +-
 doc/html/a00002.html                               |    8 +-
 doc/html/a00003.html                               |    6 +-
 doc/html/a00004.html                               |   17 +-
 doc/html/a00005.html                               |   13 +-
 doc/html/a00006.html                               |   26 +-
 doc/html/a00007.html                               |   28 +-
 doc/html/a00008.html                               |   43 -
 doc/html/a00009.html                               |   22 +-
 doc/html/a00011.html                               |   15 +-
 doc/html/{a00014.html => a00012.html}              |    6 +-
 doc/html/a00013.html                               |   75 +-
 doc/html/a00015.html                               |   69 +-
 doc/html/{a00019.html => a00016.html}              |   24 +-
 doc/html/a00017.html                               |   16 +-
 doc/html/a00018.html                               |   33 +-
 doc/html/a00020.html                               |   54 -
 doc/html/{a00024.html => a00022.html}              |   48 +-
 doc/html/{a00025.html => a00023.html}              |   56 +-
 doc/html/a00025.html                               |   65 +-
 doc/html/a00027.html                               |   68 -
 doc/html/{a00032.html => a00031.html}              |  142 +-
 doc/html/{a00037.html => a00036.html}              |   70 +-
 doc/html/{a00040.html => a00039.html}              |    4 +-
 doc/html/a00041.html                               |   41 +
 doc/html/a00042.html                               |   17 +-
 doc/html/a00043.html                               |   25 +-
 doc/html/a00044.html                               |   25 +-
 doc/html/a00045.html                               |   43 -
 doc/html/a00047.html                               |   47 +
 doc/html/a00048.html                               |   25 +-
 doc/html/a00049.html                               |   21 +-
 doc/html/a00050.html                               |   16 +-
 doc/html/a00052.html                               |   40 +
 doc/html/a00053.html                               |   42 -
 doc/html/a00054.html                               |   29 +-
 doc/html/a00055.html                               |   89 -
 doc/html/a00057.html                               |   50 +
 doc/html/a00058.html                               |  112 +-
 doc/html/a00059.html                               |   93 -
 doc/html/a00060.html                               |  115 +-
 doc/html/a00061.html                               |   81 +-
 doc/html/a00062.html                               |   87 +
 doc/html/a00063.html                               |   55 +
 doc/html/a00065.html                               |   44 -
 doc/html/a00067.html                               |   48 -
 doc/html/a00068.html                               |   54 +
 doc/html/a00070.html                               |   43 +
 doc/html/{a00040.html => a00072.html}              |    5 +-
 doc/html/{a00078.html => a00074.html}              |   36 +-
 doc/html/{a00079.html => a00075.html}              |   16 +-
 doc/html/{a00080.html => a00076.html}              |   10 +-
 doc/html/{a00081.html => a00077.html}              |   14 +-
 doc/html/a00078.html                               |   23 +-
 doc/html/a00079.html                               |   17 +-
 doc/html/a00080.html                               |    8 +-
 doc/html/a00082.html                               |    7 +-
 doc/html/a00083.html                               |   11 +-
 doc/html/a00084.html                               |    9 +-
 doc/html/a00085.html                               |    5 +-
 doc/html/a00086.html                               |    8 +-
 doc/html/a00087.html                               |   12 +-
 doc/html/{a00088.html => a00089.html}              |   11 +-
 doc/html/a00090.html                               |   13 +-
 doc/html/{a00093.html => a00091.html}              |   46 +-
 doc/html/a00092.html                               |   34 +-
 doc/html/a00093.html                               |   36 +-
 doc/html/a00094.html                               |   31 +-
 doc/html/a00095.html                               |   23 +-
 doc/html/a00096.html                               |    9 +-
 doc/html/a00097.html                               |   17 +-
 doc/html/a00098.html                               |   15 +-
 doc/html/a00099.html                               |   16 +-
 doc/html/a00100.html                               |   23 +-
 doc/html/a00101.html                               |   15 +-
 doc/html/a00102.html                               |   21 +-
 doc/html/a00103.html                               |   19 +-
 doc/html/a00104.html                               |   14 +-
 doc/html/a00105.html                               |   30 +-
 doc/html/a00106.html                               |   39 -
 doc/html/a00107.html                               |   36 +-
 doc/html/a00109.html                               |    8 +-
 doc/html/a00111.html                               |   20 +-
 doc/html/a00112.html                               |   16 +-
 doc/html/a00113.html                               |   22 +-
 doc/html/a00114.html                               |   22 +-
 doc/html/a00116.html                               |    2 +-
 doc/html/a00117.html                               |   52 -
 doc/html/a00119.html                               |  117 +-
 doc/html/a00120.html                               |  113 +-
 doc/html/a00121.html                               |   18 +-
 doc/html/a00128.html                               |   20 +-
 doc/html/a00130.html                               |   44 +-
 doc/html/a00132.html                               |    8 +-
 doc/html/a00134.html                               |   26 +-
 doc/html/a00136.html                               |   10 +-
 doc/html/a00138.html                               |    6 +-
 doc/html/a00139.html                               |    4 +-
 doc/html/a00140.html                               |    4 +-
 doc/html/a00141.html                               |    4 +-
 doc/html/a00142.html                               |   14 +-
 doc/html/a00143.html                               |   26 +-
 doc/html/a00144.html                               |   28 +-
 doc/html/a00145.html                               |   12 +-
 doc/html/{a00146.html => a00150.html}              |   10 +-
 doc/html/{a00014.html => a00154.html}              |    6 +-
 doc/html/{a00014.html => a00155.html}              |    6 +-
 doc/html/{a00153.html => a00164.html}              |    4 +-
 doc/html/{a00159.html => a00168.html}              |    8 +-
 doc/html/{a00160.html => a00169.html}              |   20 +-
 doc/html/a00212.html                               |   59 -
 doc/html/a00213.html                               |   56 -
 doc/html/a00214.html                               |   83 -
 doc/html/a00215.html                               |   63 -
 doc/html/a00217.html                               |   56 -
 doc/html/a00218.html                               |   59 -
 doc/html/a00219.html                               |   64 -
 doc/html/a00220.html                               |   50 -
 doc/html/a00221.html                               |  224 --
 doc/html/a00222.html                               |   86 -
 doc/html/a00223.html                               |   93 -
 doc/html/a00224.html                               |   86 -
 doc/html/a00224.png                                |  Bin 891 -> 0 bytes
 doc/html/a00225.html                               |  407 +--
 doc/html/a00225.png                                |  Bin 1836 -> 674 bytes
 doc/html/a00226.html                               |   90 +-
 doc/html/a00226.png                                |  Bin 0 -> 671 bytes
 doc/html/a00227.html                               |   42 +-
 doc/html/a00228.html                               |  132 +-
 doc/html/a00228.png                                |  Bin 472 -> 0 bytes
 doc/html/a00229.html                               |   56 +-
 doc/html/a00230.html                               |  277 +-
 doc/html/a00230.png                                |  Bin 731 -> 0 bytes
 doc/html/a00231.html                               |  618 +----
 doc/html/a00232.html                               |   36 +-
 doc/html/a00232.png                                |  Bin 1371 -> 0 bytes
 doc/html/a00233.html                               |  199 +-
 doc/html/a00234.html                               |   88 +-
 doc/html/a00235.html                               |  290 +--
 doc/html/a00236.html                               |  158 +-
 doc/html/a00236.png                                |  Bin 0 -> 1270 bytes
 doc/html/a00237.html                               |  381 ++-
 doc/html/a00237.png                                |  Bin 720 -> 2898 bytes
 doc/html/a00238.html                               |  586 +----
 doc/html/a00239.html                               |   33 +-
 doc/html/a00240.html                               |  136 +-
 doc/html/a00240.png                                |  Bin 691 -> 472 bytes
 doc/html/a00241.html                               |  145 +-
 doc/html/a00241.png                                |  Bin 459 -> 0 bytes
 doc/html/a00242.html                               |  278 +-
 doc/html/a00242.png                                |  Bin 387 -> 731 bytes
 doc/html/a00243.html                               |  673 ++++-
 doc/html/a00244.html                               |   65 +-
 doc/html/a00244.png                                |  Bin 709 -> 1371 bytes
 doc/html/a00245.html                               |  211 +-
 doc/html/a00246.html                               |   82 +-
 doc/html/{a00234.png => a00246.png}                |  Bin
 doc/html/a00247.html                               |  323 ++-
 doc/html/a00248.html                               |  137 +-
 doc/html/a00249.html                               |  139 +-
 doc/html/a00249.png                                |  Bin 543 -> 720 bytes
 doc/html/a00250.html                               |  523 +++-
 doc/html/a00251.html                               |   35 +-
 doc/html/a00251.png                                |  Bin 23191 -> 0 bytes
 doc/html/a00252.html                               |   59 +-
 doc/html/a00252.png                                |  Bin 0 -> 777 bytes
 doc/html/a00253.html                               |  136 +-
 doc/html/a00253.png                                |  Bin 0 -> 668 bytes
 doc/html/a00254.html                               |   65 +-
 doc/html/a00254.png                                |  Bin 1138 -> 387 bytes
 doc/html/a00255.html                               |  218 +-
 doc/html/a00255.png                                |  Bin 843 -> 0 bytes
 doc/html/a00256.html                               |  204 +-
 doc/html/{a00245.png => a00256.png}                |  Bin
 doc/html/a00257.html                               |  151 +-
 doc/html/a00258.html                               |  109 +-
 doc/html/a00259.html                               |   45 +-
 doc/html/a00260.html                               |   65 +-
 doc/html/a00260.png                                |  Bin 0 -> 942 bytes
 doc/html/a00261.html                               |   68 +-
 doc/html/a00261.png                                |  Bin 0 -> 1016 bytes
 doc/html/a00262.html                               |  200 +-
 doc/html/a00263.html                               |   46 +-
 doc/html/a00263.png                                |  Bin 0 -> 4876 bytes
 doc/html/a00264.html                               |   33 +-
 doc/html/a00265.html                               |  108 +-
 doc/html/a00266.html                               |  124 +-
 doc/html/a00266.png                                |  Bin 0 -> 1209 bytes
 doc/html/a00267.html                               |   28 +-
 doc/html/a00268.html                               |  104 +-
 doc/html/a00268.png                                |  Bin 1370 -> 0 bytes
 doc/html/a00269.html                               |   89 +-
 doc/html/a00269.png                                |  Bin 1523 -> 0 bytes
 doc/html/a00270.html                               |  110 +-
 doc/html/a00271.html                               |   95 +-
 doc/html/a00272.html                               |   49 +-
 doc/html/a00273.html                               |  132 +-
 doc/html/{a00257.png => a00273.png}                |  Bin
 doc/html/a00274.html                               |  200 +-
 doc/html/a00274.png                                |  Bin 0 -> 943 bytes
 doc/html/a00275.html                               |  109 +-
 doc/html/a00276.html                               |   50 +-
 doc/html/a00277.html                               |   66 +-
 doc/html/a00277.png                                |  Bin 2390 -> 0 bytes
 doc/html/a00278.html                               |   89 +-
 doc/html/a00279.html                               |   54 +-
 doc/html/a00280.html                               |   85 +-
 doc/html/a00281.html                               |   46 +-
 doc/html/a00282.html                               |  139 +-
 doc/html/a00282.png                                |  Bin 1782 -> 0 bytes
 doc/html/a00283.html                               |   80 +-
 doc/html/a00283.png                                |  Bin 1445 -> 0 bytes
 doc/html/a00284.html                               |   83 +-
 doc/html/a00285.html                               |  106 +-
 doc/html/a00285.png                                |  Bin 732 -> 0 bytes
 doc/html/a00286.html                               |  162 +-
 doc/html/a00286.png                                |  Bin 0 -> 2103 bytes
 doc/html/a00287.html                               |  122 +-
 doc/html/a00287.png                                |  Bin 0 -> 2251 bytes
 doc/html/a00288.html                               |   98 +-
 doc/html/a00289.html                               |   97 +-
 doc/html/a00290.html                               |   50 +-
 doc/html/a00291.html                               |  578 +----
 doc/html/a00292.html                               |  189 +-
 doc/html/a00293.html                               |  218 +-
 doc/html/a00294.html                               |   56 +-
 doc/html/a00295.html                               |  162 +-
 doc/html/a00295.png                                |  Bin 0 -> 3242 bytes
 doc/html/a00296.html                               |  134 +-
 doc/html/a00297.html                               |   56 +-
 doc/html/a00298.html                               |  287 ++-
 doc/html/a00299.html                               |  107 +-
 doc/html/a00300.html                               |   39 +-
 doc/html/a00301.html                               |  118 +-
 doc/html/a00301.png                                |  Bin 426 -> 2681 bytes
 doc/html/a00302.html                               |   92 +-
 doc/html/a00302.png                                |  Bin 0 -> 2045 bytes
 doc/html/a00303.html                               |   62 +-
 doc/html/a00304.html                               |  125 +-
 doc/html/a00304.png                                |  Bin 548 -> 1084 bytes
 doc/html/a00305.html                               |  102 +-
 doc/html/a00306.html                               |   94 +-
 doc/html/a00307.html                               |  107 +-
 doc/html/{a00289.html => a00308.html}              |   24 +-
 doc/html/{a00290.html => a00309.html}              |    8 +-
 doc/html/a00310.html                               |   75 +
 doc/html/a00310.png                                |  Bin 0 -> 3064 bytes
 doc/html/{a00291.html => a00311.html}              |  156 +-
 doc/html/{a00291.png => a00311.png}                |  Bin
 doc/html/{a00292.html => a00312.html}              |    2 +-
 doc/html/{a00239.html => a00314.html}              |   15 +-
 doc/html/{a00294.html => a00315.html}              |   16 +-
 doc/html/{a00295.html => a00316.html}              |   30 +-
 doc/html/{a00296.html => a00317.html}              |   22 +-
 doc/html/{a00297.html => a00318.html}              |    4 +-
 doc/html/{a00298.html => a00319.html}              |   42 +-
 doc/html/{a00298.png => a00319.png}                |  Bin
 doc/html/{a00299.html => a00320.html}              |   12 +-
 doc/html/{a00216.html => a00321.html}              |   33 +-
 doc/html/{a00301.html => a00322.html}              |   18 +-
 doc/html/{a00301.png => a00322.png}                |  Bin
 doc/html/{a00302.html => a00323.html}              |   20 +-
 doc/html/{a00303.html => a00324.html}              |   26 +-
 doc/html/{a00305.html => a00325.html}              |    8 +-
 doc/html/a00326.html                               |  171 +-
 doc/html/{a00307.html => a00327.html}              |    4 +-
 doc/html/{a00326.html => a00343.html}              |  150 +-
 doc/html/a00344.html                               |   55 +-
 doc/html/{a00344.html => a00363.html}              |   59 +-
 doc/html/a00370.html                               |   61 -
 doc/html/a00373.html                               |  313 ---
 doc/html/a00377.html                               |  159 --
 doc/html/a00381.html                               |  942 -------
 doc/html/{a00362.html => a00383.html}              |  506 ++--
 doc/html/{a00371.html => a00395.html}              |  180 +-
 doc/html/{a00372.html => a00396.html}              |   28 +-
 doc/html/a00397.html                               | 1692 +++----------
 doc/html/{a00374.html => a00398.html}              |   40 +-
 doc/html/{a00375.html => a00399.html}              |    4 +-
 doc/html/{a00376.html => a00400.html}              |   20 +-
 doc/html/{a00409.html => a00401.html}              |    8 +-
 doc/html/a00403.html                               |  433 ++++
 doc/html/a00407.html                               |  107 -
 doc/html/a00410.html                               |  376 ---
 doc/html/{a00418.html => a00412.html}              |   38 +-
 doc/html/{a00419.html => a00413.html}              |   36 +-
 doc/html/{a00420.html => a00414.html}              |   52 +-
 doc/html/{a00421.html => a00415.html}              |   26 +-
 doc/html/{a00423.html => a00417.html}              |   12 +-
 doc/html/a00418.html                               | 1240 ++++++++-
 doc/html/a00424.html                               | 1219 ---------
 doc/html/a00429.html                               |  328 +++
 doc/html/{a00436.html => a00432.html}              |  126 +-
 doc/html/a00433.html                               |  337 ---
 doc/html/a00436.html                               |  505 ++--
 doc/html/a00437.html                               |  263 --
 doc/html/a00440.html                               |  199 ++
 doc/html/a00442.html                               |  926 -------
 doc/html/a00443.html                               |  927 +++++++
 doc/html/{a00451.html => a00452.html}              |    0
 doc/html/a00454.html                               |  967 -------
 doc/html/a00455.html                               |  968 +++++++
 doc/html/a00466.html                               | 2522 ------------------
 doc/html/a00468.html                               | 1479 +++++++++++
 doc/html/a00480.html                               |  259 ++
 doc/html/{a00499.html => a00487.html}              |   72 +-
 doc/html/{a00501.html => a00489.html}              |   20 +-
 doc/html/{a00502.html => a00490.html}              |   20 +-
 doc/html/{a00503.html => a00491.html}              |   20 +-
 doc/html/a00500.html                               |  256 ++
 doc/html/{a00516.html => a00504.html}              |   24 +-
 doc/html/{a00518.html => a00506.html}              |  616 ++---
 doc/html/a00512.html                               |  595 +++--
 doc/html/a00518.html                               |  607 +++--
 doc/html/{a00533.html => a00523.html}              |  188 +-
 doc/html/a00524.html                               |  340 ---
 doc/html/{a00537.html => a00527.html}              |   36 +-
 doc/html/a00528.html                               |  341 ---
 doc/html/a00531.html                               |  500 ++++
 doc/html/a00541.html                               |  230 --
 doc/html/{a00546.html => a00543.html}              |  154 +-
 doc/html/{a00560.html => a00557.html}              |   44 +-
 doc/html/{a00561.html => a00558.html}              |   48 +-
 doc/html/{a00562.html => a00559.html}              |   54 +-
 doc/html/a00560.html                               |  271 +-
 doc/html/a00561.html                               |  195 +-
 doc/html/a00562.html                               |  304 ++-
 doc/html/a00563.html                               |  241 --
 doc/html/a00564.html                               |  199 --
 doc/html/a00565.html                               |   64 +-
 doc/html/a00566.html                               |   74 +-
 doc/html/a00567.html                               | 1061 ++++----
 doc/html/a00577.html                               |  422 +--
 doc/html/a00584.html                               |   96 +-
 doc/html/a00588.html                               |   42 +-
 doc/html/a00592.html                               |  374 +--
 doc/html/a00593.html                               |  118 +-
 doc/html/a00594.html                               | 1329 +++++-----
 doc/html/a00599.html                               |  225 --
 doc/html/a00600.html                               |  382 ++-
 doc/html/{a00600.html => a00601.html}              |  325 +--
 doc/html/{a00606.html => a00608.html}              |    2 +-
 doc/html/a00614.html                               |   96 -
 doc/html/a00616.html                               |  160 +-
 doc/html/{a00616.html => a00618.html}              |   52 +-
 doc/html/annotated.html                            |  199 +-
 doc/html/deprecated.html                           |    2 +-
 doc/html/files.html                                |   83 +-
 doc/html/functions.html                            |   30 +-
 doc/html/functions_0x62.html                       |   10 +-
 doc/html/functions_0x63.html                       |   47 +-
 doc/html/functions_0x64.html                       |   18 +-
 doc/html/functions_0x65.html                       |   32 +-
 doc/html/functions_0x66.html                       |   20 +-
 doc/html/functions_0x67.html                       |   15 +-
 doc/html/functions_0x69.html                       |   46 +-
 doc/html/functions_0x6c.html                       |   11 +-
 doc/html/functions_0x6d.html                       |   13 +-
 doc/html/functions_0x6e.html                       |    8 +-
 doc/html/functions_0x6f.html                       |   24 +-
 doc/html/functions_0x70.html                       |   32 +-
 doc/html/functions_0x71.html                       |    6 +-
 doc/html/functions_0x72.html                       |   57 +-
 doc/html/functions_0x73.html                       |   50 +-
 doc/html/functions_0x74.html                       |   37 +-
 doc/html/functions_0x75.html                       |    6 +-
 doc/html/functions_0x76.html                       |    2 +-
 doc/html/functions_0x77.html                       |    4 +-
 doc/html/functions_0x7e.html                       |   48 +-
 doc/html/functions_enum.html                       |   11 +-
 doc/html/functions_eval.html                       |   21 +-
 doc/html/functions_func.html                       |   24 +-
 doc/html/functions_func_0x62.html                  |   10 +-
 doc/html/functions_func_0x63.html                  |   42 +-
 doc/html/functions_func_0x64.html                  |   12 +-
 doc/html/functions_func_0x65.html                  |   15 +-
 doc/html/functions_func_0x66.html                  |   10 +-
 doc/html/functions_func_0x67.html                  |   15 +-
 doc/html/functions_func_0x69.html                  |   44 +-
 doc/html/functions_func_0x6c.html                  |   11 +-
 doc/html/functions_func_0x6d.html                  |    7 +-
 doc/html/functions_func_0x6e.html                  |    6 +-
 doc/html/functions_func_0x6f.html                  |   18 +-
 doc/html/functions_func_0x70.html                  |   28 +-
 doc/html/functions_func_0x71.html                  |    6 +-
 doc/html/functions_func_0x72.html                  |   47 +-
 doc/html/functions_func_0x73.html                  |   42 +-
 doc/html/functions_func_0x74.html                  |   37 +-
 doc/html/functions_func_0x75.html                  |    6 +-
 doc/html/functions_func_0x77.html                  |    4 +-
 doc/html/functions_func_0x7e.html                  |   48 +-
 doc/html/functions_rela.html                       |    6 +-
 doc/html/functions_type.html                       |   30 +-
 doc/html/functions_vars.html                       |   22 +-
 doc/html/globals.html                              |   22 +-
 doc/html/globals_func.html                         |   22 +-
 doc/html/hierarchy.html                            |  290 +--
 doc/html/modules.html                              |   12 +-
 doc/html/namespacemembers.html                     |   40 +-
 doc/html/namespacemembers_enum.html                |    4 +-
 doc/html/namespacemembers_eval.html                |    9 +-
 doc/html/namespacemembers_func.html                |   27 +-
 doc/html/namespacemembers_type.html                |    2 +-
 doc/html/namespaces.html                           |    3 +-
 examples/GettingStarted/index.html                 |    7 +-
 examples/GettingStarted/sub_string_finder/Makefile |    8 +
 .../sub_string_finder/Makefile.windows             |    3 +
 .../GettingStarted/sub_string_finder/index.html    |    7 +-
 .../msvs/sub_string_finder.vcproj                  |   24 +-
 .../msvs/sub_string_finder_extended.vcproj         |   24 +-
 .../msvs/sub_string_finder_pretty.vcproj           |   24 +-
 .../sub_string_finder.xcodeproj/project.pbxproj    |   97 +-
 examples/Makefile                                  |   29 +-
 examples/common/copy_libraries.bat                 |   22 +-
 examples/common/gui/Makefile.gmake                 |   12 +-
 examples/common/gui/macvideo.cpp                   |  192 +-
 examples/common/gui/video.h                        |    4 +-
 examples/common/index.html                         |    7 +-
 examples/common/utility/fast_random.h              |   90 +
 .../concurrent_hash_map/count_strings/Makefile     |    4 +
 .../concurrent_hash_map/count_strings/index.html   |    7 +-
 .../count_strings/msvs/count_strings.vcproj        |   24 +-
 .../xcode/count_strings.xcodeproj/project.pbxproj  |   39 +-
 examples/concurrent_hash_map/index.html            |    7 +-
 .../shortpath}/Makefile                            |   16 +-
 .../shortpath}/Makefile.windows                    |   10 +-
 .../concurrent_priority_queue/shortpath/index.html |   82 +
 .../shortpath/msvs/shortpath.icproj                |   11 +
 .../shortpath/msvs/shortpath.vcproj}               |   40 +-
 .../shortpath/msvs/shortpath_cl.sln                |   25 +
 .../shortpath/msvs/shortpath_icl.sln               |   33 +
 .../shortpath/shortpath.cpp                        |  375 +++
 .../xcode/shortpath.xcodeproj}/project.pbxproj     |  123 +-
 .../{task_group/sudoku => graph/binpack}/Makefile  |   19 +-
 .../sudoku => graph/binpack}/Makefile.windows      |   10 +-
 examples/graph/binpack/binpack.cpp                 |  305 +++
 examples/graph/binpack/index.html                  |   72 +
 examples/graph/binpack/msvs/binpack.icproj         |   11 +
 .../binpack/msvs/binpack.vcproj}                   |   46 +-
 examples/graph/binpack/msvs/binpack_cl.sln         |   25 +
 examples/graph/binpack/msvs/binpack_icl.sln        |   33 +
 .../xcode/binpack.xcodeproj}/project.pbxproj       |  123 +-
 .../dining_philosophers}/Makefile                  |   19 +-
 .../dining_philosophers}/Makefile.windows          |   18 +-
 examples/graph/dining_philosophers/index.html      |   48 +
 .../msvs/dining_philosophers.icproj                |   11 +
 .../msvs/dining_philosophers.vcproj}               |   56 +-
 .../msvs/dining_philosophers_cl.sln                |   25 +
 .../msvs/dining_philosophers_icl.sln               |   33 +
 .../src/dining_philosophers.cpp                    |  318 +++
 .../dining_philosophers.xcodeproj}/project.pbxproj |   83 +-
 examples/graph/index.html                          |   26 +
 examples/index.html                                |   11 +-
 examples/parallel_do/index.html                    |    7 +-
 examples/parallel_do/parallel_preorder/Makefile    |    4 +
 examples/parallel_do/parallel_preorder/index.html  |    7 +-
 .../msvs/parallel_preorder.vcproj                  |   24 +-
 .../parallel_preorder.xcodeproj/project.pbxproj    |   39 +-
 examples/parallel_for/game_of_life/Makefile        |    9 +-
 .../parallel_for/game_of_life/Makefile.windows     |    7 +-
 examples/parallel_for/game_of_life/index.html      |    7 +-
 .../game_of_life/msvs/Game_of_life.vcproj          |   48 +-
 .../xcode/game_of_life.xcodeproj/project.pbxproj   |   31 +-
 examples/parallel_for/index.html                   |    7 +-
 examples/parallel_for/polygon_overlay/Makefile     |   21 +-
 .../parallel_for/polygon_overlay/Makefile.windows  |    3 +
 examples/parallel_for/polygon_overlay/index.html   |    7 +-
 .../parallel_for/polygon_overlay/msvs/pover.vcproj |   48 +-
 .../parallel_for/polygon_overlay/msvs/pover_cl.sln |   12 +-
 .../polygon_overlay/msvs/pover_icl.sln             |   20 +-
 .../xcode/PolygonOverlay.xcodeproj/project.pbxproj |   38 +-
 examples/parallel_for/seismic/Makefile             |   28 +-
 examples/parallel_for/seismic/Makefile.windows     |   22 +-
 .../parallel_for/seismic/SeismicSimulation.cpp     |  439 ----
 examples/parallel_for/seismic/index.html           |   51 +-
 examples/parallel_for/seismic/main.cpp             |  133 +
 .../seismic/msvs/SeismicSimulation.icproj          |    2 +-
 .../seismic/msvs/SeismicSimulation.vcproj          |   82 +-
 .../seismic/msvs/SeismicSimulation_cl.sln          |   28 +-
 .../seismic/msvs/SeismicSimulation_icl.sln         |   62 +-
 examples/parallel_for/seismic/seismic_video.cpp    |  156 ++
 .../parallel_for/seismic/seismic_video.h           |   47 +-
 examples/parallel_for/seismic/universe.cpp         |  230 ++
 examples/parallel_for/seismic/universe.h           |  120 +
 .../SeismicSimulation.xcodeproj/project.pbxproj    |   52 +-
 examples/parallel_for/tachyon/Makefile             |   39 +-
 examples/parallel_for/tachyon/Makefile.windows     |   22 +-
 examples/parallel_for/tachyon/index.html           |   33 +-
 .../tachyon/msvs/tachyon.serial.vcproj             |   48 +-
 .../parallel_for/tachyon/msvs/tachyon.tbb.vcproj   |  104 +-
 .../parallel_for/tachyon/msvs/tachyon.tbb1d.vcproj |  104 +-
 examples/parallel_for/tachyon/msvs/tachyon.vcproj  |   52 +-
 examples/parallel_for/tachyon/msvs/tachyon_cl.sln  |  104 +-
 examples/parallel_for/tachyon/msvs/tachyon_icl.sln |  227 +-
 examples/parallel_for/tachyon/src/api.cpp          |    4 +-
 examples/parallel_for/tachyon/src/api.h            |    2 +-
 examples/parallel_for/tachyon/src/getargs.cpp      |  204 --
 examples/parallel_for/tachyon/src/grid.cpp         |   11 +-
 .../tachyon/src/{video.cpp => main.cpp}            |  219 +-
 examples/parallel_for/tachyon/src/render.cpp       |    4 +-
 .../tachyon/src/{getargs.h => tachyon_video.cpp}   |   45 +-
 .../tachyon/src/{video.h => tachyon_video.h}       |    6 +
 examples/parallel_for/tachyon/src/trace.serial.cpp |    2 +-
 examples/parallel_for/tachyon/src/trace.tbb.cpp    |    2 +-
 examples/parallel_for/tachyon/src/trace.tbb1d.cpp  |    2 +-
 examples/parallel_for/tachyon/src/trace_rest.cpp   |    2 +-
 examples/parallel_for/tachyon/src/types.h          |    2 +-
 examples/parallel_for/tachyon/src/ui.cpp           |   14 +-
 examples/parallel_for/tachyon/src/util.cpp         |   59 +-
 examples/parallel_for/tachyon/src/util.h           |   20 +-
 .../xcode/tachyon.xcodeproj/project.pbxproj        |   98 +-
 examples/parallel_reduce/convex_hull/Makefile      |   14 +
 .../parallel_reduce/convex_hull/Makefile.windows   |   12 +-
 examples/parallel_reduce/convex_hull/convex_hull.h |  152 +-
 .../convex_hull/convex_hull_bench.cpp              |  122 +-
 .../convex_hull/convex_hull_sample.cpp             |   95 +-
 examples/parallel_reduce/convex_hull/index.html    |    7 +-
 .../convex_hull/msvs/convex_hull_benchmark.vcproj  |   24 +-
 .../convex_hull/msvs/convex_hull_sample.vcproj     |   24 +-
 .../xcode/convex_hull.xcodeproj/project.pbxproj    |   69 +-
 examples/parallel_reduce/index.html                |    7 +-
 examples/parallel_reduce/primes/Makefile           |    4 +
 examples/parallel_reduce/primes/index.html         |    7 +-
 examples/parallel_reduce/primes/msvs/primes.vcproj |   24 +-
 .../primes/xcode/primes.xcodeproj/project.pbxproj  |   39 +-
 examples/pipeline/index.html                       |    7 +-
 examples/pipeline/square/Makefile                  |   13 +-
 examples/pipeline/square/Makefile.windows          |    8 +-
 examples/pipeline/square/index.html                |   27 +-
 examples/pipeline/square/msvs/square.vcproj        |   28 +-
 examples/pipeline/square/square.cpp                |  118 +-
 .../square/xcode/square.xcodeproj/project.pbxproj  |   61 +-
 examples/task/index.html                           |    7 +-
 examples/task/tree_sum/Makefile                    |   12 +-
 examples/task/tree_sum/Makefile.windows            |    8 +-
 examples/task/tree_sum/{main.cpp => TreeMaker.h}   |   83 +-
 examples/task/tree_sum/index.html                  |   29 +-
 examples/task/tree_sum/main.cpp                    |  205 +-
 examples/task/tree_sum/msvs/tree_sum.vcproj        |   28 +-
 .../xcode/tree_sum.xcodeproj/project.pbxproj       |   39 +-
 examples/task_group/index.html                     |    7 +-
 examples/task_group/sudoku/Makefile                |   13 +-
 examples/task_group/sudoku/Makefile.windows        |    8 +-
 examples/task_group/sudoku/index.html              |   26 +-
 examples/task_group/sudoku/msvs/sudoku.vcproj      |   24 +-
 examples/task_group/sudoku/sudoku.cpp              |  108 +-
 .../sudoku/xcode/sudoku.xcodeproj/project.pbxproj  |   43 +-
 examples/task_priority/fractal/Makefile            |   19 +-
 examples/task_priority/fractal/Makefile.windows    |   11 +-
 examples/task_priority/fractal/fractal.cpp         |   31 +-
 examples/task_priority/fractal/fractal.h           |   16 +-
 examples/task_priority/fractal/fractal_video.h     |   10 +-
 examples/task_priority/fractal/index.html          |    7 +-
 examples/task_priority/fractal/msvs/fractal.icproj |    2 +-
 examples/task_priority/fractal/msvs/fractal.vcproj |  117 +-
 examples/task_priority/fractal/msvs/fractal_cl.sln |   26 +-
 .../task_priority/fractal/msvs/fractal_icl.sln     |   58 +-
 .../xcode/fractal.xcodeproj/project.pbxproj        |   48 +-
 examples/task_priority/index.html                  |    7 +-
 examples/test_all/fibonacci/Makefile               |    4 +
 examples/test_all/fibonacci/index.html             |    7 +-
 examples/test_all/fibonacci/msvs/fibonacci.vcproj  |   24 +-
 .../xcode/fibonacci.xcodeproj/project.pbxproj      |   39 +-
 examples/test_all/index.html                       |    7 +-
 include/index.html                                 |    7 +-
 include/serial/tbb/parallel_for.h                  |  173 ++
 .../serial/tbb/tbb_annotate.h                      |   28 +-
 include/tbb/atomic.h                               |  148 +-
 include/tbb/blocked_range2d.h                      |    2 +-
 include/tbb/blocked_range3d.h                      |    2 +-
 include/tbb/compat/ppl.h                           |    2 +
 include/tbb/compat/tuple                           |    5 +
 include/tbb/concurrent_hash_map.h                  |    2 +-
 include/tbb/concurrent_priority_queue.h            |  104 +-
 include/tbb/concurrent_queue.h                     |    8 +-
 include/tbb/concurrent_unordered_map.h             |   17 +-
 ..._unordered_map.h => concurrent_unordered_set.h} |  116 +-
 include/tbb/concurrent_vector.h                    |    1 +
 include/tbb/enumerable_thread_specific.h           |    1 +
 include/tbb/flow_graph.h                           | 1589 ++++++++++++
 include/tbb/graph.h                                | 2673 --------------------
 include/tbb/index.html                             |    7 +-
 .../_aggregator_impl.h}                            |   26 +-
 .../_concurrent_queue_impl.h}                      |   28 +-
 .../_concurrent_unordered_impl.h}                  |   32 +-
 include/tbb/internal/_flow_graph_impl.h            |  582 +++++
 .../tbb/internal/_flow_graph_item_buffer_impl.h    |  190 ++
 include/tbb/internal/_flow_graph_join_impl.h       | 1702 +++++++++++++
 include/tbb/internal/_flow_graph_node_impl.h       |  473 ++++
 include/tbb/internal/_flow_graph_or_impl.h         |  268 ++
 .../tbb/internal/_flow_graph_tagged_buffer_impl.h  |  212 ++
 include/tbb/internal/_flow_graph_types_impl.h      |  158 ++
 include/tbb/{ => internal}/_tbb_windef.h           |    8 +-
 include/tbb/machine/gcc_generic.h                  |   74 +
 include/tbb/machine/ibm_aix51.h                    |   43 +-
 include/tbb/machine/linux_common.h                 |    2 +-
 include/tbb/machine/linux_ia32.h                   |   74 +-
 include/tbb/machine/linux_ia64.h                   |  184 +-
 include/tbb/machine/linux_intel64.h                |   73 +-
 include/tbb/machine/mac_ppc.h                      |  296 ++-
 include/tbb/machine/macos_common.h                 |  100 +-
 include/tbb/machine/sunos_sparc.h                  |   55 +-
 include/tbb/machine/windows_ia32.h                 |   78 +-
 include/tbb/machine/windows_intel64.h              |  100 +-
 include/tbb/machine/xbox360_ppc.h                  |   37 +-
 include/tbb/memory_pool.h                          |  259 ++
 include/tbb/parallel_for.h                         |  118 +-
 include/tbb/parallel_for_each.h                    |    6 +-
 include/tbb/parallel_invoke.h                      |   14 +-
 include/tbb/parallel_reduce.h                      |  198 +-
 include/tbb/parallel_sort.h                        |    4 +
 include/tbb/partitioner.h                          |  503 +++-
 include/tbb/queuing_mutex.h                        |    4 +-
 include/tbb/queuing_rw_mutex.h                     |   20 +-
 include/tbb/reader_writer_lock.h                   |    2 +-
 include/tbb/runtime_loader.h                       |  188 ++
 include/tbb/scalable_allocator.h                   |   26 +
 include/tbb/spin_mutex.h                           |    8 +-
 include/tbb/task.h                                 |  190 +-
 include/tbb/task_group.h                           |    4 +
 include/tbb/task_scheduler_init.h                  |    6 +-
 include/tbb/tbb_config.h                           |  119 +-
 include/tbb/tbb_machine.h                          |  861 ++++---
 include/tbb/tbb_stddef.h                           |  110 +-
 include/tbb/tbb_thread.h                           |    2 +-
 index.html                                         |    7 +-
 src/Makefile                                       |   43 +-
 src/index.html                                     |    7 +-
 src/old/concurrent_queue_v2.h                      |   11 +-
 src/old/concurrent_vector_v2.h                     |    4 +-
 src/old/spin_rw_mutex_v2.h                         |   10 +-
 src/perf/perf.h                                    |    1 -
 src/perf/time_hash_map.cpp                         |    2 +-
 src/perf/time_hash_map_fill.cpp                    |    2 +-
 src/perf/time_hash_map_fill.html                   |    7 +-
 src/rml/client/index.html                          |    7 +-
 src/rml/include/index.html                         |    7 +-
 src/rml/index.html                                 |    7 +-
 src/rml/server/index.html                          |    7 +-
 src/rml/server/thread_monitor.h                    |  113 +-
 src/rml/test/test_thread_monitor.cpp               |    1 +
 src/tbb/arena.cpp                                  |   25 +-
 src/tbb/arena.h                                    |   13 +-
 src/tbb/cilk-tbb-interop.h                         |   12 +-
 src/tbb/concurrent_monitor.cpp                     |   14 +-
 src/tbb/concurrent_monitor.h                       |   83 +-
 src/tbb/concurrent_queue.cpp                       |    4 +-
 src/tbb/custom_scheduler.h                         |  163 +-
 src/tbb/dynamic_link.cpp                           |   19 +-
 src/tbb/governor.cpp                               |   47 +-
 src/tbb/ia64-gas/ia64_misc.s                       |   72 +
 src/tbb/ibm_aix51/atomic_support.c                 |   12 +-
 src/tbb/index.html                                 |    7 +-
 src/tbb/itt_notify.h                               |    2 +-
 src/tbb/lin64ipf-tbb-export.lst                    |    8 +
 src/tbb/mac32-tbb-export.lst                       |    4 +
 src/tbb/mac64-tbb-export.lst                       |    4 +
 src/tbb/mailbox.h                                  |  103 +-
 src/tbb/market.cpp                                 |  194 +-
 src/tbb/market.h                                   |   15 +-
 src/tbb/queuing_mutex.cpp                          |   15 +-
 src/tbb/queuing_rw_mutex.cpp                       |  330 +--
 src/tbb/scheduler.cpp                              |  500 ++--
 src/tbb/scheduler.h                                |  164 +-
 src/tbb/scheduler_common.h                         |   48 +-
 src/tbb/semaphore.cpp                              |  101 +
 src/tbb/semaphore.h                                |  128 +
 src/tbb/spin_mutex.cpp                             |    2 +-
 src/tbb/task.cpp                                   |   18 +-
 src/tbb/tbb_main.cpp                               |    2 +-
 src/tbb/tbb_main.h                                 |   14 +-
 src/tbb/tbb_misc.cpp                               |    2 +-
 src/tbb/tbb_misc.h                                 |    4 +-
 src/tbb/tbb_misc_ex.cpp                            |   11 +-
 src/tbbmalloc/Customize.h                          |   43 +-
 src/tbbmalloc/LifoList.h                           |  106 -
 src/tbbmalloc/MapMemory.h                          |   25 +-
 src/tbbmalloc/backend.cpp                          | 1033 ++++++--
 src/tbbmalloc/backref.cpp                          |   54 +-
 src/tbbmalloc/frontend.cpp                         | 1028 +++++---
 src/tbbmalloc/large_objects.cpp                    |  224 +-
 ...alloc-export.def => lin32-tbbmalloc-export.def} |    9 +-
 ...alloc-export.def => lin64-tbbmalloc-export.def} |    9 +-
 ...oc-export.def => lin64ipf-tbbmalloc-export.def} |   10 +-
 src/tbbmalloc/mac32-tbbmalloc-export.def           |    8 +-
 src/tbbmalloc/mac64-tbbmalloc-export.def           |    8 +-
 src/tbbmalloc/tbb_function_replacement.cpp         |    2 +-
 src/tbbmalloc/tbbmalloc_internal.h                 |  411 ++-
 ...c-export.def => win32-gcc-tbbmalloc-export.def} |    8 +
 src/tbbmalloc/win32-tbbmalloc-export.def           |    9 +-
 ...c-export.def => win64-gcc-tbbmalloc-export.def} |    8 +
 src/tbbmalloc/win64-tbbmalloc-export.def           |    9 +-
 src/tbbproxy/tbbproxy-windows.asm                  |  121 +
 src/tbbproxy/tbbproxy.cpp                          |  616 +++++
 src/test/harness.h                                 |   56 +-
 src/test/harness_allocator.h                       |    6 +-
 src/test/harness_graph.h                           |  228 +-
 src/test/harness_inject_scheduler.h                |    1 +
 src/test/harness_iterator.h                        |   35 +
 src/test/harness_m128.h                            |   77 +-
 .../fractal_video.h => src/test/harness_task.h     |   73 +-
 src/test/harness_tbb_independence.h                |   23 +
 src/test/test_ScalableAllocator.cpp                |   74 +-
 src/test/test_ScalableAllocator_STL.cpp            |   15 +
 src/test/test_aligned_space.cpp                    |    7 +-
 src/test/test_allocator.h                          |   32 +-
 src/test/test_allocator_STL.h                      |   44 +-
 src/test/test_assembly.cpp                         |    4 +-
 src/test/test_atomic.cpp                           |  438 +++-
 src/test/test_broadcast_node.cpp                   |   42 +-
 src/test/test_buffer_node.cpp                      |   80 +-
 src/test/test_cilk_dynamic_load.cpp                |   16 +-
 src/test/test_cilk_interop.cpp                     |   14 +-
 src/test/test_combinable.cpp                       |    2 +-
 src/test/test_concurrent_hash_map.cpp              |    7 +
 src/test/test_concurrent_monitor.cpp               |   47 +-
 src/test/test_concurrent_priority_queue.cpp        |  114 +-
 src/test/test_concurrent_queue.cpp                 |   51 +-
 src/test/test_concurrent_unordered.cpp             |   70 +-
 src/test/test_concurrent_vector.cpp                |   28 +-
 src/test/test_condition_variable.h                 |   10 +-
 src/test/test_continue_node.cpp                    |  225 +-
 src/test/test_eh_algorithms.cpp                    |    4 +-
 src/test/test_enumerable_thread_specific.cpp       |    3 +-
 src/test/test_executable_node.cpp                  |  123 -
 src/test/test_faf_task.cpp                         |  155 --
 src/test/test_fast_random.cpp                      |   59 +-
 src/test/test_flow_graph.cpp                       |  141 ++
 src/test/test_function_node.cpp                    |  242 +-
 src/test/test_intrusive_list.cpp                   |    7 -
 src/test/test_join_node.cpp                        |  767 +++++-
 src/test/test_lambda.cpp                           |    4 +
 src/test/test_limiter_node.cpp                     |   82 +-
 src/test/test_malloc_compliance.cpp                |  140 +-
 src/test/test_malloc_overload.cpp                  |   14 +-
 src/test/test_malloc_pools.cpp                     |  397 +++
 src/test/test_malloc_regression.cpp                |   10 +-
 src/test/test_malloc_whitebox.cpp                  |  174 +-
 src/test/test_multioutput_function_node.cpp        |  471 ++++
 src/test/test_mutex_native_threads.cpp             |   18 +-
 src/test/test_or_node.cpp                          |  458 ++++
 src/test/test_overwrite_node.cpp                   |   36 +-
 src/test/test_parallel_do.cpp                      |    2 +
 src/test/test_parallel_for.cpp                     |  247 +-
 src/test/test_parallel_for_each.cpp                |    9 +
 src/test/test_parallel_invoke.cpp                  |    8 +-
 src/test/test_parallel_reduce.cpp                  |   75 +-
 src/test/test_parallel_sort.cpp                    |    6 +-
 src/test/test_priority_queue_node.cpp              |   71 +-
 src/test/test_queue_node.cpp                       |   71 +-
 src/test/test_runtime_loader.cpp                   |  300 +++
 src/test/test_semaphore.cpp                        |   37 +
 src/test/test_sequencer_node.cpp                   |   81 +-
 src/test/test_source_node.cpp                      |   30 +-
 src/test/test_split_node.cpp                       |  363 +++
 src/test/test_task.cpp                             |  196 +-
 src/test/test_task_assertions.cpp                  |   19 +-
 src/test/test_task_auto_init.cpp                   |   24 +-
 src/test/test_task_enqueue.cpp                     |  329 +++
 src/test/test_task_group.cpp                       |   29 +-
 src/test/test_task_leaks.cpp                       |   27 +-
 src/test/test_task_priority.cpp                    |   62 +-
 src/test/test_task_scheduler_observer.cpp          |    4 +-
 src/test/test_tbb_header.cpp                       |    8 +-
 src/test/test_tbb_version.cpp                      |    8 +-
 src/test/test_tuple.cpp                            |   22 +-
 src/test/test_write_once_node.cpp                  |   38 +-
 792 files changed, 44004 insertions(+), 37157 deletions(-)

diff --git a/CHANGES b/CHANGES
index 18a03b9..848c169 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,81 @@
+TBB 4.0 commercial-aligned release
+
+Changes (w.r.t. TBB 3.0 Update 8 commercial-aligned release):
+
+- concurrent_priority_queue is now a supported feature. Capacity
+    control methods were removed.
+- Flow graph is now a supported feature of TBB,
+    rather than being a community preview feature.
+- A new memory backend has been implemented in the TBB allocator.
+    It can return small memory blocks to the OS and thus later reuse
+    that memory for large object allocation.
+- Improved partitioning algorithms for parallel_for and parallel_reduce
+    to better handle load imbalance.
+- The convex_hull example has been refactored to produce reproducible
+    performance results.
+- The Major Interface version has changed from 5 to 6. Deprecated interfaces
+    might be removed in future releases.
+
+Community Preview Features:
+
+- Added Community Preview Feature: serial subset of TBB for modeling
+    a sequential execution of a parallel algorithm. This release introduces
+    serial parallel_for.
+- Added Community Preview Feature: or_node (accepts multiple inputs,
+    forwarding each input separately to successors), split_node (accepts
+    tuples, and forwards each element to a corresponding successor),
+    and multioutput_function_node (accepts one input, and passes the input
+    and a tuple of output ports to the function body to support outputs
+    to multiple successors).
+- Added Community Preview Feature: Scalable Memory Pools (more control on
+    memory source, grouping, collective deallocatation).
+
+------------------------------------------------------------------------
+TBB 3.0 Update 8 commercial-aligned release
+
+Changes (w.r.t. TBB 3.0 Update 7 commercial-aligned release):
+
+- Task priorities become an official feature of TBB,
+    not community preview as before.
+- Atomics API extended, and implementation refactored.
+- Added task::set_parent() method.
+- Added concurrent_unordered_set container.
+
+Open-source contributions integrated:
+
+- PowerPC support by Raf Schietekat.
+- Fix of potential task pool overrun and other improvements
+    in the task scheduler by Raf Schietekat.
+- Fix in parallel_for_each to work with std::set in Visual* C++ 2010.
+
+Community Preview Features:
+
+- Graph community preview feature was renamed to flow graph.
+    Multiple improvements in the implementation.
+    Binpack example of the feature was added.
+- A number of improvements to concurrent_priority_queue.
+    Shortpath example was added for the feature.
+- TBB runtime loaded functionality was added (Windows*-only).
+    This allows set exact versions of TBB library to be used in run-time,
+    while setting directories for the library search.
+- parallel_deterministic_reduce template function was added.
+
+------------------------------------------------------------------------
+TBB 3.0 Update 7 commercial-aligned release
+
+Changes (w.r.t. TBB 3.0 Update 6 commercial-aligned release):
+
+- Added implementation of the platform isolation layer based on 
+    GCC atomic built-ins; it is supposed to work on any platform 
+    where GCC has these built-ins.
+
+Community Preview Features:
+
+- Graph's dining_philosophers example added
+- A number of improvements to graph and concurrent_priority_queue
+
+
+------------------------------------------------------------------------
 TBB 3.0 Update 6 commercial-aligned release
 
 Changes (w.r.t. TBB 3.0 Update 5 commercial-aligned release):
@@ -14,11 +92,11 @@ Open-source contributions integrated:
 
 Bugs fixed:
 
-- Failure to locate Cilk runtime library to enable Cilk/TBB interop.
+- Failure to enable interoperability with Intel(R) Cilk(tm) Plus runtime
+    library, and a crash caused by invoking the interoperability layer
+    after one of the libraries was unloaded.
 - Data race that could result in concurrent_unordered_map structure
     corruption after call to clear() method.
-- Crash caused by invoking Cilk/TBB interop after one of the libraries
-    is unloaded.
 - Stack corruption caused by PIC version of 64-bit CAS compiled by Intel
     compiler on Linux.
 - Inconsistency of exception propagation mode possible when application
@@ -115,8 +193,8 @@ Changes (w.r.t. TBB 3.0 Update 1 commercial-aligned release):
 
 - Destructor of tbb::task_group class throws missing_wait exception
     if there are tasks running when it is invoked.
-- Cilk-TBB interop layer added to protect TBB TLS in case of
-    "Cilk-TBB-Cilk nesting" usage model.
+- Interoperability layer with Intel Cilk Plus runtime library added
+    to protect TBB TLS in case of nested usage with Intel Cilk Plus.
 - Compilation fix for dependent template names in concurrent_queue.
 - Memory allocator code refactored to ease development and maintenance.
 
@@ -1056,4 +1134,7 @@ Packaging:
     are provided separately on Intel(R) Premier.
 
 ------------------------------------------------------------------------
+Intel and Cilk are registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+
 * Other names and brands may be claimed as the property of others.
diff --git a/Makefile b/Makefile
index 982975d..dd167e9 100644
--- a/Makefile
+++ b/Makefile
@@ -26,15 +26,15 @@
 
 tbb_root?=.
 include $(tbb_root)/build/common.inc
-.PHONY: default all tbb tbbmalloc test examples
+.PHONY: default all tbb tbbmalloc tbbproxy test examples
 
 #workaround for non-depend targets tbb and tbbmalloc which both depend on version_string.tmp
 #According to documentation submakes should run in parallel
-.NOTPARALLEL: tbb tbbmalloc
+.NOTPARALLEL: tbb tbbmalloc tbbproxy
 
-default: tbb tbbmalloc
+default: tbb tbbmalloc $(if $(use_proxy),tbbproxy)
 
-all: tbb tbbmalloc test examples
+all: tbb tbbmalloc tbbproxy test examples
 
 tbb: mkdir
 	$(MAKE) -C "$(work_dir)_debug"  -r -f $(tbb_root)/build/Makefile.tbb cfg=debug tbb_root=$(tbb_root)
@@ -44,7 +44,11 @@ tbbmalloc: mkdir
 	$(MAKE) -C "$(work_dir)_debug"  -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=debug malloc tbb_root=$(tbb_root)
 	$(MAKE) -C "$(work_dir)_release"  -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=release malloc tbb_root=$(tbb_root)
 
-test: tbb tbbmalloc
+tbbproxy: mkdir
+	$(MAKE) -C "$(work_dir)_debug"  -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=debug tbbproxy tbb_root=$(tbb_root)
+	$(MAKE) -C "$(work_dir)_release"  -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=release tbbproxy tbb_root=$(tbb_root)
+
+test: tbb tbbmalloc $(if $(use_proxy),tbbproxy)
 	-$(MAKE) -C "$(work_dir)_debug"  -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=debug malloc_test tbb_root=$(tbb_root)
 	-$(MAKE) -C "$(work_dir)_debug"  -r -f $(tbb_root)/build/Makefile.test cfg=debug tbb_root=$(tbb_root)
 	-$(MAKE) -C "$(work_dir)_release"  -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=release malloc_test tbb_root=$(tbb_root)
diff --git a/build/Makefile.rml b/build/Makefile.rml
index 9c8692b..ff00bc8 100644
--- a/build/Makefile.rml
+++ b/build/Makefile.rml
@@ -24,7 +24,7 @@
 # invalidate any other reasons why the executable file might be covered by
 # the GNU General Public License.
 
-tbb_root ?= $(TBB30_INSTALL_DIR)
+tbb_root ?= $(TBBROOT)
 BUILDING_PHASE=1
 TEST_RESOURCE = $(RML.RES)
 include $(tbb_root)/build/common.inc
@@ -60,7 +60,7 @@ ifeq (linux,$(tbb_os))
 RML_ASM.OBJ = $(if $(findstring ia64,$(arch)),$(TBB_ASM.OBJ))
 endif
 
-RML_TBB_DEP= cache_aligned_allocator_rml.$(OBJ) dynamic_link_rml.$(OBJ) concurrent_vector_rml.$(OBJ) tbb_misc_rml.$(OBJ) tbb_misc_ex_rml.$(OBJ)
+RML_TBB_DEP= cache_aligned_allocator_rml.$(OBJ) dynamic_link_rml.$(OBJ) concurrent_vector_rml.$(OBJ) semaphore_rml.$(OBJ) tbb_misc_rml.$(OBJ) tbb_misc_ex_rml.$(OBJ)
 TBB_DEP_NON_RML_TEST= cache_aligned_allocator_rml.$(OBJ) dynamic_link_rml.$(OBJ) $(RML_ASM.OBJ) tbb_misc_rml.$(OBJ) tbb_misc_ex_rml.$(OBJ)
 TBB_DEP_RML_TEST= $(RML_ASM.OBJ)
 ifeq ($(cfg),debug)
diff --git a/build/Makefile.tbb b/build/Makefile.tbb
index 1ad9c04..99c20dc 100644
--- a/build/Makefile.tbb
+++ b/build/Makefile.tbb
@@ -28,7 +28,7 @@
 # Define rules for making the TBB shared library.
 #------------------------------------------------------------------------------
 
-tbb_root ?= "$(TBB30_INSTALL_DIR)"
+tbb_root ?= "$(TBBROOT)"
 BUILDING_PHASE=1
 include $(tbb_root)/build/common.inc
 DEBUG_SUFFIX=$(findstring _debug,_$(cfg))
@@ -73,6 +73,7 @@ TBB_CPLUS.OBJ = concurrent_hash_map.$(OBJ) \
 		condition_variable.$(OBJ) \
 		tbb_thread.$(OBJ) \
 		concurrent_monitor.$(OBJ) \
+		semaphore.$(OBJ) \
 		private_server.$(OBJ) \
 		rml_tbb.$(OBJ) \
 		task_group_context.$(OBJ) \
diff --git a/build/Makefile.tbbmalloc b/build/Makefile.tbbmalloc
index 4a89d98..f0bcdeb 100644
--- a/build/Makefile.tbbmalloc
+++ b/build/Makefile.tbbmalloc
@@ -27,7 +27,7 @@
 # default target
 default_malloc: malloc malloc_test
 
-tbb_root ?= $(TBB30_INSTALL_DIR)
+tbb_root ?= $(TBBROOT)
 BUILDING_PHASE=1
 TEST_RESOURCE = $(MALLOC.RES)
 include $(tbb_root)/build/common.inc
@@ -131,7 +131,8 @@ MALLOC_MAIN_TESTS = test_ScalableAllocator.$(TEST_EXT) \
                     test_ScalableAllocator_STL.$(TEST_EXT) \
                     test_malloc_compliance.$(TEST_EXT) \
                     test_malloc_regression.$(TEST_EXT) \
-                    test_malloc_init_shutdown.$(TEST_EXT)
+                    test_malloc_init_shutdown.$(TEST_EXT) \
+                    test_malloc_pools.$(TEST_EXT)
 MALLOC_OVERLOAD_TESTS =  test_malloc_overload.$(TEST_EXT) test_malloc_overload_proxy.$(TEST_EXT) test_malloc_atexit.$(TEST_EXT)
 
 MALLOC_LIB = $(call cross_suffix,$(MALLOC.LIB))
@@ -175,7 +176,10 @@ MALLOC_TESTS += $(MALLOC_OVERLOAD_TESTS) test_malloc_lib_unload.$(TEST_EXT)
 endif
 
 # run_cmd is usually empty
-malloc_test: $(call cross_suffix,$(MALLOC.DLL)) $(TEST_PREREQUISITE) $(MALLOC_TESTS)
+malloc_test: $(call cross_suffix,$(MALLOC.DLL)) malloc_test_no_depends
+
+malloc_test_no_depends: $(TEST_PREREQUISITE) $(MALLOC_TESTS)
+	$(run_cmd) ./test_malloc_pools.$(TEST_EXT) $(args) 1:4
 ifneq (,$(MALLOCPROXY.DLL))
 	$(run_cmd) ./test_malloc_atexit.$(TEST_EXT) $(args)
 	$(run_cmd) ./test_malloc_lib_unload.$(TEST_EXT) $(args)
diff --git a/build/Makefile.tbbproxy b/build/Makefile.tbbproxy
new file mode 100644
index 0000000..93433d0
--- /dev/null
+++ b/build/Makefile.tbbproxy
@@ -0,0 +1,116 @@
+# Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+#
+# This file is part of Threading Building Blocks.
+#
+# Threading Building Blocks is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public License
+# version 2 as published by the Free Software Foundation.
+#
+# Threading Building Blocks is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Threading Building Blocks; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# As a special exception, you may use this file as part of a free software
+# library without restriction.  Specifically, if other files instantiate
+# templates or use macros or inline functions from this file, or you compile
+# this file and link it with other files to produce an executable, this
+# file does not by itself cause the resulting executable to be covered by
+# the GNU General Public License.  This exception does not however
+# invalidate any other reasons why the executable file might be covered by
+# the GNU General Public License.
+
+# default target
+default_tbbproxy: tbbproxy tbbproxy_test
+
+tbb_root ?= $(TBBROOT)
+BUILDING_PHASE=1
+include $(tbb_root)/build/common.inc
+DEBUG_SUFFIX=$(findstring _debug,_$(cfg))
+
+PROXY_ROOT ?= $(tbb_root)/src/tbbproxy
+PROXY_SOURCE_ROOT ?= $(PROXY_ROOT)
+
+VPATH = $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) $(tbb_root)/src/tbb $(tbb_root)/src/test
+VPATH += $(PROXY_ROOT) $(PROXY_SOURCE_ROOT)
+
+CPLUS_FLAGS += $(DEFINE_KEY)__TBB_DLL_NAME=$(TBB.DLL)
+CPLUS_FLAGS += $(DEFINE_KEY)__TBB_LST=$(TBB.LST)
+CPLUS_FLAGS += $(foreach dir,$(VPATH),$(INCLUDE_KEY)$(dir))
+CPLUS_FLAGS += $(PIC_KEY)
+
+include $(tbb_root)/build/common_rules.inc
+
+#------------------------------------------------------
+# Define rules for making the TBB Proxy static library.
+#------------------------------------------------------
+
+# Object files that make up TBB Proxy
+PROXY_CPLUS.OBJ = tbbproxy.$(OBJ)
+PROXY_ASM.OBJ   = tbbproxy-asm.$(OBJ)
+PROXY.OBJ := $(PROXY_CPLUS.OBJ) $(PROXY_ASM.OBJ)
+
+# Not using intrinsics prevents undesired dependence from ICL libraries (e.g. libirc).
+# Not using default libs prevents link issues caused by different CRT versions in tbbproxy and in an app.
+$(PROXY.OBJ): CPLUS_FLAGS += $(DEFINE_KEY)ARCH_$(arch) $(DEFINE_KEY)OS_$(tbb_os) $(NOINTRINSIC_KEY) $(NODEFAULTLIB_KEY)
+
+$(PROXY_CPLUS.OBJ): %.$(OBJ): %.cpp
+	$(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(INCLUDES) $<
+
+$(PROXY.LIB): $(PROXY.OBJ)
+	$(AR) $(AR_FLAGS) $(AR_OUTPUT_KEY)$@ $^
+
+.PRECIOUS : %.$(ASMEXT)
+tbbproxy-asm.$(ASMEXT) : tbbproxy-$(tbb_os).$(ASMEXT) $(TBB.LST) $(TBB-OBJECTS.LST)
+	$(CPLUS) $(PREPROC_ONLY) $< $(INCLUDES) $(CPLUS_FLAGS) > $@
+
+.PHONY: tbbproxy
+ifeq (windows,$(tbb_os))
+tbbproxy: $(PROXY.LIB)
+else
+tbbproxy:
+endif
+
+#------------------------------------------------------
+# End of rules for making the TBB Proxy static library
+#------------------------------------------------------
+
+#------------------------------------------------------
+# Define rules for making the TBB Proxy unit tests
+#------------------------------------------------------
+
+add_debug=$(basename $(1))_debug$(suffix $(1))
+cross_suffix=$(if $(crosstest),$(if $(DEBUG_SUFFIX),$(subst _debug,,$(1)),$(call add_debug,$(1))),$(1))
+
+PROXY_LIB        = $(call cross_suffix,$(PROXY.LIB))
+PROXY_TESTS_SRCS = test_runtime_loader.cpp
+PROXY_TESTS_OBJS = $(PROXY_TESTS_SRCS:.cpp=.$(OBJ))
+PROXY_TESTS_EXES = $(PROXY_TESTS_OBJS:.$(OBJ)=.$(TEST_EXT))
+
+# Run rules.
+.PHONY: tbbproxy_test
+ifeq (windows,$(tbb_os))
+tbbproxy_test: $(call cross_suffix,$(PROXY.LIB)) $(TEST_PREREQUISITE) $(PROXY_TESTS_EXES)
+	$(run_cmd) ./test_runtime_loader.$(TEST_EXT) $(args)
+else
+tbbproxy_test:
+endif
+
+# Link rules.
+$(PROXY_TESTS_EXES): %.$(TEST_EXT): %.$(OBJ) $(PROXY_LIB)
+	$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(PROXY_LIB) $(LIBS) $(LIBDL) $(LINK_FLAGS)
+
+# Compilation rules.
+$(PROXY_TESTS_OBJS): %.$(OBJ): %.cpp
+	$(CPLUS) $(COMPILE_ONLY) $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(CXX_WARN_SUPPRESS) $(INCLUDES) $(OUTPUT_KEY)$@ $<
+
+#------------------------------------------------------
+# End of rules for making the TBB Proxy unit tests
+#------------------------------------------------------
+
+# Include automatically generated dependences
+-include *.d
diff --git a/build/Makefile.test b/build/Makefile.test
index 0e17b14..26c0a14 100644
--- a/build/Makefile.test
+++ b/build/Makefile.test
@@ -31,7 +31,7 @@
 
 default: test_tbb_plain test_tbb_old
 
-tbb_root ?= $(TBB30_INSTALL_DIR)
+tbb_root ?= $(TBBROOT)
 BUILDING_PHASE=1
 TEST_RESOURCE = $(TBB.RES)
 include $(tbb_root)/build/common.inc
@@ -44,11 +44,17 @@ DEBUG_SUFFIX=$(findstring _debug,$(call cross_cfg,_$(cfg)))
 VPATH = $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) $(tbb_root)/src/tbb $(tbb_root)/src/rml/client $(tbb_root)/src/old $(tbb_root)/src/test $(tbb_root)/src/perf
 
 CPLUS_FLAGS += $(if $(crosstest),$(DEFINE_KEY)__TBB_NO_IMPLICIT_LINKAGE=1)
+ifdef use_proxy
+    USE_PROXY_FLAG = $(DEFINE_KEY)HARNESS_USE_PROXY
+    CPLUS_FLAGS += $(USE_PROXY_FLAG)
+    LINK_TBB.LIB = $(PROXY.LIB)
+    LIBS += $(LIBDL)
+endif
 
 include $(tbb_root)/build/common_rules.inc
 
 # Rule for generating executable test
-%.$(TEST_EXT): %.$(OBJ) $(TBB.LIB)
+%.$(TEST_EXT): %.$(OBJ) $(TBB.LIB) $(if $(use_proxy),$(LINK_TBB.LIB))
 	$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(LINK_TBB.LIB) $(LIBS) $(AUX_LIBS) $(LINK_FLAGS)
 
 # Rules for generating a test DLL
@@ -57,9 +63,9 @@ include $(tbb_root)/build/common_rules.inc
 .PRECIOUS: %_dll.$(OBJ) %_dll.$(DLL)
 
 # Rules for the tests, which use TBB in a dynamically loadable library
+test_model_plugin.$(TEST_EXT): CPLUS_FLAGS := $(CPLUS_FLAGS:$(USE_PROXY_FLAG)=)
 test_model_plugin.$(TEST_EXT): test_model_plugin.$(OBJ) test_model_plugin_dll.$(DLL)
 	$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(LIBDL) $(LIBS) $(LINK_FLAGS)
-
 test_cilk_dynamic_load.$(TEST_EXT): test_cilk_dynamic_load.$(OBJ) test_cilk_dynamic_load_dll.$(DLL)
 	$(CPLUS) $(OUTPUT_KEY)$@ $(CPLUS_FLAGS) $< $(LINK_TBB.LIB) $(LIBDL) $(LIBS) $(LINK_FLAGS)
 
@@ -142,8 +148,8 @@ TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT)   \
 	test_combinable.$(TEST_EXT)                  \
 	test_task_auto_init.$(TEST_EXT)              \
 	test_concurrent_monitor.$(TEST_EXT)          \
+	semaphore.$(OBJ)                             \
 	test_critical_section.$(TEST_EXT)            \
-	test_semaphore.$(TEST_EXT)                   \
 	test_reader_writer_lock.$(TEST_EXT)          \
 	test_tbb_condition_variable.$(TEST_EXT)      \
 	test_intrusive_list.$(TEST_EXT)              \
@@ -151,12 +157,12 @@ TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT)   \
 	test_cilk_dynamic_load.$(TEST_EXT)           \
 	test_concurrent_priority_queue.$(TEST_EXT)   \
 	test_task_priority.$(TEST_EXT)               \
-	test_faf_task.$(TEST_EXT)                    \
+	test_task_enqueue.$(TEST_EXT)                \
 	test_hw_concurrency.$(TEST_EXT)              \
 	test_fp.$(TEST_EXT)                          \
+	test_flow_graph.$(TEST_EXT)                  \
 	test_broadcast_node.$(TEST_EXT)              \
 	test_continue_node.$(TEST_EXT)               \
-	test_executable_node.$(TEST_EXT)             \
 	test_function_node.$(TEST_EXT)               \
 	test_limiter_node.$(TEST_EXT)                \
 	test_join_node.$(TEST_EXT)                   \
@@ -167,7 +173,11 @@ TEST_TBB_PLAIN.EXE = test_assembly.$(TEST_EXT)   \
 	test_source_node.$(TEST_EXT)                 \
 	test_overwrite_node.$(TEST_EXT)              \
 	test_write_once_node.$(TEST_EXT)             \
+	test_or_node.$(TEST_EXT)                     \
+	test_multioutput_function_node.$(TEST_EXT)   \
+	test_split_node.$(TEST_EXT)                  \
 	test_tbb_version.$(TEST_EXT)                 # insert new files right above
+TEST_TBB_PLAIN.OBJ = $(TEST_TBB_PLAIN.EXE:$(TEST_EXT)=.$(OBJ))
 
 ifdef OPENMP_FLAG
 TEST_TBB_PLAIN.EXE += test_tbb_openmp
@@ -240,7 +250,7 @@ test_tbb_plain: $(TEST_PREREQUISITE) $(TASK_CPP_DIRECTLY_INCLUDED) $(TEST_TBB_PL
 	$(run_cmd) ./test_tbb_header.$(TEST_EXT) $(args)
 	$(run_cmd) ./test_concurrent_monitor.$(TEST_EXT) $(args) 6:8
 	$(run_cmd) ./test_critical_section.$(TEST_EXT) $(args) 1:4
-	$(run_cmd) ./test_semaphore.$(TEST_EXT) $(args) 1:4
+#	$(run_cmd) ./test_semaphore.$(TEST_EXT) $(args) 1:4
 	$(run_cmd) ./test_reader_writer_lock.$(TEST_EXT) $(args) 1:4
 	$(run_cmd) ./test_tbb_condition_variable.$(TEST_EXT) $(args) 1:4
 	$(run_cmd) ./test_intrusive_list.$(TEST_EXT) $(args)
@@ -248,12 +258,12 @@ test_tbb_plain: $(TEST_PREREQUISITE) $(TASK_CPP_DIRECTLY_INCLUDED) $(TEST_TBB_PL
 	$(run_cmd) ./test_cilk_dynamic_load.$(TEST_EXT) $(args)
 	$(run_cmd) ./test_concurrent_priority_queue.$(TEST_EXT) $(args) 1:4
 	$(run_cmd) ./test_task_priority.$(TEST_EXT) $(args)
-	$(run_cmd) ./test_faf_task.$(TEST_EXT) $(args)
+	$(run_cmd) ./test_task_enqueue.$(TEST_EXT) $(args) 1:4
 	$(run_cmd) ./test_hw_concurrency.$(TEST_EXT) $(args)
 	$(run_cmd) ./test_fp.$(TEST_EXT) $(args)
+	$(run_cmd) ./test_flow_graph.$(TEST_EXT) $(args) 1:4
 	$(run_cmd) ./test_broadcast_node.$(TEST_EXT) $(args) 1:4
 	$(run_cmd) ./test_continue_node.$(TEST_EXT) $(args) 1:4
-	$(run_cmd) ./test_executable_node.$(TEST_EXT) $(args) 1:4
 	$(run_cmd) ./test_function_node.$(TEST_EXT) $(args) 1:4
 	$(run_cmd) ./test_limiter_node.$(TEST_EXT) $(args) 1:4
 	$(run_cmd) ./test_join_node.$(TEST_EXT) $(args) 1:4
@@ -264,6 +274,9 @@ test_tbb_plain: $(TEST_PREREQUISITE) $(TASK_CPP_DIRECTLY_INCLUDED) $(TEST_TBB_PL
 	$(run_cmd) ./test_source_node.$(TEST_EXT) $(args) 1:4
 	$(run_cmd) ./test_overwrite_node.$(TEST_EXT) $(args) 1:4
 	$(run_cmd) ./test_write_once_node.$(TEST_EXT) $(args) 1:4
+	$(run_cmd) ./test_or_node.$(TEST_EXT) $(args) 1:4
+	$(run_cmd) ./test_multioutput_function_node.$(TEST_EXT) $(args) 1:4
+	$(run_cmd) ./test_split_node.$(TEST_EXT) $(args) 1:4
 
 CPLUS_FLAGS_DEPRECATED = $(DEFINE_KEY)TBB_DEPRECATED=1 $(subst $(WARNING_KEY),,$(CPLUS_FLAGS)) $(WARNING_SUPPRESS)
 
diff --git a/build/SunOS.suncc.inc b/build/SunOS.suncc.inc
index 8ec15ac..d29c60f 100644
--- a/build/SunOS.suncc.inc
+++ b/build/SunOS.suncc.inc
@@ -35,7 +35,8 @@ DYLIB_KEY = -G
 LIBDL = -ldl
 # WARNING_AS_ERROR_KEY = -errwarn=%all
 WARNING_AS_ERROR_KEY = Warning as error
-WARNING_SUPPRESS = -erroff=unassigned,attrskipunsup,badargtype2w,badbinaryopw,wbadasg,wvarhidemem
+# Supported Solaris Studio* 12.2 and above, remove ',inlasmpnu' in the line below to build by compiler prior Solaris Studio* 12.2 
+WARNING_SUPPRESS = -erroff=unassigned,attrskipunsup,badargtype2w,badbinaryopw,wbadasg,wvarhidemem,inlasmpnu
 tbb_strict=0
 
 TBB_NOSTRICT = 1
@@ -77,8 +78,8 @@ ifeq (sparc,$(arch))
     LIB_LINK_FLAGS += -m64
 endif 
 
-export TBB_CUSTOM_VARS_SH=export CXXFLAGS="-I$${TBB30_INSTALL_DIR}/include -library=stlport4 $(CXXFLAGS) -M$${TBB30_INSTALL_DIR}/build/suncc.map.pause"
-export TBB_CUSTOM_VARS_CSH=setenv CXXFLAGS "-I$${TBB30_INSTALL_DIR}/include -library=stlport4 $(CXXFLAGS) -M$${TBB30_INSTALL_DIR}/build/suncc.map.pause"
+export TBB_CUSTOM_VARS_SH=export CXXFLAGS="-I$${TBBROOT}/include -library=stlport4 $(CXXFLAGS) -M$${TBBROOT}/build/suncc.map.pause"
+export TBB_CUSTOM_VARS_CSH=setenv CXXFLAGS "-I$${TBBROOT}/include -library=stlport4 $(CXXFLAGS) -M$${TBBROOT}/build/suncc.map.pause"
 
 #------------------------------------------------------------------------------
 # Setting assembler data.
diff --git a/build/big_iron.inc b/build/big_iron.inc
new file mode 100644
index 0000000..a533188
--- /dev/null
+++ b/build/big_iron.inc
@@ -0,0 +1,74 @@
+# Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+#
+# This file is part of Threading Building Blocks.
+#
+# Threading Building Blocks is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public License
+# version 2 as published by the Free Software Foundation.
+#
+# Threading Building Blocks is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Threading Building Blocks; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+# As a special exception, you may use this file as part of a free software
+# library without restriction.  Specifically, if other files instantiate
+# templates or use macros or inline functions from this file, or you compile
+# this file and link it with other files to produce an executable, this
+# file does not by itself cause the resulting executable to be covered by
+# the GNU General Public License.  This exception does not however
+# invalidate any other reasons why the executable file might be covered by
+# the GNU General Public License.
+
+#------------------------------------------------------------------------------
+# Defines settings for building the TBB run-time as a static library.
+# Use these only on platforms where dynamic linking is impractical.
+#
+# IF YOU USE TBB AS A STATIC LIBRARY, YOU MUST GUARANTEE THAT ONLY ONE COPY OF 
+# THE TBB RUN-TIME IS LINKED INTO AN APPLICATION!  LINKING IN MULTIPLE COPIES
+# OF THE TBB RUN-TIME, DIRECTLY OR INDIRECTLY, MAY CAUSE PROGRAM FAILURE!
+#------------------------------------------------------------------------------
+
+# Note that ITT_NOTIFY allows to selectively remove the definition of
+# DO_ITT_NOTIFY without sabotaging deferred expansion of CPLUS_FLAGS.
+# TODO: currently only in linux.{gcc,xl}.inc
+
+# Note that -pthread with xl gives "1501-210 (W) command option t contains an incorrect subargument";
+# multithreading is instead achieved by using the _r affix in the compiler name.
+# TODO: is -lpthread still relevant/needed with XL and _r affix?
+
+# Note that -D__TBB_NO_DLOPEN is only for scalability,
+# and is not necessarily needed by any static build.
+
+# OS specific settings =>
+    LIB_LINK_CMD = ar rcs
+    LIB_LINK_FLAGS =
+    LIB_LINK_LIBS =
+    LIB_OUTPUT_KEY =
+    ifeq ($(tbb_os),linux)
+        ifeq ($(compiler),gcc)
+            LIBS = -pthread -ldl -lrt
+        endif
+        ifeq ($(compiler),xl)
+            LIBS = -lpthread -ldl -lrt
+        endif
+        LINK_FLAGS =
+    endif
+    CXXFLAGS += -D__TBB_DYNAMIC_LOAD_ENABLED=0
+    ITT_NOTIFY =
+    LIBEXT = a
+    LIBPREF = lib
+# <= OS specific settings
+
+TBB.DLL = $(LIBPREF)tbb$(DEBUG_SUFFIX).$(LIBEXT)
+TBB.LST =
+TBB.DEF =
+MALLOC.DLL = $(LIBPREF)tbbmalloc$(DEBUG_SUFFIX).$(LIBEXT)
+MALLOC.DEF =
+MALLOCPROXY.DLL =
+MALLOCPROXY.DEF =
+LINK_TBB.LIB = $(TBB.DLL)
diff --git a/build/common_rules.inc b/build/common_rules.inc
index 95d6f9f..e8b9d88 100644
--- a/build/common_rules.inc
+++ b/build/common_rules.inc
@@ -79,7 +79,7 @@ CONLY ?= $(CPLUS)
 
 # TODO Rule for generating .asm file if needed for visual inspection
 %.asm: %.cpp
-	$(CPLUS) /c /Fa $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES) $<
+	$(CPLUS) /c /FAs /Fa $(CPLUS_FLAGS) $(CXX_ONLY_FLAGS) $(INCLUDES) $<
 
 # TODO Rule for generating .s file if needed for visual inspection
 %.s: %.cpp
diff --git a/build/generate_tbbvars.bat b/build/generate_tbbvars.bat
index f42db52..05dc4fe 100644
--- a/build/generate_tbbvars.bat
+++ b/build/generate_tbbvars.bat
@@ -37,10 +37,10 @@ if not x%UNIXMODE%==x set _INCLUDE=CPATH& set _LIB=LIBRARY_PATH
 if exist tbbvars.bat goto skipbat
 echo Generating local tbbvars.bat
 echo @echo off>tbbvars.bat
-echo SET TBB30_INSTALL_DIR=%actual_root%>>tbbvars.bat
+echo SET TBBROOT=%actual_root%>>tbbvars.bat
 echo SET TBB_ARCH_PLATFORM=%arch%\%runtime%>>tbbvars.bat
 echo SET TBB_TARGET_ARCH=%arch%>>tbbvars.bat
-echo SET %_INCLUDE%=%%TBB30_INSTALL_DIR%%\include;%%%_INCLUDE%%%>>tbbvars.bat
+echo SET %_INCLUDE%=%%TBBROOT%%\include;%%%_INCLUDE%%%>>tbbvars.bat
 echo SET %_LIB%=%bin_dir%;%%%_LIB%%%>>tbbvars.bat
 echo SET PATH=%bin_dir%;%%PATH%%>>tbbvars.bat
 if not x%UNIXMODE%==x echo SET LD_LIBRARY_PATH=%bin_dir%;%%LD_LIBRARY_PATH%%>>tbbvars.bat
@@ -49,10 +49,10 @@ if not x%UNIXMODE%==x echo SET LD_LIBRARY_PATH=%bin_dir%;%%LD_LIBRARY_PATH%%>>tb
 if exist tbbvars.sh goto skipsh
 echo Generating local tbbvars.sh
 echo #!/bin/sh>tbbvars.sh
-echo export TBB30_INSTALL_DIR="%fslash_root%">>tbbvars.sh
+echo export TBBROOT="%fslash_root%">>tbbvars.sh
 echo export TBB_ARCH_PLATFORM="%arch%\%runtime%">>tbbvars.sh
 echo export TBB_TARGET_ARCH="%arch%">>tbbvars.sh
-echo export %_INCLUDE%="${TBB30_INSTALL_DIR}/include;$%_INCLUDE%">>tbbvars.sh
+echo export %_INCLUDE%="${TBBROOT}/include;$%_INCLUDE%">>tbbvars.sh
 echo export %_LIB%="%fslash_bin_dir%;$%_LIB%">>tbbvars.sh
 echo export PATH="%fslash_bin_dir%;$PATH">>tbbvars.sh
 if not x%UNIXMODE%==x echo export LD_LIBRARY_PATH="%fslash_bin_dir%;$LD_LIBRARY_PATH">>tbbvars.sh
@@ -61,10 +61,10 @@ if not x%UNIXMODE%==x echo export LD_LIBRARY_PATH="%fslash_bin_dir%;$LD_LIBRARY_
 if exist tbbvars.csh goto skipcsh
 echo Generating local tbbvars.csh
 echo #!/bin/csh>tbbvars.csh
-echo setenv TBB30_INSTALL_DIR "%actual_root%">>tbbvars.csh
+echo setenv TBBROOT "%actual_root%">>tbbvars.csh
 echo setenv TBB_ARCH_PLATFORM "%arch%\%runtime%">>tbbvars.csh
 echo setenv TBB_TARGET_ARCH "%arch%">>tbbvars.csh
-echo setenv %_INCLUDE% "${TBB30_INSTALL_DIR}\include;$%_INCLUDE%">>tbbvars.csh
+echo setenv %_INCLUDE% "${TBBROOT}\include;$%_INCLUDE%">>tbbvars.csh
 echo setenv %_LIB% "%bin_dir%;$%_LIB%">>tbbvars.csh
 echo setenv PATH "%bin_dir%;$PATH">>tbbvars.csh
 if not x%UNIXMODE%==x echo setenv LD_LIBRARY_PATH "%bin_dir%;$LD_LIBRARY_PATH">>tbbvars.csh
diff --git a/build/generate_tbbvars.sh b/build/generate_tbbvars.sh
index 16f4639..4bc967e 100644
--- a/build/generate_tbbvars.sh
+++ b/build/generate_tbbvars.sh
@@ -34,12 +34,12 @@ cd "$bin_dir"   # to EOL encoding
 [ "`uname`" = "Darwin" ] && dll_path="DYLD_LIBRARY_PATH" || dll_path="LD_LIBRARY_PATH" #
 [ -f ./tbbvars.sh ] || cat >./tbbvars.sh <<EOF
 #!/bin/bash
-export TBB30_INSTALL_DIR="${tbb_root}" #
+export TBBROOT="${tbb_root}" #
 tbb_bin="${bin_dir}" #
 if [ -z "\$CPATH" ]; then #
-    export CPATH="\${TBB30_INSTALL_DIR}/include" #
+    export CPATH="\${TBBROOT}/include" #
 else #
-    export CPATH="\${TBB30_INSTALL_DIR}/include:\$CPATH" #
+    export CPATH="\${TBBROOT}/include:\$CPATH" #
 fi #
 if [ -z "\$LIBRARY_PATH" ]; then #
     export LIBRARY_PATH="\${tbb_bin}" #
@@ -55,12 +55,12 @@ ${TBB_CUSTOM_VARS_SH} #
 EOF
 [ -f ./tbbvars.csh ] || cat >./tbbvars.csh <<EOF
 #!/bin/csh
-setenv TBB30_INSTALL_DIR "${tbb_root}" #
+setenv TBBROOT "${tbb_root}" #
 setenv tbb_bin "${bin_dir}" #
 if (! \$?CPATH) then #
-    setenv CPATH "\${TBB30_INSTALL_DIR}/include" #
+    setenv CPATH "\${TBBROOT}/include" #
 else #
-    setenv CPATH "\${TBB30_INSTALL_DIR}/include:\$CPATH" #
+    setenv CPATH "\${TBBROOT}/include:\$CPATH" #
 endif #
 if (! \$?LIBRARY_PATH) then #
     setenv LIBRARY_PATH "\${tbb_bin}" #
diff --git a/build/index.html b/build/index.html
index ae10fc4..61846a8 100644
--- a/build/index.html
+++ b/build/index.html
@@ -224,10 +224,9 @@ See the Makefile infrastructure files for examples.
 <P></P>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
 <P></P>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
-<P></P>
+Intel and Itanium are registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
 </HTML>
diff --git a/build/linux.gcc.inc b/build/linux.gcc.inc
index ec356f7..1c20c3f 100644
--- a/build/linux.gcc.inc
+++ b/build/linux.gcc.inc
@@ -45,7 +45,7 @@ TBB_NOSTRICT = 1
 CPLUS = g++
 CONLY = gcc
 LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY)
-LIBS = -lpthread -lrt
+LIBS += -lpthread -lrt
 LINK_FLAGS = -Wl,-rpath-link=.
 C_FLAGS = $(CPLUS_FLAGS)
 
@@ -118,7 +118,7 @@ ASSEMBLY_SOURCE=$(arch)-gas
 ifeq (ia64,$(arch))
     ASM_FLAGS += -xexplicit
     TBB_ASM.OBJ += atomic_support.o lock_byte.o log2.o pause.o ia64_misc.o
-    MALLOC_ASM.OBJ += atomic_support.o lock_byte.o pause.o
+    MALLOC_ASM.OBJ += atomic_support.o lock_byte.o pause.o log2.o
 endif
 #------------------------------------------------------------------------------
 # End of setting assembler data.
diff --git a/build/linux.icc.inc b/build/linux.icc.inc
index d477b53..fa24432 100644
--- a/build/linux.icc.inc
+++ b/build/linux.icc.inc
@@ -44,7 +44,7 @@ CPLUS = icpc
 CONLY = icc
 
 ifeq (release,$(cfg))
-CPLUS_FLAGS = -O2 -strict-ansi -DUSE_PTHREAD
+CPLUS_FLAGS = -O2 -g -strict-ansi -DUSE_PTHREAD
 else
 CPLUS_FLAGS = -O0 -g -strict-ansi -DUSE_PTHREAD -DTBB_USE_DEBUG
 endif
@@ -57,14 +57,15 @@ endif
 
 OPENMP_FLAG = -openmp
 LIB_LINK_FLAGS = -shared -i-static -Wl,-soname=$(BUILDING_LIBRARY)
-LIBS = -lpthread -lrt
+LIBS += -lpthread -lrt
 C_FLAGS = $(CPLUS_FLAGS)
 
 TBB_ASM.OBJ=
 MALLOC_ASM.OBJ=
 
 ifeq (ia32,$(arch))
-    CPLUS_FLAGS += -falign-stack=maintain-16-byte
+    CPLUS_FLAGS += -m32 -falign-stack=maintain-16-byte
+    LIB_LINK_FLAGS += -m32
 endif
 
 ifeq (ia64,$(arch))
@@ -94,7 +95,7 @@ ASSEMBLY_SOURCE=$(arch)-gas
 ifeq (ia64,$(arch))
     ASM_FLAGS += -xexplicit
     TBB_ASM.OBJ += atomic_support.o lock_byte.o log2.o pause.o ia64_misc.o
-    MALLOC_ASM.OBJ += atomic_support.o lock_byte.o pause.o
+    MALLOC_ASM.OBJ += atomic_support.o lock_byte.o pause.o log2.o
 endif
 #------------------------------------------------------------------------------
 # End of setting assembler data.
diff --git a/build/linux.inc b/build/linux.inc
index e0e2889..aea0392 100644
--- a/build/linux.inc
+++ b/build/linux.inc
@@ -121,7 +121,7 @@ TBB_NO_VERSION.DLL=libtbb$(CPF_SUFFIX)$(DEBUG_SUFFIX).$(DLL)
 LINK_TBB.LIB = $(TBB_NO_VERSION.DLL)
 
 MALLOC_NO_VERSION.DLL = libtbbmalloc$(DEBUG_SUFFIX).$(DLL)
-MALLOC.DEF = $(MALLOC_ROOT)/lin-tbbmalloc-export.def
+MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-tbbmalloc-export.def
 MALLOC.DLL = $(MALLOC_NO_VERSION.DLL).$(SONAME_SUFFIX)
 MALLOC.LIB = $(MALLOC_NO_VERSION.DLL)
 LINK_MALLOC.LIB = $(MALLOC_NO_VERSION.DLL)
diff --git a/build/linux.gcc.inc b/build/linux.xl.inc
similarity index 55%
copy from build/linux.gcc.inc
copy to build/linux.xl.inc
index ec356f7..6f980d9 100644
--- a/build/linux.gcc.inc
+++ b/build/linux.xl.inc
@@ -24,29 +24,30 @@
 # invalidate any other reasons why the executable file might be covered by
 # the GNU General Public License.
 
-COMPILE_ONLY = -c -MMD
-PREPROC_ONLY = -E -x c++
+####### Detections and Commands ###############################################
+
+COMPILE_ONLY = -c
+PREPROC_ONLY = -E -qsourcetype=c
 INCLUDE_KEY = -I
 DEFINE_KEY = -D
 OUTPUT_KEY = -o #
 OUTPUTOBJ_KEY = -o #
-PIC_KEY = -fPIC
-WARNING_AS_ERROR_KEY = -Werror
-WARNING_KEY = -Wall
-TEST_WARNING_KEY = -Wshadow -Wcast-qual -Woverloaded-virtual -Wnon-virtual-dtor $(if $(findstring cc4., $(runtime)),-Wextra)
+PIC_KEY = -qpic
+WARNING_AS_ERROR_KEY = -qhalt=w
+WARNING_KEY =
+TEST_WARNING_KEY =
 
-WARNING_SUPPRESS = -Wno-parentheses -Wno-non-virtual-dtor
-DYLIB_KEY = -shared
+WARNING_SUPPRESS =
+DYLIB_KEY = -qmkshrobj
 EXPORT_KEY = -Wl,--version-script,
 LIBDL = -ldl
 
 TBB_NOSTRICT = 1
 
-CPLUS = g++
-CONLY = gcc
+CPLUS = xlc++_r
+CONLY = xlc_r
 LIB_LINK_FLAGS = $(DYLIB_KEY) -Wl,-soname=$(BUILDING_LIBRARY)
 LIBS = -lpthread -lrt
-LINK_FLAGS = -Wl,-rpath-link=.
 C_FLAGS = $(CPLUS_FLAGS)
 
 ITT_NOTIFY = -DDO_ITT_NOTIFY
@@ -57,78 +58,55 @@ ifeq ($(cfg), debug)
         CPLUS_FLAGS = -DTBB_USE_DEBUG $(ITT_NOTIFY) -g -O0 -DUSE_PTHREAD
 endif
 
-ifneq (0,$(cpp0x))
-    CXX_ONLY_FLAGS = -std=c++0x
-endif
+# Adding directly to CPLUS_FLAGS instead of to WARNING_SUPPRESS because otherwise it would not be used in several tests (why not?).
+# Suppress warnings like:
+# - "1500-029: (W) WARNING: subprogram [...] could not be inlined into [...]."
+# - "1501-201: (W) Maximum number of common component diagnostics, 10  has been exceeded."
+#     see http://www-01.ibm.com/support/docview.wss?uid=swg1LI72843
+#     it seems that the internal compiler error that would ensue has now been avoided, making the condition harmless
+# - "1540-0198 (W) The omitted keyword "private" is assumed for base class "no_copy"."
+# - "1540-0822 (W) The name "__FUNCTION__" must not be defined as a macro."
+CPLUS_FLAGS += -qsuppress=1500-029:1501-201:1540-0198:1540-0822
 
-TBB_ASM.OBJ=
-MALLOC_ASM.OBJ=
+ASM=
+ASM_FLAGS=
 
-ifeq (ia64,$(arch))
-# Position-independent code (PIC) is a must on IA-64, even for regular (not shared) executables
-    CPLUS_FLAGS += $(PIC_KEY)
-endif
+TBB_ASM.OBJ=
 
 ifeq (intel64,$(arch))
-    CPLUS_FLAGS += -m64
-    LIB_LINK_FLAGS += -m64
+    CPLUS_FLAGS += -q64
+    LIB_LINK_FLAGS += -q64
 endif
 
+# TODO: equivalent for -march=pentium4 in CPLUS_FLAGS
 ifeq (ia32,$(arch))
-    CPLUS_FLAGS += -m32 -march=pentium4
-    LIB_LINK_FLAGS += -m32
+    CPLUS_FLAGS += -q32 -qarch=pentium4
+    LIB_LINK_FLAGS += -q32
 endif
 
 ifeq (ppc64,$(arch))
-    CPLUS_FLAGS += -m64
-    LIB_LINK_FLAGS += -m64
+    CPLUS_FLAGS += -q64
+    LIB_LINK_FLAGS += -q64
 endif
 
 ifeq (ppc32,$(arch))
-    CPLUS_FLAGS += -m32
-    LIB_LINK_FLAGS += -m32
+    CPLUS_FLAGS += -q32
+    LIB_LINK_FLAGS += -q32
 endif
 
 ifeq (bgp,$(arch))
-    CPLUS = mpicxx
-    CONLY = mpicc
+    CPLUS = bgxlC_r
+    CONLY = bgxlc_r
 endif
 
-# for some gcc versions on Solaris, -m64 may imply V9, but perhaps not everywhere (TODO: verify)
-ifeq (sparc,$(arch))
-    CPLUS_FLAGS    += -mcpu=v9 -m64
-    LIB_LINK_FLAGS += -mcpu=v9 -m64
-endif
-
-#------------------------------------------------------------------------------
-# Setting assembler data.
-#------------------------------------------------------------------------------
-ASM = as
-ifeq (intel64,$(arch))
-    ASM_FLAGS += --64
-endif
-ifeq (ia32,$(arch))
-    ASM_FLAGS += --32
-endif
-ifeq ($(cfg),debug)
-    ASM_FLAGS += -g
-endif
-
-ASSEMBLY_SOURCE=$(arch)-gas
-ifeq (ia64,$(arch))
-    ASM_FLAGS += -xexplicit
-    TBB_ASM.OBJ += atomic_support.o lock_byte.o log2.o pause.o ia64_misc.o
-    MALLOC_ASM.OBJ += atomic_support.o lock_byte.o pause.o
-endif
-#------------------------------------------------------------------------------
-# End of setting assembler data.
-#------------------------------------------------------------------------------
-
 #------------------------------------------------------------------------------
 # Setting tbbmalloc data.
 #------------------------------------------------------------------------------
 
-M_CPLUS_FLAGS = $(CPLUS_FLAGS) -fno-rtti -fno-exceptions -fno-schedule-insns2
+# Suppress innumerable warnings like "1540-1088 (W) The exception specification is being ignored."
+# Suppress             warnings like "1540-1090 (I) The destructor of "lock" might not be called."
+# TODO: aren't these warnings an indication that -qnoeh might not be appropriate?
+M_CPLUS_FLAGS = $(CPLUS_FLAGS) -qnortti -qnoeh -qsuppress=1540-1088:1540-1090
 
 #------------------------------------------------------------------------------
 # End of setting tbbmalloc data.
diff --git a/build/macos.icc.inc b/build/macos.icc.inc
index f3f21f8..37b5d0d 100644
--- a/build/macos.icc.inc
+++ b/build/macos.icc.inc
@@ -70,6 +70,9 @@ ifeq (intel64,$(arch))
     ASM_FLAGS += -arch x86_64
 endif
 ifeq (ia32,$(arch))
+    CPLUS_FLAGS += -m32
+    LINK_FLAGS += -m32
+    LIB_LINK_FLAGS += -m32
     ASM_FLAGS += -arch i386
 endif
 ifeq ($(cfg), debug)
diff --git a/build/vsproject/index.html b/build/vsproject/index.html
index cd1788a..6179447 100644
--- a/build/vsproject/index.html
+++ b/build/vsproject/index.html
@@ -22,10 +22,9 @@ This directory contains the visual studio* 2005 solution to build Threading Buil
 <P></P>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
 <P></P>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
-<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
+<p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
 </HTML>
diff --git a/build/vsproject/tbb.vcproj b/build/vsproject/tbb.vcproj
index 704111d..1c77711 100644
--- a/build/vsproject/tbb.vcproj
+++ b/build/vsproject/tbb.vcproj
@@ -325,9 +325,9 @@
 " Outputs=""$(IntDir)\tbb.def""/>
 				</FileConfiguration>
 			</File>
-			<File RelativePath="..\..\src\tbb\concurrent_hash_map.cpp"/><File RelativePath="..\..\src\tbb\concurrent_queue.cpp"/><File RelativePath="..\..\src\tbb\concurrent_vector.cpp"/><File RelativePath="..\..\src\tbb\dynamic_link.cpp"/><File RelativePath="..\..\src\tbb\itt_notify.cpp"/><File RelativePath="..\..\src\tbb\cache_aligned_allocator.cpp"/><File RelativePath="..\..\src\tbb\pipeline.cpp"/><File RelativePath="..\..\src\tbb\queuing_mutex.cpp"/><File RelativePath="..\..\src\tbb\queuing_r [...]
+			<File RelativePath="..\..\src\tbb\concurrent_hash_map.cpp"/><File RelativePath="..\..\src\tbb\concurrent_queue.cpp"/><File RelativePath="..\..\src\tbb\concurrent_vector.cpp"/><File RelativePath="..\..\src\tbb\dynamic_link.cpp"/><File RelativePath="..\..\src\tbb\itt_notify.cpp"/><File RelativePath="..\..\src\tbb\cache_aligned_allocator.cpp"/><File RelativePath="..\..\src\tbb\pipeline.cpp"/><File RelativePath="..\..\src\tbb\queuing_mutex.cpp"/><File RelativePath="..\..\src\tbb\queuing_r [...]
 		<Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
-			<File RelativePath="..\..\include\tbb\_concurrent_queue_internal.h">
+			<File RelativePath="..\..\include\tbb\internal\_concurrent_queue_impl.h">
 			</File>
 			<File RelativePath="..\..\include\tbb\_tbb_windef.h">
 			</File>
diff --git a/build/vsproject/tbbmalloc.vcproj b/build/vsproject/tbbmalloc.vcproj
index ff5ac1d..d00a511 100644
--- a/build/vsproject/tbbmalloc.vcproj
+++ b/build/vsproject/tbbmalloc.vcproj
@@ -261,7 +261,7 @@
 			</File>
 			<File RelativePath="..\..\src\tbbmalloc\frontend.cpp"/><File RelativePath="..\..\src\tbbmalloc\backend.cpp"/><File RelativePath="..\..\src\tbbmalloc\large_objects.cpp"/><File RelativePath="..\..\src\tbbmalloc\backref.cpp"/><File RelativePath="..\..\src\tbb\itt_notify.cpp"/><File RelativePath="..\..\src\tbbmalloc\tbbmalloc.cpp"/></Filter>
 		<Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
-			<File RelativePath="..\..\include\tbb\_concurrent_queue_internal.h">
+			<File RelativePath="..\..\include\tbb\internal\_concurrent_queue_impl.h">
 			</File>
 			<File RelativePath="..\..\include\tbb\_tbb_windef.h">
 			</File>
diff --git a/build/windows.gcc.inc b/build/windows.gcc.inc
index 807bd20..6233c33 100644
--- a/build/windows.gcc.inc
+++ b/build/windows.gcc.inc
@@ -44,7 +44,7 @@ ifeq (ia32,$(arch))
 else
     TBB.LST = $(tbb_root)/src/tbb/win64-gcc-tbb-export.lst
 endif
-MALLOC.DEF = $(MALLOC_ROOT)/win-gcc-tbbmalloc-export.def
+MALLOC.DEF = $(MALLOC_ROOT)/$(def_prefix)-gcc-tbbmalloc-export.def
 RML.DEF = $(RML_SERVER_ROOT)/lin-rml-export.def
 
 LINK_TBB.LIB = $(TBB.LIB)
diff --git a/build/windows.inc b/build/windows.inc
index 7b09ee4..6d1150e 100644
--- a/build/windows.inc
+++ b/build/windows.inc
@@ -53,9 +53,14 @@ MD=cmd /c mkdir
 SLASH=\\
 NUL = nul
 
+AR=lib
+AR_OUTPUT_KEY=/out:
+AR_FLAGS=/nologo /nodefaultlib
+
 OBJ = obj
 DLL = dll
 LIBEXT = lib
+ASMEXT = asm
 
 def_prefix = $(if $(findstring ia32,$(arch)),win32,win64)
 
@@ -89,6 +94,8 @@ LINK_MALLOC.LIB = $(MALLOC.LIB)
 MALLOCPROXY.DLL = tbbmalloc_proxy$(DEBUG_SUFFIX).$(DLL)
 MALLOCPROXY.LIB = tbbmalloc_proxy$(DEBUG_SUFFIX).$(LIBEXT)
 
+PROXY.LIB = tbbproxy$(DEBUG_SUFFIX).$(LIBEXT)
+
 RML.DEF = $(RML_SERVER_ROOT)/$(def_prefix)-rml-export.def
 RML.DLL = irml$(DEBUG_SUFFIX).$(DLL)
 RML.LIB = irml$(DEBUG_SUFFIX).$(LIBEXT)
diff --git a/build/xbox360.cl.inc b/build/xbox360.cl.inc
index a06e2e8..0322df6 100644
--- a/build/xbox360.cl.inc
+++ b/build/xbox360.cl.inc
@@ -44,7 +44,7 @@ ifeq ($(cfg), release)
 endif
 ifeq ($(cfg), debug)
         CPLUS_FLAGS = $(MS_CRT_KEY) /Od /Ob0 /Zi $(EH_FLAGS) /Zc:forScope \
-                      /DTBB_DO_ASSERT /D_XBOX /DTBB_NO_LEGACY=1
+                      /DTBB_USE_DEBUG /D_XBOX /DTBB_NO_LEGACY=1
         ASM_FLAGS = /DUSE_FRAME_POINTER
 endif
 
diff --git a/doc/Release_Notes.txt b/doc/Release_Notes.txt
index 96f70ec..d92e7a6 100644
--- a/doc/Release_Notes.txt
+++ b/doc/Release_Notes.txt
@@ -1,6 +1,6 @@
 ------------------------------------------------------------------------
 Intel(R) Threading Building Blocks - Release Notes
-		  Version 3.0
+		  Version 4.0
 ------------------------------------------------------------------------
 
 
@@ -8,7 +8,7 @@ System Requirements
 -------------------
 
 Intel(R) Threading Building Blocks (Intel(R) TBB) is available
-commercially (see http://www.intel.com/software/products/threading) as a
+commercially (see http://software.intel.com/en-us/intel-tbb) as a
 binary distribution, and in open source, in both source and binary
 forms (see http://threadingbuildingblocks.org).
 
@@ -27,68 +27,60 @@ Hardware - Recommended
 	    or higher
     Linux* Systems
 	Intel(R) Core(TM) 2 Duo processor or Intel(R) Xeon(R) processor
-	    or Intel(R) Itanium(R) processor or higher
+	    or higher
     Mac OS* X Systems
 	Intel(R) Core(TM) 2 Duo processor or higher
 
 Hardware - Supported
 
     Intel(R) Pentium(R) 4 processor family and higher
-    Intel(R) Itanium(R) processor family (Linux* systems only)
     Non Intel(R) processors compatible with the above processors
 
 Software - Minimum Requirements
 
     Supported operating system (see below)
     Supported compiler (see below)
-    Xcode* tool suite 3.1.4 or higher (Mac OS* X systems only)
-    Microsoft* Internet Explorer* 8.0, or other compatible web browser
-    Adobe(R) Reader(R)* 6.0 or higher
+    Adobe(R) Reader(R)* 7.0 or higher
 
 Software - Recommended
 
-    Intel(R) Parallel Studio
-    Intel(R) C++ Compiler 11.1 or higher
-    Intel(R) Thread Checker 3.1 or higher
-    Intel(R) Thread Profiler 3.1 or higher
+    Intel(R) Parallel Studio XE 2011 and higher
+    Intel(R) Parallel Studio 2011 and higher
 
 Software - Supported Operating Systems
 
     Microsoft* Windows* Systems
-	Microsoft* Windows* XP Professional
-	Microsoft* Windows* Server 2003
-	Microsoft* Windows* Vista
-	Microsoft* Windows* Server 2008
 	Microsoft* Windows* 7
+	Microsoft* Windows* Server 2008
+	Microsoft* Windows* Vista
+	Microsoft* Windows* XP Professional
+	Microsoft* Windows* Server 2003 (deprecated)
     Linux* Systems
-	Red Hat* Enterprise Linux* 5, 6, 4 (deprecated)
-	    (when using Red Hat* Enterprise Linux* 4 with Intel(R)
-	    Itanium(R) processors, operating system Update 2 or higher
-	    is recommended)
-	Fedora* 12, 13
-	    (not with Intel(R) Itanium(R) processors)
-	Asianux* 3.0
-	Debian* GNU/Linux* 5.0
-	Ubuntu* 10.04
-	SuSE* Linux* Enterprise Server (SLES) 10, 11
+	Red Hat* Enterprise Linux* 6, 5, 4 (deprecated)
+	Fedora* 15
+	Asianux* 4.0, 3.0
+	Debian* GNU/Linux* 6.0
+	Ubuntu* 11.04, 10.04 LTS
+	SuSE* Linux* Enterprise Server 10, 11SP1
     Mac OS* X Systems
-	Mac OS* X 10.5.8 or higher
+	Mac OS* X 10.6.7 or higher
 
 Software - Supported Compilers
 
-    Microsoft* Visual C++ 8.0 (Microsoft* Visual Studio* 2005,
+    Intel(R) C++ Composer XE 2011 and higher
+    Intel(R) C++ Compiler 11.1
+    Microsoft* Visual C++ 10.0 (Microsoft* Visual Studio* 2010,
 	Windows* systems only)
     Microsoft* Visual C++ 9.0 (Microsoft* Visual Studio* 2008,
 	Windows* systems only)
-    Microsoft* Visual C++ 10.0 (Microsoft* Visual Studio* 2010,
-	Windows* systems only)
-    Intel(R) C++ Compiler 11.1 or higher
+    Microsoft* Visual C++ 8.0 (Microsoft* Visual Studio* 2005,
+	Windows* systems only, deprecated)
     For each supported Linux* operating system, the standard gcc
 	version provided with that operating system is supported,
-	including gcc 3.4 through 4.5
+	including gcc 3.4 through 4.6
     For each supported Mac OS* X operating system, the standard gcc
 	version provided with that operating system is supported,
-	including: 4.0.1 or higher (Xcode* tool suite 3.1.4 or higher)
+	including: 4.0.1 or higher (Xcode* tool suite 3.2.5 or higher)
 
 
 Known Issues
@@ -128,8 +120,7 @@ Library Issues
 ------------------------------------------------------------------------
 Copyright (C) 2005-2011 Intel Corporation.  All Rights Reserved.
 
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
+Intel, Xeon and Pentium are registered trademarks or trademarks of
+Intel Corporation or its subsidiaries in the United States and other countries.
 
 * Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00001.html b/doc/html/a00001.html
index 50c62c7..c5c6e06 100644
--- a/doc/html/a00001.html
+++ b/doc/html/a00001.html
@@ -20,10 +20,9 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::interface6::internal::aggregated_operation< Derived > Member List</h1>This is the complete list of members for <a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>aggregated_operation</b>() (defined in <a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a>)</td><td><a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>next</b> (defined in <a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a>)</td><td><a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>status</b> (defined in <a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a>)</td><td><a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a></td><td></td></tr>
+<h1>tbb::aligned_space< T, N > Member List</h1>This is the complete list of members for <a class="el" href="a00227.html">tbb::aligned_space< T, N ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()</td><td><a class="el" href="a00227.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00227.html#024be075c23c0394c9a2518d993bcd9e">end</a>()</td><td><a class="el" href="a00227.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00002.html b/doc/html/a00002.html
index 753bae4..e08c449 100644
--- a/doc/html/a00002.html
+++ b/doc/html/a00002.html
@@ -20,11 +20,9 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::interface6::internal::aggregator< handler_type, operation_type > Member List</h1>This is the complete list of members for <a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>aggregator</b>() (defined in <a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a>)</td><td><a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00214.html#282d5a2f1216b185c91ed23d00119481">execute</a>(operation_type *op)</td><td><a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>initialize_handler</b>(handler_type h) (defined in <a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a>)</td><td><a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~aggregator</b>() (defined in <a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a>)</td><td><a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::atomic< T > Member List</h1>This is the complete list of members for <a class="el" href="a00228.html">tbb::atomic< T ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(T rhs) (defined in <a class="el" href="a00228.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00228.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const atomic< T > &rhs) (defined in <a class="el" href="a00228.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00228.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00003.html b/doc/html/a00003.html
index e2b0392..e9e631b 100644
--- a/doc/html/a00003.html
+++ b/doc/html/a00003.html
@@ -20,9 +20,9 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::aligned_space< T, N > Member List</h1>This is the complete list of members for <a class="el" href="a00215.html">tbb::aligned_space< T, N ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()</td><td><a class="el" href="a00215.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00215.html#024be075c23c0394c9a2518d993bcd9e">end</a>()</td><td><a class="el" href="a00215.html">tbb::aligned_space< T, N ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::atomic< void * > Member List</h1>This is the complete list of members for <a class="el" href="a00229.html">tbb::atomic< void * ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(void *rhs) (defined in <a class="el" href="a00229.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00229.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const atomic< void * > &rhs) (defined in <a class="el" href="a00229.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00229.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00004.html b/doc/html/a00004.html
index 6029fc7..c03e3ae 100644
--- a/doc/html/a00004.html
+++ b/doc/html/a00004.html
@@ -20,9 +20,20 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::atomic< T > Member List</h1>This is the complete list of members for <a class="el" href="a00216.html">tbb::atomic< T ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(T rhs) (defined in <a class="el" href="a00216.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00216.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const atomic< T > &rhs) (defined in <a class="el" href="a00216.html">tbb::atomic< T ></a>)</td><td><a class="el" href="a00216.html">tbb::atomic< T ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::blocked_range< Value > Member List</h1>This is the complete list of members for <a class="el" href="a00233.html">tbb::blocked_range< Value ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00233.html#18d2258400756ac1446dac7676b18df3">begin</a>() const </td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00233.html#94607755c5110d199202234d58d022ac">blocked_range</a>()</td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00233.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a>(Value begin_, Value end_, size_type grainsize_=1)</td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00233.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a>(blocked_range &r, split)</td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b> (defined in <a class="el" href="a00233.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b> (defined in <a class="el" href="a00233.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> typedef</td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() const </td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>() const </td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>() const </td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() const </td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>() const </td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> typedef</td><td><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00005.html b/doc/html/a00005.html
index 5c001f4..7d34f8a 100644
--- a/doc/html/a00005.html
+++ b/doc/html/a00005.html
@@ -20,9 +20,16 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::atomic< void * > Member List</h1>This is the complete list of members for <a class="el" href="a00217.html">tbb::atomic< void * ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(void *rhs) (defined in <a class="el" href="a00217.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00217.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const atomic< void * > &rhs) (defined in <a class="el" href="a00217.html">tbb::atomic< void * ></a>)</td><td><a class="el" href="a00217.html">tbb::atomic< void * ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::blocked_range2d< RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize) (defined in <a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end) (defined in <a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(blocked_range2d &r, split) (defined in <a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>col_range_type</b> typedef (defined in <a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00234.html#392a46759af2c884957115771affa7f4">cols</a>() const </td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00234.html#d144cb2d88cef553420311aca8667a44">empty</a>() const </td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00234.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>() const </td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00234.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a> typedef</td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00234.html#f496e7348a82652fba581203477cc07c">rows</a>() const </td><td><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00006.html b/doc/html/a00006.html
index 267678b..2281c6c 100644
--- a/doc/html/a00006.html
+++ b/doc/html/a00006.html
@@ -20,20 +20,18 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::blocked_range< Value > Member List</h1>This is the complete list of members for <a class="el" href="a00221.html">tbb::blocked_range< Value ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin</a>() const </td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>()</td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00221.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a>(Value begin_, Value end_, size_type grainsize_=1)</td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00221.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a>(blocked_range &r, split)</td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b> (defined in <a class="el" href="a00221.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b> (defined in <a class="el" href="a00221.html">tbb::blocked_range< Value ></a>)</td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> typedef</td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() const </td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>() const </td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>() const </td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() const </td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>() const </td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> typedef</td><td><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td></td></tr>
+<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end) (defined in <a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize, RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize) (defined in <a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00235.html">tbb::blocked_range3d [...]
+  <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(blocked_range3d &r, split) (defined in <a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>col_range_type</b> typedef (defined in <a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00235.html#3336ba9480fd6c43e158f9beb024c050">cols</a>() const </td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00235.html#356860e1c977d91711e8216bd55c0b25">empty</a>() const </td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00235.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>() const </td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00235.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a> typedef</td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00235.html#cf971430aa12361d3ed245344b7c6764">pages</a>() const </td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>row_range_type</b> typedef (defined in <a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00235.html#1584623e59ff32a8aa82006827508be4">rows</a>() const </td><td><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00007.html b/doc/html/a00007.html
index 9d62bdf..0445b25 100644
--- a/doc/html/a00007.html
+++ b/doc/html/a00007.html
@@ -20,16 +20,24 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::blocked_range2d< RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize) (defined in <a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end) (defined in <a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>blocked_range2d</b>(blocked_range2d &r, split) (defined in <a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>col_range_type</b> typedef (defined in <a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a>)</td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00222.html#392a46759af2c884957115771affa7f4">cols</a>() const </td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00222.html#d144cb2d88cef553420311aca8667a44">empty</a>() const </td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00222.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>() const </td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00222.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a> typedef</td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00222.html#f496e7348a82652fba581203477cc07c">rows</a>() const </td><td><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::cache_aligned_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const  (defined in <a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const  (defined in <a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00238.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>(size_type n, const void *hint=0)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>() (defined in <a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>(const cache_aligned_allocator &) (defined in <a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>(const cache_aligned_allocator< U > &) (defined in <a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00238.html#958ee8745c86c275bfc9533af565e017">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00238.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>(pointer p)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00238.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const </td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00008.html b/doc/html/a00008.html
deleted file mode 100644
index 856f6e6..0000000
--- a/doc/html/a00008.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Member List</h1>This is the complete list of members for <a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end) (defined in <a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize, RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize) (defined in <a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00223.html">tbb::blocked_range3d [...]
-  <tr bgcolor="#f0f0f0"><td><b>blocked_range3d</b>(blocked_range3d &r, split) (defined in <a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>col_range_type</b> typedef (defined in <a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00223.html#3336ba9480fd6c43e158f9beb024c050">cols</a>() const </td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00223.html#356860e1c977d91711e8216bd55c0b25">empty</a>() const </td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00223.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>() const </td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00223.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a> typedef</td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00223.html#cf971430aa12361d3ed245344b7c6764">pages</a>() const </td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>row_range_type</b> typedef (defined in <a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>)</td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00223.html#1584623e59ff32a8aa82006827508be4">rows</a>() const </td><td><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00009.html b/doc/html/a00009.html
index 9b88443..e747ba6 100644
--- a/doc/html/a00009.html
+++ b/doc/html/a00009.html
@@ -20,24 +20,10 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::cache_aligned_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const  (defined in <a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const  (defined in <a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00226.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>(size_type n, const void *hint=0)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>() (defined in <a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>(const cache_aligned_allocator &) (defined in <a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>cache_aligned_allocator</b>(const cache_aligned_allocator< U > &) (defined in <a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00226.html#958ee8745c86c275bfc9533af565e017">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00226.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00226.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>(pointer p)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00226.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const </td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>)</td><td><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td></td></tr>
+<h1>tbb::cache_aligned_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00239.html">tbb::cache_aligned_allocator< void ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00239.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00239.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00239.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00239.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00239.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00239.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00011.html b/doc/html/a00011.html
index 8795e2e..6cfd67c 100644
--- a/doc/html/a00011.html
+++ b/doc/html/a00011.html
@@ -20,10 +20,17 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::cache_aligned_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00227.html">tbb::cache_aligned_allocator< void ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00227.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00227.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00227.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00227.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00227.html">tbb::cache_aligned_allocator< void ></a>)</td><td><a class="el" href="a00227.html">tbb::cache_aligned_allocator< void ></a></td><td></td></tr>
+<h1>tbb::combinable< T > Member List</h1>This is the complete list of members for <a class="el" href="a00241.html">tbb::combinable< T ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>combinable</b>() (defined in <a class="el" href="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>combinable</b>(finit _finit) (defined in <a class="el" href="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>combinable</b>(const combinable &other) (defined in <a class="el" href="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>combine</b>(combine_func_t f_combine) (defined in <a class="el" href="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>combine_each</b>(combine_func_t f_combine) (defined in <a class="el" href="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>local</b>() (defined in <a class="el" href="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>local</b>(bool &exists) (defined in <a class="el" href="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const combinable &other) (defined in <a class="el" href="a00241.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00241.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00241.html#2c87e79ae98588a5780f708773388843">~combinable</a>()</td><td><a class="el" href="a00241.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00014.html b/doc/html/a00012.html
similarity index 85%
copy from doc/html/a00014.html
copy to doc/html/a00012.html
index 0d81875..e55415c 100644
--- a/doc/html/a00014.html
+++ b/doc/html/a00012.html
@@ -20,9 +20,9 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::tbb_hash_compare< Key > Member List</h1>This is the complete list of members for <a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>equal</b>(const Key &a, const Key &b) (defined in <a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>hash</b>(const Key &a) (defined in <a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::tbb_hash_compare< Key > Member List</h1>This is the complete list of members for <a class="el" href="a00321.html">tbb::tbb_hash_compare< Key ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>equal</b>(const Key &a, const Key &b) (defined in <a class="el" href="a00321.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00321.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>hash</b>(const Key &a) (defined in <a class="el" href="a00321.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00321.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00013.html b/doc/html/a00013.html
index 58a53a3..8cebf50 100644
--- a/doc/html/a00013.html
+++ b/doc/html/a00013.html
@@ -20,17 +20,70 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::combinable< T > Member List</h1>This is the complete list of members for <a class="el" href="a00229.html">tbb::combinable< T ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>combinable</b>() (defined in <a class="el" href="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>combinable</b>(finit _finit) (defined in <a class="el" href="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>combinable</b>(const combinable &other) (defined in <a class="el" href="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>combine</b>(combine_func_t f_combine) (defined in <a class="el" href="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>combine_each</b>(combine_func_t f_combine) (defined in <a class="el" href="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>local</b>() (defined in <a class="el" href="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>local</b>(bool &exists) (defined in <a class="el" href="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const combinable &other) (defined in <a class="el" href="a00229.html">tbb::combinable< T ></a>)</td><td><a class="el" href="a00229.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00229.html#2c87e79ae98588a5780f708773388843">~combinable</a>()</td><td><a class="el" href="a00229.html">tbb::combinable< T ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>begin</b>() (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>begin</b>() const  (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#af34cb91b1d0f36a885a1a3432dd9af1">bucket_count</a>() const </td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#220686fe17b197eedf19dd856cd02e36">clear</a>()</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#1ad413f5b666176e7669bf4c87d1ff3f">concurrent_hash_map</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#46b9896317662c3cfa3c876ad7592a7c">concurrent_hash_map</a>(size_type n, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#6fb14710893308fb47aaeee55ee30dc3">concurrent_hash_map</a>(const concurrent_hash_map &table, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#83c40f2053f208861b90390e12a36436">concurrent_hash_map</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_accessor</b> (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#6968eb6feed2df36be421df0464297af">count</a>(const Key &key) const </td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>delete_node</b>(node_base *n) (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#61ff2e5bb44e5469366fd5295e5d0ebe">empty</a>() const </td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>end</b>() (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>end</b>() const  (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>equal_range</b>(const Key &key) (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>equal_range</b>(const Key &key) const  (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#f27802b3a8d1863c29e743e9c6b4e870">erase</a>(const Key &key)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#e698ef3d70b2d1a29a7a5551784d3653">erase</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#5f12d150d421420965db07368666a84f">erase</a>(accessor &item_accessor)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#0c964214eb38f54603aa75fdff6d2709">exclude</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#2afcc33dade7bb24e008d60c0df38230">find</a>(const_accessor &result, const Key &key) const </td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#7bc475d1968f7f0af3d736d7e8a0d7df">find</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator</a>() const </td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#47fe0e60151a9bd7a444db827772a4e6">insert</a>(const_accessor &result, const Key &key)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#54e0955ecd11575b4c07166838a72893">insert</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#091efd2d12fdad4fe9e54d9629a9dfc3">insert</a>(const_accessor &result, const value_type &value)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#39183d78d6e8425917555ab542ab92de">insert</a>(accessor &result, const value_type &value)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#3f121a316af8135de476a30fae6d7c07">insert</a>(const value_type &value)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#1dd37fad87e561151ba1e242ca94bcc1">insert</a>(I first, I last)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::hash_map_iterator</b> (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::hash_map_range</b> (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a>(const concurrent_hash_map &source)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_copy</b>(I first, I last) (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#8f5373b8e1864619d1ffcf3bf3f1f13d">internal_equal_range</a>(const Key &key, I end) const </td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a>(const Key &key) const </td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>key_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#3f3413264a99174a224ef96f6c4ea769">lookup</a>(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>mapped_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#2bce57fe9b594abe1e6d2568aea8b357">max_size</a>() const </td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_allocator</b> (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_hash_compare</b> (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>node_allocator_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#088d1aaccc816884a49e38f7065622c8">operator=</a>(const concurrent_hash_map &table)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>range</b>(size_type grainsize=1) (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>range</b>(size_type grainsize=1) const  (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#94758113d8993cfe5afdf2d63a728869">rehash</a>(size_type n=0)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>rehash_bucket</b>(bucket *b_new, const hashcode_t h) (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>search_bucket</b>(const key_type &key, bucket *b) const  (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size</a>() const </td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#076f8d9e16110aac5f558777aa744eb6">swap</a>(concurrent_hash_map &table)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00243.html#2aa8e2d28d5af1284cf78d20a9c22731">~concurrent_hash_map</a>()</td><td><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00015.html b/doc/html/a00015.html
index e49596c..ea69dfc 100644
--- a/doc/html/a00015.html
+++ b/doc/html/a00015.html
@@ -20,70 +20,11 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>begin</b>() (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>begin</b>() const  (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#af34cb91b1d0f36a885a1a3432dd9af1">bucket_count</a>() const </td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#220686fe17b197eedf19dd856cd02e36">clear</a>()</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#1ad413f5b666176e7669bf4c87d1ff3f">concurrent_hash_map</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#46b9896317662c3cfa3c876ad7592a7c">concurrent_hash_map</a>(size_type n, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#6fb14710893308fb47aaeee55ee30dc3">concurrent_hash_map</a>(const concurrent_hash_map &table, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#83c40f2053f208861b90390e12a36436">concurrent_hash_map</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_accessor</b> (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#6968eb6feed2df36be421df0464297af">count</a>(const Key &key) const </td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>delete_node</b>(node_base *n) (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#61ff2e5bb44e5469366fd5295e5d0ebe">empty</a>() const </td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>end</b>() (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>end</b>() const  (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>equal_range</b>(const Key &key) (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>equal_range</b>(const Key &key) const  (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#f27802b3a8d1863c29e743e9c6b4e870">erase</a>(const Key &key)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#e698ef3d70b2d1a29a7a5551784d3653">erase</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#5f12d150d421420965db07368666a84f">erase</a>(accessor &item_accessor)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#0c964214eb38f54603aa75fdff6d2709">exclude</a>(const_accessor &item_accessor)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#2afcc33dade7bb24e008d60c0df38230">find</a>(const_accessor &result, const Key &key) const </td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#7bc475d1968f7f0af3d736d7e8a0d7df">find</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator</a>() const </td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#47fe0e60151a9bd7a444db827772a4e6">insert</a>(const_accessor &result, const Key &key)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#54e0955ecd11575b4c07166838a72893">insert</a>(accessor &result, const Key &key)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#091efd2d12fdad4fe9e54d9629a9dfc3">insert</a>(const_accessor &result, const value_type &value)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#39183d78d6e8425917555ab542ab92de">insert</a>(accessor &result, const value_type &value)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#3f121a316af8135de476a30fae6d7c07">insert</a>(const value_type &value)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#1dd37fad87e561151ba1e242ca94bcc1">insert</a>(I first, I last)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::hash_map_iterator</b> (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::hash_map_range</b> (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a>(const concurrent_hash_map &source)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_copy</b>(I first, I last) (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#8f5373b8e1864619d1ffcf3bf3f1f13d">internal_equal_range</a>(const Key &key, I end) const </td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a>(const Key &key) const </td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>key_type</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#3f3413264a99174a224ef96f6c4ea769">lookup</a>(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>mapped_type</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#2bce57fe9b594abe1e6d2568aea8b357">max_size</a>() const </td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_allocator</b> (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_hash_compare</b> (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>node_allocator_type</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#088d1aaccc816884a49e38f7065622c8">operator=</a>(const concurrent_hash_map &table)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>range</b>(size_type grainsize=1) (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>range</b>(size_type grainsize=1) const  (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#94758113d8993cfe5afdf2d63a728869">rehash</a>(size_type n=0)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>rehash_bucket</b>(bucket *b_new, const hashcode_t h) (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>search_bucket</b>(const key_type &key, bucket *b) const  (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size</a>() const </td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#076f8d9e16110aac5f558777aa744eb6">swap</a>(concurrent_hash_map &table)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>)</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00231.html#2aa8e2d28d5af1284cf78d20a9c22731">~concurrent_hash_map</a>()</td><td><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00245.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00245.html#d11c77f4d70a94d4fb344492bbf18007">acquire</a>(concurrent_hash_map *base, const hashcode_t h, bool writer=false)</td><td><a class="el" href="a00245.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>bucket_accessor</b>(concurrent_hash_map *base, const hashcode_t h, bool writer=false) (defined in <a class="el" href="a00245.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00245.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00245.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a>()</td><td><a class="el" href="a00245.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00245.html#fa6314b861c574f86ed189b124cf5853">operator()</a>()</td><td><a class="el" href="a00245.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00019.html b/doc/html/a00016.html
similarity index 50%
rename from doc/html/a00019.html
rename to doc/html/a00016.html
index 53e07de..59da4fe 100644
--- a/doc/html/a00019.html
+++ b/doc/html/a00016.html
@@ -20,17 +20,19 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Member List</h1>This is the complete list of members for <a class="el" href="a00232.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00234.html#27399c613eb1aecd4660803955dda09d">const_accessor</a>()</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00234.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a>() const </td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_writer</b>() (defined in <a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline, protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_hash</b> (defined in <a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_node</b> (defined in <a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00232.html#170280ea807a22e742095de3e8c5ea38">operator *</a>() const </td><td><a class="el" href="a00232.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00232.html#a807920cdffe3ec5c5e282b4d1ff92a2">operator-></a>() const </td><td><a class="el" href="a00232.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00234.html#7db006d41b49dc5f1716a913769d4698">release</a>()</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00232.html#0b648be7a95a8fb2971042c15eb112c1">value_type</a> typedef</td><td><a class="el" href="a00232.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00234.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a>()</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>accessor</b> (defined in <a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b> (defined in <a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00246.html#27399c613eb1aecd4660803955dda09d">const_accessor</a>()</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00246.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a>() const </td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_writer</b>() (defined in <a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_hash</b> (defined in <a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_node</b> (defined in <a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00246.html#9411df8197ceb4881ec4c7368a0a7f88">operator *</a>() const </td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00246.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a>() const </td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a>()</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00246.html#a8e50238483ba451363dccebd981d346">value_type</a> typedef</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00246.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a>()</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00017.html b/doc/html/a00017.html
index efeeecd..e79a934 100644
--- a/doc/html/a00017.html
+++ b/doc/html/a00017.html
@@ -20,11 +20,17 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00233.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00233.html#d11c77f4d70a94d4fb344492bbf18007">acquire</a>(concurrent_hash_map *base, const hashcode_t h, bool writer=false)</td><td><a class="el" href="a00233.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>bucket_accessor</b>(concurrent_hash_map *base, const hashcode_t h, bool writer=false) (defined in <a class="el" href="a00233.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>)</td><td><a class="el" href="a00233.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00233.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a>()</td><td><a class="el" href="a00233.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00233.html#fa6314b861c574f86ed189b124cf5853">operator()</a>()</td><td><a class="el" href="a00233.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Member List</h1>This is the complete list of members for <a class="el" href="a00244.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00246.html#27399c613eb1aecd4660803955dda09d">const_accessor</a>()</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00246.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a>() const </td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_writer</b>() (defined in <a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_hash</b> (defined in <a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_node</b> (defined in <a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00244.html#170280ea807a22e742095de3e8c5ea38">operator *</a>() const </td><td><a class="el" href="a00244.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00244.html#a807920cdffe3ec5c5e282b4d1ff92a2">operator-></a>() const </td><td><a class="el" href="a00244.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a>()</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00244.html#0b648be7a95a8fb2971042c15eb112c1">value_type</a> typedef</td><td><a class="el" href="a00244.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00246.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a>()</td><td><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00018.html b/doc/html/a00018.html
index 59becc6..e2ecdf6 100644
--- a/doc/html/a00018.html
+++ b/doc/html/a00018.html
@@ -20,19 +20,26 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Member List</h1>This is the complete list of members for <a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>accessor</b> (defined in <a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b> (defined in <a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00234.html#27399c613eb1aecd4660803955dda09d">const_accessor</a>()</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00234.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a>() const </td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_writer</b>() (defined in <a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline, protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_hash</b> (defined in <a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_node</b> (defined in <a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>)</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00234.html#9411df8197ceb4881ec4c7368a0a7f88">operator *</a>() const </td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00234.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a>() const </td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00234.html#7db006d41b49dc5f1716a913769d4698">release</a>()</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00234.html#a8e50238483ba451363dccebd981d346">value_type</a> typedef</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00234.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a>()</td><td><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::concurrent_priority_queue< T, Compare, A > Member List</h1>This is the complete list of members for <a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> typedef</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a>()</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#4555b4a55415a70024c4004b51e9f385">concurrent_priority_queue</a>(size_type init_capacity, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#9147cb4207017c260a0c3929c12cd40f">concurrent_priority_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#509419e320f200456d89dc54a65140b3">concurrent_priority_queue</a>(const concurrent_priority_queue &src)</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#c8b20e7430c5302936030bef59a562be">concurrent_priority_queue</a>(const concurrent_priority_queue &src, const allocator_type &a)</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> typedef</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a> typedef</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#317c508fa92df218be5d014c26c09bb7">empty</a>() const </td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a>() const </td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a>(const concurrent_priority_queue &src)</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#d905af7b8f6defff562f5ae9c3275763">push</a>(const_reference elem)</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> typedef</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a>() const </td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> typedef</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(concurrent_priority_queue &q)</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a>(reference elem)</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> typedef</td><td><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00020.html b/doc/html/a00020.html
deleted file mode 100644
index 8f0af58..0000000
--- a/doc/html/a00020.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<h1>tbb::interface5::concurrent_priority_queue< T, Compare, A > Member List</h1>This is the complete list of members for <a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> typedef</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#e5d6a0aca1579ecebb716bbe53514963">capacity</a>() const </td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a>()</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline, explicit]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#4555b4a55415a70024c4004b51e9f385">concurrent_priority_queue</a>(size_type init_capacity, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline, explicit]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#9147cb4207017c260a0c3929c12cd40f">concurrent_priority_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#509419e320f200456d89dc54a65140b3">concurrent_priority_queue</a>(const concurrent_priority_queue &src)</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline, explicit]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>concurrent_priority_queue</b>(const concurrent_priority_queue &src, const allocator_type &a) (defined in <a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>)</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> typedef</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a> typedef</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#317c508fa92df218be5d014c26c09bb7">empty</a>() const </td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a>() const </td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a>(const concurrent_priority_queue &src)</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#d905af7b8f6defff562f5ae9c3275763">push</a>(const_reference elem)</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> typedef</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#e7c59f011c4cca83ff210aefe7c9d868">reserve</a>(size_type new_cap)</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#28d113288fc7e0c04c9053ec7de61368">shrink_to_fit</a>()</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a>() const </td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> typedef</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(concurrent_priority_queue &q)</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a>(reference elem)</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> typedef</td><td><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00024.html b/doc/html/a00022.html
similarity index 59%
rename from doc/html/a00024.html
rename to doc/html/a00022.html
index efbbad4..219c2f7 100644
--- a/doc/html/a00024.html
+++ b/doc/html/a00022.html
@@ -20,30 +20,30 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::strict_ppl::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#c32e8e84c0524155133b4aae32d2a827">clear</a>()</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a>(const concurrent_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a> typedef</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() const </td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>() const </td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>(const T &source)</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a> typedef</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>(T &result)</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const  (defined in <a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const  (defined in <a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>() const </td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#682c3978d5cb0620000994f11c44a476">value_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00236.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>()</td><td><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+<h1>tbb::strict_ppl::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a> typedef</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#c32e8e84c0524155133b4aae32d2a827">clear</a>()</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a>(const concurrent_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a> typedef</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a> typedef</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() const </td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>() const </td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>(const T &source)</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a> typedef</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> typedef</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>(T &result)</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const  (defined in <a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const  (defined in <a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>() const </td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#682c3978d5cb0620000994f11c44a476">value_type</a> typedef</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00248.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>()</td><td><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00025.html b/doc/html/a00023.html
similarity index 58%
copy from doc/html/a00025.html
copy to doc/html/a00023.html
index 9af2e9f..d95baac 100644
--- a/doc/html/a00025.html
+++ b/doc/html/a00023.html
@@ -20,34 +20,34 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::concurrent_bounded_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const  (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const  (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+<h1>tbb::concurrent_bounded_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const  (defined in <a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const  (defined in <a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00025.html b/doc/html/a00025.html
index 9af2e9f..bec592c 100644
--- a/doc/html/a00025.html
+++ b/doc/html/a00025.html
@@ -20,34 +20,43 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::concurrent_bounded_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const  (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const  (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+<h1>tbb::deprecated::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>begin</b>() (defined in <a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>begin</b>() const  (defined in <a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00249.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(const A &a=A())</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00249.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a>(const concurrent_queue &src, const A &a=A())</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00249.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a>(InputIterator b, InputIterator e, const A &a=A())</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>end</b>() (defined in <a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>end</b>() const  (defined in <a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00249.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>(T &destination)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00249.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>(const T &source)</td><td><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const  (defined in <a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const  (defined in <a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00242.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00027.html b/doc/html/a00027.html
deleted file mode 100644
index 73846d5..0000000
--- a/doc/html/a00027.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<h1>tbb::deprecated::concurrent_queue< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>begin</b>() (defined in <a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>begin</b>() const  (defined in <a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>()</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a>(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a>(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(const A &a=A())</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00237.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a>(const concurrent_queue &src, const A &a=A())</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00237.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a>(InputIterator b, InputIterator e, const A &a=A())</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>end</b>() (defined in <a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>end</b>() const  (defined in <a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::concurrent_queue_iterator</b> (defined in <a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>(T &destination)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00237.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>(T &destination)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">push</a>(const T &source)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>(const T &source)</td><td><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>(size_type new_capacity)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">size</a>() const </td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>(T &destination)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>(const T &source)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_begin</b>() const  (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unsafe_end</b>() const  (defined in <a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>)</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#98245517a931e5893f6601e66c51fc75">value_type</a> typedef</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>()</td><td><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00032.html b/doc/html/a00031.html
similarity index 52%
rename from doc/html/a00032.html
rename to doc/html/a00031.html
index ff359bb..accfa82 100644
--- a/doc/html/a00032.html
+++ b/doc/html/a00031.html
@@ -20,77 +20,77 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::concurrent_vector< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a>(size_type n, const_reference t)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#93a06b3112cb804f42f40efb5e7387b4">assign</a>(I first, I last)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#0c073ca43e787c7cbf7b0e26d2221748">at</a>(size_type index)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#23e14a38af748edff96a7adc3a0f1c58">at</a>(size_type index) const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#41ce48d6015a1a2812d41cf620ec3476">back</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#bd518e204107d07fd08d0ec5bdfd383d">back</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#730b23a251ecb6d37f692fb22f38e029">begin</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#78a06182276ff758788d4c0623ae0d71">begin</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#1693d1da41b1a8235871be9c6633be35">compact</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a>(const concurrent_vector &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a>(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a>(size_type n)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a>(size_type n, const_reference t, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_reverse_iterator</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_reverse_iterator</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#fff9cece89438587997ebedf93c5e962">crend</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#c0b51160e5a764982ec97a455f94f2c6">end</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#15181759c0bfa2ddce5d10c7550e0002">front</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#502615a858eb9fa0390ee59169065e90">front</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#30484e3959892fd5392fa93c873c31f0">grow_by</a>(size_type delta)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a>(size_type delta)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#38274ab3f772ecba600c7daca7690102">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#473a59a4c9308b93411b898b3110d26c">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::vector_iterator</b> (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_vector_base</b>() const  (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#691f0f3cda3e489c37a657016e375eaf">operator=</a>(const concurrent_vector &vector)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a>(const concurrent_vector< T, M > &vector)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>(size_type index)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a>(size_type index) const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(const_reference item) iterator push_back(const _reference item)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#3d09ccfb581b879ae64203741035e193">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#9f9c103e18d5f212703805354074ad44">rbegin</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a>(size_type n)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a>(size_type n)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a>(size_type n, const_reference t)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reverse_iterator</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reverse_iterator</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() const </td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a>(concurrent_vector &vector)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00238.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a>()</td><td><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::concurrent_vector< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a>(size_type n, const_reference t)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#93a06b3112cb804f42f40efb5e7387b4">assign</a>(I first, I last)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#0c073ca43e787c7cbf7b0e26d2221748">at</a>(size_type index)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#23e14a38af748edff96a7adc3a0f1c58">at</a>(size_type index) const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#41ce48d6015a1a2812d41cf620ec3476">back</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#bd518e204107d07fd08d0ec5bdfd383d">back</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#730b23a251ecb6d37f692fb22f38e029">begin</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#78a06182276ff758788d4c0623ae0d71">begin</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#1693d1da41b1a8235871be9c6633be35">compact</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a>(const allocator_type &a=allocator_type())</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a>(const concurrent_vector &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a>(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a>(size_type n)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a>(size_type n, const_reference t, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a>(I first, I last, const allocator_type &a=allocator_type())</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_reverse_iterator</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_reverse_iterator</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#fff9cece89438587997ebedf93c5e962">crend</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#c0b51160e5a764982ec97a455f94f2c6">end</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#15181759c0bfa2ddce5d10c7550e0002">front</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#502615a858eb9fa0390ee59169065e90">front</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#30484e3959892fd5392fa93c873c31f0">grow_by</a>(size_type delta)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a>(size_type delta)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#38274ab3f772ecba600c7daca7690102">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#473a59a4c9308b93411b898b3110d26c">grow_by</a>(size_type delta, const_reference t)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a>(size_type n)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::vector_iterator</b> (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_vector_base</b>() const  (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#691f0f3cda3e489c37a657016e375eaf">operator=</a>(const concurrent_vector &vector)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a>(const concurrent_vector< T, M > &vector)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>(size_type index)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a>(size_type index) const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(const_reference item) iterator push_back(const _reference item)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#3d09ccfb581b879ae64203741035e193">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#9f9c103e18d5f212703805354074ad44">rbegin</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a>(size_type n)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a>(size_type n)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a>(size_type n, const_reference t)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reverse_iterator</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reverse_iterator</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() const </td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a>(concurrent_vector &vector)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>)</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00250.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a>()</td><td><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00037.html b/doc/html/a00036.html
similarity index 64%
rename from doc/html/a00037.html
rename to doc/html/a00036.html
index b44d73e..1fe608e 100644
--- a/doc/html/a00037.html
+++ b/doc/html/a00036.html
@@ -20,41 +20,41 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Member List</h1>This is the complete list of members for <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00243.html#3c03eb40955b933b01987222722ac4bd">allocator_type</a> typedef</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#01d7baf8e913ab2819e97917a2ac795f">begin</a>()</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#84afb3906a39e399cde1c950d6351300">begin</a>() const </td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#a8764176d4b6014c5d65f1051851abc8">clear</a>()</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>combine</b>(combine_func_t f_combine) (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>combine_each</b>(combine_func_t f_combine) (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#72595886d0ac8fd0543f90038570510d">empty</a>() const </td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#2456ff88252fc921b01cd8907628a4ee">end</a>()</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#cb448bb4977ce366ceb7344085cc7050">end</a>() const </td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b> (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#0cfa3a5c8f2be3bbf313d93b1fa8cdb3">enumerable_thread_specific</a>()</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#8d4b456ff9d7b289c73254eccc11db45">enumerable_thread_specific</a>(Finit finit)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#7bce6829981c9efe3f59cae2355e383e">enumerable_thread_specific</a>(const T &exemplar)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b>(const enumerable_thread_specific< U, Alloc, Cachetype > &other) (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b>(const enumerable_thread_specific &other) (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#c8d5265ccbd5e4485996b3f3baaa5ba1">local</a>()</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#7dc79058d2832f7447de8e691c3455ea">local</a>(bool &exists)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const enumerable_thread_specific &other) (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const enumerable_thread_specific< U, Alloc, Cachetype > &other) (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#b22c54990b2362cd93c1a8f73de140bc">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#33fd6593da1ed14340f10f67d5a69130">size</a>() const </td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00243.html#5a7907d9e3e5b18e7a7b55211ef3213f">~enumerable_thread_specific</a>()</td><td><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Member List</h1>This is the complete list of members for <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00255.html#3c03eb40955b933b01987222722ac4bd">allocator_type</a> typedef</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#01d7baf8e913ab2819e97917a2ac795f">begin</a>()</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#84afb3906a39e399cde1c950d6351300">begin</a>() const </td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#a8764176d4b6014c5d65f1051851abc8">clear</a>()</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>combine</b>(combine_func_t f_combine) (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>combine_each</b>(combine_func_t f_combine) (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_iterator</b> typedef (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_range_type</b> typedef (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#72595886d0ac8fd0543f90038570510d">empty</a>() const </td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#2456ff88252fc921b01cd8907628a4ee">end</a>()</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#cb448bb4977ce366ceb7344085cc7050">end</a>() const </td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b> (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#0cfa3a5c8f2be3bbf313d93b1fa8cdb3">enumerable_thread_specific</a>()</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#8d4b456ff9d7b289c73254eccc11db45">enumerable_thread_specific</a>(Finit finit)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#7bce6829981c9efe3f59cae2355e383e">enumerable_thread_specific</a>(const T &exemplar)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b>(const enumerable_thread_specific< U, Alloc, Cachetype > &other) (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>enumerable_thread_specific</b>(const enumerable_thread_specific &other) (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>iterator</b> typedef (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#c8d5265ccbd5e4485996b3f3baaa5ba1">local</a>()</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#7dc79058d2832f7447de8e691c3455ea">local</a>(bool &exists)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const enumerable_thread_specific &other) (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const enumerable_thread_specific< U, Alloc, Cachetype > &other) (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#b22c54990b2362cd93c1a8f73de140bc">range</a>(size_t grainsize=1)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">range</a>(size_t grainsize=1) const </td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>range_type</b> typedef (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#33fd6593da1ed14340f10f67d5a69130">size</a>() const </td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>)</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00255.html#5a7907d9e3e5b18e7a7b55211ef3213f">~enumerable_thread_specific</a>()</td><td><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00040.html b/doc/html/a00039.html
similarity index 78%
copy from doc/html/a00040.html
copy to doc/html/a00039.html
index 603513a..70ff349 100644
--- a/doc/html/a00040.html
+++ b/doc/html/a00039.html
@@ -20,8 +20,8 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::graph_node Member List</h1>This is the complete list of members for <a class="el" href="a00251.html">tbb::graph_node</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::graph_node Member List</h1>This is the complete list of members for <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00041.html b/doc/html/a00041.html
new file mode 100644
index 0000000..ec500e6
--- /dev/null
+++ b/doc/html/a00041.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class Members</span></a></li>
+  </ul></div>
+<h1>tbb::flow::interface6::sender< T > Member List</h1>This is the complete list of members for <a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00301.html#127af99916cc085cd9dbc09c53299928">output_type</a> typedef</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [pure virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [pure virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a> typedef</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>()</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>(T &)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#27036b06d6a91e97007e14f400529199">try_release</a>()</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>(T &)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00042.html b/doc/html/a00042.html
index bf3347d..70a703c 100644
--- a/doc/html/a00042.html
+++ b/doc/html/a00042.html
@@ -20,16 +20,13 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::sender< T > Member List</h1>This is the complete list of members for <a class="el" href="a00282.html">tbb::sender< T ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00282.html#d3aa21714dfc464e65a471816e38ea89">output_type</a> typedef</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">register_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [pure virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#3f345427e812e8741370308ff88f30bf">remove_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [pure virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#c0746cda7dfd266f01acaf6cd5d4b77d">successor_type</a> typedef</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">try_consume</a>()</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#bf8c9235810354f3353a899c982645de">try_get</a>(T &)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">try_release</a>()</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">try_reserve</a>(T &)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::receiver< T > Member List</h1>This is the complete list of members for <a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00295.html#0d0524c99313dedea1e04464bbf2f7ef">input_type</a> typedef</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#7fa8cff811e7c1589b805a4bb4c7a74f">predecessor_type</a> typedef</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#c6d5d0cb8ebe5771be91933609fe31b8">try_put</a>(const T &t)=0</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [pure virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00043.html b/doc/html/a00043.html
index d0426dc..913e4fa 100644
--- a/doc/html/a00043.html
+++ b/doc/html/a00043.html
@@ -20,13 +20,24 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::receiver< T > Member List</h1>This is the complete list of members for <a class="el" href="a00277.html">tbb::receiver< T ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00277.html#9cfd5ef0d67d5bbfb5f9a76d75e62765">input_type</a> typedef</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#c802c845b51c6d129153b684d33f7310">predecessor_type</a> typedef</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#6e5422b03b4570138f227b3d5d0073b8">try_put</a>(T t)=0</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [pure virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::continue_receiver Member List</h1>This is the complete list of members for <a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00253.html#177db82d548a1f8471371331890b91a8">continue_receiver</a>(int number_of_predecessors=0)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00253.html#a0b292ed7fa6556b2a735f6d1e82dc74">continue_receiver</a>(const continue_receiver &src)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00253.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute</a>()=0</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected, pure virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00253.html#3c43c166af832d9187035985841e0a7f">input_type</a> typedef</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_current_count</b> (defined in <a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_initial_predecessor_count</b> (defined in <a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_mutex</b> (defined in <a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_predecessor_count</b> (defined in <a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a>)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00253.html#f9c58b3e9c46afd2518d0fd8957a5a2f">predecessor_type</a> typedef</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00253.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver::register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00253.html#cb691b18416d4742265aed84d496ebbd">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver::remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00253.html#3969c70fb89c0a982f142ae9eb5facae">try_put</a>(const input_type &)</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#c6d5d0cb8ebe5771be91933609fe31b8">tbb::flow::interface6::receiver::try_put</a>(const T &t)=0</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [pure virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00253.html#1e14828fa079b9835ff7267df5ee45d7">~continue_receiver</a>()</td><td><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00044.html b/doc/html/a00044.html
index f3620d7..2e053fe 100644
--- a/doc/html/a00044.html
+++ b/doc/html/a00044.html
@@ -20,22 +20,15 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::continue_receiver Member List</h1>This is the complete list of members for <a class="el" href="a00241.html">tbb::continue_receiver</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00241.html#799d383813261426d881b10247caadba">continue_receiver</a>(int number_of_predecessors=0)</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">execute</a>()=0</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [protected, pure virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00241.html#21acef0b97b53d92f637619012837b30">input_type</a> typedef</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_current_count</b> (defined in <a class="el" href="a00241.html">tbb::continue_receiver</a>)</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_mutex</b> (defined in <a class="el" href="a00241.html">tbb::continue_receiver</a>)</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_predecessor_count</b> (defined in <a class="el" href="a00241.html">tbb::continue_receiver</a>)</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00241.html#52fa92968dd48560d59798ca7ba6a3a2">predecessor_type</a> typedef</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00241.html#b9fa9290cbb871f8780f9d69e1ec3b4e">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">tbb::receiver::register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00241.html#02411d8d13b380062548aff133752cc5">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">tbb::receiver::remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">try_put</a>(input_type)</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#6e5422b03b4570138f227b3d5d0073b8">tbb::receiver::try_put</a>(T t)=0</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [pure virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00241.html#9a38edb7e1e3c9be4e3848145c51a617">~continue_receiver</a>()</td><td><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::graph Member List</h1>This is the complete list of members for <a class="el" href="a00262.html">tbb::flow::interface6::graph</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00262.html#29b85506870f13a884a21655aec2a65d">decrement_wait_count</a>()</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00262.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a>()</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00262.html#a993b789d1e488e0c3929135beae560e">increment_wait_count</a>()</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00262.html#7f4e3ae90811a5d8b597146b5b586d10">root_task</a>()</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00262.html#50a7938df01b6148ab2c0696835f002e">run</a>(Receiver &r, Body body)</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00262.html#c1145b00e063793a7e7bf994d202c7a0">run</a>(Body body)</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a>()</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00262.html#8a7d424c0616a1c37a908ead182e2fe5">~graph</a>()</td><td><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00045.html b/doc/html/a00045.html
deleted file mode 100644
index 6d946c3..0000000
--- a/doc/html/a00045.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<h1>tbb::graph Member List</h1>This is the complete list of members for <a class="el" href="a00250.html">tbb::graph</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00250.html#633b9b55e3248b785efd13264261f0e5">concurrency</a> enum name</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00250.html#ff3b6a3ef2ae1e661dcdb398c227b43c">decrement_wait_count</a>()</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00250.html#1ba8311506558a2419101722f5d49ba9">graph</a>()</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00250.html#1e5c5ae6538ec714cee107d1004705b9">increment_wait_count</a>()</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00250.html#34d61d8b6560e5b2eb42e0112701db0f">root_task</a>()</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00250.html#4c5e8dc5a45e641d534d6206838cfa7f">run</a>(Receiver &r, Body body)</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00250.html#71213dd18099298dc74731e293c8286a">run</a>(Body body)</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>serial</b> enum value (defined in <a class="el" href="a00250.html">tbb::graph</a>)</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>unlimited</b> enum value (defined in <a class="el" href="a00250.html">tbb::graph</a>)</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">wait_for_all</a>()</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00250.html#55332084e7884a26ff288b8fe960030d">~graph</a>()</td><td><a class="el" href="a00250.html">tbb::graph</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00047.html b/doc/html/a00047.html
new file mode 100644
index 0000000..e533133
--- /dev/null
+++ b/doc/html/a00047.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class Members</span></a></li>
+  </ul></div>
+<h1>tbb::flow::interface6::source_node< Output > Member List</h1>This is the complete list of members for <a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00304.html#4b647e4a93d08ccdd8d323279e4eaaa6">activate</a>()</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::source_task< source_node< output_type > ></b> (defined in <a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a>)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> typedef</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00304.html#22960d499df9f1569a9d8a544e35afe3">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00304.html#222484bf295f39df36415a29e508e5c9">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00304.html#503c3b395c629296bf5cccd96d6388c1">source_node</a>(graph &g, Body body, bool is_active=true)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00304.html#adaac111fbcace95804219a5f2929304">source_node</a>(const source_node &src)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00304.html#dd7b8fe78f0bec9d6b70cbf1018a69fe">successor_type</a> typedef</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</a>()</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00304.html#41073ad4d3510ed5a8b6bda9c0f58636">try_get</a>(output_type &v)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00304.html#494678baf9096835268736b800824460">try_release</a>()</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a>(output_type &v)</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::sender< Output ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00304.html#61700b0865fc17188b0abe26bbde65b6">~source_node</a>()</td><td><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00048.html b/doc/html/a00048.html
index 93c65e7..8d9aa4c 100644
--- a/doc/html/a00048.html
+++ b/doc/html/a00048.html
@@ -20,21 +20,16 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::source_node< Output > Member List</h1>This is the complete list of members for <a class="el" href="a00285.html">tbb::source_node< Output ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00285.html#d71ed386c53032463f3435f79a15b6ff">activate</a>()</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::source_task< source_node< output_type > ></b> (defined in <a class="el" href="a00285.html">tbb::source_node< Output ></a>)</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> typedef</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00285.html#ce601874ec5cbb0996f6dcb8e43badb8">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00285.html#de069bfc6fae7ed4e82b2a1fbb58b721">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00285.html#0513272133a06db6742873671af98f21">source_node</a>(graph &g, Body body, bool is_active=true)</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00285.html#217d72bbc6e7a4b35ef014dd9a15efca">successor_type</a> typedef</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00285.html#809f51859ca4dd04204591d76c8572eb">try_consume</a>()</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00285.html#0434d2933ad082d3c43a4ec774150511">try_get</a>(output_type &v)</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">try_release</a>()</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">try_reserve</a>(output_type &v)</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< Output ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< Output ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00285.html#90c94a8a52cc3d19cf393ce289e80733">~source_node</a>()</td><td><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::flow::interface6::function_node< Input, Output,, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>fOutput_type</b> typedef (defined in <a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>(graph &g, size_t concurrency, Body body)</td><td><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00260.html#d5132323fd2ac6a00ea0c78beda78723">function_node</a>(const function_node &src)</td><td><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00049.html b/doc/html/a00049.html
index 36c6bc3..37090d4 100644
--- a/doc/html/a00049.html
+++ b/doc/html/a00049.html
@@ -20,15 +20,18 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::function_node< Input, Output > Member List</h1>This is the complete list of members for <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00249.html#7bde12e8ee43d4cafbdd5b1fc2031e2b">function_node</a>(graph &g, size_t concurrency, Body body)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>)</td><td><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td><code> [inline, protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::function_node< Input, Output, queueing, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>fInput_type</b> typedef (defined in <a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>fOutput_type</b> typedef (defined in <a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00261.html#5b9019c1e6e9b2c41c986a384bd179db">function_node</a>(graph &g, size_t concurrency, Body body)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00261.html#01055081ed477714503820035db3a965">function_node</a>(const function_node &src)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>queue_type</b> typedef (defined in <a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>)</td><td><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td><code> [inline, protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00050.html b/doc/html/a00050.html
index 12f826c..2897add 100644
--- a/doc/html/a00050.html
+++ b/doc/html/a00050.html
@@ -20,16 +20,12 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::executable_node< Output > Member List</h1>This is the complete list of members for <a class="el" href="a00244.html">tbb::executable_node< Output ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00244.html#73d4304b322a25ed0df468e607dd1dac">executable_node</a>(graph &g, Body body)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00244.html#c13030111d34feeafd9cdb1dd21584f1">executable_node</a>(graph &g, int number_of_predecessors, Body body)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [inline, protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>multioutput_function_node</b>(graph &g, size_t concurrency, Body body) (defined in <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>multioutput_function_node</b>(const multioutput_function_node &other) (defined in <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>ports_type</b> typedef (defined in <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00052.html b/doc/html/a00052.html
new file mode 100644
index 0000000..9782efb
--- /dev/null
+++ b/doc/html/a00052.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class Members</span></a></li>
+  </ul></div>
+<h1>tbb::flow::interface6::split_node< TupleType, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>allocator_type</b> typedef (defined in <a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>multioutput_function_node</b>(graph &g, size_t concurrency, Body body) (defined in <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>multioutput_function_node</b>(const multioutput_function_node &other) (defined in <a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator ></a>)</td><td><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>ports_type</b> typedef (defined in <a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>split_node</b>(graph &g) (defined in <a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>split_node</b>(const split_node &other) (defined in <a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>)</td><td><a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00053.html b/doc/html/a00053.html
deleted file mode 100644
index 3f4adb8..0000000
--- a/doc/html/a00053.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<h1>tbb::continue_node Member List</h1>This is the complete list of members for <a class="el" href="a00240.html">tbb::continue_node</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>continue_node</b>(graph &g) (defined in <a class="el" href="a00240.html">tbb::continue_node</a>)</td><td><a class="el" href="a00240.html">tbb::continue_node</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00244.html#73d4304b322a25ed0df468e607dd1dac">executable_node</a>(graph &g, Body body)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00244.html#c13030111d34feeafd9cdb1dd21584f1">executable_node</a>(graph &g, int number_of_predecessors, Body body)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00240.html">tbb::continue_node</a>)</td><td><a class="el" href="a00240.html">tbb::continue_node</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00240.html">tbb::continue_node</a>)</td><td><a class="el" href="a00240.html">tbb::continue_node</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00240.html">tbb::continue_node</a>)</td><td><a class="el" href="a00240.html">tbb::continue_node</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00240.html">tbb::continue_node</a>)</td><td><a class="el" href="a00240.html">tbb::continue_node</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00244.html">tbb::executable_node< Output ></a>)</td><td><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td><code> [inline, protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00054.html b/doc/html/a00054.html
index ff5451f..a43d8d3 100644
--- a/doc/html/a00054.html
+++ b/doc/html/a00054.html
@@ -20,24 +20,17 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::broadcast_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00224.html">tbb::broadcast_node< T ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>broadcast_node</b>() (defined in <a class="el" href="a00224.html">tbb::broadcast_node< T ></a>)</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00224.html#59ea89dbeab816742e6dc6af467e6c3f">input_type</a> typedef</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00224.html#b844ca1ee578a54bc11ff28467b12e7d">output_type</a> typedef</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00224.html#4dd13b81f6361fc244abe7cbcacd048c">predecessor_type</a> typedef</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00224.html#3f4149fa6b984b2138cb5ed40a2ddc6c">register_successor</a>(receiver< T > &r)</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00224.html#eefb3210bb9727765ea7385ba163c2a6">remove_successor</a>(receiver< T > &r)</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00224.html#453928c367d813cb481f1b9aa1e1742a">successor_type</a> typedef</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">try_consume</a>()</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#bf8c9235810354f3353a899c982645de">try_get</a>(T &)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00224.html#9b211e02554d6b39dc04f7e7f4e00073">try_put</a>(T t)</td><td><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">try_release</a>()</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">try_reserve</a>(T &)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::continue_node< Output > Member List</h1>This is the complete list of members for <a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00252.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>(graph &g, Body body)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00252.html#7817aebf22dd125ca04df53ac488d163">continue_node</a>(graph &g, int number_of_predecessors, Body body)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00252.html#869562787fcb5c57a90aea120f26d492">continue_node</a>(const continue_node &src)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>fOutput_type</b> typedef (defined in <a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>input_type</b> typedef (defined in <a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>output_type</b> typedef (defined in <a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>predecessor_type</b> typedef (defined in <a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>successor_type</b> typedef (defined in <a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>successors</b>() (defined in <a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a>)</td><td><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td><code> [inline, protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00055.html b/doc/html/a00055.html
deleted file mode 100644
index 4316b58..0000000
--- a/doc/html/a00055.html
+++ /dev/null
@@ -1,89 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<h1>tbb::buffer_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00225.html">tbb::buffer_node< T ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">buffer_node</a>(graph &g)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">forward</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>(size_t minimum_size)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>initial_buffer_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#90de308ba6abefb74c537a62ed0f1ca3">input_type</a> typedef</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T > ></b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(buffer_operation *op) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">internal_forward</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(buffer_operation *op) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_push</b>(buffer_operation *op) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(buffer_operation *op) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(buffer_operation *op) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>item_type</b> typedef (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_array</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_array_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_head</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_mutex</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_reserved</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_reserved_id</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_tail</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">output_type</a> typedef</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#688cf819089ee2fac2b9de2e050adea7">predecessor_type</a> typedef</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#5e23f4f377ff4e1f53e71fd909a65771">successor_type</a> typedef</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">try_consume</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>try_fwd</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">try_get</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">try_put</a>(T t)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">try_release</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">try_reserve</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00057.html b/doc/html/a00057.html
new file mode 100644
index 0000000..3e8dc08
--- /dev/null
+++ b/doc/html/a00057.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class Members</span></a></li>
+  </ul></div>
+<h1>tbb::flow::interface6::broadcast_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>broadcast_node</b>() (defined in <a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a>)</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>broadcast_node</b>(const broadcast_node &) (defined in <a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a>)</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00236.html#43c775d80e98cc601de69764983319f9">input_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00236.html#8fd8d3075823e08b879be46c1215ab0f">output_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00236.html#0e2ad9a121cb286aa0d0142fef33c646">predecessor_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00236.html#fd0324c9ddb51fe6f95b3d015d338941">register_successor</a>(receiver< T > &r)</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00236.html#366efcc046ec08a104281109801ae629">remove_successor</a>(receiver< T > &r)</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00236.html#cc6a0eb1c4ee65465770628d8366f055">successor_type</a> typedef</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>()</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>(T &)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00236.html#29eb768c10b377880bbf83d31ee49acf">try_put</a>(const T &t)</td><td><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#27036b06d6a91e97007e14f400529199">try_release</a>()</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>(T &)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00058.html b/doc/html/a00058.html
index b3d1559..eaca853 100644
--- a/doc/html/a00058.html
+++ b/doc/html/a00058.html
@@ -20,66 +20,58 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::queue_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00269.html">tbb::queue_node< T ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">buffer_node</a>(graph &g)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">forward</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>(size_t minimum_size)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>initial_buffer_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00269.html#27016487003a4ff2908748c3cf11c1fe">input_type</a> typedef</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T > ></b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(queue_operation *op) (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">internal_forward</a>(queue_operation *op)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(queue_operation *op) (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_push</b>(buffer_operation *op) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(buffer_operation *op) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(queue_operation *op) (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>item_type</b> typedef (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_array</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_array_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_head</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_mutex</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_reserved</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_reserved_id</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_tail</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00269.html#d227f122eebe2f9489ba763ff24fd6fb">output_type</a> typedef</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00269.html#83bc7308a38f1d205377d78ec14931d1">predecessor_type</a> typedef</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">queue_node</a>(graph &g)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>queue_operation</b> typedef (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00269.html#c3b1d76b66b1292f6a1b6dae52c67a0e">successor_type</a> typedef</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">try_consume</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>try_fwd</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">try_get</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">try_put</a>(T t)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">try_release</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">try_reserve</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::buffer_node< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">forward</a>()</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a> typedef</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::aggregating_functor< my_class, buffer_operation ></b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T, A > ></b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(buffer_operation *op) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#dcbffbae514f4d95205b0845785c0a91">internal_forward</a>(buffer_operation *op)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(buffer_operation *op) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_push</b>(buffer_operation *op) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(buffer_operation *op) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(buffer_operation *op) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_class</b> typedef (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> typedef</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#5fb0ad03a822ca0fc34ad5d56a4093a2">predecessor_type</a> typedef</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#66f7eda69b75e08f50726e50a11429cd">successor_type</a> typedef</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>try_fwd</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(const T &t)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00059.html b/doc/html/a00059.html
deleted file mode 100644
index ac0a985..0000000
--- a/doc/html/a00059.html
+++ /dev/null
@@ -1,93 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<h1>tbb::sequencer_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">buffer_node</a>(graph &g)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">forward</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>(size_t minimum_size)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>initial_buffer_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">input_type</a> typedef</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T > ></b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(queue_operation *op) (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">internal_forward</a>(queue_operation *op)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(queue_operation *op) (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(buffer_operation *op) (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(queue_operation *op) (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>item_type</b> typedef (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_array</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_array_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_head</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_mutex</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_reserved</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_reserved_id</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_tail</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00283.html#0c613bb01103dfcfbc3f9cbe943f95b0">output_type</a> typedef</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00283.html#6581686ef0cf8e13c0270687628af5eb">predecessor_type</a> typedef</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">queue_node</a>(graph &g)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>queue_operation</b> typedef (defined in <a class="el" href="a00269.html">tbb::queue_node< T ></a>)</td><td><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00283.html#c3138c1c96b76ae9f13b0abbf7029590">sequencer_node</a>(graph &g, const Sequencer &s)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>sequencer_operation</b> typedef (defined in <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00283.html#3591313e30d0f485a09106686067411f">successor_type</a> typedef</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">try_consume</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>try_fwd</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">try_get</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">try_put</a>(T t)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">try_release</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">try_reserve</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00283.html">tbb::sequencer_node< T ></a>)</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00283.html#c87d80feebaf2bae4af22b5f2459b37e">~sequencer_node</a>()</td><td><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00060.html b/doc/html/a00060.html
index 7aead19..c602c35 100644
--- a/doc/html/a00060.html
+++ b/doc/html/a00060.html
@@ -20,66 +20,61 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::priority_queue_node< T, Compare > Member List</h1>This is the complete list of members for <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">buffer_node</a>(graph &g)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">forward</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>(size_t minimum_size)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(prio_operation *op_list) (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>initial_buffer_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">input_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T > ></b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(prio_operation *op) (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">internal_forward</a>(prio_operation *op)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(prio_operation *op) (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_push</b>(prio_operation *op) (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(prio_operation *op) (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(prio_operation *op) (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>item_type</b> typedef (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_array</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_array_size</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_head</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_mutex</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_reserved</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_reserved_id</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_tail</b> (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00268.html#3b3fa4479416e7cb6d4a6a4b175c2b15">output_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00268.html#98900a87758cac05500fcbc74113cebf">predecessor_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>prio_operation</b> typedef (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00268.html#1630f68674c4b201346a391b1e8d3f5d">priority_queue_node</a>(graph &g)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00268.html#e01014f2e5ceea292c68f6fe47391c57">successor_type</a> typedef</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">try_consume</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>try_fwd</b> enum value (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">try_get</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">try_put</a>(T t)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">try_release</a>()</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">try_reserve</a>(T &v)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>)</td><td><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00225.html">tbb::buffer_node< T ></a>)</td><td><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::queue_node< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">forward</a>()</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a> typedef</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::aggregating_functor< my_class, buffer_operation ></b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T, A > ></b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(queue_operation *op) (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">internal_forward</a>(queue_operation *op)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(queue_operation *op) (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_push</b>(buffer_operation *op) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(buffer_operation *op) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(queue_operation *op) (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_class</b> typedef (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00287.html#25b5a53ab1f9a342644fa3759bc0b1ad">output_type</a> typedef</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00287.html#5e2fdd33c45d44549dee9c1638e19898">predecessor_type</a> typedef</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00287.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>(graph &g)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00287.html#0226762d9ebba28311b7b1518d948ab1">queue_node</a>(const queue_node &src)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>queue_operation</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00287.html#f35076a19f256f9e7a61bed77ca1ccc5">successor_type</a> typedef</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>try_fwd</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(const T &t)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00061.html b/doc/html/a00061.html
index cb52008..f27772f 100644
--- a/doc/html/a00061.html
+++ b/doc/html/a00061.html
@@ -20,29 +20,64 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::limiter_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00255.html">tbb::limiter_node< T ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">decrement</a></td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">input_type</a> typedef</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::decrementer< limiter_node< T > ></b> (defined in <a class="el" href="a00255.html">tbb::limiter_node< T ></a>)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< limiter_node< T > ></b> (defined in <a class="el" href="a00255.html">tbb::limiter_node< T ></a>)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00255.html#f0139fc645a51ce30b7aebb59c38a4ed">limiter_node</a>(graph &g, size_t threshold, int number_of_decrement_predecessors=0)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">output_type</a> typedef</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00255.html#fd88ce7670e7107aef2161b45f156185">predecessor_type</a> typedef</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00255.html#fb9909b87538f5c881c7cb7577436d14">register_predecessor</a>(predecessor_type &src)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">tbb::receiver::register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00255.html#b8b9dbfbfc52750fa0c6bb8849681e86">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00255.html#a05cf39b2825183e9c0393890fbbbb41">remove_predecessor</a>(predecessor_type &src)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">tbb::receiver::remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00255.html#047d77f583e789e6d3ac6a52aba3168b">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00255.html#754182cc1e5b403201495bc1fd45674b">successor_type</a> typedef</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">try_consume</a>()</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#bf8c9235810354f3353a899c982645de">try_get</a>(T &)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00255.html#a38facb46cde854cb7408bf9f3bf8999">try_put</a>(T t)</td><td><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">try_release</a>()</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">try_reserve</a>(T &)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< T ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::flow::interface6::sequencer_node< T, A > Member List</h1>This is the complete list of members for <a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">forward</a>()</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(buffer_operation *op_list) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00302.html#af629f26832ff4e476e240637a78bc0c">input_type</a> typedef</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::aggregating_functor< my_class, buffer_operation ></b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T, A > ></b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(queue_operation *op) (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">internal_forward</a>(queue_operation *op)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(queue_operation *op) (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(buffer_operation *op) (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(queue_operation *op) (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_class</b> typedef (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00302.html#ca026eaef70e35791c407323199031a7">output_type</a> typedef</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00302.html#8127e36811832563fe1e9bc3ba391f79">predecessor_type</a> typedef</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00287.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>(graph &g)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00287.html#0226762d9ebba28311b7b1518d948ab1">queue_node</a>(const queue_node &src)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>queue_operation</b> typedef (defined in <a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>)</td><td><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00302.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a>(graph &g, const Sequencer &s)</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00302.html#b38e7a070552960384bcc1d91af13a5c">sequencer_node</a>(const sequencer_node &src)</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>sequencer_operation</b> typedef (defined in <a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00302.html#795f3ee75f133b9d3b159172fc4a197f">successor_type</a> typedef</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>try_fwd</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(const T &t)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>)</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00302.html#93d3d8f6a72b3e1387047282116ed6ee">~sequencer_node</a>()</td><td><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00062.html b/doc/html/a00062.html
new file mode 100644
index 0000000..732e8c7
--- /dev/null
+++ b/doc/html/a00062.html
@@ -0,0 +1,87 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class Members</span></a></li>
+  </ul></div>
+<h1>tbb::flow::interface6::priority_queue_node< T, Compare, A > Member List</h1>This is the complete list of members for <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>(graph &g)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a>(const buffer_node &src)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>con_res</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>FAILED</b> enum value (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">forward</a>()</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>forwarder_busy</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>handle_operations</b>(prio_operation *op_list) (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> typedef</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::aggregating_functor< my_class, buffer_operation ></b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< buffer_node< T, A > ></b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_consume</b>(prio_operation *op) (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">internal_forward</a>(prio_operation *op)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_pop</b>(prio_operation *op) (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_push</b>(prio_operation *op) (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_release</b>(prio_operation *op) (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal_reserve</b>(prio_operation *op) (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline, protected, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>item_type</b> typedef (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_aggregator</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_class</b> typedef (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_handler</b> typedef (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_parent</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_successors</b> (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>op_stat</b> enum name (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>op_type</b> enum name (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00286.html#2cb099b590246b6bc93cc15e78c6ee5c">output_type</a> typedef</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00286.html#fdea783bf9d5a4c98e794ac7e0f84ccf">predecessor_type</a> typedef</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>prio_operation</b> typedef (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00286.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a>(graph &g)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00286.html#17a4f66e23d54100b64805405e905d62">priority_queue_node</a>(const priority_queue_node &src)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>put_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reg_succ</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>rel_res</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>rem_succ</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>req_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>res_item</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>SUCCEEDED</b> enum value (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00286.html#09ab5064ca8192e68c03da47603e68eb">successor_type</a> typedef</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>()</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>try_fwd</b> enum value (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>(T &v)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(const T &t)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>()</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>(T &v)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>WAIT</b> enum value (defined in <a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>)</td><td><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~buffer_node</b>() (defined in <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>)</td><td><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00063.html b/doc/html/a00063.html
new file mode 100644
index 0000000..f2b4661
--- /dev/null
+++ b/doc/html/a00063.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class Members</span></a></li>
+  </ul></div>
+<h1>tbb::flow::interface6::limiter_node< T > Member List</h1>This is the complete list of members for <a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a></td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">input_type</a> typedef</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::decrementer< limiter_node< T > ></b> (defined in <a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a>)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::forward_task< limiter_node< T > ></b> (defined in <a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a>)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00266.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a>(graph &g, size_t threshold, int num_decrement_predecessors=0)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00266.html#83d3ab884543b070ee5b345a87f241fa">limiter_node</a>(const limiter_node &src)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> typedef</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00266.html#f89fcf44f38eb33f965ee5362d3e68e9">predecessor_type</a> typedef</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00266.html#de70a0e88ce7655d8c14b6af57f7496f">register_predecessor</a>(predecessor_type &src)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver::register_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00266.html#c76561d8d871b4769876988a4de12a9b">register_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00266.html#c530e7b469454e2340460795f2da3317">remove_predecessor</a>(predecessor_type &src)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver::remove_predecessor</a>(predecessor_type &)</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00266.html#275e328063c121b3e506ccef2a825d28">remove_successor</a>(receiver< output_type > &r)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00266.html#e8945e4dd6ea759ff9e4735da13f12ef">successor_type</a> typedef</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>()</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>(T &)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00266.html#55a02d458a4d8ffa6accd7a70605da2f">try_put</a>(const T &t)</td><td><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#27036b06d6a91e97007e14f400529199">try_release</a>()</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>(T &)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>)</td><td><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>()</td><td><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a>)</td><td><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td><code> [inline, virtual]</code></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00065.html b/doc/html/a00065.html
deleted file mode 100644
index f9800d9..0000000
--- a/doc/html/a00065.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<h1>tbb::internal::two_phase_port< T > Member List</h1>This is the complete list of members for <a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00304.html#684f6bbc3290270ed43cb34ffd273f71">consume</a>()</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00304.html#0f464d59e15941d6d625e8c7d634e26b">input_type</a> typedef</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00304.html#37ee9b5320b631c39bccc0b4745d88d1">predecessor_type</a> typedef</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00304.html#6dc1f9bf02109c7f6fe4cc58bc31a00c">register_predecessor</a>(sender< T > &src)</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00304.html#091f6efffaadbbeca6cf23483dabd891">release</a>()</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00304.html#a734a55289804ff34ce1c6ac4c5075e4">remove_predecessor</a>(sender< T > &src)</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00304.html#1d7399cfc77fca8878d8d16049ce4e7e">reserve</a>(T &v)</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>set_join_node_pointer</b>(forwarding_base *join) (defined in <a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a>)</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00304.html#f316c0d5ff67068ff23b684accbe87f4">try_put</a>(T)</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00304.html#60e17ef935031c86c4a288eafab5c066">two_phase_port</a>()</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>two_phase_port</b>(const two_phase_port &) (defined in <a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a>)</td><td><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>()</td><td><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00067.html b/doc/html/a00067.html
deleted file mode 100644
index 6b72233..0000000
--- a/doc/html/a00067.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<h1>tbb::internal::join_node_base< JP, InputTuple, OutputTuple > Member List</h1>This is the complete list of members for <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>forward_task< join_node_base< JP, InputTuple, OutputTuple > ></b> (defined in <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>input_port</b>(void) (defined in <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>input_ports_type</b> typedef (defined in <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>join_node_base</b>(graph &g) (defined in <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">output_type</a> typedef</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>register_successor</b>(successor_type &r) (defined in <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">tbb::sender< OutputTuple >::register_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a></td><td><code> [pure virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>remove_successor</b>(successor_type &r) (defined in <a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#3f345427e812e8741370308ff88f30bf">tbb::sender< OutputTuple >::remove_successor</a>(successor_type &r)=0</td><td><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a></td><td><code> [pure virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">successor_type</a> typedef</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">try_consume</a>()</td><td><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00254.html#50c0e6465ac929a2e94d4e62a13ebeff">try_get</a>(output_type &v)</td><td><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">try_release</a>()</td><td><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">try_reserve</a>(OutputTuple &)</td><td><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~sender</b>() (defined in <a class="el" href="a00282.html">tbb::sender< OutputTuple ></a>)</td><td><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a></td><td><code> [inline, virtual]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00068.html b/doc/html/a00068.html
new file mode 100644
index 0000000..16915ab
--- /dev/null
+++ b/doc/html/a00068.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class Members</span></a></li>
+  </ul></div>
+<h1>tbb::interface6::memory_pool_allocator< T, P > Member List</h1>This is the complete list of members for <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const  (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const  (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00270.html#365bd64d284c80d85bb2149a12681526">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00270.html#c7e1671b725894b94ce9a6ac544e24f2">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00270.html#4e24a03de38638af07548383024c54ab">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00270.html#a3af27e1f8535cc512134ec9a82ff4fc">destroy</a>(pointer p)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00270.html#beebdb6144df8ba219fadfad4de866ea">max_size</a>() const </td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b> (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(pool_type &pool) (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(const memory_pool_allocator &src) (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(const memory_pool_allocator< U, P > &src) (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_pool</b> (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator!=</b> (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator==</b> (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pool_type</b> typedef (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>)</td><td><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00070.html b/doc/html/a00070.html
new file mode 100644
index 0000000..d0209ee
--- /dev/null
+++ b/doc/html/a00070.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Member List</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class Members</span></a></li>
+  </ul></div>
+<h1>tbb::interface6::memory_pool_allocator< void, P > Member List</h1>This is the complete list of members for <a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b> (defined in <a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(pool_type &pool) (defined in <a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(const memory_pool_allocator &src) (defined in <a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>memory_pool_allocator</b>(const memory_pool_allocator< U, P > &src) (defined in <a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_pool</b> (defined in <a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator!=</b> (defined in <a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator==</b> (defined in <a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pool_type</b> typedef (defined in <a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>)</td><td><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td></td></tr>
+</table><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00040.html b/doc/html/a00072.html
similarity index 66%
rename from doc/html/a00040.html
rename to doc/html/a00072.html
index 603513a..13cb414 100644
--- a/doc/html/a00040.html
+++ b/doc/html/a00072.html
@@ -20,8 +20,9 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::graph_node Member List</h1>This is the complete list of members for <a class="el" href="a00251.html">tbb::graph_node</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>~graph_node</b>() (defined in <a class="el" href="a00251.html">tbb::graph_node</a>)</td><td><a class="el" href="a00251.html">tbb::graph_node</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::interface6::memory_pool< Alloc > Member List</h1>This is the complete list of members for <a class="el" href="a00269.html">tbb::interface6::memory_pool< Alloc ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00269.html#2822528265718a4c779591fc37c02ca8">memory_pool</a>(const Alloc &src=Alloc())</td><td><a class="el" href="a00269.html">tbb::interface6::memory_pool< Alloc ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00269.html#fdad7c4ed08332ec384491a71b721957">~memory_pool</a>()</td><td><a class="el" href="a00269.html">tbb::interface6::memory_pool< Alloc ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00078.html b/doc/html/a00074.html
similarity index 55%
copy from doc/html/a00078.html
copy to doc/html/a00074.html
index 575a53d..1a4425d 100644
--- a/doc/html/a00078.html
+++ b/doc/html/a00074.html
@@ -20,24 +20,24 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::mutex Member List</h1>This is the complete list of members for <a class="el" href="a00258.html">tbb::mutex</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>DESTROYED</b> enum value (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>HELD</b> enum value (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>INITIALIZED</b> enum value (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00258.html#4470e61c24c129a0299ca6c17240adbb">lock</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00258.html#05313cb77d4f85213103d4dab74ed454">mutex</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>native_handle</b>() (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> typedef</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>native_handle_type</b> typedef (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00258.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>(state_t to)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>state_t</b> enum name (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00258.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00258.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~mutex</b>() (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::mutex Member List</h1>This is the complete list of members for <a class="el" href="a00275.html">tbb::mutex</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>DESTROYED</b> enum value (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>HELD</b> enum value (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>INITIALIZED</b> enum value (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00275.html#4470e61c24c129a0299ca6c17240adbb">lock</a>()</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00275.html#05313cb77d4f85213103d4dab74ed454">mutex</a>()</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>native_handle</b>() (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> typedef</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>native_handle_type</b> typedef (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00275.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>(state_t to)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>state_t</b> enum name (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00275.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>()</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00275.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>()</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~mutex</b>() (defined in <a class="el" href="a00275.html">tbb::mutex</a>)</td><td><a class="el" href="a00275.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00079.html b/doc/html/a00075.html
similarity index 69%
copy from doc/html/a00079.html
copy to doc/html/a00075.html
index 57a201f..10c39e2 100644
--- a/doc/html/a00079.html
+++ b/doc/html/a00075.html
@@ -20,14 +20,14 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00259.html">tbb::mutex::scoped_lock</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00259.html#862e022841cdc522e4296a5533b22efd">acquire</a>(mutex &mutex)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>mutex</b> (defined in <a class="el" href="a00259.html">tbb::mutex::scoped_lock</a>)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00259.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>()</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00259.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>()</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00259.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a>(mutex &mutex)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00259.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>(mutex &mutex)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00259.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>()</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00276.html">tbb::mutex::scoped_lock</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00276.html#862e022841cdc522e4296a5533b22efd">acquire</a>(mutex &mutex)</td><td><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>mutex</b> (defined in <a class="el" href="a00276.html">tbb::mutex::scoped_lock</a>)</td><td><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00276.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>()</td><td><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00276.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>()</td><td><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00276.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a>(mutex &mutex)</td><td><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00276.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>(mutex &mutex)</td><td><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00276.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>()</td><td><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00080.html b/doc/html/a00076.html
similarity index 76%
copy from doc/html/a00080.html
copy to doc/html/a00076.html
index 641ac00..b744120 100644
--- a/doc/html/a00080.html
+++ b/doc/html/a00076.html
@@ -20,11 +20,11 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::null_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00260.html">tbb::null_mutex</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>null_mutex</b>() (defined in <a class="el" href="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.html">tbb::null_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::null_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00277.html">tbb::null_mutex</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00277.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00277.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00277.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00277.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00277.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00277.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>null_mutex</b>() (defined in <a class="el" href="a00277.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00277.html">tbb::null_mutex</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00081.html b/doc/html/a00077.html
similarity index 73%
rename from doc/html/a00081.html
rename to doc/html/a00077.html
index d215285..b6e3d9d 100644
--- a/doc/html/a00081.html
+++ b/doc/html/a00077.html
@@ -20,13 +20,13 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::null_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>acquire</b>(null_mutex &) (defined in <a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>release</b>() (defined in <a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>() (defined in <a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>(null_mutex &) (defined in <a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>try_acquire</b>(null_mutex &) (defined in <a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~scoped_lock</b>() (defined in <a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::null_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>acquire</b>(null_mutex &) (defined in <a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>release</b>() (defined in <a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>() (defined in <a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>(null_mutex &) (defined in <a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>try_acquire</b>(null_mutex &) (defined in <a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~scoped_lock</b>() (defined in <a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a>)</td><td><a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00078.html b/doc/html/a00078.html
index 575a53d..6a7c81a 100644
--- a/doc/html/a00078.html
+++ b/doc/html/a00078.html
@@ -20,24 +20,11 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::mutex Member List</h1>This is the complete list of members for <a class="el" href="a00258.html">tbb::mutex</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>DESTROYED</b> enum value (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>HELD</b> enum value (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>INITIALIZED</b> enum value (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00258.html#4470e61c24c129a0299ca6c17240adbb">lock</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00258.html#05313cb77d4f85213103d4dab74ed454">mutex</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>native_handle</b>() (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> typedef</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>native_handle_type</b> typedef (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00258.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>(state_t to)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>state_t</b> enum name (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00258.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00258.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>()</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~mutex</b>() (defined in <a class="el" href="a00258.html">tbb::mutex</a>)</td><td><a class="el" href="a00258.html">tbb::mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::null_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00279.html">tbb::null_rw_mutex</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00279.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00279.html">tbb::null_rw_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00279.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00279.html">tbb::null_rw_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00279.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00279.html">tbb::null_rw_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>null_rw_mutex</b>() (defined in <a class="el" href="a00279.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00279.html">tbb::null_rw_mutex</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00079.html b/doc/html/a00079.html
index 57a201f..6c44c19 100644
--- a/doc/html/a00079.html
+++ b/doc/html/a00079.html
@@ -20,14 +20,15 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00259.html">tbb::mutex::scoped_lock</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00259.html#862e022841cdc522e4296a5533b22efd">acquire</a>(mutex &mutex)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>mutex</b> (defined in <a class="el" href="a00259.html">tbb::mutex::scoped_lock</a>)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00259.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>()</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00259.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>()</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00259.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a>(mutex &mutex)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00259.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>(mutex &mutex)</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00259.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>()</td><td><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::null_rw_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>acquire</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>downgrade_to_reader</b>() (defined in <a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>release</b>() (defined in <a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>() (defined in <a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>try_acquire</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>upgrade_to_writer</b>() (defined in <a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~scoped_lock</b>() (defined in <a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00080.html b/doc/html/a00080.html
index 641ac00..67469ea 100644
--- a/doc/html/a00080.html
+++ b/doc/html/a00080.html
@@ -20,11 +20,9 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::null_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00260.html">tbb::null_mutex</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.html">tbb::null_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>null_mutex</b>() (defined in <a class="el" href="a00260.html">tbb::null_mutex</a>)</td><td><a class="el" href="a00260.html">tbb::null_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::parallel_do_feeder< Item > Member List</h1>This is the complete list of members for <a class="el" href="a00281.html">tbb::parallel_do_feeder< Item ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00281.html#40baaf0f6856f4491dd0adf896c93516">add</a>(const Item &item)</td><td><a class="el" href="a00281.html">tbb::parallel_do_feeder< Item ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::parallel_do_feeder_impl</b> (defined in <a class="el" href="a00281.html">tbb::parallel_do_feeder< Item ></a>)</td><td><a class="el" href="a00281.html">tbb::parallel_do_feeder< Item ></a></td><td><code> [friend]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00082.html b/doc/html/a00082.html
index e55d066..9b0ca91 100644
--- a/doc/html/a00082.html
+++ b/doc/html/a00082.html
@@ -20,11 +20,8 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::null_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00262.html">tbb::null_rw_mutex</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00262.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00262.html">tbb::null_rw_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00262.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00262.html">tbb::null_rw_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00262.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00262.html">tbb::null_rw_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>null_rw_mutex</b>() (defined in <a class="el" href="a00262.html">tbb::null_rw_mutex</a>)</td><td><a class="el" href="a00262.html">tbb::null_rw_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::pre_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00285.html">tbb::pre_scan_tag</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>is_final_scan</b>() (defined in <a class="el" href="a00285.html">tbb::pre_scan_tag</a>)</td><td><a class="el" href="a00285.html">tbb::pre_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00083.html b/doc/html/a00083.html
index a4c376f..5614da5 100644
--- a/doc/html/a00083.html
+++ b/doc/html/a00083.html
@@ -20,15 +20,8 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::null_rw_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>acquire</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>downgrade_to_reader</b>() (defined in <a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>release</b>() (defined in <a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>() (defined in <a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>try_acquire</b>(null_rw_mutex &, bool=true) (defined in <a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>upgrade_to_writer</b>() (defined in <a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~scoped_lock</b>() (defined in <a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a>)</td><td><a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::final_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00258.html">tbb::final_scan_tag</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>is_final_scan</b>() (defined in <a class="el" href="a00258.html">tbb::final_scan_tag</a>)</td><td><a class="el" href="a00258.html">tbb::final_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00084.html b/doc/html/a00084.html
index b59c34f..0923278 100644
--- a/doc/html/a00084.html
+++ b/doc/html/a00084.html
@@ -20,9 +20,12 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::parallel_do_feeder< Item > Member List</h1>This is the complete list of members for <a class="el" href="a00264.html">tbb::parallel_do_feeder< Item ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00264.html#40baaf0f6856f4491dd0adf896c93516">add</a>(const Item &item)</td><td><a class="el" href="a00264.html">tbb::parallel_do_feeder< Item ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::parallel_do_feeder_impl</b> (defined in <a class="el" href="a00264.html">tbb::parallel_do_feeder< Item ></a>)</td><td><a class="el" href="a00264.html">tbb::parallel_do_feeder< Item ></a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::parallel_while< Body > Member List</h1>This is the complete list of members for <a class="el" href="a00282.html">tbb::parallel_while< Body ></a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00282.html#e131c560057a58229992b61eb8dba4c6">add</a>(const value_type &item)</td><td><a class="el" href="a00282.html">tbb::parallel_while< Body ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00282.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>()</td><td><a class="el" href="a00282.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00282.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a>(Stream &stream, const Body &body)</td><td><a class="el" href="a00282.html">tbb::parallel_while< Body ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> typedef</td><td><a class="el" href="a00282.html">tbb::parallel_while< Body ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00282.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>()</td><td><a class="el" href="a00282.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00085.html b/doc/html/a00085.html
index 8db8eb1..ace4663 100644
--- a/doc/html/a00085.html
+++ b/doc/html/a00085.html
@@ -20,8 +20,9 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::pre_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00267.html">tbb::pre_scan_tag</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>is_final_scan</b>() (defined in <a class="el" href="a00267.html">tbb::pre_scan_tag</a>)</td><td><a class="el" href="a00267.html">tbb::pre_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::internal::affinity_partitioner_base_v3 Member List</h1>This is the complete list of members for <a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>tbb::affinity_partitioner</b> (defined in <a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>tbb::interface6::internal::affinity_partition_type</b> (defined in <a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00086.html b/doc/html/a00086.html
index 5893606..1e29984 100644
--- a/doc/html/a00086.html
+++ b/doc/html/a00086.html
@@ -20,8 +20,12 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::final_scan_tag Member List</h1>This is the complete list of members for <a class="el" href="a00247.html">tbb::final_scan_tag</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>is_final_scan</b>() (defined in <a class="el" href="a00247.html">tbb::final_scan_tag</a>)</td><td><a class="el" href="a00247.html">tbb::final_scan_tag</a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::internal::partition_type_base Member List</h1>This is the complete list of members for <a class="el" href="a00283.html">tbb::internal::partition_type_base</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>continue_after_execute_range</b>() (defined in <a class="el" href="a00283.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00283.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>decide_whether_to_delay</b>() (defined in <a class="el" href="a00283.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00283.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>note_affinity</b>(task::affinity_id) (defined in <a class="el" href="a00283.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00283.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>set_affinity</b>(task &) (defined in <a class="el" href="a00283.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00283.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>spawn_or_delay</b>(bool, task &b) (defined in <a class="el" href="a00283.html">tbb::internal::partition_type_base</a>)</td><td><a class="el" href="a00283.html">tbb::internal::partition_type_base</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00087.html b/doc/html/a00087.html
index f84857d..1c2fb62 100644
--- a/doc/html/a00087.html
+++ b/doc/html/a00087.html
@@ -20,12 +20,12 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::parallel_while< Body > Member List</h1>This is the complete list of members for <a class="el" href="a00265.html">tbb::parallel_while< Body ></a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00265.html#e131c560057a58229992b61eb8dba4c6">add</a>(const value_type &item)</td><td><a class="el" href="a00265.html">tbb::parallel_while< Body ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00265.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>()</td><td><a class="el" href="a00265.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00265.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a>(Stream &stream, const Body &body)</td><td><a class="el" href="a00265.html">tbb::parallel_while< Body ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00265.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> typedef</td><td><a class="el" href="a00265.html">tbb::parallel_while< Body ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00265.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>()</td><td><a class="el" href="a00265.html">tbb::parallel_while< Body ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::simple_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00303.html">tbb::simple_partitioner</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_for</b> (defined in <a class="el" href="a00303.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00303.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_reduce</b> (defined in <a class="el" href="a00303.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00303.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00303.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00303.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>serial::interface6::start_for</b> (defined in <a class="el" href="a00303.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00303.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>simple_partitioner</b>() (defined in <a class="el" href="a00303.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00303.html">tbb::simple_partitioner</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00088.html b/doc/html/a00089.html
similarity index 52%
rename from doc/html/a00088.html
rename to doc/html/a00089.html
index 742a894..24f6586 100644
--- a/doc/html/a00088.html
+++ b/doc/html/a00089.html
@@ -20,11 +20,12 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::simple_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00284.html">tbb::simple_partitioner</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>internal::start_for</b> (defined in <a class="el" href="a00284.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00284.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce</b> (defined in <a class="el" href="a00284.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00284.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00284.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00284.html">tbb::simple_partitioner</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>simple_partitioner</b>() (defined in <a class="el" href="a00284.html">tbb::simple_partitioner</a>)</td><td><a class="el" href="a00284.html">tbb::simple_partitioner</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::auto_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00231.html">tbb::auto_partitioner</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>auto_partitioner</b>() (defined in <a class="el" href="a00231.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00231.html">tbb::auto_partitioner</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_for</b> (defined in <a class="el" href="a00231.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00231.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_reduce</b> (defined in <a class="el" href="a00231.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00231.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00231.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00231.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>serial::interface6::start_for</b> (defined in <a class="el" href="a00231.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00231.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00090.html b/doc/html/a00090.html
index e7dad3a..205ab74 100644
--- a/doc/html/a00090.html
+++ b/doc/html/a00090.html
@@ -20,11 +20,14 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::auto_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00219.html">tbb::auto_partitioner</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>auto_partitioner</b>() (defined in <a class="el" href="a00219.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00219.html">tbb::auto_partitioner</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::start_for</b> (defined in <a class="el" href="a00219.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00219.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce</b> (defined in <a class="el" href="a00219.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00219.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00219.html">tbb::auto_partitioner</a>)</td><td><a class="el" href="a00219.html">tbb::auto_partitioner</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::affinity_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00225.html">tbb::affinity_partitioner</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>affinity_partitioner</b>() (defined in <a class="el" href="a00225.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00225.html">tbb::affinity_partitioner</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_for</b> (defined in <a class="el" href="a00225.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00225.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>interface6::internal::start_reduce</b> (defined in <a class="el" href="a00225.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00225.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00225.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00225.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>serial::interface6::start_for</b> (defined in <a class="el" href="a00225.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00225.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>tbb::affinity_partitioner</b> (defined in <a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>tbb::interface6::internal::affinity_partition_type</b> (defined in <a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a>)</td><td><a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a></td><td><code> [friend]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00093.html b/doc/html/a00091.html
similarity index 55%
copy from doc/html/a00093.html
copy to doc/html/a00091.html
index 79f7e4a..498cfc2 100644
--- a/doc/html/a00093.html
+++ b/doc/html/a00091.html
@@ -20,29 +20,29 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::filter Member List</h1>This is the complete list of members for <a class="el" href="a00245.html">tbb::filter</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>filter</b>(mode filter_mode) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_pipeline</b>(NULL) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>next_segment</b>(NULL) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>pipeline</b> (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>prev_filter_in_pipeline</b>(not_in_pipeline()) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>set_end_of_input</b>() (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>x1</b>((is_serial_?serial:parallel)|exact_exception_propagation)) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
+<h1>tbb::filter Member List</h1>This is the complete list of members for <a class="el" href="a00256.html">tbb::filter</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00256.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>filter</b>(mode filter_mode) (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_pipeline</b>(NULL) (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>next_segment</b>(NULL) (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pipeline</b> (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>prev_filter_in_pipeline</b>(not_in_pipeline()) (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>set_end_of_input</b>() (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>x1</b>((is_serial_?serial:parallel)|exact_exception_propagation)) (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00092.html b/doc/html/a00092.html
index 3780df9..f345406 100644
--- a/doc/html/a00092.html
+++ b/doc/html/a00092.html
@@ -20,12 +20,34 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::affinity_partitioner Member List</h1>This is the complete list of members for <a class="el" href="a00212.html">tbb::affinity_partitioner</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>affinity_partitioner</b>() (defined in <a class="el" href="a00212.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00212.html">tbb::affinity_partitioner</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::affinity_partition_type</b> (defined in <a class="el" href="a00212.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00212.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::start_for</b> (defined in <a class="el" href="a00212.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00212.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::start_reduce</b> (defined in <a class="el" href="a00212.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00212.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::start_scan</b> (defined in <a class="el" href="a00212.html">tbb::affinity_partitioner</a>)</td><td><a class="el" href="a00212.html">tbb::affinity_partitioner</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::thread_bound_filter Member List</h1>This is the complete list of members for <a class="el" href="a00322.html">tbb::thread_bound_filter</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>end_of_stream</b> enum value (defined in <a class="el" href="a00322.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00322.html">tbb::thread_bound_filter</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>filter</b>(mode filter_mode) (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>item_not_available</b> enum value (defined in <a class="el" href="a00322.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00322.html">tbb::thread_bound_filter</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>my_pipeline</b>(NULL) (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>next_segment</b>(NULL) (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>prev_filter_in_pipeline</b>(not_in_pipeline()) (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00322.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>()</td><td><a class="el" href="a00322.html">tbb::thread_bound_filter</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>result_type</b> enum name (defined in <a class="el" href="a00322.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00322.html">tbb::thread_bound_filter</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>set_end_of_input</b>() (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>success</b> enum value (defined in <a class="el" href="a00322.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00322.html">tbb::thread_bound_filter</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b>(mode filter_mode) (defined in <a class="el" href="a00322.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00322.html">tbb::thread_bound_filter</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00322.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>()</td><td><a class="el" href="a00322.html">tbb::thread_bound_filter</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>x1</b>((is_serial_?serial:parallel)|exact_exception_propagation)) (defined in <a class="el" href="a00256.html">tbb::filter</a>)</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00256.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00256.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00093.html b/doc/html/a00093.html
index 79f7e4a..1d47b8b 100644
--- a/doc/html/a00093.html
+++ b/doc/html/a00093.html
@@ -20,29 +20,19 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::filter Member List</h1>This is the complete list of members for <a class="el" href="a00245.html">tbb::filter</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>filter</b>(mode filter_mode) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_pipeline</b>(NULL) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>next_segment</b>(NULL) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>pipeline</b> (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>prev_filter_in_pipeline</b>(not_in_pipeline()) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>set_end_of_input</b>() (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>x1</b>((is_serial_?serial:parallel)|exact_exception_propagation)) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
+<h1>tbb::pipeline Member List</h1>This is the complete list of members for <a class="el" href="a00284.html">tbb::pipeline</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00284.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>(filter &filter_)</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00284.html#2c84aef5b834b555ee220b176e25931e">clear</a>()</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>filter</b> (defined in <a class="el" href="a00284.html">tbb::pipeline</a>)</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_cleaner</b> (defined in <a class="el" href="a00284.html">tbb::pipeline</a>)</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00284.html">tbb::pipeline</a>)</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00284.html">tbb::pipeline</a>)</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00284.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>()</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00284.html#f627616049b3fe36801f37ee40403ef8">run</a>(size_t max_number_of_live_tokens)</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00284.html#93d7fec8cd607b803dd2d79fb46bd260">run</a>(size_t max_number_of_live_tokens, tbb::task_group_context &context)</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>tbb::interface6::internal::pipeline_proxy</b> (defined in <a class="el" href="a00284.html">tbb::pipeline</a>)</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00284.html">tbb::pipeline</a>)</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00284.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>()</td><td><a class="el" href="a00284.html">tbb::pipeline</a></td><td><code> [virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00094.html b/doc/html/a00094.html
index a370a16..94889c4 100644
--- a/doc/html/a00094.html
+++ b/doc/html/a00094.html
@@ -20,34 +20,9 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::thread_bound_filter Member List</h1>This is the complete list of members for <a class="el" href="a00301.html">tbb::thread_bound_filter</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>end_of_stream</b> enum value (defined in <a class="el" href="a00301.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00301.html">tbb::thread_bound_filter</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>filter</b>(mode filter_mode) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a></td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#56275eb889c77c4807967133e21401bd">finalize</a>(void *)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>() const </td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>item_not_available</b> enum value (defined in <a class="el" href="a00301.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00301.html">tbb::thread_bound_filter</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>my_pipeline</b>(NULL) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>next_segment</b>(NULL) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline, protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>()</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>(void *item)=0</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [pure virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>prev_filter_in_pipeline</b>(not_in_pipeline()) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00301.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>()</td><td><a class="el" href="a00301.html">tbb::thread_bound_filter</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>result_type</b> enum name (defined in <a class="el" href="a00301.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00301.html">tbb::thread_bound_filter</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>set_end_of_input</b>() (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>success</b> enum value (defined in <a class="el" href="a00301.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00301.html">tbb::thread_bound_filter</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b>(mode filter_mode) (defined in <a class="el" href="a00301.html">tbb::thread_bound_filter</a>)</td><td><a class="el" href="a00301.html">tbb::thread_bound_filter</a></td><td><code> [inline, protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00301.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>()</td><td><a class="el" href="a00301.html">tbb::thread_bound_filter</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>x1</b>((is_serial_?serial:parallel)|exact_exception_propagation)) (defined in <a class="el" href="a00245.html">tbb::filter</a>)</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00245.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>()</td><td><a class="el" href="a00245.html">tbb::filter</a></td><td><code> [virtual]</code></td></tr>
+<h1>tbb::interface6::flow_control Member List</h1>This is the complete list of members for <a class="el" href="a00259.html">tbb::interface6::flow_control</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>internal::concrete_filter</b> (defined in <a class="el" href="a00259.html">tbb::interface6::flow_control</a>)</td><td><a class="el" href="a00259.html">tbb::interface6::flow_control</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>stop</b>() (defined in <a class="el" href="a00259.html">tbb::interface6::flow_control</a>)</td><td><a class="el" href="a00259.html">tbb::interface6::flow_control</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00095.html b/doc/html/a00095.html
index 26972b3..2672779 100644
--- a/doc/html/a00095.html
+++ b/doc/html/a00095.html
@@ -20,19 +20,16 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::pipeline Member List</h1>This is the complete list of members for <a class="el" href="a00266.html">tbb::pipeline</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00266.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>(filter &filter_)</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00266.html#2c84aef5b834b555ee220b176e25931e">clear</a>()</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>filter</b> (defined in <a class="el" href="a00266.html">tbb::pipeline</a>)</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_cleaner</b> (defined in <a class="el" href="a00266.html">tbb::pipeline</a>)</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_root_task</b> (defined in <a class="el" href="a00266.html">tbb::pipeline</a>)</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::stage_task</b> (defined in <a class="el" href="a00266.html">tbb::pipeline</a>)</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00266.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>()</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00266.html#f627616049b3fe36801f37ee40403ef8">run</a>(size_t max_number_of_live_tokens)</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00266.html#93d7fec8cd607b803dd2d79fb46bd260">run</a>(size_t max_number_of_live_tokens, tbb::task_group_context &context)</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>tbb::interface6::internal::pipeline_proxy</b> (defined in <a class="el" href="a00266.html">tbb::pipeline</a>)</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>thread_bound_filter</b> (defined in <a class="el" href="a00266.html">tbb::pipeline</a>)</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00266.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>()</td><td><a class="el" href="a00266.html">tbb::pipeline</a></td><td><code> [virtual]</code></td></tr>
+<h1>tbb::interface6::filter_t< T, U > Member List</h1>This is the complete list of members for <a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>filter_t</b>() (defined in <a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>filter_t</b>(const filter_t< T, U > &rhs) (defined in <a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>filter_t</b>(tbb::filter::mode mode, const Body &body) (defined in <a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_proxy</b> (defined in <a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00257.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a>(tbb::filter::mode, const Body &)</td><td><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator &</b> (defined in <a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const filter_t< T, U > &rhs) (defined in <a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~filter_t</b>() (defined in <a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00096.html b/doc/html/a00096.html
index b7dad10..abb4614 100644
--- a/doc/html/a00096.html
+++ b/doc/html/a00096.html
@@ -20,9 +20,12 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::interface6::flow_control Member List</h1>This is the complete list of members for <a class="el" href="a00248.html">tbb::interface6::flow_control</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>internal::concrete_filter</b> (defined in <a class="el" href="a00248.html">tbb::interface6::flow_control</a>)</td><td><a class="el" href="a00248.html">tbb::interface6::flow_control</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>stop</b>() (defined in <a class="el" href="a00248.html">tbb::interface6::flow_control</a>)</td><td><a class="el" href="a00248.html">tbb::interface6::flow_control</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::queuing_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00288.html">tbb::queuing_mutex</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>internal_construct</b>() (defined in <a class="el" href="a00288.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00288.html">tbb::queuing_mutex</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00288.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00288.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00288.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00288.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00288.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00288.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00288.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>()</td><td><a class="el" href="a00288.html">tbb::queuing_mutex</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00097.html b/doc/html/a00097.html
index 2bdd71f..4b6b3a3 100644
--- a/doc/html/a00097.html
+++ b/doc/html/a00097.html
@@ -20,16 +20,13 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::interface6::filter_t< T, U > Member List</h1>This is the complete list of members for <a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>filter_t</b>() (defined in <a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>filter_t</b>(const filter_t< T, U > &rhs) (defined in <a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>filter_t</b>(tbb::filter::mode mode, const Body &body) (defined in <a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::pipeline_proxy</b> (defined in <a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00246.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a>(tbb::filter::mode, const Body &)</td><td><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>operator &</b> (defined in <a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const filter_t< T, U > &rhs) (defined in <a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~filter_t</b>() (defined in <a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a>)</td><td><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::queuing_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00289.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00289.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>()</td><td><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00289.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>()</td><td><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00289.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a>(queuing_mutex &m)</td><td><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00289.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00289.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>()</td><td><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00098.html b/doc/html/a00098.html
index 0ee16d9..ab2a755 100644
--- a/doc/html/a00098.html
+++ b/doc/html/a00098.html
@@ -20,13 +20,14 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::queuing_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00270.html">tbb::queuing_mutex</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>internal_construct</b>() (defined in <a class="el" href="a00270.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00270.html">tbb::queuing_mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00270.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00270.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00270.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00270.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00270.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00270.html">tbb::queuing_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>()</td><td><a class="el" href="a00270.html">tbb::queuing_mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00270.html">tbb::queuing_mutex</a>)</td><td><a class="el" href="a00270.html">tbb::queuing_mutex</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::queuing_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00290.html">tbb::queuing_rw_mutex</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>internal_construct</b>() (defined in <a class="el" href="a00290.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00290.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00290.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00290.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00290.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>()</td><td><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00290.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00290.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>()</td><td><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00099.html b/doc/html/a00099.html
index 8311748..edde6aa 100644
--- a/doc/html/a00099.html
+++ b/doc/html/a00099.html
@@ -20,13 +20,15 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::queuing_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00271.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>()</td><td><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00271.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>()</td><td><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00271.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a>(queuing_mutex &m)</td><td><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00271.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>(queuing_mutex &m)</td><td><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00271.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>()</td><td><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::queuing_rw_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00291.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00291.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>()</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00291.html#67ae221109ddc69510ab593874e435d4">release</a>()</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00291.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>()</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00291.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00291.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00291.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>()</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00291.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>()</td><td><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00100.html b/doc/html/a00100.html
index 652f520..758acaa 100644
--- a/doc/html/a00100.html
+++ b/doc/html/a00100.html
@@ -20,14 +20,21 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::queuing_rw_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00272.html">tbb::queuing_rw_mutex</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>internal_construct</b>() (defined in <a class="el" href="a00272.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00272.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00272.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00272.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>()</td><td><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00272.html">tbb::queuing_rw_mutex</a>)</td><td><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00272.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>()</td><td><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::reader_writer_lock Member List</h1>This is the complete list of members for <a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>active</b> enum value (defined in <a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>invalid</b> enum value (defined in <a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>()</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00292.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a>()</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00292.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a>()</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scoped_lock_read</b> (defined in <a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00292.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> enum name</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00292.html#721eb173e154ab38292273e9266a9b07">try_lock</a>()</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00292.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a>()</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00292.html#5113b32689305599b2c36b5831547704">unlock</a>()</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>waiting</b> enum value (defined in <a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>waiting_nonblocking</b> enum value (defined in <a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00292.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a>()</td><td><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00101.html b/doc/html/a00101.html
index f5f0e2d..3cd86c0 100644
--- a/doc/html/a00101.html
+++ b/doc/html/a00101.html
@@ -20,15 +20,12 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::queuing_rw_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00273.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>()</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00273.html#67ae221109ddc69510ab593874e435d4">release</a>()</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>()</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00273.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00273.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>(queuing_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00273.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>()</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00273.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>()</td><td><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::reader_writer_lock::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>operator delete</b>(void *p) (defined in <a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator new</b>(size_t s) (defined in <a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reader_writer_lock</b> (defined in <a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00293.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00293.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>()</td><td><a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00102.html b/doc/html/a00102.html
index e67c1de..a02433b 100644
--- a/doc/html/a00102.html
+++ b/doc/html/a00102.html
@@ -20,21 +20,12 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::interface5::reader_writer_lock Member List</h1>This is the complete list of members for <a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>active</b> enum value (defined in <a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>invalid</b> enum value (defined in <a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>()</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00274.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a>()</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a>()</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scoped_lock_read</b> (defined in <a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> enum name</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00274.html#721eb173e154ab38292273e9266a9b07">try_lock</a>()</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00274.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a>()</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00274.html#5113b32689305599b2c36b5831547704">unlock</a>()</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>waiting</b> enum value (defined in <a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>waiting_nonblocking</b> enum value (defined in <a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a>)</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00274.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a>()</td><td><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface5::reader_writer_lock::scoped_lock_read Member List</h1>This is the complete list of members for <a class="el" href="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>operator delete</b>(void *p) (defined in <a class="el" href="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator new</b>(size_t s) (defined in <a class="el" href="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reader_writer_lock</b> (defined in <a class="el" href="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00294.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00294.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a>()</td><td><a class="el" href="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00103.html b/doc/html/a00103.html
index 5800849..b32866d 100644
--- a/doc/html/a00103.html
+++ b/doc/html/a00103.html
@@ -20,12 +20,19 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::interface5::reader_writer_lock::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>operator delete</b>(void *p) (defined in <a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>operator new</b>(size_t s) (defined in <a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reader_writer_lock</b> (defined in <a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a>)</td><td><a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00275.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00275.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>()</td><td><a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::recursive_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00296.html">tbb::recursive_mutex</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00296.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>()</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>native_handle</b>() (defined in <a class="el" href="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> typedef</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>native_handle_type</b> typedef (defined in <a class="el" href="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00296.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a>()</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00296.html#86e719b0afee25704af11ab97694d240">try_lock</a>()</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00296.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>()</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~recursive_mutex</b>() (defined in <a class="el" href="a00296.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00104.html b/doc/html/a00104.html
index ed68e97..fc62e2c 100644
--- a/doc/html/a00104.html
+++ b/doc/html/a00104.html
@@ -20,12 +20,14 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::interface5::reader_writer_lock::scoped_lock_read Member List</h1>This is the complete list of members for <a class="el" href="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>operator delete</b>(void *p) (defined in <a class="el" href="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>operator new</b>(size_t s) (defined in <a class="el" href="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reader_writer_lock</b> (defined in <a class="el" href="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>)</td><td><a class="el" href="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00276.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a>(reader_writer_lock &lock)</td><td><a class="el" href="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a>()</td><td><a class="el" href="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::recursive_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>recursive_mutex</b> (defined in <a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a>)</td><td><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00297.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>()</td><td><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00297.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>()</td><td><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00297.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00297.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00297.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>()</td><td><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00105.html b/doc/html/a00105.html
index 59ca4f2..83bdf57 100644
--- a/doc/html/a00105.html
+++ b/doc/html/a00105.html
@@ -20,19 +20,23 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::recursive_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00278.html">tbb::recursive_mutex</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00278.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>()</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>native_handle</b>() (defined in <a class="el" href="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> typedef</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>native_handle_type</b> typedef (defined in <a class="el" href="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00278.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a>()</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00278.html#86e719b0afee25704af11ab97694d240">try_lock</a>()</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00278.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>()</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~recursive_mutex</b>() (defined in <a class="el" href="a00278.html">tbb::recursive_mutex</a>)</td><td><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::interface6::runtime_loader Member List</h1>This is the complete list of members for <a class="el" href="a00298.html">tbb::interface6::runtime_loader</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">ec_no_lib</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a> enum value</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> enum name</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> enum name</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#5f3f6f1683386705a6931acae45f0862">load</a>(char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX)</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#7caa4ff6e44c2348e67f601cc5d97c34">runtime_loader</a>(error_mode mode=em_abort)</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#7ae5330beb48fce0c702c32a5df0094a">runtime_loader</a>(char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX, error_mode mode=em_abort)</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#78d938ed2e54d38dd38d6609e6c60389">status</a>()</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00298.html#c25fec923a751a3e03f5cbe969f1f0c5">~runtime_loader</a>()</td><td><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00106.html b/doc/html/a00106.html
deleted file mode 100644
index 9320470..0000000
--- a/doc/html/a00106.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<h1>tbb::recursive_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>recursive_mutex</b> (defined in <a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a>)</td><td><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00279.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>()</td><td><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00279.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>()</td><td><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00279.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00279.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>(recursive_mutex &mutex)</td><td><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00279.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>()</td><td><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00107.html b/doc/html/a00107.html
index bbf4347..c8878d4 100644
--- a/doc/html/a00107.html
+++ b/doc/html/a00107.html
@@ -20,24 +20,24 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::scalable_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const  (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const  (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00280.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>construct</b>(pointer p, const value_type &value) (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00280.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>destroy</b>(pointer p) (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00280.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const </td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>() (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>(const scalable_allocator &) (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>(const scalable_allocator< U > &) (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+<h1>tbb::scalable_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const  (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const  (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00299.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>construct</b>(pointer p, const value_type &value) (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00299.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>destroy</b>(pointer p) (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00299.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const </td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>() (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>(const scalable_allocator &) (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scalable_allocator</b>(const scalable_allocator< U > &) (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>)</td><td><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00109.html b/doc/html/a00109.html
index 76982cc..38d7564 100644
--- a/doc/html/a00109.html
+++ b/doc/html/a00109.html
@@ -20,10 +20,10 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::scalable_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00281.html">tbb::scalable_allocator< void ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00281.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00281.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00281.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00281.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00281.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00281.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
+<h1>tbb::scalable_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00300.html">tbb::scalable_allocator< void ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00300.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00300.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00300.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00300.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00300.html">tbb::scalable_allocator< void ></a>)</td><td><a class="el" href="a00300.html">tbb::scalable_allocator< void ></a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00111.html b/doc/html/a00111.html
index 34e8215..b36c110 100644
--- a/doc/html/a00111.html
+++ b/doc/html/a00111.html
@@ -20,16 +20,16 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::spin_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00286.html">tbb::spin_mutex</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>internal_construct</b>() (defined in <a class="el" href="a00286.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00286.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00286.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00286.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00286.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>()</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00286.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00286.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>()</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00286.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>()</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00286.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>()</td><td><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::spin_mutex Member List</h1>This is the complete list of members for <a class="el" href="a00305.html">tbb::spin_mutex</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>internal_construct</b>() (defined in <a class="el" href="a00305.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00305.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00305.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00305.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00305.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>()</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scoped_lock</b> (defined in <a class="el" href="a00305.html">tbb::spin_mutex</a>)</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00305.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>()</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00305.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>()</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00305.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>()</td><td><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00112.html b/doc/html/a00112.html
index 04418b4..27d1506 100644
--- a/doc/html/a00112.html
+++ b/doc/html/a00112.html
@@ -20,14 +20,14 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::spin_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00287.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00287.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>()</td><td><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00287.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>()</td><td><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00287.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a>(spin_mutex &m)</td><td><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>spin_mutex</b> (defined in <a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a>)</td><td><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00287.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00287.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>()</td><td><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::spin_mutex::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00306.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00306.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>()</td><td><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00306.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>()</td><td><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00306.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a>(spin_mutex &m)</td><td><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>spin_mutex</b> (defined in <a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a>)</td><td><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00306.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>(spin_mutex &m)</td><td><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00306.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>()</td><td><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00113.html b/doc/html/a00113.html
index 2dcf573..8c9a5ce 100644
--- a/doc/html/a00113.html
+++ b/doc/html/a00113.html
@@ -20,17 +20,17 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::spin_rw_mutex_v3 Member List</h1>This is the complete list of members for <a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00288.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a>()</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00288.html#13f799708ac4ca437a16be202e263e18">lock_read</a>()</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00288.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00288.html#088bb256be794cc47d3b83791632fdfc">try_lock</a>()</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00288.html#b8667415869013f840d976aa406d385a">try_lock_read</a>()</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00288.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a>()</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00288.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::spin_rw_mutex_v3 Member List</h1>This is the complete list of members for <a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>is_fair_mutex</b> (defined in <a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_recursive_mutex</b> (defined in <a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>is_rw_mutex</b> (defined in <a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a>)</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00307.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00307.html#13f799708ac4ca437a16be202e263e18">lock_read</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00307.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00307.html#088bb256be794cc47d3b83791632fdfc">try_lock</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00307.html#b8667415869013f840d976aa406d385a">try_lock_read</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00307.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00307.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a>()</td><td><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00114.html b/doc/html/a00114.html
index 563ff24..541405c 100644
--- a/doc/html/a00114.html
+++ b/doc/html/a00114.html
@@ -20,17 +20,17 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::spin_rw_mutex_v3::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00289.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00289.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a>()</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">is_writer</a></td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00289.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">mutex</a></td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00289.html#61b14d00a78185c9b2d206ebfc379124">release</a>()</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00289.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a>()</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00289.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00289.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00289.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a>()</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00289.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a>()</td><td><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::spin_rw_mutex_v3::scoped_lock Member List</h1>This is the complete list of members for <a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00308.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00308.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a>()</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00308.html#6b5a7c3c67a36b05c4df8410d32627d8">is_writer</a></td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00308.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">mutex</a></td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00308.html#61b14d00a78185c9b2d206ebfc379124">release</a>()</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00308.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a>()</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00308.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00308.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a>(spin_rw_mutex &m, bool write=true)</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00308.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a>()</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00308.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a>()</td><td><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00116.html b/doc/html/a00116.html
index 7b83c00..78a43a7 100644
--- a/doc/html/a00116.html
+++ b/doc/html/a00116.html
@@ -20,7 +20,7 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::interface5::internal::task_base Member List</h1>This is the complete list of members for <a class="el" href="a00292.html">tbb::interface5::internal::task_base</a>, including all inherited members.<p><table>
+<h1>tbb::interface5::internal::task_base Member List</h1>This is the complete list of members for <a class="el" href="a00312.html">tbb::interface5::internal::task_base</a>, including all inherited members.<p><table>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00117.html b/doc/html/a00117.html
deleted file mode 100644
index 90456af..0000000
--- a/doc/html/a00117.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Member List</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<h1>tbb::task_group_context Member List</h1>This is the complete list of members for <a class="el" href="a00293.html">tbb::task_group_context</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>bound</b> enum value (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00293.html#8bcdfdf4e6bfb76125b6de15c00b571d">cancel_group_execution</a>()</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>concurrent_wait</b> enum value (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>default_traits</b> enum value (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>exact_exception</b> enum value (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00293.html#49a55352084fd44b8863d182e839e6dc">init</a>()</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td><code> [protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_with_context_proxy</b> (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::generic_scheduler</b> (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00293.html#4db72f16210b0a991b2c134d6763a4cc">is_group_execution_cancelled</a>() const </td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>isolated</b> enum value (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>kind_type</b> enum name (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00293.html#2f2342b9e6c9c03703248ac13ad0271d">priority</a>() const </td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00293.html#d97c8a03615594b71b4ef06ff75cf561">register_pending_exception</a>()</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00293.html#6d30d16bf1cd22f86c6afaf29c2b430c">reset</a>()</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00293.html#c4272d4d9ab65d600ca70fc2c8c4b039">set_priority</a>(priority_t)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>task</b> (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00293.html#19fee08fb8ac98adccfe69c1aa63c491">task_group_context</a>(kind_type relation_with_parent=bound, uintptr_t traits=default_traits)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>task_scheduler_init</b> (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>traits_type</b> enum name (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~task_group_context</b>() (defined in <a class="el" href="a00293.html">tbb::task_group_context</a>)</td><td><a class="el" href="a00293.html">tbb::task_group_context</a></td><td></td></tr>
-</table><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00119.html b/doc/html/a00119.html
index 6bac6a7..300283a 100644
--- a/doc/html/a00119.html
+++ b/doc/html/a00119.html
@@ -20,64 +20,65 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::task Member List</h1>This is the complete list of members for <a class="el" href="a00291.html">tbb::task</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>add_to_depth</b>(int) (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a>(task_group_context &ctx)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>depth</b>() const  (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a>(task &t, priority_t p)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute</a>()=0</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [pure virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">group</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>interface5::internal::task_base</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_additional_child_of_proxy</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_child_proxy</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_continuation_proxy</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_proxy</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_with_context_proxy</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::scheduler</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>set_depth</b>(intptr_t) (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a>(priority_t p)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, protected]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>task_list</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::task Member List</h1>This is the complete list of members for <a class="el" href="a00311.html">tbb::task</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>add_to_depth</b>(int) (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a>(task_group_context &ctx)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>depth</b>() const  (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a>(task &t, priority_t p)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">execute</a>()=0</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [pure virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#5987123486afca36ddebb9e2a8b7779a">group</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>interface5::internal::task_base</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_additional_child_of_proxy</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_child_proxy</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_continuation_proxy</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_proxy</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_with_context_proxy</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::scheduler</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>set_depth</b>(intptr_t) (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a>(priority_t p)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">set_parent</a>(task *p)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>task_list</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00120.html b/doc/html/a00120.html
index 4781215..ef1bb92 100644
--- a/doc/html/a00120.html
+++ b/doc/html/a00120.html
@@ -20,62 +20,63 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::empty_task Member List</h1>This is the complete list of members for <a class="el" href="a00242.html">tbb::empty_task</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>add_to_depth</b>(int) (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a>(task_group_context &ctx)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>depth</b>() const  (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a>(task &t, priority_t p)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">group</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>interface5::internal::task_base</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_additional_child_of_proxy</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_child_proxy</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_continuation_proxy</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_proxy</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_with_context_proxy</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>internal::scheduler</b> (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>set_depth</b>(intptr_t) (defined in <a class="el" href="a00291.html">tbb::task</a>)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a>(priority_t p)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00291.html">tbb::task</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00291.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00291.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
+<h1>tbb::empty_task Member List</h1>This is the complete list of members for <a class="el" href="a00254.html">tbb::empty_task</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>add_to_depth</b>(int) (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> typedef</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#1434c79a5138993269d034008bff7329">allocate_continuation</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#23acb0da0afd690da797f9f882027d34">allocate_root</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a>(task_group_context &ctx)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a>(task_group_context &ctx)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>depth</b>() const  (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(task &t)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a>(task &t)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a>(task &t, priority_t p)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#5987123486afca36ddebb9e2a8b7779a">group</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>interface5::internal::task_base</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_additional_child_of_proxy</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_child_proxy</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_continuation_proxy</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_proxy</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::allocate_root_with_context_proxy</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>internal::scheduler</b> (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a>(affinity_id id)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#314e98ee4347ccec83efcb9ee22e8596">parent</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a>(task &new_parent)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a> enum value</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#ad774f55eaec008ae02b236423209ced">ref_count</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a>(affinity_id id)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>set_depth</b>(intptr_t) (defined in <a class="el" href="a00311.html">tbb::task</a>)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a>(priority_t p)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">set_parent</a>(task *p)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(int count)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(task &child)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a>(task_list &list)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a>(task &root)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a>(task_list &root_list)</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a>() const </td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a> enum name</td><td><a class="el" href="a00311.html">tbb::task</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00311.html#98245ee0473f84cb19dbbf8c81134908">~task</a>()</td><td><a class="el" href="a00311.html">tbb::task</a></td><td><code> [inline, virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00121.html b/doc/html/a00121.html
index 5f217df..efe208d 100644
--- a/doc/html/a00121.html
+++ b/doc/html/a00121.html
@@ -20,15 +20,15 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::task_list Member List</h1>This is the complete list of members for <a class="el" href="a00294.html">tbb::task_list</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00294.html#fce446ee13e025969945328f3ff59b95">clear</a>()</td><td><a class="el" href="a00294.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00294.html#f3ac31e092814b90929f81bb30441959">empty</a>() const </td><td><a class="el" href="a00294.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>interface5::internal::task_base</b> (defined in <a class="el" href="a00294.html">tbb::task_list</a>)</td><td><a class="el" href="a00294.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00294.html#5fe85df5ed524418389d34051750347d">pop_front</a>()</td><td><a class="el" href="a00294.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00294.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>(task &task)</td><td><a class="el" href="a00294.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>task</b> (defined in <a class="el" href="a00294.html">tbb::task_list</a>)</td><td><a class="el" href="a00294.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00294.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>()</td><td><a class="el" href="a00294.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>()</td><td><a class="el" href="a00294.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::task_list Member List</h1>This is the complete list of members for <a class="el" href="a00315.html">tbb::task_list</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00315.html#fce446ee13e025969945328f3ff59b95">clear</a>()</td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00315.html#f3ac31e092814b90929f81bb30441959">empty</a>() const </td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>interface5::internal::task_base</b> (defined in <a class="el" href="a00315.html">tbb::task_list</a>)</td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00315.html#5fe85df5ed524418389d34051750347d">pop_front</a>()</td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00315.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>(task &task)</td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>task</b> (defined in <a class="el" href="a00315.html">tbb::task_list</a>)</td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00315.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>()</td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00315.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>()</td><td><a class="el" href="a00315.html">tbb::task_list</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00128.html b/doc/html/a00128.html
index 471ab26..81613ed 100644
--- a/doc/html/a00128.html
+++ b/doc/html/a00128.html
@@ -20,16 +20,16 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::task_scheduler_init Member List</h1>This is the complete list of members for <a class="el" href="a00295.html">tbb::task_scheduler_init</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00295.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a>()</td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a></td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00295.html#d476053cc712e572554823492a5229ce">initialize</a>(int number_of_threads=automatic)</td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00295.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a>(int number_of_threads, stack_size_type thread_stack_size)</td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00295.html#12752282977029f23416642bc03e8b74">is_active</a>() const </td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00295.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>(int number_of_threads=automatic, stack_size_type thread_stack_size=0)</td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00295.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>()</td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00295.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a>()</td><td><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::task_scheduler_init Member List</h1>This is the complete list of members for <a class="el" href="a00316.html">tbb::task_scheduler_init</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00316.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a>()</td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00316.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a></td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00316.html#d476053cc712e572554823492a5229ce">initialize</a>(int number_of_threads=automatic)</td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00316.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a>(int number_of_threads, stack_size_type thread_stack_size)</td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00316.html#12752282977029f23416642bc03e8b74">is_active</a>() const </td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00316.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>(int number_of_threads=automatic, stack_size_type thread_stack_size=0)</td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00316.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>()</td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00316.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a>()</td><td><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00130.html b/doc/html/a00130.html
index 57505e7..f0a0855 100644
--- a/doc/html/a00130.html
+++ b/doc/html/a00130.html
@@ -20,28 +20,28 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::tbb_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const  (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const  (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00296.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00296.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>()</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline, static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00296.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00296.html#ef133522bf55f05a605bee0763208281">destroy</a>(pointer p)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> enum name</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const </td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>scalable</b> enum value (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>standard</b> enum value (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>() (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>(const tbb_allocator &) (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>(const tbb_allocator< U > &) (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+<h1>tbb::tbb_allocator< T > Member List</h1>This is the complete list of members for <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>address</b>(reference x) const  (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>address</b>(const_reference x) const  (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00317.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>(size_type n, const void *=0)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00317.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>()</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline, static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00317.html#ab228ab9e324ed041c2226e1d717df5f">construct</a>(pointer p, const value_type &value)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00317.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>(pointer p, size_type)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00317.html#ef133522bf55f05a605bee0763208281">destroy</a>(pointer p)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> enum name</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00317.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const </td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>scalable</b> enum value (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>standard</b> enum value (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>() (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>(const tbb_allocator &) (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>tbb_allocator</b>(const tbb_allocator< U > &) (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>)</td><td><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00132.html b/doc/html/a00132.html
index be7e3bd..ee3501e 100644
--- a/doc/html/a00132.html
+++ b/doc/html/a00132.html
@@ -20,10 +20,10 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::tbb_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00297.html">tbb::tbb_allocator< void ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00297.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00297.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00297.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00297.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00297.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00297.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
+<h1>tbb::tbb_allocator< void > Member List</h1>This is the complete list of members for <a class="el" href="a00318.html">tbb::tbb_allocator< void ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00318.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00318.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00318.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00318.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00318.html">tbb::tbb_allocator< void ></a>)</td><td><a class="el" href="a00318.html">tbb::tbb_allocator< void ></a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00134.html b/doc/html/a00134.html
index 4814540..8c3578f 100644
--- a/doc/html/a00134.html
+++ b/doc/html/a00134.html
@@ -20,19 +20,19 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::zero_allocator< T, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>allocate</b>(const size_type n, const void *hint=0) (defined in <a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>base_allocator_type</b> typedef (defined in <a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>zero_allocator</b>() (defined in <a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>zero_allocator</b>(const zero_allocator &a) (defined in <a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>zero_allocator</b>(const zero_allocator< U > &a) (defined in <a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::zero_allocator< T, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>allocate</b>(const size_type n, const void *hint=0) (defined in <a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>base_allocator_type</b> typedef (defined in <a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_reference</b> typedef (defined in <a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>difference_type</b> typedef (defined in <a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reference</b> typedef (defined in <a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>size_type</b> typedef (defined in <a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>zero_allocator</b>() (defined in <a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>zero_allocator</b>(const zero_allocator &a) (defined in <a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>zero_allocator</b>(const zero_allocator< U > &a) (defined in <a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>)</td><td><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00136.html b/doc/html/a00136.html
index 7ee6ceb..cf60dcf 100644
--- a/doc/html/a00136.html
+++ b/doc/html/a00136.html
@@ -20,11 +20,11 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::zero_allocator< void, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>base_allocator_type</b> typedef (defined in <a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
+<h1>tbb::zero_allocator< void, Allocator > Member List</h1>This is the complete list of members for <a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>base_allocator_type</b> typedef (defined in <a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>const_pointer</b> typedef (defined in <a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>pointer</b> typedef (defined in <a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>value_type</b> typedef (defined in <a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a>)</td><td><a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00138.html b/doc/html/a00138.html
index d775f50..b80dde6 100644
--- a/doc/html/a00138.html
+++ b/doc/html/a00138.html
@@ -20,9 +20,9 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::bad_last_alloc Member List</h1>This is the complete list of members for <a class="el" href="a00220.html">tbb::bad_last_alloc</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>what</b>() const  (defined in <a class="el" href="a00220.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00220.html">tbb::bad_last_alloc</a></td><td></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~bad_last_alloc</b>() (defined in <a class="el" href="a00220.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00220.html">tbb::bad_last_alloc</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::bad_last_alloc Member List</h1>This is the complete list of members for <a class="el" href="a00232.html">tbb::bad_last_alloc</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>what</b>() const  (defined in <a class="el" href="a00232.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00232.html">tbb::bad_last_alloc</a></td><td></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~bad_last_alloc</b>() (defined in <a class="el" href="a00232.html">tbb::bad_last_alloc</a>)</td><td><a class="el" href="a00232.html">tbb::bad_last_alloc</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00139.html b/doc/html/a00139.html
index 8bf5c2b..5c917c6 100644
--- a/doc/html/a00139.html
+++ b/doc/html/a00139.html
@@ -20,8 +20,8 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::improper_lock Member List</h1>This is the complete list of members for <a class="el" href="a00252.html">tbb::improper_lock</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>what</b>() const  (defined in <a class="el" href="a00252.html">tbb::improper_lock</a>)</td><td><a class="el" href="a00252.html">tbb::improper_lock</a></td><td></td></tr>
+<h1>tbb::improper_lock Member List</h1>This is the complete list of members for <a class="el" href="a00264.html">tbb::improper_lock</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>what</b>() const  (defined in <a class="el" href="a00264.html">tbb::improper_lock</a>)</td><td><a class="el" href="a00264.html">tbb::improper_lock</a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00140.html b/doc/html/a00140.html
index 74f9a7c..cc64dd3 100644
--- a/doc/html/a00140.html
+++ b/doc/html/a00140.html
@@ -20,8 +20,8 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::missing_wait Member List</h1>This is the complete list of members for <a class="el" href="a00256.html">tbb::missing_wait</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>what</b>() const  (defined in <a class="el" href="a00256.html">tbb::missing_wait</a>)</td><td><a class="el" href="a00256.html">tbb::missing_wait</a></td><td></td></tr>
+<h1>tbb::missing_wait Member List</h1>This is the complete list of members for <a class="el" href="a00272.html">tbb::missing_wait</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>what</b>() const  (defined in <a class="el" href="a00272.html">tbb::missing_wait</a>)</td><td><a class="el" href="a00272.html">tbb::missing_wait</a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00141.html b/doc/html/a00141.html
index 1437180..19cbf87 100644
--- a/doc/html/a00141.html
+++ b/doc/html/a00141.html
@@ -20,8 +20,8 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::invalid_multiple_scheduling Member List</h1>This is the complete list of members for <a class="el" href="a00253.html">tbb::invalid_multiple_scheduling</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>what</b>() const  (defined in <a class="el" href="a00253.html">tbb::invalid_multiple_scheduling</a>)</td><td><a class="el" href="a00253.html">tbb::invalid_multiple_scheduling</a></td><td></td></tr>
+<h1>tbb::invalid_multiple_scheduling Member List</h1>This is the complete list of members for <a class="el" href="a00265.html">tbb::invalid_multiple_scheduling</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>what</b>() const  (defined in <a class="el" href="a00265.html">tbb::invalid_multiple_scheduling</a>)</td><td><a class="el" href="a00265.html">tbb::invalid_multiple_scheduling</a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00142.html b/doc/html/a00142.html
index 5b13d33..bcac7fb 100644
--- a/doc/html/a00142.html
+++ b/doc/html/a00142.html
@@ -20,13 +20,13 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::tbb_exception Member List</h1>This is the complete list of members for <a class="el" href="a00298.html">tbb::tbb_exception</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00298.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a>()=0</td><td><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move</a>()=0</td><td><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00298.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() const =0</td><td><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00298.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a>()=0</td><td><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() const =0</td><td><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+<h1>tbb::tbb_exception Member List</h1>This is the complete list of members for <a class="el" href="a00319.html">tbb::tbb_exception</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00319.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a>()=0</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">move</a>()=0</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00319.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() const =0</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00319.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a>()=0</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00319.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() const =0</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [pure virtual]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00143.html b/doc/html/a00143.html
index ca4d66e..4ef88eb 100644
--- a/doc/html/a00143.html
+++ b/doc/html/a00143.html
@@ -20,19 +20,19 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::captured_exception Member List</h1>This is the complete list of members for <a class="el" href="a00228.html">tbb::captured_exception</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const captured_exception &src) (defined in <a class="el" href="a00228.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const char *name_, const char *info) (defined in <a class="el" href="a00228.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00228.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00228.html#93d875d3555502ff6f18513525de204c">destroy</a>()</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00228.html#837a50b8f6a800bda225c39d1699643f">move</a>()</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00228.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const </td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const captured_exception &src) (defined in <a class="el" href="a00228.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>set</b>(const char *name, const char *info) (defined in <a class="el" href="a00228.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a>()</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00228.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const </td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~captured_exception</b>() (defined in <a class="el" href="a00228.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00228.html">tbb::captured_exception</a></td><td></td></tr>
+<h1>tbb::captured_exception Member List</h1>This is the complete list of members for <a class="el" href="a00240.html">tbb::captured_exception</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const captured_exception &src) (defined in <a class="el" href="a00240.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>captured_exception</b>(const char *name_, const char *info) (defined in <a class="el" href="a00240.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>clear</b>() (defined in <a class="el" href="a00240.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00240.html#93d875d3555502ff6f18513525de204c">destroy</a>()</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00240.html#837a50b8f6a800bda225c39d1699643f">move</a>()</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00240.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const </td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const captured_exception &src) (defined in <a class="el" href="a00240.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>set</b>(const char *name, const char *info) (defined in <a class="el" href="a00240.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00240.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a>()</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00240.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const </td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td><code> [virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~captured_exception</b>() (defined in <a class="el" href="a00240.html">tbb::captured_exception</a>)</td><td><a class="el" href="a00240.html">tbb::captured_exception</a></td><td></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00144.html b/doc/html/a00144.html
index 4340eee..69ac6fd 100644
--- a/doc/html/a00144.html
+++ b/doc/html/a00144.html
@@ -20,20 +20,20 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::movable_exception< ExceptionData > Member List</h1>This is the complete list of members for <a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>data</b>() (defined in <a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>data</b>() const  (defined in <a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">destroy</a>()</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>movable_exception</b>(const ExceptionData &data_) (defined in <a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>movable_exception</b>(const movable_exception &src) (defined in <a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a>()</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [protected]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>() const </td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const movable_exception &src) (defined in <a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00257.html#17cffba35811c92b7e65d63506b69602">throw_self</a>()</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a>() const </td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>~movable_exception</b>() (defined in <a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::movable_exception< ExceptionData > Member List</h1>This is the complete list of members for <a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>data</b>() (defined in <a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>data</b>() const  (defined in <a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00273.html#7a46873119d9f85a7b0009c13e41a258">destroy</a>()</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>movable_exception</b>(const ExceptionData &data_) (defined in <a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>movable_exception</b>(const movable_exception &src) (defined in <a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a>()</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [protected]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>() const </td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a>(void *p)</td><td><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>operator=</b>(const movable_exception &src) (defined in <a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00273.html#17cffba35811c92b7e65d63506b69602">throw_self</a>()</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a>() const </td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline, virtual]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>~movable_exception</b>() (defined in <a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a>)</td><td><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00145.html b/doc/html/a00145.html
index 0ccbfcf..2a193ac 100644
--- a/doc/html/a00145.html
+++ b/doc/html/a00145.html
@@ -20,12 +20,12 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::internal::tbb_exception_ptr Member List</h1>This is the complete list of members for <a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>allocate</b>() (defined in <a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>allocate</b>(const tbb_exception &tag) (defined in <a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00299.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a>(captured_exception &src)</td><td><a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00299.html#921875bbacd2c8a5f324c7da7a415262">destroy</a>()</td><td><a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a></td><td></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00299.html#292832fd5c523e3d8081a22247840a1d">throw_self</a>()</td><td><a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::internal::tbb_exception_ptr Member List</h1>This is the complete list of members for <a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>allocate</b>() (defined in <a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>allocate</b>(const tbb_exception &tag) (defined in <a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a>)</td><td><a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00320.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a>(captured_exception &src)</td><td><a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00320.html#921875bbacd2c8a5f324c7da7a415262">destroy</a>()</td><td><a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a></td><td></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00320.html#292832fd5c523e3d8081a22247840a1d">throw_self</a>()</td><td><a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00146.html b/doc/html/a00150.html
similarity index 77%
rename from doc/html/a00146.html
rename to doc/html/a00150.html
index 3ee0912..e038e06 100644
--- a/doc/html/a00146.html
+++ b/doc/html/a00150.html
@@ -20,11 +20,11 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::internal::atomic_backoff Member List</h1>This is the complete list of members for <a class="el" href="a00218.html">tbb::internal::atomic_backoff</a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>atomic_backoff</b>() (defined in <a class="el" href="a00218.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00218.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>bounded_pause</b>() (defined in <a class="el" href="a00218.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00218.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>()</td><td><a class="el" href="a00218.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00218.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00218.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::internal::atomic_backoff Member List</h1>This is the complete list of members for <a class="el" href="a00230.html">tbb::internal::atomic_backoff</a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>atomic_backoff</b>() (defined in <a class="el" href="a00230.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00230.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>bounded_pause</b>() (defined in <a class="el" href="a00230.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00230.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>()</td><td><a class="el" href="a00230.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>reset</b>() (defined in <a class="el" href="a00230.html">tbb::internal::atomic_backoff</a>)</td><td><a class="el" href="a00230.html">tbb::internal::atomic_backoff</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00014.html b/doc/html/a00154.html
similarity index 60%
copy from doc/html/a00014.html
copy to doc/html/a00154.html
index 0d81875..83999d8 100644
--- a/doc/html/a00014.html
+++ b/doc/html/a00154.html
@@ -20,9 +20,9 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::tbb_hash_compare< Key > Member List</h1>This is the complete list of members for <a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>equal</b>(const Key &a, const Key &b) (defined in <a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>hash</b>(const Key &a) (defined in <a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::internal::machine_load_store_seq_cst< T, 8 > Member List</h1>This is the complete list of members for <a class="el" href="a00268.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>load</b>(const volatile T &location) (defined in <a class="el" href="a00268.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>)</td><td><a class="el" href="a00268.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a></td><td><code> [inline, static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>store</b>(volatile T &location, T value) (defined in <a class="el" href="a00268.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>)</td><td><a class="el" href="a00268.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a></td><td><code> [inline, static]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00014.html b/doc/html/a00155.html
similarity index 60%
rename from doc/html/a00014.html
rename to doc/html/a00155.html
index 0d81875..c9b6f5b 100644
--- a/doc/html/a00014.html
+++ b/doc/html/a00155.html
@@ -20,9 +20,9 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::tbb_hash_compare< Key > Member List</h1>This is the complete list of members for <a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>equal</b>(const Key &a, const Key &b) (defined in <a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>hash</b>(const Key &a) (defined in <a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a>)</td><td><a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a></td><td><code> [inline, static]</code></td></tr>
+<h1>tbb::internal::machine_load_store_relaxed< T, S > Member List</h1>This is the complete list of members for <a class="el" href="a00267.html">tbb::internal::machine_load_store_relaxed< T, S ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>load</b>(const volatile T &location) (defined in <a class="el" href="a00267.html">tbb::internal::machine_load_store_relaxed< T, S ></a>)</td><td><a class="el" href="a00267.html">tbb::internal::machine_load_store_relaxed< T, S ></a></td><td><code> [inline, static]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>store</b>(volatile T &location, T value) (defined in <a class="el" href="a00267.html">tbb::internal::machine_load_store_relaxed< T, S ></a>)</td><td><a class="el" href="a00267.html">tbb::internal::machine_load_store_relaxed< T, S ></a></td><td><code> [inline, static]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00153.html b/doc/html/a00164.html
similarity index 90%
rename from doc/html/a00153.html
rename to doc/html/a00164.html
index 0f8bd97..65afe3d 100644
--- a/doc/html/a00153.html
+++ b/doc/html/a00164.html
@@ -20,8 +20,8 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::internal::work_around_alignment_bug< Size, T > Member List</h1>This is the complete list of members for <a class="el" href="a00305.html">tbb::internal::work_around_alignment_bug< Size, T ></a>, including all inherited members.<p><table>
-  <tr bgcolor="#f0f0f0"><td><b>alignment</b> (defined in <a class="el" href="a00305.html">tbb::internal::work_around_alignment_bug< Size, T ></a>)</td><td><a class="el" href="a00305.html">tbb::internal::work_around_alignment_bug< Size, T ></a></td><td><code> [static]</code></td></tr>
+<h1>tbb::internal::work_around_alignment_bug< Size, T > Member List</h1>This is the complete list of members for <a class="el" href="a00325.html">tbb::internal::work_around_alignment_bug< Size, T ></a>, including all inherited members.<p><table>
+  <tr bgcolor="#f0f0f0"><td><b>alignment</b> (defined in <a class="el" href="a00325.html">tbb::internal::work_around_alignment_bug< Size, T ></a>)</td><td><a class="el" href="a00325.html">tbb::internal::work_around_alignment_bug< Size, T ></a></td><td><code> [static]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00159.html b/doc/html/a00168.html
similarity index 80%
rename from doc/html/a00159.html
rename to doc/html/a00168.html
index 39fd259..4f4d44d 100644
--- a/doc/html/a00159.html
+++ b/doc/html/a00168.html
@@ -20,10 +20,10 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::tick_count Member List</h1>This is the complete list of members for <a class="el" href="a00302.html">tbb::tick_count</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00302.html#fb7f78ca61cf28398645ace66e284473">now</a>()</td><td><a class="el" href="a00302.html">tbb::tick_count</a></td><td><code> [inline, static]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00302.html">tbb::tick_count</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00302.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>()</td><td><a class="el" href="a00302.html">tbb::tick_count</a></td><td><code> [inline]</code></td></tr>
+<h1>tbb::tick_count Member List</h1>This is the complete list of members for <a class="el" href="a00323.html">tbb::tick_count</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00323.html#fb7f78ca61cf28398645ace66e284473">now</a>()</td><td><a class="el" href="a00323.html">tbb::tick_count</a></td><td><code> [inline, static]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00323.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00323.html">tbb::tick_count</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00323.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>()</td><td><a class="el" href="a00323.html">tbb::tick_count</a></td><td><code> [inline]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00160.html b/doc/html/a00169.html
similarity index 68%
rename from doc/html/a00160.html
rename to doc/html/a00169.html
index 29ad763..3d6774f 100644
--- a/doc/html/a00160.html
+++ b/doc/html/a00169.html
@@ -20,16 +20,16 @@
     <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>tbb::tick_count::interval_t Member List</h1>This is the complete list of members for <a class="el" href="a00303.html">tbb::tick_count::interval_t</a>, including all inherited members.<p><table>
-  <tr class="memlist"><td><a class="el" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>()</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00303.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a>(double sec)</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [inline, explicit]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00303.html#5871ead1ca230efbe52a5008470e6428">operator+</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00303.html#cd9814947902e26463a69a111530f81b">operator+=</a>(const interval_t &i)</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00303.html#fa509691e1d689830931e36edd274f76">operator-</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>(const interval_t &i)</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
-  <tr class="memlist"><td><a class="el" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() const </td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
-  <tr bgcolor="#f0f0f0"><td><b>tbb::tick_count</b> (defined in <a class="el" href="a00303.html">tbb::tick_count::interval_t</a>)</td><td><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+<h1>tbb::tick_count::interval_t Member List</h1>This is the complete list of members for <a class="el" href="a00324.html">tbb::tick_count::interval_t</a>, including all inherited members.<p><table>
+  <tr class="memlist"><td><a class="el" href="a00324.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>()</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00324.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a>(double sec)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [inline, explicit]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00324.html#5871ead1ca230efbe52a5008470e6428">operator+</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00324.html#cd9814947902e26463a69a111530f81b">operator+=</a>(const interval_t &i)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00324.html#09dde78a4100800c11bb883d6204b586">operator-</a>(const tick_count &t1, const tick_count &t0)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00324.html#fa509691e1d689830931e36edd274f76">operator-</a>(const interval_t &i, const interval_t &j)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00324.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>(const interval_t &i)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+  <tr class="memlist"><td><a class="el" href="a00324.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() const </td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [inline]</code></td></tr>
+  <tr bgcolor="#f0f0f0"><td><b>tbb::tick_count</b> (defined in <a class="el" href="a00324.html">tbb::tick_count::interval_t</a>)</td><td><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td><code> [friend]</code></td></tr>
 </table><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00212.html b/doc/html/a00212.html
deleted file mode 100644
index 227c7e5..0000000
--- a/doc/html/a00212.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::affinity_partitioner Class Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00212.html">affinity_partitioner</a></div>
-<h1>tbb::affinity_partitioner Class Reference</h1><!-- doxytag: class="tbb::affinity_partitioner" -->An affinity partitioner.  
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00541.html">partitioner.h</a>></code>
-<p>
-<a href="a00092.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a47f7e0208a2bf68f35b51b27d2ddf2a"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_for" ref="a47f7e0208a2bf68f35b51b27d2ddf2a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_for</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8f710e431b62c2a48914bd99d0fe034"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_reduce" ref="e8f710e431b62c2a48914bd99d0fe034" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_reduce</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e9575467e391b90e0703fadf573dbad7"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::affinity_partition_type" ref="e9575467e391b90e0703fadf573dbad7" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::affinity_partition_type</b></td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-An affinity partitioner. 
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00541.html">partitioner.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00213.html b/doc/html/a00213.html
deleted file mode 100644
index e204096..0000000
--- a/doc/html/a00213.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::internal::aggregated_operation< Derived > Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface6</b>::<b>internal</b>::<a class="el" href="a00213.html">aggregated_operation</a></div>
-<h1>tbb::interface6::internal::aggregated_operation< Derived > Class Template Reference</h1><!-- doxytag: class="tbb::interface6::internal::aggregated_operation" --><a class="el" href="a00213.html">aggregated_operation</a> base class  
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00377.html">_aggregator_internal.h</a>></code>
-<p>
-<a href="a00001.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57a1b5d43be94cd9e4c3c59081736638"></a><!-- doxytag: member="tbb::interface6::internal::aggregated_operation::status" ref="57a1b5d43be94cd9e4c3c59081736638" args="" -->
-uintptr_t </td><td class="memItemRight" valign="bottom"><b>status</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0bd4c85d1b47b2a410bfe1a266f22dee"></a><!-- doxytag: member="tbb::interface6::internal::aggregated_operation::next" ref="0bd4c85d1b47b2a410bfe1a266f22dee" args="" -->
-Derived * </td><td class="memItemRight" valign="bottom"><b>next</b></td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Derived><br>
- class tbb::interface6::internal::aggregated_operation< Derived ></h3>
-
-<a class="el" href="a00213.html">aggregated_operation</a> base class 
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00377.html">_aggregator_internal.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00214.html b/doc/html/a00214.html
deleted file mode 100644
index a01624b..0000000
--- a/doc/html/a00214.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::internal::aggregator< handler_type, operation_type > Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface6</b>::<b>internal</b>::<a class="el" href="a00214.html">aggregator</a></div>
-<h1>tbb::interface6::internal::aggregator< handler_type, operation_type > Class Template Reference</h1><!-- doxytag: class="tbb::interface6::internal::aggregator" -->Aggregator base class.  
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00377.html">_aggregator_internal.h</a>></code>
-<p>
-<a href="a00002.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1893fb7ba6824ca9b135d2ef005f97bb"></a><!-- doxytag: member="tbb::interface6::internal::aggregator::initialize_handler" ref="1893fb7ba6824ca9b135d2ef005f97bb" args="(handler_type h)" -->
-void </td><td class="memItemRight" valign="bottom"><b>initialize_handler</b> (handler_type h)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00214.html#282d5a2f1216b185c91ed23d00119481">execute</a> (operation_type *op)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Place operation in list.  <a href="#282d5a2f1216b185c91ed23d00119481"></a><br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename handler_type, typename operation_type><br>
- class tbb::interface6::internal::aggregator< handler_type, operation_type ></h3>
-
-Aggregator base class. 
-<p>
-An aggregator for collecting operations coming from multiple sources and executing them serially on a single thread. operation_type must be derived from <a class="el" href="a00213.html">aggregated_operation</a>. The parameter handler_type is a functor that will be passed the list of operations and is expected to handle each operation appropriately, setting the status of each operation to non-zero. 
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="282d5a2f1216b185c91ed23d00119481"></a><!-- doxytag: member="tbb::interface6::internal::aggregator::execute" ref="282d5a2f1216b185c91ed23d00119481" args="(operation_type *op)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename handler_type, typename operation_type> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">void <a class="el" href="a00214.html">tbb::interface6::internal::aggregator</a>< handler_type, operation_type >::execute           </td>
-          <td>(</td>
-          <td class="paramtype">operation_type * </td>
-          <td class="paramname"> <em>op</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Place operation in list. 
-<p>
-Place operation in list and either handle list or wait for operation to complete. 
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00377.html">_aggregator_internal.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00215.html b/doc/html/a00215.html
deleted file mode 100644
index 2af4a45..0000000
--- a/doc/html/a00215.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::aligned_space< T, N > Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00215.html">aligned_space</a></div>
-<h1>tbb::aligned_space< T, N > Class Template Reference<br>
-<small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::aligned_space" -->Block of space aligned sufficiently to construct an array T with N elements.  
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00409.html">aligned_space.h</a>></code>
-<p>
-<a href="a00003.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d702fc6b9e9d061ace3501b3c861cdf"></a><!-- doxytag: member="tbb::aligned_space::begin" ref="0d702fc6b9e9d061ace3501b3c861cdf" args="()" -->
-T * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to beginning of array. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="024be075c23c0394c9a2518d993bcd9e"></a><!-- doxytag: member="tbb::aligned_space::end" ref="024be075c23c0394c9a2518d993bcd9e" args="()" -->
-T * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00215.html#024be075c23c0394c9a2518d993bcd9e">end</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to one past last element in array. <br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, size_t N><br>
- class tbb::aligned_space< T, N ></h3>
-
-Block of space aligned sufficiently to construct an array T with N elements. 
-<p>
-The elements are not constructed or destroyed by this class. 
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00409.html">aligned_space.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00217.html b/doc/html/a00217.html
deleted file mode 100644
index 336e89d..0000000
--- a/doc/html/a00217.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::atomic< void * > Struct Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00217.html">atomic< void * ></a></div>
-<h1>tbb::atomic< void * > Struct Template Reference</h1><!-- doxytag: class="tbb::atomic< void * >" -->Specialization for <a class="el" href="a00217.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.  
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00410.html">atomic.h</a>></code>
-<p>
-<a href="a00005.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ba6e74163e255b88c497c40db64c5dad"></a><!-- doxytag: member="tbb::atomic< void * >::operator=" ref="ba6e74163e255b88c497c40db64c5dad" args="(void *rhs)" -->
-void * </td><td class="memItemRight" valign="bottom"><b>operator=</b> (void *rhs)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="37979e62d1f88eb45bd3ad7df5a140f8"></a><!-- doxytag: member="tbb::atomic< void * >::operator=" ref="37979e62d1f88eb45bd3ad7df5a140f8" args="(const atomic< void * > &rhs)" -->
-<a class="el" href="a00216.html">atomic</a>< void * > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00216.html">atomic</a>< void * > &rhs)</td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<><br>
- struct tbb::atomic< void * ></h3>
-
-Specialization for <a class="el" href="a00217.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->. 
-<p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00410.html">atomic.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00218.html b/doc/html/a00218.html
deleted file mode 100644
index 1187034..0000000
--- a/doc/html/a00218.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::internal::atomic_backoff Class Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00218.html">atomic_backoff</a></div>
-<h1>tbb::internal::atomic_backoff Class Reference</h1><!-- doxytag: class="tbb::internal::atomic_backoff" -->Class that implements exponential backoff.  
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00594.html">tbb_machine.h</a>></code>
-<p>
-<a href="a00146.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a174ea93e3bd3d5cce82389c2f28d037"></a><!-- doxytag: member="tbb::internal::atomic_backoff::pause" ref="a174ea93e3bd3d5cce82389c2f28d037" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pause for a while. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6179b19e2e8dedd73a36d523af2fe12"></a><!-- doxytag: member="tbb::internal::atomic_backoff::bounded_pause" ref="c6179b19e2e8dedd73a36d523af2fe12" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>bounded_pause</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45edb535489eb0e76ecc59a19fd952de"></a><!-- doxytag: member="tbb::internal::atomic_backoff::reset" ref="45edb535489eb0e76ecc59a19fd952de" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Class that implements exponential backoff. 
-<p>
-See implementation of spin_wait_while_eq for an example. 
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00594.html">tbb_machine.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00219.html b/doc/html/a00219.html
deleted file mode 100644
index 672c260..0000000
--- a/doc/html/a00219.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::auto_partitioner Class Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00219.html">auto_partitioner</a></div>
-<h1>tbb::auto_partitioner Class Reference<br>
-<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::auto_partitioner" -->An auto partitioner.  
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00541.html">partitioner.h</a>></code>
-<p>
-<a href="a00090.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a47f7e0208a2bf68f35b51b27d2ddf2a"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_for" ref="a47f7e0208a2bf68f35b51b27d2ddf2a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_for</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8f710e431b62c2a48914bd99d0fe034"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_reduce" ref="e8f710e431b62c2a48914bd99d0fe034" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_reduce</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>partition_type</b></td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-An auto partitioner. 
-<p>
-The range is initial divided into several large chunks. Chunks are further subdivided into VICTIM_CHUNKS pieces if they are stolen and divisible. 
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00541.html">partitioner.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00220.html b/doc/html/a00220.html
deleted file mode 100644
index f9c96cb..0000000
--- a/doc/html/a00220.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::bad_last_alloc Class Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00220.html">bad_last_alloc</a></div>
-<h1>tbb::bad_last_alloc Class Reference</h1><!-- doxytag: class="tbb::bad_last_alloc" -->Exception for concurrent containers.  
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
-<p>
-<a href="a00138.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ec7a57742ff4dc214266179d88984015"></a><!-- doxytag: member="tbb::bad_last_alloc::what" ref="ec7a57742ff4dc214266179d88984015" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const   throw ()</td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception for concurrent containers. 
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00221.html b/doc/html/a00221.html
deleted file mode 100644
index e1f320b..0000000
--- a/doc/html/a00221.html
+++ /dev/null
@@ -1,224 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::blocked_range< Value > Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00221.html">blocked_range</a></div>
-<h1>tbb::blocked_range< Value > Class Template Reference<br>
-<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::blocked_range" -->A range over which to iterate.  
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00418.html">blocked_range.h</a>></code>
-<p>
-<a href="a00006.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef Value </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of a value.  <a href="#1a8d05842c2b3dfc177bc4d347e4cef7"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f5707bffea38eee5c9680f37358afb8e"></a><!-- doxytag: member="tbb::blocked_range::size_type" ref="f5707bffea38eee5c9680f37358afb8e" args="" -->
-typedef std::size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of a range. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct range with default-constructed values for begin and end.  <a href="#94607755c5110d199202234d58d022ac"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14795a36ead1414b4371dbe1a4656359"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="14795a36ead1414b4371dbe1a4656359" args="(Value begin_, Value end_, size_type grainsize_=1)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a> (Value begin_, Value end_, <a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct range over half-open interval [begin,end), with the given grainsize. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="18d2258400756ac1446dac7676b18df3"></a><!-- doxytag: member="tbb::blocked_range::begin" ref="18d2258400756ac1446dac7676b18df3" args="() const " -->
-<a class="el" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Beginning of range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8b929d93ddc13f148b11bceef3a3bdf8"></a><!-- doxytag: member="tbb::blocked_range::end" ref="8b929d93ddc13f148b11bceef3a3bdf8" args="() const " -->
-<a class="el" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">One past last value in range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Size of the range.  <a href="#9eaa0b6beff1420f688570bbf6b8c462"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcd2e5b8b6c11fd3f20fc0aa9f11bbc2"></a><!-- doxytag: member="tbb::blocked_range::grainsize" ref="fcd2e5b8b6c11fd3f20fc0aa9f11bbc2" args="() const " -->
-<a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The grain size for this range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f4f02f530eb3f2e7ea26e06f76aef9d"></a><!-- doxytag: member="tbb::blocked_range::empty" ref="8f4f02f530eb3f2e7ea26e06f76aef9d" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible.  <a href="#41a58b703d574b6e1ca155df3576f578"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a> (<a class="el" href="a00221.html">blocked_range</a> &r, <a class="el" href="a00290.html">split</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Split range.  <a href="#4c0efd2be3f96a0ab3ba5085e8b3fcc7"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="395a514a55017e36d571809f1223389b"></a><!-- doxytag: member="tbb::blocked_range::blocked_range2d" ref="395a514a55017e36d571809f1223389b" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="13d172a4da9be197033e64516fff1f4b"></a><!-- doxytag: member="tbb::blocked_range::blocked_range3d" ref="13d172a4da9be197033e64516fff1f4b" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b></td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Value><br>
- class tbb::blocked_range< Value ></h3>
-
-A range over which to iterate. 
-<p>
-<hr><h2>Member Typedef Documentation</h2>
-<a class="anchor" name="1a8d05842c2b3dfc177bc4d347e4cef7"></a><!-- doxytag: member="tbb::blocked_range::const_iterator" ref="1a8d05842c2b3dfc177bc4d347e4cef7" args="" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">typedef Value <a class="el" href="a00221.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>          </td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Type of a value. 
-<p>
-Called a const_iterator for sake of algorithms that need to treat a <a class="el" href="a00221.html">blocked_range</a> as an STL container. 
-</div>
-</div><p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="94607755c5110d199202234d58d022ac"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="94607755c5110d199202234d58d022ac" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="a00221.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00221.html">blocked_range</a>           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Construct range with default-constructed values for begin and end. 
-<p>
-Requires that Value have a default constructor. 
-</div>
-</div><p>
-<a class="anchor" name="4c0efd2be3f96a0ab3ba5085e8b3fcc7"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="4c0efd2be3f96a0ab3ba5085e8b3fcc7" args="(blocked_range &r, split)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="a00221.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00221.html">blocked_range</a>           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00221.html">blocked_range</a>< Value > & </td>
-          <td class="paramname"> <em>r</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype"><a class="el" href="a00290.html">split</a> </td>
-          <td class="paramname"></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Split range. 
-<p>
-The new Range *this has the second half, the old range r has the first half. Unspecified if <a class="el" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin()</a> or !is_divisible(). 
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="41a58b703d574b6e1ca155df3576f578"></a><!-- doxytag: member="tbb::blocked_range::is_divisible" ref="41a58b703d574b6e1ca155df3576f578" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00221.html">tbb::blocked_range</a>< Value >::is_divisible           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"> const<code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-True if range is divisible. 
-<p>
-Unspecified if <a class="el" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin()</a>. 
-</div>
-</div><p>
-<a class="anchor" name="9eaa0b6beff1420f688570bbf6b8c462"></a><!-- doxytag: member="tbb::blocked_range::size" ref="9eaa0b6beff1420f688570bbf6b8c462" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Value> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="el" href="a00221.html">tbb::blocked_range</a>< Value >::size           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"> const<code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Size of the range. 
-<p>
-Unspecified if <a class="el" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin()</a>. 
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00418.html">blocked_range.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00222.html b/doc/html/a00222.html
deleted file mode 100644
index 6d70406..0000000
--- a/doc/html/a00222.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00222.html">blocked_range2d</a></div>
-<h1>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference<br>
-<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::blocked_range2d" -->A 2-dimensional range that models the Range concept.  
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00419.html">blocked_range2d.h</a>></code>
-<p>
-<a href="a00007.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a807a22fe658ec38b8edfd69521d0383"></a><!-- doxytag: member="tbb::blocked_range2d::row_range_type" ref="a807a22fe658ec38b8edfd69521d0383" args="" -->
-typedef <a class="el" href="a00221.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00222.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of an iteation range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="750d5c6ac9915443df477a30031c07fd"></a><!-- doxytag: member="tbb::blocked_range2d::col_range_type" ref="750d5c6ac9915443df477a30031c07fd" args="" -->
-typedef <a class="el" href="a00221.html">blocked_range</a>< ColValue > </td><td class="memItemRight" valign="bottom"><b>col_range_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4180bc35d4f8ed9f20045dba4f2a1bdc"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="4180bc35d4f8ed9f20045dba4f2a1bdc" args="(RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (RowValue row_begin, RowValue row_end, typename <a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="485434db1609b2074d86cb604f3c674e"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="485434db1609b2074d86cb604f3c674e" args="(RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d144cb2d88cef553420311aca8667a44"></a><!-- doxytag: member="tbb::blocked_range2d::empty" ref="d144cb2d88cef553420311aca8667a44" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00222.html#d144cb2d88cef553420311aca8667a44">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad36a9b38e4fef26d376f99552ce2d92"></a><!-- doxytag: member="tbb::blocked_range2d::is_divisible" ref="ad36a9b38e4fef26d376f99552ce2d92" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00222.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible into two pieces. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f80e6db02bfa4e90e2a219de9f17461"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="4f80e6db02bfa4e90e2a219de9f17461" args="(blocked_range2d &r, split)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (<a class="el" href="a00222.html">blocked_range2d</a> &r, <a class="el" href="a00290.html">split</a>)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f496e7348a82652fba581203477cc07c"></a><!-- doxytag: member="tbb::blocked_range2d::rows" ref="f496e7348a82652fba581203477cc07c" args="() const " -->
-const <a class="el" href="a00221.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00222.html#f496e7348a82652fba581203477cc07c">rows</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The rows of the iteration space. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="392a46759af2c884957115771affa7f4"></a><!-- doxytag: member="tbb::blocked_range2d::cols" ref="392a46759af2c884957115771affa7f4" args="() const " -->
-const <a class="el" href="a00221.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00222.html#392a46759af2c884957115771affa7f4">cols</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The columns of the iteration space. <br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename RowValue, typename ColValue = RowValue><br>
- class tbb::blocked_range2d< RowValue, ColValue ></h3>
-
-A 2-dimensional range that models the Range concept. 
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00419.html">blocked_range2d.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00223.html b/doc/html/a00223.html
deleted file mode 100644
index 26f7ea9..0000000
--- a/doc/html/a00223.html
+++ /dev/null
@@ -1,93 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00223.html">blocked_range3d</a></div>
-<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference<br>
-<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::blocked_range3d" -->A 3-dimensional range that models the Range concept.  
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00420.html">blocked_range3d.h</a>></code>
-<p>
-<a href="a00008.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8ebf17a552ba47825e9b3887855b719"></a><!-- doxytag: member="tbb::blocked_range3d::page_range_type" ref="b8ebf17a552ba47825e9b3887855b719" args="" -->
-typedef <a class="el" href="a00221.html">blocked_range</a>< PageValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00223.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of an iteation range. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4edc39b1a76c84c8f43ea8bff3e88007"></a><!-- doxytag: member="tbb::blocked_range3d::row_range_type" ref="4edc39b1a76c84c8f43ea8bff3e88007" args="" -->
-typedef <a class="el" href="a00221.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><b>row_range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="02229b59d4dc5437bf5fbe72acca7f66"></a><!-- doxytag: member="tbb::blocked_range3d::col_range_type" ref="02229b59d4dc5437bf5fbe72acca7f66" args="" -->
-typedef <a class="el" href="a00221.html">blocked_range</a>< ColValue > </td><td class="memItemRight" valign="bottom"><b>col_range_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a762f420ed83a887967cb7dfe337582c"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="a762f420ed83a887967cb7dfe337582c" args="(PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b4dcf5b059634b95c1671086bf6d4ff"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="0b4dcf5b059634b95c1671086bf6d4ff" args="(PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize, RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_gr [...]
- </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (PageValue page_begin, PageValue page_end, typename <a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize, RowValue row_begin, RowValue row_end, typename <a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00221.html#f5707bffea38eee [...]
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="356860e1c977d91711e8216bd55c0b25"></a><!-- doxytag: member="tbb::blocked_range3d::empty" ref="356860e1c977d91711e8216bd55c0b25" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00223.html#356860e1c977d91711e8216bd55c0b25">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="39d69191721c488e737ae5d9c5336b9c"></a><!-- doxytag: member="tbb::blocked_range3d::is_divisible" ref="39d69191721c488e737ae5d9c5336b9c" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00223.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible into two pieces. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0d6f0085c9fb364ddcbc2197da6c251"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="a0d6f0085c9fb364ddcbc2197da6c251" args="(blocked_range3d &r, split)" -->
- </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (<a class="el" href="a00223.html">blocked_range3d</a> &r, <a class="el" href="a00290.html">split</a>)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf971430aa12361d3ed245344b7c6764"></a><!-- doxytag: member="tbb::blocked_range3d::pages" ref="cf971430aa12361d3ed245344b7c6764" args="() const " -->
-const <a class="el" href="a00221.html">page_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00223.html#cf971430aa12361d3ed245344b7c6764">pages</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The pages of the iteration space. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1584623e59ff32a8aa82006827508be4"></a><!-- doxytag: member="tbb::blocked_range3d::rows" ref="1584623e59ff32a8aa82006827508be4" args="() const " -->
-const <a class="el" href="a00221.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00223.html#1584623e59ff32a8aa82006827508be4">rows</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The rows of the iteration space. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3336ba9480fd6c43e158f9beb024c050"></a><!-- doxytag: member="tbb::blocked_range3d::cols" ref="3336ba9480fd6c43e158f9beb024c050" args="() const " -->
-const <a class="el" href="a00221.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00223.html#3336ba9480fd6c43e158f9beb024c050">cols</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The columns of the iteration space. <br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename PageValue, typename RowValue = PageValue, typename ColValue = RowValue><br>
- class tbb::blocked_range3d< PageValue, RowValue, ColValue ></h3>
-
-A 3-dimensional range that models the Range concept. 
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00420.html">blocked_range3d.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00224.html b/doc/html/a00224.html
deleted file mode 100644
index 439fab8..0000000
--- a/doc/html/a00224.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::broadcast_node< T > Class Template Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="annotated.html"><span>Class List</span></a></li>
-    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
-    <li><a href="functions.html"><span>Class Members</span></a></li>
-  </ul></div>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00224.html">broadcast_node</a></div>
-<h1>tbb::broadcast_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::broadcast_node" --><!-- doxytag: inherits="tbb::graph_node,tbb::receiver,tbb::sender" -->Forwards messages of type T to all successors.  
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
-<p>
-<p>Inheritance diagram for tbb::broadcast_node< T >:
-<p><center><img src="a00224.png" usemap="#tbb::broadcast_node< T >_map" border="0" alt=""></center>
-<map name="tbb::broadcast_node< T >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,157,24">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="167,0,324,24">
-<area href="a00282.html" alt="tbb::sender< T >" shape="rect" coords="334,0,491,24">
-</map>
-<a href="a00054.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="59ea89dbeab816742e6dc6af467e6c3f"></a><!-- doxytag: member="tbb::broadcast_node::input_type" ref="59ea89dbeab816742e6dc6af467e6c3f" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#59ea89dbeab816742e6dc6af467e6c3f">input_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b844ca1ee578a54bc11ff28467b12e7d"></a><!-- doxytag: member="tbb::broadcast_node::output_type" ref="b844ca1ee578a54bc11ff28467b12e7d" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#b844ca1ee578a54bc11ff28467b12e7d">output_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4dd13b81f6361fc244abe7cbcacd048c"></a><!-- doxytag: member="tbb::broadcast_node::predecessor_type" ref="4dd13b81f6361fc244abe7cbcacd048c" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00224.html#59ea89dbeab816742e6dc6af467e6c3f">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#4dd13b81f6361fc244abe7cbcacd048c">predecessor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="453928c367d813cb481f1b9aa1e1742a"></a><!-- doxytag: member="tbb::broadcast_node::successor_type" ref="453928c367d813cb481f1b9aa1e1742a" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00224.html#b844ca1ee578a54bc11ff28467b12e7d">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#453928c367d813cb481f1b9aa1e1742a">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3f4149fa6b984b2138cb5ed40a2ddc6c"></a><!-- doxytag: member="tbb::broadcast_node::register_successor" ref="3f4149fa6b984b2138cb5ed40a2ddc6c" args="(receiver< T > &r)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#3f4149fa6b984b2138cb5ed40a2ddc6c">register_successor</a> (<a class="el" href="a00277.html">receiver</a>< T > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Adds a successor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eefb3210bb9727765ea7385ba163c2a6"></a><!-- doxytag: member="tbb::broadcast_node::remove_successor" ref="eefb3210bb9727765ea7385ba163c2a6" args="(receiver< T > &r)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#eefb3210bb9727765ea7385ba163c2a6">remove_successor</a> (<a class="el" href="a00277.html">receiver</a>< T > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes s as a successor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9b211e02554d6b39dc04f7e7f4e00073"></a><!-- doxytag: member="tbb::broadcast_node::try_put" ref="9b211e02554d6b39dc04f7e7f4e00073" args="(T t)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html#9b211e02554d6b39dc04f7e7f4e00073">try_put</a> (T t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Put an item to the receiver. <br></td></tr>
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::broadcast_node< T ></h3>
-
-Forwards messages of type T to all successors. 
-<p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00224.png b/doc/html/a00224.png
deleted file mode 100644
index 820bcba..0000000
Binary files a/doc/html/a00224.png and /dev/null differ
diff --git a/doc/html/a00225.html b/doc/html/a00225.html
index fae9f13..74166b2 100644
--- a/doc/html/a00225.html
+++ b/doc/html/a00225.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::buffer_node< T > Class Template Reference</title>
+<title>tbb::affinity_partitioner Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,405 +21,38 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00225.html">buffer_node</a></div>
-<h1>tbb::buffer_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::buffer_node" --><!-- doxytag: inherits="tbb::graph_node,tbb::receiver,tbb::sender" -->Forwards messages in arbitrary order.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00225.html">affinity_partitioner</a></div>
+<h1>tbb::affinity_partitioner Class Reference</h1><!-- doxytag: class="tbb::affinity_partitioner" --><!-- doxytag: inherits="tbb::internal::affinity_partitioner_base_v3" -->An affinity partitioner.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00531.html">partitioner.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::buffer_node< T >:
-<p><center><img src="a00225.png" usemap="#tbb::buffer_node< T >_map" border="0" alt=""></center>
-<map name="tbb::buffer_node< T >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,242,24">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="252,0,494,24">
-<area href="a00282.html" alt="tbb::sender< T >" shape="rect" coords="504,0,746,24">
-<area href="a00268.html" alt="tbb::priority_queue_node< T, Compare >" shape="rect" coords="126,112,368,136">
-<area href="a00269.html" alt="tbb::queue_node< T >" shape="rect" coords="378,112,620,136">
-<area href="a00283.html" alt="tbb::sequencer_node< T >" shape="rect" coords="378,168,620,192">
+<p>Inheritance diagram for tbb::affinity_partitioner:
+<p><center><img src="a00225.png" usemap="#tbb::affinity_partitioner_map" border="0" alt=""></center>
+<map name="tbb::affinity_partitioner_map">
+<area href="a00226.html" alt="tbb::internal::affinity_partitioner_base_v3" shape="rect" coords="0,0,240,24">
 </map>
-<a href="a00055.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00090.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90de308ba6abefb74c537a62ed0f1ca3"></a><!-- doxytag: member="tbb::buffer_node::input_type" ref="90de308ba6abefb74c537a62ed0f1ca3" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#90de308ba6abefb74c537a62ed0f1ca3">input_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="28c06a61dbad153f2e989efbf43016c5"></a><!-- doxytag: member="tbb::buffer_node::output_type" ref="28c06a61dbad153f2e989efbf43016c5" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">output_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="688cf819089ee2fac2b9de2e050adea7"></a><!-- doxytag: member="tbb::buffer_node::predecessor_type" ref="688cf819089ee2fac2b9de2e050adea7" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00225.html#90de308ba6abefb74c537a62ed0f1ca3">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#688cf819089ee2fac2b9de2e050adea7">predecessor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e23f4f377ff4e1f53e71fd909a65771"></a><!-- doxytag: member="tbb::buffer_node::successor_type" ref="5e23f4f377ff4e1f53e71fd909a65771" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#5e23f4f377ff4e1f53e71fd909a65771">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7360978fa427d054bc6cde05c80e5e9f"></a><!-- doxytag: member="tbb::buffer_node::buffer_node" ref="7360978fa427d054bc6cde05c80e5e9f" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">buffer_node</a> (<a class="el" href="a00250.html">graph</a> &g)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">register_successor</a> (<a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">output_type</a> > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Adds a new successor.  <a href="#cd2ef588b0ee6eb8d23ee169e00c73a9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">remove_successor</a> (<a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">output_type</a> > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor.  <a href="#415428db02e74a479fb056a8ed72ba53"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">try_get</a> (T &v)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the <a class="el" href="a00225.html">buffer_node</a>.  <a href="#b68bdec127703dbfb2d93d685abbfd67"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">try_reserve</a> (T &v)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserves an item.  <a href="#11ebad4c72082a1a03ecccd3afab4ae2"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">try_release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release a reserved item.  <a href="#435e29a66f0719d4822a0a8dc78a0405"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">try_consume</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Consumes a reserved item.  <a href="#46b8b257a97e2192a2b11743279e8ffe"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">try_put</a> (T t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Receive an item.  <a href="#f74899ffb67687998168ad428f586b64"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7650a28da77a86b18e91510023475192"></a><!-- doxytag: member="tbb::buffer_node::size_type" ref="7650a28da77a86b18e91510023475192" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad0e26a3248e66762998ff71b759df9f"></a><!-- doxytag: member="tbb::buffer_node::item_type" ref="ad0e26a3248e66762998ff71b759df9f" args="" -->
-typedef std::pair< T, bool > </td><td class="memItemRight" valign="bottom"><b>item_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4560fc3c7118b2520aa1bc5f62dd60e036bd5780cc2e6c71263d7926c5e631a7"></a><!-- doxytag: member="tbb::buffer_node::reg_succ" ref="4560fc3c7118b2520aa1bc5f62dd60e036bd5780cc2e6c71263d7926c5e631a7" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>reg_succ</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4560fc3c7118b2520aa1bc5f62dd60e0b1c420e37f5e6aa824a5c553352485cb"></a><!-- doxytag: member="tbb::buffer_node::rem_succ" ref="4560fc3c7118b2520aa1bc5f62dd60e0b1c420e37f5e6aa824a5c553352485cb" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>rem_succ</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4560fc3c7118b2520aa1bc5f62dd60e05c53e265b1aab0b49efbe9be4963a6fe"></a><!-- doxytag: member="tbb::buffer_node::req_item" ref="4560fc3c7118b2520aa1bc5f62dd60e05c53e265b1aab0b49efbe9be4963a6fe" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>req_item</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4560fc3c7118b2520aa1bc5f62dd60e021f5de223fc34b414c41c8f2a4c2c376"></a><!-- doxytag: member="tbb::buffer_node::res_item" ref="4560fc3c7118b2520aa1bc5f62dd60e021f5de223fc34b414c41c8f2a4c2c376" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>res_item</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4560fc3c7118b2520aa1bc5f62dd60e012dafb1a5c2d5073b11845440100e3bf"></a><!-- doxytag: member="tbb::buffer_node::rel_res" ref="4560fc3c7118b2520aa1bc5f62dd60e012dafb1a5c2d5073b11845440100e3bf" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>rel_res</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4560fc3c7118b2520aa1bc5f62dd60e0b1a6a5c39512d70a4458dabbbf677267"></a><!-- doxytag: member="tbb::buffer_node::con_res" ref="4560fc3c7118b2520aa1bc5f62dd60e0b1a6a5c39512d70a4458dabbbf677267" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>con_res</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4560fc3c7118b2520aa1bc5f62dd60e021a9fe988ff484f1033a739cde97eb9d"></a><!-- doxytag: member="tbb::buffer_node::put_item" ref="4560fc3c7118b2520aa1bc5f62dd60e021a9fe988ff484f1033a739cde97eb9d" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>put_item</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4560fc3c7118b2520aa1bc5f62dd60e0ec6665fcffc5a6c0f658baad182f52c5"></a><!-- doxytag: member="tbb::buffer_node::try_fwd" ref="4560fc3c7118b2520aa1bc5f62dd60e0ec6665fcffc5a6c0f658baad182f52c5" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>try_fwd</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5d9b0dd3eb6f5fb930ef9c831fc2687b94f11e3700304f854a3981371820c9bf"></a><!-- doxytag: member="tbb::buffer_node::WAIT" ref="5d9b0dd3eb6f5fb930ef9c831fc2687b94f11e3700304f854a3981371820c9bf" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5d9b0dd3eb6f5fb930ef9c831fc2687bca6c186a8b172a894745873277f103d2"></a><!-- doxytag: member="tbb::buffer_node::SUCCEEDED" ref="5d9b0dd3eb6f5fb930ef9c831fc2687bca6c186a8b172a894745873277f103d2" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5d9b0dd3eb6f5fb930ef9c831fc2687b1f741448d944a5fbe12628a89ffab06f"></a><!-- doxytag: member="tbb::buffer_node::FAILED" ref="5d9b0dd3eb6f5fb930ef9c831fc2687b1f741448d944a5fbe12628a89ffab06f" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>op_type</b> { <br>
-  <b>reg_succ</b>, 
-<b>rem_succ</b>, 
-<b>req_item</b>, 
-<b>res_item</b>, 
-<br>
-  <b>rel_res</b>, 
-<b>con_res</b>, 
-<b>put_item</b>, 
-<b>try_fwd</b>
-<br>
- }</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0, 
-<b>SUCCEEDED</b>, 
-<b>FAILED</b>
- }</td></tr>
-
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fe41bdb6b830ffec654561414a6f96f9"></a><!-- doxytag: member="tbb::buffer_node::handle_operations" ref="fe41bdb6b830ffec654561414a6f96f9" args="(buffer_operation *op_list)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><b>handle_operations</b> (buffer_operation *op_list)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3a31b3b55bee417de3af09c7b45b9ad6"></a><!-- doxytag: member="tbb::buffer_node::forward" ref="3a31b3b55bee417de3af09c7b45b9ad6" args="()" -->
-virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">forward</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">This is executed by an enqueued task, the "forwarder". <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="017f16c8d6e0fb65d0d3a61aec86b3e2"></a><!-- doxytag: member="tbb::buffer_node::internal_reg_succ" ref="017f16c8d6e0fb65d0d3a61aec86b3e2" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a> (buffer_operation *op)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Register successor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a75f731cf9fc93f7487eb72de3fcf7b1"></a><!-- doxytag: member="tbb::buffer_node::internal_rem_succ" ref="a75f731cf9fc93f7487eb72de3fcf7b1" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a> (buffer_operation *op)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove successor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3cb61d8a98bc4bc860b1cb04944b4f8"></a><!-- doxytag: member="tbb::buffer_node::internal_forward" ref="a3cb61d8a98bc4bc860b1cb04944b4f8" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">internal_forward</a> (buffer_operation *op)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to forward valid items to successors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fac0c0e9be7255747118f126dd9f6d39"></a><!-- doxytag: member="tbb::buffer_node::internal_push" ref="fac0c0e9be7255747118f126dd9f6d39" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><b>internal_push</b> (buffer_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e4cf171d5bcf707786ef6a51977e2601"></a><!-- doxytag: member="tbb::buffer_node::internal_pop" ref="e4cf171d5bcf707786ef6a51977e2601" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><b>internal_pop</b> (buffer_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="263221e903d306c9b411c87a2f558a02"></a><!-- doxytag: member="tbb::buffer_node::internal_reserve" ref="263221e903d306c9b411c87a2f558a02" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><b>internal_reserve</b> (buffer_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="81321b083181f57543c8ce3f61da9777"></a><!-- doxytag: member="tbb::buffer_node::internal_consume" ref="81321b083181f57543c8ce3f61da9777" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (buffer_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="153ec83b01b797aabc13599c57effc01"></a><!-- doxytag: member="tbb::buffer_node::internal_release" ref="153ec83b01b797aabc13599c57effc01" args="(buffer_operation *op)" -->
-virtual void </td><td class="memItemRight" valign="bottom"><b>internal_release</b> (buffer_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ec9d33aa9f1e9292d5952e3eb477ca1"></a><!-- doxytag: member="tbb::buffer_node::grow_my_array" ref="3ec9d33aa9f1e9292d5952e3eb477ca1" args="(size_t minimum_size)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a> (size_t minimum_size)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Grows the internal array. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3cd68b585af1cba2311322a1cc008f0f"></a><!-- doxytag: member="tbb::buffer_node::my_successors" ref="3cd68b585af1cba2311322a1cc008f0f" args="" -->
-internal::round_robin_cache<<br>
- T, <a class="el" href="a00262.html">null_rw_mutex</a> > </td><td class="memItemRight" valign="bottom"><b>my_successors</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4cb1a21519885a4709af34e889d7cc7"></a><!-- doxytag: member="tbb::buffer_node::my_parent" ref="a4cb1a21519885a4709af34e889d7cc7" args="" -->
-<a class="el" href="a00291.html">task</a> * </td><td class="memItemRight" valign="bottom"><b>my_parent</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c746e9fd9b31e8554ac8edd4a8a4a55e"></a><!-- doxytag: member="tbb::buffer_node::my_array" ref="c746e9fd9b31e8554ac8edd4a8a4a55e" args="" -->
-item_type * </td><td class="memItemRight" valign="bottom"><b>my_array</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7218ccd1547224f4025b43b66f00072f"></a><!-- doxytag: member="tbb::buffer_node::my_array_size" ref="7218ccd1547224f4025b43b66f00072f" args="" -->
-size_type </td><td class="memItemRight" valign="bottom"><b>my_array_size</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="41e23e9ab9deb975d1abaf62dd8f28e1"></a><!-- doxytag: member="tbb::buffer_node::my_head" ref="41e23e9ab9deb975d1abaf62dd8f28e1" args="" -->
-size_type </td><td class="memItemRight" valign="bottom"><b>my_head</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bf042c91faf597e80867449bff116037"></a><!-- doxytag: member="tbb::buffer_node::my_tail" ref="bf042c91faf597e80867449bff116037" args="" -->
-size_type </td><td class="memItemRight" valign="bottom"><b>my_tail</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="26778eaf1e96a93141f704eb66a40a27"></a><!-- doxytag: member="tbb::buffer_node::my_mutex" ref="26778eaf1e96a93141f704eb66a40a27" args="" -->
-<a class="el" href="a00286.html">spin_mutex</a> </td><td class="memItemRight" valign="bottom"><b>my_mutex</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4014dadf54bae347d8b72201abdac680"></a><!-- doxytag: member="tbb::buffer_node::my_reserved" ref="4014dadf54bae347d8b72201abdac680" args="" -->
-bool </td><td class="memItemRight" valign="bottom"><b>my_reserved</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2278ecdc5a18582a2b50759b16430480"></a><!-- doxytag: member="tbb::buffer_node::my_reserved_id" ref="2278ecdc5a18582a2b50759b16430480" args="" -->
-size_type </td><td class="memItemRight" valign="bottom"><b>my_reserved_id</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8ab9d2d97b1fd58aec401243a1dc4cd"></a><!-- doxytag: member="tbb::buffer_node::forwarder_busy" ref="e8ab9d2d97b1fd58aec401243a1dc4cd" args="" -->
-bool </td><td class="memItemRight" valign="bottom"><b>forwarder_busy</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="480281137c9d1ecfbb2e2cdacdafd4f5"></a><!-- doxytag: member="tbb::buffer_node::my_aggregator" ref="480281137c9d1ecfbb2e2cdacdafd4f5" args="" -->
-internal::aggregator< my_functor_t,<br>
- buffer_operation > </td><td class="memItemRight" valign="bottom"><b>my_aggregator</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Static Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f4390dbfe8bf638d6b279bd67e687a8c"></a><!-- doxytag: member="tbb::buffer_node::initial_buffer_size" ref="f4390dbfe8bf638d6b279bd67e687a8c" args="" -->
-static const size_type </td><td class="memItemRight" valign="bottom"><b>initial_buffer_size</b> = 4</td></tr>
-
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8d43e5c9a739e9493cf9581ac80a363"></a><!-- doxytag: member="tbb::buffer_node::internal::forward_task< buffer_node< T > >" ref="b8d43e5c9a739e9493cf9581ac80a363" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::forward_task< buffer_node< T > ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5f730f70d21df405adaebfc2018f59cd"></a><!-- doxytag: member="tbb::affinity_partitioner::serial::interface6::start_for" ref="5f730f70d21df405adaebfc2018f59cd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>serial::interface6::start_for</b></td></tr>
 
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>buffer_operation</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a4cd0ffed4fad0d9af2c5efdaf586a8"></a><!-- doxytag: member="tbb::affinity_partitioner::interface6::internal::start_for" ref="8a4cd0ffed4fad0d9af2c5efdaf586a8" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_for</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>my_functor_t</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="86f0750233dd6c83b65fb684338fd09f"></a><!-- doxytag: member="tbb::affinity_partitioner::interface6::internal::start_reduce" ref="86f0750233dd6c83b65fb684338fd09f" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_reduce</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::affinity_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::buffer_node< T ></h3>
-
-Forwards messages in arbitrary order. 
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="cd2ef588b0ee6eb8d23ee169e00c73a9"></a><!-- doxytag: member="tbb::buffer_node::register_successor" ref="cd2ef588b0ee6eb8d23ee169e00c73a9" args="(receiver< output_type > &r)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00225.html">tbb::buffer_node</a>< T >::register_successor           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">output_type</a> > & </td>
-          <td class="paramname"> <em>r</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Adds a new successor. 
-<p>
-Adds successor r to the list of successors; may forward tasks. 
-<p>
-Implements <a class="el" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">tbb::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="415428db02e74a479fb056a8ed72ba53"></a><!-- doxytag: member="tbb::buffer_node::remove_successor" ref="415428db02e74a479fb056a8ed72ba53" args="(receiver< output_type > &r)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00225.html">tbb::buffer_node</a>< T >::remove_successor           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">output_type</a> > & </td>
-          <td class="paramname"> <em>r</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Removes a successor. 
-<p>
-Removes successor r from the list of successors. It also calls r.remove_predecessor(*this) to remove this node as a predecessor. 
-<p>
-Implements <a class="el" href="a00282.html#3f345427e812e8741370308ff88f30bf">tbb::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="46b8b257a97e2192a2b11743279e8ffe"></a><!-- doxytag: member="tbb::buffer_node::try_consume" ref="46b8b257a97e2192a2b11743279e8ffe" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00225.html">tbb::buffer_node</a>< T >::try_consume           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Consumes a reserved item. 
-<p>
-true = item is removed from sender and reservation removed 
-<p>
-Reimplemented from <a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">tbb::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="b68bdec127703dbfb2d93d685abbfd67"></a><!-- doxytag: member="tbb::buffer_node::try_get" ref="b68bdec127703dbfb2d93d685abbfd67" args="(T &v)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00225.html">tbb::buffer_node</a>< T >::try_get           </td>
-          <td>(</td>
-          <td class="paramtype">T & </td>
-          <td class="paramname"> <em>v</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Request an item from the <a class="el" href="a00225.html">buffer_node</a>. 
-<p>
-true = v contains the returned item<br>
- false = no item has been returned 
-<p>
-Reimplemented from <a class="el" href="a00282.html#bf8c9235810354f3353a899c982645de">tbb::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="f74899ffb67687998168ad428f586b64"></a><!-- doxytag: member="tbb::buffer_node::try_put" ref="f74899ffb67687998168ad428f586b64" args="(T t)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00225.html">tbb::buffer_node</a>< T >::try_put           </td>
-          <td>(</td>
-          <td class="paramtype">T </td>
-          <td class="paramname"> <em>t</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Receive an item. 
-<p>
-true is always returned 
-<p>
-Implements <a class="el" href="a00277.html#6e5422b03b4570138f227b3d5d0073b8">tbb::receiver< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="435e29a66f0719d4822a0a8dc78a0405"></a><!-- doxytag: member="tbb::buffer_node::try_release" ref="435e29a66f0719d4822a0a8dc78a0405" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00225.html">tbb::buffer_node</a>< T >::try_release           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Release a reserved item. 
-<p>
-true = item has been released and so remains in sender 
-<p>
-Reimplemented from <a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">tbb::sender< T ></a>.
-</div>
-</div><p>
-<a class="anchor" name="11ebad4c72082a1a03ecccd3afab4ae2"></a><!-- doxytag: member="tbb::buffer_node::try_reserve" ref="11ebad4c72082a1a03ecccd3afab4ae2" args="(T &v)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00225.html">tbb::buffer_node</a>< T >::try_reserve           </td>
-          <td>(</td>
-          <td class="paramtype">T & </td>
-          <td class="paramname"> <em>v</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Reserves an item. 
-<p>
-false = no item can be reserved<br>
- true = an item is reserved 
+An affinity partitioner. 
 <p>
-Reimplemented from <a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">tbb::sender< T ></a>.
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00531.html">partitioner.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00225.png b/doc/html/a00225.png
index db5c56e..31d2cc3 100644
Binary files a/doc/html/a00225.png and b/doc/html/a00225.png differ
diff --git a/doc/html/a00226.html b/doc/html/a00226.html
index 80abee9..07b5814 100644
--- a/doc/html/a00226.html
+++ b/doc/html/a00226.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::cache_aligned_allocator< T > Class Template Reference</title>
+<title>tbb::internal::affinity_partitioner_base_v3 Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,88 +21,32 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00226.html">cache_aligned_allocator</a></div>
-<h1>tbb::cache_aligned_allocator< T > Class Template Reference<br>
-<small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::cache_aligned_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  
+<a class="el" href="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00226.html">affinity_partitioner_base_v3</a></div>
+<h1>tbb::internal::affinity_partitioner_base_v3 Class Reference</h1><!-- doxytag: class="tbb::internal::affinity_partitioner_base_v3" -->Defines entry point for affinity partitioner into tbb run-time library.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00421.html">cache_aligned_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00531.html">partitioner.h</a>></code>
 <p>
-<a href="a00009.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::internal::affinity_partitioner_base_v3:
+<p><center><img src="a00226.png" usemap="#tbb::internal::affinity_partitioner_base_v3_map" border="0" alt=""></center>
+<map name="tbb::internal::affinity_partitioner_base_v3_map">
+<area href="a00225.html" alt="tbb::affinity_partitioner" shape="rect" coords="0,56,240,80">
+</map>
+<a href="a00085.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f7128452e3c43b5bf1801b61d971d17"></a><!-- doxytag: member="tbb::cache_aligned_allocator::value_type" ref="8f7128452e3c43b5bf1801b61d971d17" args="" -->
-typedef internal::allocator_type<<br>
- T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa554f840d8ef010ff2650bac032ec01"></a><!-- doxytag: member="tbb::internal::affinity_partitioner_base_v3::tbb::affinity_partitioner" ref="fa554f840d8ef010ff2650bac032ec01" args="" -->
+class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00226.html#fa554f840d8ef010ff2650bac032ec01">tbb::affinity_partitioner</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b23ef1d76c34fe1c2ebbb2f3df5b5676"></a><!-- doxytag: member="tbb::cache_aligned_allocator::pointer" ref="b23ef1d76c34fe1c2ebbb2f3df5b5676" args="" -->
-typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d15affd67eafcabbd12bd1cd07372994"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_pointer" ref="d15affd67eafcabbd12bd1cd07372994" args="" -->
-typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8c4e0d5867a07b1cea21d4fca2998c8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::reference" ref="e8c4e0d5867a07b1cea21d4fca2998c8" args="" -->
-typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d3d77a39f0852c42f80c6505843f450c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_reference" ref="d3d77a39f0852c42f80c6505843f450c" args="" -->
-typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90ca6a2979ebee466be771f4c2f9337e"></a><!-- doxytag: member="tbb::cache_aligned_allocator::size_type" ref="90ca6a2979ebee466be771f4c2f9337e" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b73eba293d042333f343d025c26751a4"></a><!-- doxytag: member="tbb::cache_aligned_allocator::difference_type" ref="b73eba293d042333f343d025c26751a4" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74ccd00a29171ddd61a4ea88cfa49c32"></a><!-- doxytag: member="tbb::cache_aligned_allocator::cache_aligned_allocator" ref="74ccd00a29171ddd61a4ea88cfa49c32" args="(const cache_aligned_allocator &)" -->
- </td><td class="memItemRight" valign="bottom"><b>cache_aligned_allocator</b> (const <a class="el" href="a00226.html">cache_aligned_allocator</a> &)  throw ()</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="de57e731c36a51bf39b458c9b8adee58"></a><!-- doxytag: member="tbb::cache_aligned_allocator::cache_aligned_allocator" ref="de57e731c36a51bf39b458c9b8adee58" args="(const cache_aligned_allocator< U > &)" -->
-template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>cache_aligned_allocator</b> (const <a class="el" href="a00226.html">cache_aligned_allocator</a>< U > &)  throw ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="023e0cc7cf6ebde69e1f2c12182eb12b"></a><!-- doxytag: member="tbb::cache_aligned_allocator::address" ref="023e0cc7cf6ebde69e1f2c12182eb12b" args="(reference x) const " -->
-pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db4f7613b1de12d1e79285c15636cf3b"></a><!-- doxytag: member="tbb::cache_aligned_allocator::address" ref="db4f7613b1de12d1e79285c15636cf3b" args="(const_reference x) const " -->
-const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4cdeea67af6c1fcd8f1d5e9c4cab61e8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::allocate" ref="4cdeea67af6c1fcd8f1d5e9c4cab61e8" args="(size_type n, const void *hint=0)" -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00226.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a> (size_type n, const void *hint=0)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects, starting on a cache/sector line. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d4eadf188f7d85d3805ae534e0b8e1c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::deallocate" ref="3d4eadf188f7d85d3805ae534e0b8e1c" args="(pointer p, size_type)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00226.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a> (pointer p, size_type)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Free block of memory that starts on a cache line. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb23b687b4c0429dab4c7f8017266cf0"></a><!-- doxytag: member="tbb::cache_aligned_allocator::max_size" ref="fb23b687b4c0429dab4c7f8017266cf0" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00226.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a> () const   throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="958ee8745c86c275bfc9533af565e017"></a><!-- doxytag: member="tbb::cache_aligned_allocator::construct" ref="958ee8745c86c275bfc9533af565e017" args="(pointer p, const value_type &value)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00226.html#958ee8745c86c275bfc9533af565e017">construct</a> (pointer p, const value_type &value)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd298895a4f1654b5149ec84b591ecb5"></a><!-- doxytag: member="tbb::cache_aligned_allocator::destroy" ref="cd298895a4f1654b5149ec84b591ecb5" args="(pointer p)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00226.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a> (pointer p)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy value at location pointed to by p. <br></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6d1d1f136cb6105d06ddbcf67107575"></a><!-- doxytag: member="tbb::internal::affinity_partitioner_base_v3::tbb::interface6::internal::affinity_partition_type" ref="c6d1d1f136cb6105d06ddbcf67107575" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>tbb::interface6::internal::affinity_partition_type</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::cache_aligned_allocator< T ></h3>
-
-Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. 
-<p>
-The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard. 
+Defines entry point for affinity partitioner into tbb run-time library. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00421.html">cache_aligned_allocator.h</a></ul>
+<li><a class="el" href="a00531.html">partitioner.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00226.png b/doc/html/a00226.png
new file mode 100644
index 0000000..18c7d58
Binary files /dev/null and b/doc/html/a00226.png differ
diff --git a/doc/html/a00227.html b/doc/html/a00227.html
index 039cc2c..406807c 100644
--- a/doc/html/a00227.html
+++ b/doc/html/a00227.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::cache_aligned_allocator< void > Class Template Reference</title>
+<title>tbb::aligned_space< T, N > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,39 +21,37 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00227.html">cache_aligned_allocator< void ></a></div>
-<h1>tbb::cache_aligned_allocator< void > Class Template Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00227.html">aligned_space</a></div>
+<h1>tbb::aligned_space< T, N > Class Template Reference<br>
 <small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::cache_aligned_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  
+[<a class="el" href="a00397.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::aligned_space" -->Block of space aligned sufficiently to construct an array T with N elements.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00421.html">cache_aligned_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00401.html">aligned_space.h</a>></code>
 <p>
-<a href="a00011.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00001.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce89776145998f0685a767b4f195272d"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::pointer" ref="ce89776145998f0685a767b4f195272d" args="" -->
-typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d702fc6b9e9d061ace3501b3c861cdf"></a><!-- doxytag: member="tbb::aligned_space::begin" ref="0d702fc6b9e9d061ace3501b3c861cdf" args="()" -->
+T * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4431fbbe1a8cfeb19c48ad0072078f45"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::const_pointer" ref="4431fbbe1a8cfeb19c48ad0072078f45" args="" -->
-typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2ab296f4ecdd75f8e193ff92004a697d"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::value_type" ref="2ab296f4ecdd75f8e193ff92004a697d" args="" -->
-typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to beginning of array. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="024be075c23c0394c9a2518d993bcd9e"></a><!-- doxytag: member="tbb::aligned_space::end" ref="024be075c23c0394c9a2518d993bcd9e" args="()" -->
+T * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00227.html#024be075c23c0394c9a2518d993bcd9e">end</a> ()</td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to one past last element in array. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<><br>
- class tbb::cache_aligned_allocator< void ></h3>
+<h3>template<typename T, size_t N><br>
+ class tbb::aligned_space< T, N ></h3>
 
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. 
+Block of space aligned sufficiently to construct an array T with N elements. 
+<p>
+The elements are not constructed or destroyed by this class. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00421.html">cache_aligned_allocator.h</a></ul>
+<li><a class="el" href="a00401.html">aligned_space.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00228.html b/doc/html/a00228.html
index 90a926d..dd91709 100644
--- a/doc/html/a00228.html
+++ b/doc/html/a00228.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::captured_exception Class Reference</title>
+<title>tbb::atomic< T > Struct Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,131 +21,35 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00228.html">captured_exception</a></div>
-<h1>tbb::captured_exception Class Reference</h1><!-- doxytag: class="tbb::captured_exception" --><!-- doxytag: inherits="tbb::tbb_exception" -->This class is used by TBB to propagate information about unhandled exceptions into the root thread.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00228.html">atomic</a></div>
+<h1>tbb::atomic< T > Struct Template Reference<br>
+<small>
+[<a class="el" href="a00398.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::atomic" -->Primary template for atomic.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00403.html">atomic.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::captured_exception:
-<p><center><img src="a00228.png" usemap="#tbb::captured_exception_map" border="0" alt=""></center>
-<map name="tbb::captured_exception_map">
-<area href="a00298.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,146,24">
-</map>
-<a href="a00143.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00002.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b50d9716bcdd281df574ec758a3952f9"></a><!-- doxytag: member="tbb::captured_exception::captured_exception" ref="b50d9716bcdd281df574ec758a3952f9" args="(const captured_exception &src)" -->
- </td><td class="memItemRight" valign="bottom"><b>captured_exception</b> (const <a class="el" href="a00228.html">captured_exception</a> &src)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e29e03a31436bad5eb1aa5a9d46a2da"></a><!-- doxytag: member="tbb::atomic::operator=" ref="1e29e03a31436bad5eb1aa5a9d46a2da" args="(T rhs)" -->
+T </td><td class="memItemRight" valign="bottom"><b>operator=</b> (T rhs)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="179076f146699724f652a9b1e81bd791"></a><!-- doxytag: member="tbb::captured_exception::captured_exception" ref="179076f146699724f652a9b1e81bd791" args="(const char *name_, const char *info)" -->
- </td><td class="memItemRight" valign="bottom"><b>captured_exception</b> (const char *name_, const char *info)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e95b8eb99ec9dea22934ac528a08654c"></a><!-- doxytag: member="tbb::captured_exception::operator=" ref="e95b8eb99ec9dea22934ac528a08654c" args="(const captured_exception &src)" -->
-<a class="el" href="a00228.html">captured_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00228.html">captured_exception</a> &src)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00228.html">captured_exception</a> *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00228.html#837a50b8f6a800bda225c39d1699643f">move</a> ()  throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object.  <a href="#837a50b8f6a800bda225c39d1699643f"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00228.html#93d875d3555502ff6f18513525de204c">destroy</a> ()  throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00228.html#837a50b8f6a800bda225c39d1699643f">move()</a> method.  <a href="#93d875d3555502ff6f18513525de204c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object.  <a href="#2dd1be66ab32fa27e0ddef5707fa67ef"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5af82fd677449c5ca727fa1d7e16f9f5"></a><!-- doxytag: member="tbb::captured_exception::name" ref="5af82fd677449c5ca727fa1d7e16f9f5" args="() const " -->
-const char *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00228.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a> () const   throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6b5988ef74a1fe2a58998d110b3633e0"></a><!-- doxytag: member="tbb::captured_exception::what" ref="6b5988ef74a1fe2a58998d110b3633e0" args="() const " -->
-const char *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00228.html#6b5988ef74a1fe2a58998d110b3633e0">what</a> () const   throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00228.html#6b5988ef74a1fe2a58998d110b3633e0">what()</a> method. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="92ed4100413eef26969f8299f6845e18"></a><!-- doxytag: member="tbb::captured_exception::set" ref="92ed4100413eef26969f8299f6845e18" args="(const char *name, const char *info)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>set</b> (const char *name, const char *info)  throw ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5f56d05102acdba6c2f09ba6db3baeb"></a><!-- doxytag: member="tbb::captured_exception::clear" ref="d5f56d05102acdba6c2f09ba6db3baeb" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>clear</b> ()  throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90791297d59b1659cfaf0d93c7cc59ae"></a><!-- doxytag: member="tbb::atomic::operator=" ref="90791297d59b1659cfaf0d93c7cc59ae" args="(const atomic< T > &rhs)" -->
+<a class="el" href="a00228.html">atomic</a>< T > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00228.html">atomic</a>< T > &rhs)</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-This class is used by TBB to propagate information about unhandled exceptions into the root thread. 
-<p>
-Exception of this type is thrown by TBB in the root thread (thread that started a parallel algorithm ) if an unhandled exception was intercepted during the algorithm execution in one of the workers. <dl compact><dt><b>See also:</b></dt><dd><a class="el" href="a00298.html">tbb::tbb_exception</a> </dd></dl>
-
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="93d875d3555502ff6f18513525de204c"></a><!-- doxytag: member="tbb::captured_exception::destroy" ref="93d875d3555502ff6f18513525de204c" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void __TBB_EXPORTED_METHOD tbb::captured_exception::destroy           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%">  throw ()<code> [virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Destroys objects created by the <a class="el" href="a00228.html#837a50b8f6a800bda225c39d1699643f">move()</a> method. 
-<p>
-Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method. 
-<p>
-Implements <a class="el" href="a00298.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>.
-</div>
-</div><p>
-<a class="anchor" name="837a50b8f6a800bda225c39d1699643f"></a><!-- doxytag: member="tbb::captured_exception::move" ref="837a50b8f6a800bda225c39d1699643f" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="a00228.html">captured_exception</a>* __TBB_EXPORTED_METHOD tbb::captured_exception::move           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%">  throw ()<code> [virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T><br>
+ struct tbb::atomic< T ></h3>
 
+Primary template for atomic. 
 <p>
-Creates and returns pointer to the deep copy of this exception object. 
-<p>
-Move semantics is allowed. 
-<p>
-Implements <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a>.
-</div>
-</div><p>
-<a class="anchor" name="2dd1be66ab32fa27e0ddef5707fa67ef"></a><!-- doxytag: member="tbb::captured_exception::throw_self" ref="2dd1be66ab32fa27e0ddef5707fa67ef" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void tbb::captured_exception::throw_self           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Throws this exception object. 
-<p>
-Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown. 
+See the Reference for details. 
 <p>
-Implements <a class="el" href="a00298.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a>.
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00403.html">atomic.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00228.png b/doc/html/a00228.png
deleted file mode 100644
index 2470bea..0000000
Binary files a/doc/html/a00228.png and /dev/null differ
diff --git a/doc/html/a00229.html b/doc/html/a00229.html
index a728010..279fa06 100644
--- a/doc/html/a00229.html
+++ b/doc/html/a00229.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::combinable< T > Class Template Reference</title>
+<title>tbb::atomic< void * > Struct Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,58 +21,30 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00229.html">combinable</a></div>
-<h1>tbb::combinable< T > Class Template Reference<br>
-<small>
-[<a class="el" href="a00372.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::combinable" -->Thread-local storage with optional reduction.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00229.html">atomic< void * ></a></div>
+<h1>tbb::atomic< void * > Struct Template Reference</h1><!-- doxytag: class="tbb::atomic< void * >" -->Specialization for <a class="el" href="a00229.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00423.html">combinable.h</a>></code>
+<code>#include <<a class="el" href="a00403.html">atomic.h</a>></code>
 <p>
-<a href="a00013.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00003.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="d03619e90e62555aa5634fcc8adadcc9"></a><!-- doxytag: member="tbb::combinable::combinable" ref="d03619e90e62555aa5634fcc8adadcc9" args="(finit _finit)" -->
-template<typename finit> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>combinable</b> (finit _finit)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ba6e74163e255b88c497c40db64c5dad"></a><!-- doxytag: member="tbb::atomic< void * >::operator=" ref="ba6e74163e255b88c497c40db64c5dad" args="(void *rhs)" -->
+void * </td><td class="memItemRight" valign="bottom"><b>operator=</b> (void *rhs)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c87e79ae98588a5780f708773388843"></a><!-- doxytag: member="tbb::combinable::~combinable" ref="2c87e79ae98588a5780f708773388843" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00229.html#2c87e79ae98588a5780f708773388843">~combinable</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">destructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57012803b7bc7416452cb930121ff210"></a><!-- doxytag: member="tbb::combinable::combinable" ref="57012803b7bc7416452cb930121ff210" args="(const combinable &other)" -->
- </td><td class="memItemRight" valign="bottom"><b>combinable</b> (const <a class="el" href="a00229.html">combinable</a> &other)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c9650d59f65b1042afa232ede57dfca9"></a><!-- doxytag: member="tbb::combinable::operator=" ref="c9650d59f65b1042afa232ede57dfca9" args="(const combinable &other)" -->
-<a class="el" href="a00229.html">combinable</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00229.html">combinable</a> &other)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f09233cccb9b5e8a58874e43a703cac2"></a><!-- doxytag: member="tbb::combinable::clear" ref="f09233cccb9b5e8a58874e43a703cac2" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>clear</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2d7550204bcb88fa8810b5a39e9cad24"></a><!-- doxytag: member="tbb::combinable::local" ref="2d7550204bcb88fa8810b5a39e9cad24" args="()" -->
-T & </td><td class="memItemRight" valign="bottom"><b>local</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93a42052881ecccdd8ddff16a1b1cca1"></a><!-- doxytag: member="tbb::combinable::local" ref="93a42052881ecccdd8ddff16a1b1cca1" args="(bool &exists)" -->
-T & </td><td class="memItemRight" valign="bottom"><b>local</b> (bool &exists)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9be306b4a073066dcac4043dc189c514"></a><!-- doxytag: member="tbb::combinable::combine" ref="9be306b4a073066dcac4043dc189c514" args="(combine_func_t f_combine)" -->
-template<typename combine_func_t> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>combine</b> (combine_func_t f_combine)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="dcd23283834149c87c345c0e476dfee8"></a><!-- doxytag: member="tbb::combinable::combine_each" ref="dcd23283834149c87c345c0e476dfee8" args="(combine_func_t f_combine)" -->
-template<typename combine_func_t> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="37979e62d1f88eb45bd3ad7df5a140f8"></a><!-- doxytag: member="tbb::atomic< void * >::operator=" ref="37979e62d1f88eb45bd3ad7df5a140f8" args="(const atomic< void * > &rhs)" -->
+<a class="el" href="a00228.html">atomic</a>< void * > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00228.html">atomic</a>< void * > &rhs)</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::combinable< T ></h3>
+<h3>template<><br>
+ struct tbb::atomic< void * ></h3>
 
-Thread-local storage with optional reduction. 
+Specialization for <a class="el" href="a00229.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->. 
 <p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00423.html">combinable.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00403.html">atomic.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00230.html b/doc/html/a00230.html
index ca39e2d..d491137 100644
--- a/doc/html/a00230.html
+++ b/doc/html/a00230.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::concurrent_bounded_queue< T, A > Class Template Reference</title>
+<title>tbb::internal::atomic_backoff Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,280 +21,33 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00230.html">concurrent_bounded_queue</a></div>
-<h1>tbb::concurrent_bounded_queue< T, A > Class Template Reference<br>
-<small>
-[<a class="el" href="a00372.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::concurrent_bounded_queue" -->A high-performance thread-safe blocking concurrent bounded queue.  
+<a class="el" href="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00230.html">atomic_backoff</a></div>
+<h1>tbb::internal::atomic_backoff Class Reference</h1><!-- doxytag: class="tbb::internal::atomic_backoff" -->Class that implements exponential backoff.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00436.html">concurrent_queue.h</a>></code>
+<code>#include <<a class="el" href="a00594.html">tbb_machine.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::concurrent_bounded_queue< T, A >:
-<p><center><img src="a00230.png" usemap="#tbb::concurrent_bounded_queue< T, A >_map" border="0" alt=""></center>
-<map name="tbb::concurrent_bounded_queue< T, A >_map">
-<area href="a00237.html" alt="tbb::deprecated::concurrent_queue< T, A >" shape="rect" coords="0,56,257,80">
-</map>
-<a href="a00025.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00150.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98245517a931e5893f6601e66c51fc75"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::value_type" ref="98245517a931e5893f6601e66c51fc75" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#98245517a931e5893f6601e66c51fc75">value_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2e2726fccf6d975dc1071608cc0bbf90"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::allocator_type" ref="2e2726fccf6d975dc1071608cc0bbf90" args="" -->
-typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dcd44ca6a88c0dc7a847a47a10811f0c"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::reference" ref="dcd44ca6a88c0dc7a847a47a10811f0c" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="796713d0b9ba93a4721cbe13e4474068"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::const_reference" ref="796713d0b9ba93a4721cbe13e4474068" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef std::ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue.  <a href="#a80e4c11dbb324e4b92a24a77bbcde68"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b45c91297e69515d83d5eef85ae1f49"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::difference_type" ref="4b45c91297e69515d83d5eef85ae1f49" args="" -->
-typedef std::ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aeea2ad38b7e7fc2866f063dfed24c52"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::iterator" ref="aeea2ad38b7e7fc2866f063dfed24c52" args="" -->
-typedef internal::concurrent_queue_iterator<<br>
- <a class="el" href="a00230.html">concurrent_bounded_queue</a>,<br>
- T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0edd1a90e6ffa503bac1c4027116dbff"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::const_iterator" ref="0edd1a90e6ffa503bac1c4027116dbff" args="" -->
-typedef internal::concurrent_queue_iterator<<br>
- <a class="el" href="a00230.html">concurrent_bounded_queue</a>,<br>
- const T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
-
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e3525226732963ff0f13e89d8e6dab5b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="e3525226732963ff0f13e89d8e6dab5b" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a> (const <a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7b7fb414d2eaa8a7f5d68fc4cd63ac50"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="7b7fb414d2eaa8a7f5d68fc4cd63ac50" args="(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a> (const <a class="el" href="a00230.html">concurrent_bounded_queue</a> &src, const <a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="a5e04dcd7db9fd9b583b4e7df832246a"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="a5e04dcd7db9fd9b583b4e7df832246a" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
-template<typename InputIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="acaf5b510dc0dfc7780b8c956cf773cf"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::~concurrent_bounded_queue" ref="acaf5b510dc0dfc7780b8c956cf773cf" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ceb08c743b11ba88c878e73fff8af20b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::push" ref="ceb08c743b11ba88c878e73fff8af20b" args="(const T &source)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">push</a> (const T &source)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a> (T &destination)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Dequeue item from head of queue.  <a href="#41f4c6bd7a82ab070e840bbf81b0b123"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a> (const T &source)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue if queue is not already full.  <a href="#2bd6232531279fb3ccbd296bea23066b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a> (T &destination)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue.  <a href="#0ca487019bbb00a196442aff78a1e4f7"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return number of pushes minus number of pops.  <a href="#7dc14d1a579a4cccda9f857585e1768d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f64924f2ee9225c368a270fc3c394db9"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::empty" ref="f64924f2ee9225c368a270fc3c394db9" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to <a class="el" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">size()</a><=0. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b2888b3e4e837d7e03f2c731963a402b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::capacity" ref="b2888b3e4e837d7e03f2c731963a402b" args="() const " -->
-<a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Maximum number of allowed elements. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a> (<a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Set the capacity.  <a href="#f3c6c934f85fd02aedbc83a16943193b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="415eb87e53b1c6a266de06ecbc490d16"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::get_allocator" ref="415eb87e53b1c6a266de06ecbc490d16" args="() const " -->
-<a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90b31e2954c6e4596c7900435a5f4bc1"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::clear" ref="90b31e2954c6e4596c7900435a5f4bc1" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">clear the queue. not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a2637188e104503ac2c0dff633014e8"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_begin" ref="5a2637188e104503ac2c0dff633014e8" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a174ea93e3bd3d5cce82389c2f28d037"></a><!-- doxytag: member="tbb::internal::atomic_backoff::pause" ref="a174ea93e3bd3d5cce82389c2f28d037" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c7267334ef11087c76c810abb9d5cbc2"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_end" ref="c7267334ef11087c76c810abb9d5cbc2" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pause for a while. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6179b19e2e8dedd73a36d523af2fe12"></a><!-- doxytag: member="tbb::internal::atomic_backoff::bounded_pause" ref="c6179b19e2e8dedd73a36d523af2fe12" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>bounded_pause</b> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8be757841d0bbf7744508aaf6a141d08"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_begin" ref="8be757841d0bbf7744508aaf6a141d08" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45edb535489eb0e76ecc59a19fd952de"></a><!-- doxytag: member="tbb::internal::atomic_backoff::reset" ref="45edb535489eb0e76ecc59a19fd952de" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3aac91d288bf227d9d06717b44ef28f7"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_end" ref="3aac91d288bf227d9d06717b44ef28f7" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> () const </td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>destroyer</b></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class used to ensure exception-safety of method "pop". <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, class A = cache_aligned_allocator<T>><br>
- class tbb::concurrent_bounded_queue< T, A ></h3>
-
-A high-performance thread-safe blocking concurrent bounded queue. 
-<p>
-This is the pre-PPL TBB concurrent queue which supports boundedness and blocking semantics. Note that method names agree with the PPL-style concurrent queue. Multiple threads may each push and pop concurrently. Assignment construction is not allowed. 
-<p>
-<hr><h2>Member Typedef Documentation</h2>
-<a class="anchor" name="a80e4c11dbb324e4b92a24a77bbcde68"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::size_type" ref="a80e4c11dbb324e4b92a24a77bbcde68" args="" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">typedef std::ptrdiff_t <a class="el" href="a00230.html">tbb::concurrent_bounded_queue</a>< T, A >::<a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>          </td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Integral type for representing size of the queue. 
-<p>
-Note that the size_type is a signed integral type. This is because the size can be negative if there are pending pops without corresponding pushes. 
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="41f4c6bd7a82ab070e840bbf81b0b123"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::pop" ref="41f4c6bd7a82ab070e840bbf81b0b123" args="(T &destination)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">void <a class="el" href="a00230.html">tbb::concurrent_bounded_queue</a>< T, A >::pop           </td>
-          <td>(</td>
-          <td class="paramtype">T & </td>
-          <td class="paramname"> <em>destination</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Dequeue item from head of queue. 
-<p>
-Block until an item becomes available, and then dequeue it. 
-</div>
-</div><p>
-<a class="anchor" name="f3c6c934f85fd02aedbc83a16943193b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::set_capacity" ref="f3c6c934f85fd02aedbc83a16943193b" args="(size_type new_capacity)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">void <a class="el" href="a00230.html">tbb::concurrent_bounded_queue</a>< T, A >::set_capacity           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td>
-          <td class="paramname"> <em>new_capacity</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Set the capacity. 
-<p>
-Setting the capacity to 0 causes subsequent try_push operations to always fail, and subsequent push operations to block forever. 
-</div>
-</div><p>
-<a class="anchor" name="7dc14d1a579a4cccda9f857585e1768d"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::size" ref="7dc14d1a579a4cccda9f857585e1768d" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="el" href="a00230.html">tbb::concurrent_bounded_queue</a>< T, A >::size           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"> const<code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Return number of pushes minus number of pops. 
-<p>
-Note that the result can be negative if there are pops waiting for the corresponding pushes. The result can also exceed <a class="el" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">capacity()</a> if there are push operations in flight. 
-</div>
-</div><p>
-<a class="anchor" name="0ca487019bbb00a196442aff78a1e4f7"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::try_pop" ref="0ca487019bbb00a196442aff78a1e4f7" args="(T &destination)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00230.html">tbb::concurrent_bounded_queue</a>< T, A >::try_pop           </td>
-          <td>(</td>
-          <td class="paramtype">T & </td>
-          <td class="paramname"> <em>destination</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Attempt to dequeue an item from head of queue. 
-<p>
-Does not wait for item to become available. Returns true if successful; false otherwise. 
-</div>
-</div><p>
-<a class="anchor" name="2bd6232531279fb3ccbd296bea23066b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::try_push" ref="2bd6232531279fb3ccbd296bea23066b" args="(const T &source)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00230.html">tbb::concurrent_bounded_queue</a>< T, A >::try_push           </td>
-          <td>(</td>
-          <td class="paramtype">const T & </td>
-          <td class="paramname"> <em>source</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
+Class that implements exponential backoff. 
 <p>
-Enqueue an item at tail of queue if queue is not already full. 
+See implementation of spin_wait_while_eq for an example. 
 <p>
-Does not wait for queue to become not full. Returns true if item is pushed; false if queue was already full. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00436.html">concurrent_queue.h</a></ul>
+<li><a class="el" href="a00594.html">tbb_machine.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00230.png b/doc/html/a00230.png
deleted file mode 100644
index e9d90a2..0000000
Binary files a/doc/html/a00230.png and /dev/null differ
diff --git a/doc/html/a00231.html b/doc/html/a00231.html
index ba8315f..ad994ed 100644
--- a/doc/html/a00231.html
+++ b/doc/html/a00231.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference</title>
+<title>tbb::auto_partitioner Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,620 +21,38 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00231.html">concurrent_hash_map</a></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00231.html">auto_partitioner</a></div>
+<h1>tbb::auto_partitioner Class Reference<br>
 <small>
-[<a class="el" href="a00372.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map" -->Unordered map from Key to T.  
+[<a class="el" href="a00395.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::auto_partitioner" -->An auto partitioner.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00424.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00531.html">partitioner.h</a>></code>
 <p>
-<a href="a00015.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00089.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e664e41a5b735a677f2ebbbcca0fcd80"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::key_type" ref="e664e41a5b735a677f2ebbbcca0fcd80" args="" -->
-typedef Key </td><td class="memItemRight" valign="bottom"><b>key_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="616243d5a0b6159299f2a34413e077e4"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::mapped_type" ref="616243d5a0b6159299f2a34413e077e4" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><b>mapped_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ece048b19778bc31377185392ecf312b"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::value_type" ref="ece048b19778bc31377185392ecf312b" args="" -->
-typedef std::pair< const Key,<br>
- T > </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="549109620a3331c83e46b8fe0636b883"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::size_type" ref="549109620a3331c83e46b8fe0636b883" args="" -->
-typedef hash_map_base::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0a4ffc8ac85bb2eb80a4e1909a373e2c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::difference_type" ref="0a4ffc8ac85bb2eb80a4e1909a373e2c" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="341d2ae1e5e9d8ba05e5306a3933f31a"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::pointer" ref="341d2ae1e5e9d8ba05e5306a3933f31a" args="" -->
-typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b401731d22f457617f950416fde9bff"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_pointer" ref="4b401731d22f457617f950416fde9bff" args="" -->
-typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2765bbab7bac8b74cfd79d269a2008b8"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::reference" ref="2765bbab7bac8b74cfd79d269a2008b8" args="" -->
-typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3b62b1930b2b88c98cb617f67bb9545"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_reference" ref="a3b62b1930b2b88c98cb617f67bb9545" args="" -->
-typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83603b64f2507ee6560133d79a001eb2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::iterator" ref="83603b64f2507ee6560133d79a001eb2" args="" -->
-typedef internal::hash_map_iterator<<br>
- <a class="el" href="a00231.html">concurrent_hash_map</a>, value_type > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d47cbc7e0b0999b849187040f02557f5"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_iterator" ref="d47cbc7e0b0999b849187040f02557f5" args="" -->
-typedef internal::hash_map_iterator<<br>
- <a class="el" href="a00231.html">concurrent_hash_map</a>, const <br>
-value_type > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="baeed4327d9c77f084bfb5ac8d519c96"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::range_type" ref="baeed4327d9c77f084bfb5ac8d519c96" args="" -->
-typedef internal::hash_map_range<<br>
- iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e7700e8872566a5dc6d1c702b7949f4"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_range_type" ref="1e7700e8872566a5dc6d1c702b7949f4" args="" -->
-typedef internal::hash_map_range<<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bf2a3ebce78da6d8be3b1803eb31a2e3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::allocator_type" ref="bf2a3ebce78da6d8be3b1803eb31a2e3" args="" -->
-typedef Allocator </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ad413f5b666176e7669bf4c87d1ff3f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="1ad413f5b666176e7669bf4c87d1ff3f" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#1ad413f5b666176e7669bf4c87d1ff3f">concurrent_hash_map</a> (const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="46b9896317662c3cfa3c876ad7592a7c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="46b9896317662c3cfa3c876ad7592a7c" args="(size_type n, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#46b9896317662c3cfa3c876ad7592a7c">concurrent_hash_map</a> (size_type n, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty table with n preallocated buckets. This number serves also as initial concurrency level. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6fb14710893308fb47aaeee55ee30dc3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="6fb14710893308fb47aaeee55ee30dc3" args="(const concurrent_hash_map &table, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#6fb14710893308fb47aaeee55ee30dc3">concurrent_hash_map</a> (const <a class="el" href="a00231.html">concurrent_hash_map</a> &table, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="83c40f2053f208861b90390e12a36436"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="83c40f2053f208861b90390e12a36436" args="(I first, I last, const allocator_type &a=allocator_type())" -->
-template<typename I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00231.html#83c40f2053f208861b90390e12a36436">concurrent_hash_map</a> (I first, I last, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with copying iteration range and given allocator instance. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="088d1aaccc816884a49e38f7065622c8"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::operator=" ref="088d1aaccc816884a49e38f7065622c8" args="(const concurrent_hash_map &table)" -->
-<a class="el" href="a00231.html">concurrent_hash_map</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#088d1aaccc816884a49e38f7065622c8">operator=</a> (const <a class="el" href="a00231.html">concurrent_hash_map</a> &table)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#94758113d8993cfe5afdf2d63a728869">rehash</a> (size_type n=0)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Rehashes and optionally resizes the whole table.  <a href="#94758113d8993cfe5afdf2d63a728869"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="220686fe17b197eedf19dd856cd02e36"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::clear" ref="220686fe17b197eedf19dd856cd02e36" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#220686fe17b197eedf19dd856cd02e36">clear</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2aa8e2d28d5af1284cf78d20a9c22731"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::~concurrent_hash_map" ref="2aa8e2d28d5af1284cf78d20a9c22731" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#2aa8e2d28d5af1284cf78d20a9c22731">~concurrent_hash_map</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear table and destroy it. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ee6b69f390111c92318a85600dd9c559"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::range" ref="ee6b69f390111c92318a85600dd9c559" args="(size_type grainsize=1)" -->
-range_type </td><td class="memItemRight" valign="bottom"><b>range</b> (size_type grainsize=1)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d9a834a345415581bd801647945ea96b"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::range" ref="d9a834a345415581bd801647945ea96b" args="(size_type grainsize=1) const " -->
-const_range_type </td><td class="memItemRight" valign="bottom"><b>range</b> (size_type grainsize=1) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35a8c373fc3d52099ae18f0553162491"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::begin" ref="35a8c373fc3d52099ae18f0553162491" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="67c50bddda53b9a10318f8981e4fc4fa"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::end" ref="67c50bddda53b9a10318f8981e4fc4fa" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>end</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c8ad3d9bb833063b3d09164199b8f7de"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::begin" ref="c8ad3d9bb833063b3d09164199b8f7de" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> () const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="75e7c0fb6addae180b6cc483b771fded"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::end" ref="75e7c0fb6addae180b6cc483b771fded" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>end</b> () const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8262e9ef1208a39e7ea087487fbe8368"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::equal_range" ref="8262e9ef1208a39e7ea087487fbe8368" args="(const Key &key)" -->
-std::pair< iterator, iterator > </td><td class="memItemRight" valign="bottom"><b>equal_range</b> (const Key &key)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b94bf1d3724f26299640e8b82787a75c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::equal_range" ref="b94bf1d3724f26299640e8b82787a75c" args="(const Key &key) const " -->
-std::pair< const_iterator,<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>equal_range</b> (const Key &key) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6aa56a8b5a25e61a97fa0b54fe2b5659"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::size" ref="6aa56a8b5a25e61a97fa0b54fe2b5659" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Number of items in table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61ff2e5bb44e5469366fd5295e5d0ebe"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::empty" ref="61ff2e5bb44e5469366fd5295e5d0ebe" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#61ff2e5bb44e5469366fd5295e5d0ebe">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if <a class="el" href="a00231.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size()</a>==0. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2bce57fe9b594abe1e6d2568aea8b357"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::max_size" ref="2bce57fe9b594abe1e6d2568aea8b357" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#2bce57fe9b594abe1e6d2568aea8b357">max_size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Upper bound on size. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af34cb91b1d0f36a885a1a3432dd9af1"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_count" ref="af34cb91b1d0f36a885a1a3432dd9af1" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#af34cb91b1d0f36a885a1a3432dd9af1">bucket_count</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the current number of buckets. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6cbcacb4a256a85bf89576c101373ca7"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::get_allocator" ref="6cbcacb4a256a85bf89576c101373ca7" args="() const " -->
-allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="076f8d9e16110aac5f558777aa744eb6"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::swap" ref="076f8d9e16110aac5f558777aa744eb6" args="(concurrent_hash_map &table)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#076f8d9e16110aac5f558777aa744eb6">swap</a> (<a class="el" href="a00231.html">concurrent_hash_map</a> &table)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">swap two instances. Iterators are invalidated <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6968eb6feed2df36be421df0464297af"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::count" ref="6968eb6feed2df36be421df0464297af" args="(const Key &key) const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#6968eb6feed2df36be421df0464297af">count</a> (const Key &key) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return count of items (0 or 1). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#2afcc33dade7bb24e008d60c0df38230">find</a> (<a class="el" href="a00234.html">const_accessor</a> &result, const Key &key) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Find item and acquire a read lock on the item.  <a href="#2afcc33dade7bb24e008d60c0df38230"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#7bc475d1968f7f0af3d736d7e8a0d7df">find</a> (<a class="el" href="a00232.html">accessor</a> &result, const Key &key)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Find item and acquire a write lock on the item.  <a href="#7bc475d1968f7f0af3d736d7e8a0d7df"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#47fe0e60151a9bd7a444db827772a4e6">insert</a> (<a class="el" href="a00234.html">const_accessor</a> &result, const Key &key)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item (if not already present) and acquire a read lock on the item.  <a href="#47fe0e60151a9bd7a444db827772a4e6"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#54e0955ecd11575b4c07166838a72893">insert</a> (<a class="el" href="a00232.html">accessor</a> &result, const Key &key)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item (if not already present) and acquire a write lock on the item.  <a href="#54e0955ecd11575b4c07166838a72893"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#091efd2d12fdad4fe9e54d9629a9dfc3">insert</a> (<a class="el" href="a00234.html">const_accessor</a> &result, const value_type &value)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already and acquire a read lock on the item.  <a href="#091efd2d12fdad4fe9e54d9629a9dfc3"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#39183d78d6e8425917555ab542ab92de">insert</a> (<a class="el" href="a00232.html">accessor</a> &result, const value_type &value)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already and acquire a write lock on the item.  <a href="#39183d78d6e8425917555ab542ab92de"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#3f121a316af8135de476a30fae6d7c07">insert</a> (const value_type &value)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already.  <a href="#3f121a316af8135de476a30fae6d7c07"></a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1dd37fad87e561151ba1e242ca94bcc1"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="1dd37fad87e561151ba1e242ca94bcc1" args="(I first, I last)" -->
-template<typename I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00231.html#1dd37fad87e561151ba1e242ca94bcc1">insert</a> (I first, I last)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert range [first, last). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#f27802b3a8d1863c29e743e9c6b4e870">erase</a> (const Key &key)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item.  <a href="#f27802b3a8d1863c29e743e9c6b4e870"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#e698ef3d70b2d1a29a7a5551784d3653">erase</a> (<a class="el" href="a00234.html">const_accessor</a> &item_accessor)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by <a class="el" href="a00234.html">const_accessor</a>.  <a href="#e698ef3d70b2d1a29a7a5551784d3653"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#5f12d150d421420965db07368666a84f">erase</a> (<a class="el" href="a00232.html">accessor</a> &item_accessor)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by accessor.  <a href="#5f12d150d421420965db07368666a84f"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2066e7e0fec7813db8fe9c8b9368c9e5"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::node_allocator_type" ref="2066e7e0fec7813db8fe9c8b9368c9e5" args="" -->
-typedef Allocator::template <br>
-rebind< node >::other </td><td class="memItemRight" valign="bottom"><b>node_allocator_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="559190b7953177b4967a3312f557318f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::delete_node" ref="559190b7953177b4967a3312f557318f" args="(node_base *n)" -->
-void </td><td class="memItemRight" valign="bottom"><b>delete_node</b> (node_base *n)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="32ec82223d843f1c2b95fa37acb7f4bb"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::search_bucket" ref="32ec82223d843f1c2b95fa37acb7f4bb" args="(const key_type &key, bucket *b) const " -->
-node * </td><td class="memItemRight" valign="bottom"><b>search_bucket</b> (const key_type &key, bucket *b) const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4962c7da24793ccc05524cc3bbcf1efa"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::rehash_bucket" ref="4962c7da24793ccc05524cc3bbcf1efa" args="(bucket *b_new, const hashcode_t h)" -->
-void </td><td class="memItemRight" valign="bottom"><b>rehash_bucket</b> (bucket *b_new, const hashcode_t h)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3f3413264a99174a224ef96f6c4ea769"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::lookup" ref="3f3413264a99174a224ef96f6c4ea769" args="(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#3f3413264a99174a224ef96f6c4ea769">lookup</a> (bool op_insert, const Key &key, const T *t, <a class="el" href="a00234.html">const_accessor</a> *result, bool write)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert or find item and optionally acquire a lock on the item. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c964214eb38f54603aa75fdff6d2709"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::exclude" ref="0c964214eb38f54603aa75fdff6d2709" args="(const_accessor &item_accessor)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#0c964214eb38f54603aa75fdff6d2709">exclude</a> (<a class="el" href="a00234.html">const_accessor</a> &item_accessor)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">delete item by accessor <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="8f5373b8e1864619d1ffcf3bf3f1f13d"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_equal_range" ref="8f5373b8e1864619d1ffcf3bf3f1f13d" args="(const Key &key, I end) const " -->
-template<typename I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">std::pair< I, I > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00231.html#8f5373b8e1864619d1ffcf3bf3f1f13d">internal_equal_range</a> (const Key &key, I end) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns an iterator for an item defined by the key, or for the next item after it (if upper==true). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72c9c9e9655fcf096f5f0ed9c8ba6669"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_copy" ref="72c9c9e9655fcf096f5f0ed9c8ba6669" args="(const concurrent_hash_map &source)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a> (const <a class="el" href="a00231.html">concurrent_hash_map</a> &source)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy "source" to *this, where *this must start out empty. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1ec1fe8dfa2d7894bf0589bfdbcb1f96"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_copy" ref="1ec1fe8dfa2d7894bf0589bfdbcb1f96" args="(I first, I last)" -->
-template<typename I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>internal_copy</b> (I first, I last)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a> (const Key &key) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast find when no concurrent erasure is used. For internal use inside TBB only!  <a href="#2f76ed101a0ccc8875b846c2f747897e"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a72cb6e9873e5541295682179e5a7f74"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::my_allocator" ref="a72cb6e9873e5541295682179e5a7f74" args="" -->
-node_allocator_type </td><td class="memItemRight" valign="bottom"><b>my_allocator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="53c747a3f2d2d2c85aec866e19c31c29"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::my_hash_compare" ref="53c747a3f2d2d2c85aec866e19c31c29" args="" -->
-HashCompare </td><td class="memItemRight" valign="bottom"><b>my_hash_compare</b></td></tr>
-
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e24acd2f6849db3377a3942807639758"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal::hash_map_iterator" ref="e24acd2f6849db3377a3942807639758" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::hash_map_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c94f21746c8902f7e0b5115a8d4da1d2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal::hash_map_range" ref="c94f21746c8902f7e0b5115a8d4da1d2" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::hash_map_range</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5f730f70d21df405adaebfc2018f59cd"></a><!-- doxytag: member="tbb::auto_partitioner::serial::interface6::start_for" ref="5f730f70d21df405adaebfc2018f59cd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>serial::interface6::start_for</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c0028dfa75a6baa14007355ab1ef7fc"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor" ref="2c0028dfa75a6baa14007355ab1ef7fc" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>const_accessor</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a4cd0ffed4fad0d9af2c5efdaf586a8"></a><!-- doxytag: member="tbb::auto_partitioner::interface6::internal::start_for" ref="8a4cd0ffed4fad0d9af2c5efdaf586a8" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_for</b></td></tr>
 
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00232.html">accessor</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="86f0750233dd6c83b65fb684338fd09f"></a><!-- doxytag: member="tbb::auto_partitioner::interface6::internal::start_reduce" ref="86f0750233dd6c83b65fb684338fd09f" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_reduce</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allows write access to elements and combines data access, locking, and garbage collection.  <a href="a00232.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html">bucket_accessor</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">bucket accessor is to find, rehash, acquire a lock, and access a bucket  <a href="a00233.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html">const_accessor</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Combines data access, locking, and garbage collection.  <a href="a00234.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>node</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::auto_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></h3>
-
-Unordered map from Key to T. 
-<p>
-<a class="el" href="a00231.html">concurrent_hash_map</a> is associative container with concurrent access.<p>
-<dl compact><dt><b>Compatibility</b></dt><dd>The class meets all Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1).</dd></dl>
-<dl compact><dt><b>Exception Safety</b></dt><dd><ul>
-<li>Hash function is not permitted to throw an exception. User-defined types Key and T are forbidden from throwing an exception in destructors.</li><li>If exception happens during <a class="el" href="a00231.html#47fe0e60151a9bd7a444db827772a4e6">insert()</a> operations, it has no effect (unless exception raised by HashCompare::hash() function during grow_segment).</li><li>If exception happens during <a class="el" href="a00231.html#088d1aaccc816884a49e38f7065622c8">operator=()</a> operati [...]
-</dd></dl>
-<dl compact><dt><b>Changes since TBB 2.1</b></dt><dd><ul>
-<li>Replaced internal algorithm and data structure. Patent is pending.</li><li>Added buckets number argument for constructor</li></ul>
-</dd></dl>
-<dl compact><dt><b>Changes since TBB 2.0</b></dt><dd><ul>
-<li>Fixed exception-safety</li><li>Added template argument for allocator</li><li>Added allocator argument in constructors</li><li>Added constructor from a range of iterators</li><li>Added several new overloaded <a class="el" href="a00231.html#47fe0e60151a9bd7a444db827772a4e6">insert()</a> methods</li><li>Added <a class="el" href="a00231.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator()</a></li><li>Added <a class="el" href="a00231.html#076f8d9e16110aac5f558777aa744eb6">swap()</a></li [...]
-</dd></dl>
-
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="5f12d150d421420965db07368666a84f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::erase" ref="5f12d150d421420965db07368666a84f" args="(accessor &item_accessor)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00232.html">accessor</a> & </td>
-          <td class="paramname"> <em>item_accessor</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Erase item by accessor. 
-<p>
-Return true if item was erased by particularly this call. 
-</div>
-</div><p>
-<a class="anchor" name="e698ef3d70b2d1a29a7a5551784d3653"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::erase" ref="e698ef3d70b2d1a29a7a5551784d3653" args="(const_accessor &item_accessor)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00234.html">const_accessor</a> & </td>
-          <td class="paramname"> <em>item_accessor</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Erase item by <a class="el" href="a00234.html">const_accessor</a>. 
-<p>
-Return true if item was erased by particularly this call. 
-</div>
-</div><p>
-<a class="anchor" name="f27802b3a8d1863c29e743e9c6b4e870"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::erase" ref="f27802b3a8d1863c29e743e9c6b4e870" args="(const Key &key)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename A> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, A >::erase           </td>
-          <td>(</td>
-          <td class="paramtype">const Key & </td>
-          <td class="paramname"> <em>key</em>          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Erase item. 
-<p>
-Return true if item was erased by particularly this call. 
-</div>
-</div><p>
-<a class="anchor" name="7bc475d1968f7f0af3d736d7e8a0d7df"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::find" ref="7bc475d1968f7f0af3d736d7e8a0d7df" args="(accessor &result, const Key &key)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00232.html">accessor</a> & </td>
-          <td class="paramname"> <em>result</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">const Key & </td>
-          <td class="paramname"> <em>key</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Find item and acquire a write lock on the item. 
-<p>
-Return true if item is found, false otherwise. 
-</div>
-</div><p>
-<a class="anchor" name="2afcc33dade7bb24e008d60c0df38230"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::find" ref="2afcc33dade7bb24e008d60c0df38230" args="(const_accessor &result, const Key &key) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00234.html">const_accessor</a> & </td>
-          <td class="paramname"> <em>result</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">const Key & </td>
-          <td class="paramname"> <em>key</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"> const<code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Find item and acquire a read lock on the item. 
-<p>
-Return true if item is found, false otherwise. 
-</div>
-</div><p>
-<a class="anchor" name="3f121a316af8135de476a30fae6d7c07"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="3f121a316af8135de476a30fae6d7c07" args="(const value_type &value)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert           </td>
-          <td>(</td>
-          <td class="paramtype">const value_type & </td>
-          <td class="paramname"> <em>value</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item by copying if there is no such key present already. 
-<p>
-Returns true if item is inserted. 
-</div>
-</div><p>
-<a class="anchor" name="39183d78d6e8425917555ab542ab92de"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="39183d78d6e8425917555ab542ab92de" args="(accessor &result, const value_type &value)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00232.html">accessor</a> & </td>
-          <td class="paramname"> <em>result</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">const value_type & </td>
-          <td class="paramname"> <em>value</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item by copying if there is no such key present already and acquire a write lock on the item. 
-<p>
-Returns true if item is new. 
-</div>
-</div><p>
-<a class="anchor" name="091efd2d12fdad4fe9e54d9629a9dfc3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="091efd2d12fdad4fe9e54d9629a9dfc3" args="(const_accessor &result, const value_type &value)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00234.html">const_accessor</a> & </td>
-          <td class="paramname"> <em>result</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">const value_type & </td>
-          <td class="paramname"> <em>value</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item by copying if there is no such key present already and acquire a read lock on the item. 
-<p>
-Returns true if item is new. 
-</div>
-</div><p>
-<a class="anchor" name="54e0955ecd11575b4c07166838a72893"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="54e0955ecd11575b4c07166838a72893" args="(accessor &result, const Key &key)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00232.html">accessor</a> & </td>
-          <td class="paramname"> <em>result</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">const Key & </td>
-          <td class="paramname"> <em>key</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item (if not already present) and acquire a write lock on the item. 
-<p>
-Returns true if item is new. 
-</div>
-</div><p>
-<a class="anchor" name="47fe0e60151a9bd7a444db827772a4e6"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="47fe0e60151a9bd7a444db827772a4e6" args="(const_accessor &result, const Key &key)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00234.html">const_accessor</a> & </td>
-          <td class="paramname"> <em>result</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">const Key & </td>
-          <td class="paramname"> <em>key</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Insert item (if not already present) and acquire a read lock on the item. 
-<p>
-Returns true if item is new. 
-</div>
-</div><p>
-<a class="anchor" name="2f76ed101a0ccc8875b846c2f747897e"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_fast_find" ref="2f76ed101a0ccc8875b846c2f747897e" args="(const Key &key) const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">const_pointer <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::internal_fast_find           </td>
-          <td>(</td>
-          <td class="paramtype">const Key & </td>
-          <td class="paramname"> <em>key</em>          </td>
-          <td> ) </td>
-          <td width="100%"> const<code> [inline, protected]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Fast find when no concurrent erasure is used. For internal use inside TBB only! 
-<p>
-Return pointer to item with given key, or NULL if no such item exists. Must not be called concurrently with erasure operations. 
-</div>
-</div><p>
-<a class="anchor" name="94758113d8993cfe5afdf2d63a728869"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::rehash" ref="94758113d8993cfe5afdf2d63a728869" args="(size_type n=0)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Key, typename T, typename HashCompare, typename A> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">void <a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, A >::rehash           </td>
-          <td>(</td>
-          <td class="paramtype">size_type </td>
-          <td class="paramname"> <em>n</em> = <code>0</code>          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
+An auto partitioner. 
 <p>
-Rehashes and optionally resizes the whole table. 
+The range is initial divided into several large chunks. Chunks are further subdivided into smaller pieces if demand detected and they are divisible. 
 <p>
-Useful to optimize performance before or after concurrent operations. Also enables using of <a class="el" href="a00231.html#2afcc33dade7bb24e008d60c0df38230">find()</a> and <a class="el" href="a00231.html#6968eb6feed2df36be421df0464297af">count()</a> concurrent methods in serial context. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00424.html">concurrent_hash_map.h</a></ul>
+<li><a class="el" href="a00531.html">partitioner.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00232.html b/doc/html/a00232.html
index b32b01b..837ad06 100644
--- a/doc/html/a00232.html
+++ b/doc/html/a00232.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</title>
+<title>tbb::bad_last_alloc Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,42 +21,24 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00231.html">concurrent_hash_map</a>::<a class="el" href="a00232.html">accessor</a></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map::accessor" --><!-- doxytag: inherits="tbb::interface5::concurrent_hash_map::const_accessor" -->Allows write access to elements and combines data access, locking, and garbage collection.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00232.html">bad_last_alloc</a></div>
+<h1>tbb::bad_last_alloc Class Reference</h1><!-- doxytag: class="tbb::bad_last_alloc" -->Exception for concurrent containers.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00424.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor:
-<p><center><img src="a00232.png" usemap="#tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map" border="0" alt=""></center>
-<map name="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map">
-<area href="a00234.html" alt="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor" shape="rect" coords="0,0,530,24">
-</map>
-<a href="a00019.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00138.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b648be7a95a8fb2971042c15eb112c1"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::accessor::value_type" ref="0b648be7a95a8fb2971042c15eb112c1" args="" -->
-typedef concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00232.html#0b648be7a95a8fb2971042c15eb112c1">value_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of value. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="170280ea807a22e742095de3e8c5ea38"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::accessor::operator *" ref="170280ea807a22e742095de3e8c5ea38" args="() const " -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00232.html#170280ea807a22e742095de3e8c5ea38">operator *</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return reference to associated value in hash table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a807920cdffe3ec5c5e282b4d1ff92a2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::accessor::operator->" ref="a807920cdffe3ec5c5e282b4d1ff92a2" args="() const " -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00232.html#a807920cdffe3ec5c5e282b4d1ff92a2">operator-></a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ec7a57742ff4dc214266179d88984015"></a><!-- doxytag: member="tbb::bad_last_alloc::what" ref="ec7a57742ff4dc214266179d88984015" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const   throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return pointer to associated value in hash table. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</h3>
-
-Allows write access to elements and combines data access, locking, and garbage collection. 
+Exception for concurrent containers. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00424.html">concurrent_hash_map.h</a></ul>
+<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00232.png b/doc/html/a00232.png
deleted file mode 100644
index 9fd6a57..0000000
Binary files a/doc/html/a00232.png and /dev/null differ
diff --git a/doc/html/a00233.html b/doc/html/a00233.html
index 797a6fb..0d961f0 100644
--- a/doc/html/a00233.html
+++ b/doc/html/a00233.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</title>
+<title>tbb::blocked_range< Value > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,39 +21,198 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00231.html">concurrent_hash_map</a>::<a class="el" href="a00233.html">bucket_accessor</a></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map::bucket_accessor" -->bucket accessor is to find, rehash, acquire a lock, and access a bucket  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00233.html">blocked_range</a></div>
+<h1>tbb::blocked_range< Value > Class Template Reference<br>
+<small>
+[<a class="el" href="a00395.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::blocked_range" -->A range over which to iterate.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00424.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00412.html">blocked_range.h</a>></code>
 <p>
-<a href="a00017.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00004.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef Value </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of a value.  <a href="#1a8d05842c2b3dfc177bc4d347e4cef7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f5707bffea38eee5c9680f37358afb8e"></a><!-- doxytag: member="tbb::blocked_range::size_type" ref="f5707bffea38eee5c9680f37358afb8e" args="" -->
+typedef std::size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of a range. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b1dcb174ab54b8612b25b6126d18d6c3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::bucket_accessor" ref="b1dcb174ab54b8612b25b6126d18d6c3" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
- </td><td class="memItemRight" valign="bottom"><b>bucket_accessor</b> (<a class="el" href="a00231.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#94607755c5110d199202234d58d022ac">blocked_range</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct range with default-constructed values for begin and end.  <a href="#94607755c5110d199202234d58d022ac"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14795a36ead1414b4371dbe1a4656359"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="14795a36ead1414b4371dbe1a4656359" args="(Value begin_, Value end_, size_type grainsize_=1)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#14795a36ead1414b4371dbe1a4656359">blocked_range</a> (Value begin_, Value end_, <a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct range over half-open interval [begin,end), with the given grainsize. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="18d2258400756ac1446dac7676b18df3"></a><!-- doxytag: member="tbb::blocked_range::begin" ref="18d2258400756ac1446dac7676b18df3" args="() const " -->
+<a class="el" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#18d2258400756ac1446dac7676b18df3">begin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Beginning of range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8b929d93ddc13f148b11bceef3a3bdf8"></a><!-- doxytag: member="tbb::blocked_range::end" ref="8b929d93ddc13f148b11bceef3a3bdf8" args="() const " -->
+<a class="el" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">One past last value in range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a> () const </td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d11c77f4d70a94d4fb344492bbf18007"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::acquire" ref="d11c77f4d70a94d4fb344492bbf18007" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#d11c77f4d70a94d4fb344492bbf18007">acquire</a> (<a class="el" href="a00231.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Size of the range.  <a href="#9eaa0b6beff1420f688570bbf6b8c462"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcd2e5b8b6c11fd3f20fc0aa9f11bbc2"></a><!-- doxytag: member="tbb::blocked_range::grainsize" ref="fcd2e5b8b6c11fd3f20fc0aa9f11bbc2" args="() const " -->
+<a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">find a bucket by masked hashcode, optionally rehash, and acquire the lock <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="07d958f151a0eaa92f50fd56ad6440e2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::is_writer" ref="07d958f151a0eaa92f50fd56ad6440e2" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The grain size for this range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f4f02f530eb3f2e7ea26e06f76aef9d"></a><!-- doxytag: member="tbb::blocked_range::empty" ref="8f4f02f530eb3f2e7ea26e06f76aef9d" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">check whether bucket is locked for write <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa6314b861c574f86ed189b124cf5853"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::operator()" ref="fa6314b861c574f86ed189b124cf5853" args="()" -->
-bucket * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#fa6314b861c574f86ed189b124cf5853">operator()</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible.  <a href="#41a58b703d574b6e1ca155df3576f578"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">blocked_range</a> (<a class="el" href="a00233.html">blocked_range</a> &r, <a class="el" href="a00309.html">split</a>)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Split range.  <a href="#4c0efd2be3f96a0ab3ba5085e8b3fcc7"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="395a514a55017e36d571809f1223389b"></a><!-- doxytag: member="tbb::blocked_range::blocked_range2d" ref="395a514a55017e36d571809f1223389b" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="13d172a4da9be197033e64516fff1f4b"></a><!-- doxytag: member="tbb::blocked_range::blocked_range3d" ref="13d172a4da9be197033e64516fff1f4b" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">get bucket pointer <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</h3>
+<h3>template<typename Value><br>
+ class tbb::blocked_range< Value ></h3>
+
+A range over which to iterate. 
+<p>
+<hr><h2>Member Typedef Documentation</h2>
+<a class="anchor" name="1a8d05842c2b3dfc177bc4d347e4cef7"></a><!-- doxytag: member="tbb::blocked_range::const_iterator" ref="1a8d05842c2b3dfc177bc4d347e4cef7" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef Value <a class="el" href="a00233.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>          </td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Type of a value. 
+<p>
+Called a const_iterator for sake of algorithms that need to treat a <a class="el" href="a00233.html">blocked_range</a> as an STL container. 
+</div>
+</div><p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="94607755c5110d199202234d58d022ac"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="94607755c5110d199202234d58d022ac" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="a00233.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00233.html">blocked_range</a>           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Construct range with default-constructed values for begin and end. 
+<p>
+Requires that Value have a default constructor. 
+</div>
+</div><p>
+<a class="anchor" name="4c0efd2be3f96a0ab3ba5085e8b3fcc7"></a><!-- doxytag: member="tbb::blocked_range::blocked_range" ref="4c0efd2be3f96a0ab3ba5085e8b3fcc7" args="(blocked_range &r, split)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="a00233.html">tbb::blocked_range</a>< Value >::<a class="el" href="a00233.html">blocked_range</a>           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00233.html">blocked_range</a>< Value > & </td>
+          <td class="paramname"> <em>r</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="a00309.html">split</a> </td>
+          <td class="paramname"></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Split range. 
+<p>
+The new Range *this has the second half, the old range r has the first half. Unspecified if <a class="el" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00233.html#18d2258400756ac1446dac7676b18df3">begin()</a> or !is_divisible(). 
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="41a58b703d574b6e1ca155df3576f578"></a><!-- doxytag: member="tbb::blocked_range::is_divisible" ref="41a58b703d574b6e1ca155df3576f578" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00233.html">tbb::blocked_range</a>< Value >::is_divisible           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+True if range is divisible. 
+<p>
+Unspecified if <a class="el" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00233.html#18d2258400756ac1446dac7676b18df3">begin()</a>. 
+</div>
+</div><p>
+<a class="anchor" name="9eaa0b6beff1420f688570bbf6b8c462"></a><!-- doxytag: member="tbb::blocked_range::size" ref="9eaa0b6beff1420f688570bbf6b8c462" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Value> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="el" href="a00233.html">tbb::blocked_range</a>< Value >::size           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
 
-bucket accessor is to find, rehash, acquire a lock, and access a bucket 
 <p>
+Size of the range. 
+<p>
+Unspecified if <a class="el" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">end()</a><<a class="el" href="a00233.html#18d2258400756ac1446dac7676b18df3">begin()</a>. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00424.html">concurrent_hash_map.h</a></ul>
+<li><a class="el" href="a00412.html">blocked_range.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00234.html b/doc/html/a00234.html
index 769ef55..7cea8ee 100644
--- a/doc/html/a00234.html
+++ b/doc/html/a00234.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</title>
+<title>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,76 +21,60 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00231.html">concurrent_hash_map</a>::<a class="el" href="a00234.html">const_accessor</a></div>
-<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map::const_accessor" -->Combines data access, locking, and garbage collection.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00234.html">blocked_range2d</a></div>
+<h1>tbb::blocked_range2d< RowValue, ColValue > Class Template Reference<br>
+<small>
+[<a class="el" href="a00395.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::blocked_range2d" -->A 2-dimensional range that models the Range concept.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00424.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00413.html">blocked_range2d.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor:
-<p><center><img src="a00234.png" usemap="#tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map" border="0" alt=""></center>
-<map name="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map">
-<area href="a00232.html" alt="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor" shape="rect" coords="0,56,530,80">
-</map>
-<a href="a00018.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00005.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8e50238483ba451363dccebd981d346"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::value_type" ref="a8e50238483ba451363dccebd981d346" args="" -->
-typedef const concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html#a8e50238483ba451363dccebd981d346">value_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a807a22fe658ec38b8edfd69521d0383"></a><!-- doxytag: member="tbb::blocked_range2d::row_range_type" ref="a807a22fe658ec38b8edfd69521d0383" args="" -->
+typedef <a class="el" href="a00233.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html#a807a22fe658ec38b8edfd69521d0383">row_range_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of value. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="84c3080d0c6124d55c8bb4cf6055e65f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::empty" ref="84c3080d0c6124d55c8bb4cf6055e65f" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if result is empty. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7db006d41b49dc5f1716a913769d4698"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::release" ref="7db006d41b49dc5f1716a913769d4698" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html#7db006d41b49dc5f1716a913769d4698">release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Set to null. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9411df8197ceb4881ec4c7368a0a7f88"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::operator *" ref="9411df8197ceb4881ec4c7368a0a7f88" args="() const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html#9411df8197ceb4881ec4c7368a0a7f88">operator *</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of an iteration range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="750d5c6ac9915443df477a30031c07fd"></a><!-- doxytag: member="tbb::blocked_range2d::col_range_type" ref="750d5c6ac9915443df477a30031c07fd" args="" -->
+typedef <a class="el" href="a00233.html">blocked_range</a>< ColValue > </td><td class="memItemRight" valign="bottom"><b>col_range_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return reference to associated value in hash table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d03a48ecb8cd9549bd8be64b09c9b0d"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::operator->" ref="3d03a48ecb8cd9549bd8be64b09c9b0d" args="() const " -->
-const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return pointer to associated value in hash table. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27399c613eb1aecd4660803955dda09d"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::const_accessor" ref="27399c613eb1aecd4660803955dda09d" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html#27399c613eb1aecd4660803955dda09d">const_accessor</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4180bc35d4f8ed9f20045dba4f2a1bdc"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="4180bc35d4f8ed9f20045dba4f2a1bdc" args="(RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (RowValue row_begin, RowValue row_end, typename <a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Create empty result. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="928769b139d53427e7075c1f86148e4c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::~const_accessor" ref="928769b139d53427e7075c1f86148e4c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="485434db1609b2074d86cb604f3c674e"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="485434db1609b2074d86cb604f3c674e" args="(RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy result after releasing the underlying reference. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45ab59454c6f11fe938bbcab637cdd73"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::is_writer" ref="45ab59454c6f11fe938bbcab637cdd73" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>is_writer</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d144cb2d88cef553420311aca8667a44"></a><!-- doxytag: member="tbb::blocked_range2d::empty" ref="d144cb2d88cef553420311aca8667a44" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html#d144cb2d88cef553420311aca8667a44">empty</a> () const </td></tr>
 
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="21856da696b0765cc3db90663160d95e"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::my_node" ref="21856da696b0765cc3db90663160d95e" args="" -->
-node * </td><td class="memItemRight" valign="bottom"><b>my_node</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad36a9b38e4fef26d376f99552ce2d92"></a><!-- doxytag: member="tbb::blocked_range2d::is_divisible" ref="ad36a9b38e4fef26d376f99552ce2d92" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a> () const </td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4936cc9432926ed38f0207828b388e24"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::my_hash" ref="4936cc9432926ed38f0207828b388e24" args="" -->
-hashcode_t </td><td class="memItemRight" valign="bottom"><b>my_hash</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible into two pieces. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f80e6db02bfa4e90e2a219de9f17461"></a><!-- doxytag: member="tbb::blocked_range2d::blocked_range2d" ref="4f80e6db02bfa4e90e2a219de9f17461" args="(blocked_range2d &r, split)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range2d</b> (<a class="el" href="a00234.html">blocked_range2d</a> &r, <a class="el" href="a00309.html">split</a>)</td></tr>
 
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d062d8ecb243a6ec62fa30bca52a1bcf"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::concurrent_hash_map< Key, T, HashCompare, Allocator >" ref="d062d8ecb243a6ec62fa30bca52a1bcf" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f496e7348a82652fba581203477cc07c"></a><!-- doxytag: member="tbb::blocked_range2d::rows" ref="f496e7348a82652fba581203477cc07c" args="() const " -->
+const <a class="el" href="a00233.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html#f496e7348a82652fba581203477cc07c">rows</a> () const </td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ddd77aff56c12366acc02d0f1588a706"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::accessor" ref="ddd77aff56c12366acc02d0f1588a706" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>accessor</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The rows of the iteration space. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="392a46759af2c884957115771affa7f4"></a><!-- doxytag: member="tbb::blocked_range2d::cols" ref="392a46759af2c884957115771affa7f4" args="() const " -->
+const <a class="el" href="a00233.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html#392a46759af2c884957115771affa7f4">cols</a> () const </td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The columns of the iteration space. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
- class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</h3>
+<h3>template<typename RowValue, typename ColValue = RowValue><br>
+ class tbb::blocked_range2d< RowValue, ColValue ></h3>
 
-Combines data access, locking, and garbage collection. 
+A 2-dimensional range that models the Range concept. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00424.html">concurrent_hash_map.h</a></ul>
+<li><a class="el" href="a00413.html">blocked_range2d.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00235.html b/doc/html/a00235.html
index 5091712..06958fb 100644
--- a/doc/html/a00235.html
+++ b/doc/html/a00235.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::concurrent_priority_queue< T, Compare, A > Class Template Reference</title>
+<title>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,277 +21,67 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00235.html">concurrent_priority_queue</a></div>
-<h1>tbb::interface5::concurrent_priority_queue< T, Compare, A > Class Template Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_priority_queue" -->Concurrent priority queue.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00235.html">blocked_range3d</a></div>
+<h1>tbb::blocked_range3d< PageValue, RowValue, ColValue > Class Template Reference<br>
+<small>
+[<a class="el" href="a00395.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::blocked_range3d" -->A 3-dimensional range that models the Range concept.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00433.html">concurrent_priority_queue.h</a>></code>
+<code>#include <<a class="el" href="a00414.html">blocked_range3d.h</a>></code>
 <p>
-<a href="a00020.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00006.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7c611a6b5b8f94b0e7f2afc97e31efb1"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::value_type" ref="7c611a6b5b8f94b0e7f2afc97e31efb1" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8ebf17a552ba47825e9b3887855b719"></a><!-- doxytag: member="tbb::blocked_range3d::page_range_type" ref="b8ebf17a552ba47825e9b3887855b719" args="" -->
+typedef <a class="el" href="a00233.html">blocked_range</a>< PageValue > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#b8ebf17a552ba47825e9b3887855b719">page_range_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5804b3c708ef4e50d603f918ef2b9e58"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::reference" ref="5804b3c708ef4e50d603f918ef2b9e58" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type for size of an iteration range. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4edc39b1a76c84c8f43ea8bff3e88007"></a><!-- doxytag: member="tbb::blocked_range3d::row_range_type" ref="4edc39b1a76c84c8f43ea8bff3e88007" args="" -->
+typedef <a class="el" href="a00233.html">blocked_range</a>< RowValue > </td><td class="memItemRight" valign="bottom"><b>row_range_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4ded8601a434098605be0dcc4febc60"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::const_reference" ref="a4ded8601a434098605be0dcc4febc60" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#a4ded8601a434098605be0dcc4febc60">const_reference</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="02229b59d4dc5437bf5fbe72acca7f66"></a><!-- doxytag: member="tbb::blocked_range3d::col_range_type" ref="02229b59d4dc5437bf5fbe72acca7f66" args="" -->
+typedef <a class="el" href="a00233.html">blocked_range</a>< ColValue > </td><td class="memItemRight" valign="bottom"><b>col_range_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b679eea8d01d041625a39f719ca2b7ed"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::size_type" ref="b679eea8d01d041625a39f719ca2b7ed" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="77399bc76b3ecd60e33f7e35a5becd87"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::difference_type" ref="77399bc76b3ecd60e33f7e35a5becd87" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1712cb3a46bc1821fccc5e2cd83d5cd7"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::allocator_type" ref="1712cb3a46bc1821fccc5e2cd83d5cd7" args="" -->
-typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eefa40599afe00ea393897d8f5662e65"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="eefa40599afe00ea393897d8f5662e65" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a> (const <a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00235.html">concurrent_priority_queue</a> with default capacity. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4555b4a55415a70024c4004b51e9f385"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="4555b4a55415a70024c4004b51e9f385" args="(size_type init_capacity, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#4555b4a55415a70024c4004b51e9f385">concurrent_priority_queue</a> (<a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> init_capacity, const <a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00235.html">concurrent_priority_queue</a> with init_sz capacity. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9147cb4207017c260a0c3929c12cd40f"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="9147cb4207017c260a0c3929c12cd40f" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
-template<typename InputIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00235.html#9147cb4207017c260a0c3929c12cd40f">concurrent_priority_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#509419e320f200456d89dc54a65140b3">concurrent_priority_queue</a> (const <a class="el" href="a00235.html">concurrent_priority_queue</a> &src)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor.  <a href="#509419e320f200456d89dc54a65140b3"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c8b20e7430c5302936030bef59a562be"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="c8b20e7430c5302936030bef59a562be" args="(const concurrent_priority_queue &src, const allocator_type &a)" -->
- </td><td class="memItemRight" valign="bottom"><b>concurrent_priority_queue</b> (const <a class="el" href="a00235.html">concurrent_priority_queue</a> &src, const <a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00235.html">concurrent_priority_queue</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a> (const <a class="el" href="a00235.html">concurrent_priority_queue</a> &src)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment operator.  <a href="#2ab7f7808891027ac0f0f5b3a4be51e9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#317c508fa92df218be5d014c26c09bb7">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a762f420ed83a887967cb7dfe337582c"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="a762f420ed83a887967cb7dfe337582c" args="(PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (PageValue page_begin, PageValue page_end, RowValue row_begin, RowValue row_end, ColValue col_begin, ColValue col_end)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if empty, false otherwise.  <a href="#317c508fa92df218be5d014c26c09bb7"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b4dcf5b059634b95c1671086bf6d4ff"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="0b4dcf5b059634b95c1671086bf6d4ff" args="(PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize, RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize, ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_gr [...]
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (PageValue page_begin, PageValue page_end, typename <a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize, RowValue row_begin, RowValue row_end, typename <a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize, ColValue col_begin, ColValue col_end, typename <a class="el" href="a00233.html#f5707bffea38eee [...]
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the current number of elements contained in the queue.  <a href="#8b2ae25c61338c6fd59e94fe09822ba5"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#e5d6a0aca1579ecebb716bbe53514963">capacity</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="356860e1c977d91711e8216bd55c0b25"></a><!-- doxytag: member="tbb::blocked_range3d::empty" ref="356860e1c977d91711e8216bd55c0b25" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#356860e1c977d91711e8216bd55c0b25">empty</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the current capacity (i.e. allocated storage) of the queue.  <a href="#e5d6a0aca1579ecebb716bbe53514963"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d905af7b8f6defff562f5ae9c3275763"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::push" ref="d905af7b8f6defff562f5ae9c3275763" args="(const_reference elem)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#d905af7b8f6defff562f5ae9c3275763">push</a> (<a class="el" href="a00235.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> elem)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is empty. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="39d69191721c488e737ae5d9c5336b9c"></a><!-- doxytag: member="tbb::blocked_range3d::is_divisible" ref="39d69191721c488e737ae5d9c5336b9c" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pushes elem onto the queue, increasing capacity of queue if necessary. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a> (<a class="el" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> elem)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if range is divisible into two pieces. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0d6f0085c9fb364ddcbc2197da6c251"></a><!-- doxytag: member="tbb::blocked_range3d::blocked_range3d" ref="a0d6f0085c9fb364ddcbc2197da6c251" args="(blocked_range3d &r, split)" -->
+ </td><td class="memItemRight" valign="bottom"><b>blocked_range3d</b> (<a class="el" href="a00235.html">blocked_range3d</a> &r, <a class="el" href="a00309.html">split</a>)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Gets a reference to and removes highest priority element.  <a href="#e036461a29cc40902a2bb79abf9f5146"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e7c59f011c4cca83ff210aefe7c9d868"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::reserve" ref="e7c59f011c4cca83ff210aefe7c9d868" args="(size_type new_cap)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#e7c59f011c4cca83ff210aefe7c9d868">reserve</a> (<a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> new_cap)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf971430aa12361d3ed245344b7c6764"></a><!-- doxytag: member="tbb::blocked_range3d::pages" ref="cf971430aa12361d3ed245344b7c6764" args="() const " -->
+const <a class="el" href="a00233.html">page_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#cf971430aa12361d3ed245344b7c6764">pages</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">If current capacity is less than new_cap, increases capacity to new_cap. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The pages of the iteration space. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1584623e59ff32a8aa82006827508be4"></a><!-- doxytag: member="tbb::blocked_range3d::rows" ref="1584623e59ff32a8aa82006827508be4" args="() const " -->
+const <a class="el" href="a00233.html">row_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#1584623e59ff32a8aa82006827508be4">rows</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the queue; not thread-safe.  <a href="#0bdcdf7cde9fd369edca845bec34ca94"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="28d113288fc7e0c04c9053ec7de61368"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::shrink_to_fit" ref="28d113288fc7e0c04c9053ec7de61368" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#28d113288fc7e0c04c9053ec7de61368">shrink_to_fit</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Shrink queue capacity to current contents; not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ecdc6a04aa259374425d424ca2a6082"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::swap" ref="0ecdc6a04aa259374425d424ca2a6082" args="(concurrent_priority_queue &q)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">swap</a> (<a class="el" href="a00235.html">concurrent_priority_queue</a> &q)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Swap this queue with another; not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d545d444fb0d16148f9b61fd89f9a337"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::get_allocator" ref="d545d444fb0d16148f9b61fd89f9a337" args="() const " -->
-<a class="el" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return allocator object. <br></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>cpq_operation</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>my_functor_t</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The rows of the iteration space. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3336ba9480fd6c43e158f9beb024c050"></a><!-- doxytag: member="tbb::blocked_range3d::cols" ref="3336ba9480fd6c43e158f9beb024c050" args="() const " -->
+const <a class="el" href="a00233.html">col_range_type</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html#3336ba9480fd6c43e158f9beb024c050">cols</a> () const </td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The columns of the iteration space. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>><br>
- class tbb::interface5::concurrent_priority_queue< T, Compare, A ></h3>
-
-Concurrent priority queue. 
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="509419e320f200456d89dc54a65140b3"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="509419e320f200456d89dc54a65140b3" args="(const concurrent_priority_queue &src)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::<a class="el" href="a00235.html">concurrent_priority_queue</a>           </td>
-          <td>(</td>
-          <td class="paramtype">const <a class="el" href="a00235.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
-          <td class="paramname"> <em>src</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, explicit]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Copy constructor. 
-<p>
-State of this queue may not reflect results of pending operations on the copied queue. 
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="e5d6a0aca1579ecebb716bbe53514963"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::capacity" ref="e5d6a0aca1579ecebb716bbe53514963" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::capacity           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"> const<code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<h3>template<typename PageValue, typename RowValue = PageValue, typename ColValue = RowValue><br>
+ class tbb::blocked_range3d< PageValue, RowValue, ColValue ></h3>
 
+A 3-dimensional range that models the Range concept. 
 <p>
-Returns the current capacity (i.e. allocated storage) of the queue. 
-<p>
-Returned value may not reflect results of pending operations. 
-</div>
-</div><p>
-<a class="anchor" name="0bdcdf7cde9fd369edca845bec34ca94"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::clear" ref="0bdcdf7cde9fd369edca845bec34ca94" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">void <a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::clear           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Clear the queue; not thread-safe. 
-<p>
-Resets size, effectively emptying queue; does not free space. May not clear elements added in pending operations. 
-</div>
-</div><p>
-<a class="anchor" name="317c508fa92df218be5d014c26c09bb7"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::empty" ref="317c508fa92df218be5d014c26c09bb7" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::empty           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"> const<code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns true if empty, false otherwise. 
-<p>
-Returned value may not reflect results of pending operations. 
-</div>
-</div><p>
-<a class="anchor" name="2ab7f7808891027ac0f0f5b3a4be51e9"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::operator=" ref="2ab7f7808891027ac0f0f5b3a4be51e9" args="(const concurrent_priority_queue &src)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="a00235.html">concurrent_priority_queue</a>& <a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::operator=           </td>
-          <td>(</td>
-          <td class="paramtype">const <a class="el" href="a00235.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
-          <td class="paramname"> <em>src</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Assignment operator. 
-<p>
-State of this queue may not reflect results of pending operations on the copied queue. 
-</div>
-</div><p>
-<a class="anchor" name="8b2ae25c61338c6fd59e94fe09822ba5"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::size" ref="8b2ae25c61338c6fd59e94fe09822ba5" args="() const " -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::size           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"> const<code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns the current number of elements contained in the queue. 
-<p>
-Returned value may not reflect results of pending operations. 
-</div>
-</div><p>
-<a class="anchor" name="e036461a29cc40902a2bb79abf9f5146"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::try_pop" ref="e036461a29cc40902a2bb79abf9f5146" args="(reference elem)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::try_pop           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> </td>
-          <td class="paramname"> <em>elem</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Gets a reference to and removes highest priority element. 
-<p>
-If a highest priority element was found, sets elem and returns true, otherwise returns false. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00433.html">concurrent_priority_queue.h</a></ul>
+<li><a class="el" href="a00414.html">blocked_range3d.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00236.html b/doc/html/a00236.html
index dcd1fc8..3bc8c2b 100644
--- a/doc/html/a00236.html
+++ b/doc/html/a00236.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference</title>
+<title>tbb::flow::interface6::broadcast_node< T > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,143 +21,63 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00370.html">strict_ppl</a>::<a class="el" href="a00236.html">concurrent_queue</a></div>
-<h1>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference<br>
-<small>
-[<a class="el" href="a00372.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::strict_ppl::concurrent_queue" -->A high-performance thread-safe non-blocking concurrent queue.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00236.html">broadcast_node</a></div>
+<h1>tbb::flow::interface6::broadcast_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::broadcast_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node,tbb::flow::interface6::receiver,tbb::flow::interface6::sender" -->Forwards messages of type T to all successors.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00436.html">concurrent_queue.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<a href="a00024.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::broadcast_node< T >:
+<p><center><img src="a00236.png" usemap="#tbb::flow::interface6::broadcast_node< T >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::broadcast_node< T >_map">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,249,24">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="259,0,508,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="518,0,767,24">
+</map>
+<a href="a00057.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="682c3978d5cb0620000994f11c44a476"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::value_type" ref="682c3978d5cb0620000994f11c44a476" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#682c3978d5cb0620000994f11c44a476">value_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="43c775d80e98cc601de69764983319f9"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::input_type" ref="43c775d80e98cc601de69764983319f9" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#43c775d80e98cc601de69764983319f9">input_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8d725c50a9834bb7af5b67c0aff92b8"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::reference" ref="a8d725c50a9834bb7af5b67c0aff92b8" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8fd8d3075823e08b879be46c1215ab0f"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::output_type" ref="8fd8d3075823e08b879be46c1215ab0f" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#8fd8d3075823e08b879be46c1215ab0f">output_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4d48e7ff93f81636bca2c74f7da34750"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::const_reference" ref="4d48e7ff93f81636bca2c74f7da34750" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e2ad9a121cb286aa0d0142fef33c646"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::predecessor_type" ref="0e2ad9a121cb286aa0d0142fef33c646" args="" -->
+typedef <a class="el" href="a00301.html">sender</a>< <a class="el" href="a00236.html#43c775d80e98cc601de69764983319f9">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#0e2ad9a121cb286aa0d0142fef33c646">predecessor_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8fc30e93f8342a1960357f71e4fe8a2b"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::size_type" ref="8fc30e93f8342a1960357f71e4fe8a2b" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="068576d16c7e4e05d52f9db7a45b5b65"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::difference_type" ref="068576d16c7e4e05d52f9db7a45b5b65" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a3956341728eaa558d8827063718cac"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::allocator_type" ref="5a3956341728eaa558d8827063718cac" args="" -->
-typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9736ac047d6da3363895c7e5b121d0c4"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::iterator" ref="9736ac047d6da3363895c7e5b121d0c4" args="" -->
-typedef internal::concurrent_queue_iterator<<br>
- <a class="el" href="a00236.html">concurrent_queue</a>, T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9cd76d19af8c78be1bafc6ca0123ac0d"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::const_iterator" ref="9cd76d19af8c78be1bafc6ca0123ac0d" args="" -->
-typedef internal::concurrent_queue_iterator<<br>
- <a class="el" href="a00236.html">concurrent_queue</a>, const T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cc6a0eb1c4ee65465770628d8366f055"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::successor_type" ref="cc6a0eb1c4ee65465770628d8366f055" args="" -->
+typedef <a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00236.html#8fd8d3075823e08b879be46c1215ab0f">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#cc6a0eb1c4ee65465770628d8366f055">successor_type</a></td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7c48a05a94a1f4f98fdfadfbef98ecf6"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="7c48a05a94a1f4f98fdfadfbef98ecf6" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a> (const <a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="25209656c84f2f9b030e2f9162713341"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="25209656c84f2f9b030e2f9162713341" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
-template<typename InputIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00236.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a6b98ea11a867db8ac868f0113ca429"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="8a6b98ea11a867db8ac868f0113ca429" args="(const concurrent_queue &src, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a> (const <a class="el" href="a00236.html">concurrent_queue</a> &src, const <a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="830b33753d6b149c366344e29b2edd8c"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::~concurrent_queue" ref="830b33753d6b149c366344e29b2edd8c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="73c47563ffcc4c2f6452f25a04ebe2e2"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::push" ref="73c47563ffcc4c2f6452f25a04ebe2e2" args="(const T &source)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a> (const T &source)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a> (T &result)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue.  <a href="#ae31ca0db34ef96ef1e74aa0d28c95f8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eaa35a5274606779802e9a669a706260"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_size" ref="eaa35a5274606779802e9a669a706260" args="() const " -->
-<a class="el" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#eaa35a5274606779802e9a669a706260">unsafe_size</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e446eb80aa9ac9bc1ab8f9c0ffc582cd"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::broadcast_node" ref="e446eb80aa9ac9bc1ab8f9c0ffc582cd" args="(const broadcast_node &)" -->
+ </td><td class="memItemRight" valign="bottom"><b>broadcast_node</b> (const <a class="el" href="a00236.html">broadcast_node</a> &)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return the number of items in the queue; thread unsafe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f3f6fce0cfa2d581d6f3b47e0613ad64"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::empty" ref="f3f6fce0cfa2d581d6f3b47e0613ad64" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fd0324c9ddb51fe6f95b3d015d338941"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::register_successor" ref="fd0324c9ddb51fe6f95b3d015d338941" args="(receiver< T > &r)" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#fd0324c9ddb51fe6f95b3d015d338941">register_successor</a> (<a class="el" href="a00295.html">receiver</a>< T > &r)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to size()==0. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c32e8e84c0524155133b4aae32d2a827"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::clear" ref="c32e8e84c0524155133b4aae32d2a827" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#c32e8e84c0524155133b4aae32d2a827">clear</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Adds a successor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="366efcc046ec08a104281109801ae629"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::remove_successor" ref="366efcc046ec08a104281109801ae629" args="(receiver< T > &r)" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#366efcc046ec08a104281109801ae629">remove_successor</a> (<a class="el" href="a00295.html">receiver</a>< T > &r)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the queue. not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f034f70caef445fe8abc9113ec926a8d"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::get_allocator" ref="f034f70caef445fe8abc9113ec926a8d" args="() const " -->
-<a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return allocator object. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6297f48808dd7c14e6c2fe81559ca190"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_begin" ref="6297f48808dd7c14e6c2fe81559ca190" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1569f70e70521fe71944a5b0138c6ef5"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_end" ref="1569f70e70521fe71944a5b0138c6ef5" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e3e6746f7b6ecfbc16f781665ac51112"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_begin" ref="e3e6746f7b6ecfbc16f781665ac51112" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> () const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83bf90849c08f44d25dd7a3b207a8956"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_end" ref="83bf90849c08f44d25dd7a3b207a8956" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> () const </td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes s as a successor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="29eb768c10b377880bbf83d31ee49acf"></a><!-- doxytag: member="tbb::flow::interface6::broadcast_node::try_put" ref="29eb768c10b377880bbf83d31ee49acf" args="(const T &t)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html#29eb768c10b377880bbf83d31ee49acf">try_put</a> (const T &t)</td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Put an item to the receiver. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
- class tbb::strict_ppl::concurrent_queue< T, A ></h3>
+<h3>template<typename T><br>
+ class tbb::flow::interface6::broadcast_node< T ></h3>
 
-A high-performance thread-safe non-blocking concurrent queue. 
-<p>
-Multiple threads may each push and pop concurrently. Assignment construction is not allowed. 
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="ae31ca0db34ef96ef1e74aa0d28c95f8"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::try_pop" ref="ae31ca0db34ef96ef1e74aa0d28c95f8" args="(T &result)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, typename A = cache_aligned_allocator<T>> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue</a>< T, A >::try_pop           </td>
-          <td>(</td>
-          <td class="paramtype">T & </td>
-          <td class="paramname"> <em>result</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Attempt to dequeue an item from head of queue. 
+Forwards messages of type T to all successors. 
 <p>
-Does not wait for item to become available. Returns true if successful; false otherwise. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00436.html">concurrent_queue.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00236.png b/doc/html/a00236.png
new file mode 100644
index 0000000..5a7b1d5
Binary files /dev/null and b/doc/html/a00236.png differ
diff --git a/doc/html/a00237.html b/doc/html/a00237.html
index 8c3ddb9..cfd40a8 100644
--- a/doc/html/a00237.html
+++ b/doc/html/a00237.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::deprecated::concurrent_queue< T, A > Class Template Reference</title>
+<title>tbb::flow::interface6::buffer_node< T, A > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,128 +21,385 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>deprecated</b>::<a class="el" href="a00237.html">concurrent_queue</a></div>
-<h1>tbb::deprecated::concurrent_queue< T, A > Class Template Reference<br>
-<small>
-[<a class="el" href="a00372.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::deprecated::concurrent_queue" --><!-- doxytag: inherits="tbb::concurrent_bounded_queue" -->A high-performance thread-safe blocking concurrent bounded queue.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00237.html">buffer_node</a></div>
+<h1>tbb::flow::interface6::buffer_node< T, A > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::buffer_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node,tbb::flow::interface6::receiver,tbb::flow::interface6::sender" -->Forwards messages in arbitrary order.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00436.html">concurrent_queue.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::deprecated::concurrent_queue< T, A >:
-<p><center><img src="a00237.png" usemap="#tbb::deprecated::concurrent_queue< T, A >_map" border="0" alt=""></center>
-<map name="tbb::deprecated::concurrent_queue< T, A >_map">
-<area href="a00230.html" alt="tbb::concurrent_bounded_queue< T, A >" shape="rect" coords="0,0,257,24">
+<p>Inheritance diagram for tbb::flow::interface6::buffer_node< T, A >:
+<p><center><img src="a00237.png" usemap="#tbb::flow::interface6::buffer_node< T, A >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::buffer_node< T, A >_map">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,352,24">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="362,0,714,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="724,0,1076,24">
+<area href="a00286.html" alt="tbb::flow::interface6::priority_queue_node< T, Compare, A >" shape="rect" coords="181,112,533,136">
+<area href="a00287.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="543,112,895,136">
+<area href="a00302.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="543,168,895,192">
 </map>
-<a href="a00027.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00058.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8861a9cdf232a20b5f2569754a281871"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::iterator" ref="8861a9cdf232a20b5f2569754a281871" args="" -->
-typedef <a class="el" href="a00230.html">concurrent_bounded_queue</a><<br>
- T, A >::iterator </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="334efb81b56a2f2b3ae08a16e8d65620"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::input_type" ref="334efb81b56a2f2b3ae08a16e8d65620" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7117842ce3ed7c5147d3c886922e64d0"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::const_iterator" ref="7117842ce3ed7c5147d3c886922e64d0" args="" -->
-typedef <a class="el" href="a00230.html">concurrent_bounded_queue</a><<br>
- T, A >::const_iterator </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="089520db81f6a1551dc94c01efbdd7be"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::output_type" ref="089520db81f6a1551dc94c01efbdd7be" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#089520db81f6a1551dc94c01efbdd7be">output_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fb0ad03a822ca0fc34ad5d56a4093a2"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::predecessor_type" ref="5fb0ad03a822ca0fc34ad5d56a4093a2" args="" -->
+typedef <a class="el" href="a00301.html">sender</a>< <a class="el" href="a00237.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#5fb0ad03a822ca0fc34ad5d56a4093a2">predecessor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="66f7eda69b75e08f50726e50a11429cd"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::successor_type" ref="66f7eda69b75e08f50726e50a11429cd" args="" -->
+typedef <a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00237.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#66f7eda69b75e08f50726e50a11429cd">successor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17ee32d233db52b86256480d5f048e16"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_class" ref="17ee32d233db52b86256480d5f048e16" args="" -->
+typedef <a class="el" href="a00237.html">buffer_node</a>< T, A > </td><td class="memItemRight" valign="bottom"><b>my_class</b></td></tr>
 
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aaf19bd7337b72f3131ece60f7315ef7"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="aaf19bd7337b72f3131ece60f7315ef7" args="(const A &a=A())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a> (const A &a=A())</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fe4b79f780586ff66e002ce32a5c60d"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::buffer_node" ref="5fe4b79f780586ff66e002ce32a5c60d" args="(graph &g)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a> (<a class="el" href="a00262.html">graph</a> &g)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fc092b9082f233482f3513fc3bb670f7"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="fc092b9082f233482f3513fc3bb670f7" args="(const concurrent_queue &src, const A &a=A())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a> (const <a class="el" href="a00237.html">concurrent_queue</a> &src, const A &a=A())</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="03ad7b85a8341437f584af06ad050cdc"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::buffer_node" ref="03ad7b85a8341437f584af06ad050cdc" args="(const buffer_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">buffer_node</a> (const <a class="el" href="a00237.html">buffer_node</a> &src)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9102b897776bd2d9e908e6604ff16b5f"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="9102b897776bd2d9e908e6604ff16b5f" args="(InputIterator b, InputIterator e, const A &a=A())" -->
-template<typename InputIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00237.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a> (InputIterator b, InputIterator e, const A &a=A())</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#f8bf4944ede4fc106423d67715beb695">register_successor</a> (<a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00237.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > &r)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Adds a new successor.  <a href="#f8bf4944ede4fc106423d67715beb695"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a> (<a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00237.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > &r)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor.  <a href="#2074da0e39b9477c32897d6e5786196f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">try_get</a> (T &v)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the <a class="el" href="a00237.html">buffer_node</a>.  <a href="#aeb8aec46ca99ca022356a792c46735e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a> (T &v)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserves an item.  <a href="#1cc889bb6c38bcb81757d0ebbc3a5e64"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release a reserved item.  <a href="#2c8e8f2f5f4ff5be27136cc1184a3c3e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Consumes a reserved item.  <a href="#8ef07c434eb763d947a7b4e80c086a49"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#2b02fe332e704bbe14f297802298b63a">try_put</a> (const T &t)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Receive an item.  <a href="#2b02fe332e704bbe14f297802298b63a"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3bdeda814bba6d687b62449e8d7b8001"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::size_type" ref="3bdeda814bba6d687b62449e8d7b8001" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5da41039fc224257fc16df21ea78351c"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_handler" ref="5da41039fc224257fc16df21ea78351c" args="" -->
+typedef internal::aggregating_functor<<br>
+ <a class="el" href="a00237.html">my_class</a>, buffer_operation > </td><td class="memItemRight" valign="bottom"><b>my_handler</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579ba61e9d48b022a45d302fb7cc2e99587"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::reg_succ" ref="27ef87d052ece9366a56e5dfd8017579ba61e9d48b022a45d302fb7cc2e99587" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>reg_succ</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579e5c114ade89a63b1d44116994be56f94"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::rem_succ" ref="27ef87d052ece9366a56e5dfd8017579e5c114ade89a63b1d44116994be56f94" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>rem_succ</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579b830235026f7286b15954d74559baeb8"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::req_item" ref="27ef87d052ece9366a56e5dfd8017579b830235026f7286b15954d74559baeb8" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>req_item</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579014be13638194a9fe0b10201be74847e"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::res_item" ref="27ef87d052ece9366a56e5dfd8017579014be13638194a9fe0b10201be74847e" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>res_item</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579d451e6807b6f8238c3fed708789c9fb3"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::rel_res" ref="27ef87d052ece9366a56e5dfd8017579d451e6807b6f8238c3fed708789c9fb3" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>rel_res</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579b2a86824c712d448bd3ff7c6e905fb48"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::con_res" ref="27ef87d052ece9366a56e5dfd8017579b2a86824c712d448bd3ff7c6e905fb48" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>con_res</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd80175799f00b67eaae74451baf63ea2dc0cb94c"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::put_item" ref="27ef87d052ece9366a56e5dfd80175799f00b67eaae74451baf63ea2dc0cb94c" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>put_item</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27ef87d052ece9366a56e5dfd8017579ec0df922a8ffd2153f650732611395c9"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_fwd" ref="27ef87d052ece9366a56e5dfd8017579ec0df922a8ffd2153f650732611395c9" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>try_fwd</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ca181d774b321a511fd9a9653ce2a60f415a59924de2ce1c447c79a1b278a3a"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::WAIT" ref="0ca181d774b321a511fd9a9653ce2a60f415a59924de2ce1c447c79a1b278a3a" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ca181d774b321a511fd9a9653ce2a60159bdd1eb0a3e1245f61a1e3bcca417f"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::SUCCEEDED" ref="0ca181d774b321a511fd9a9653ce2a60159bdd1eb0a3e1245f61a1e3bcca417f" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ca181d774b321a511fd9a9653ce2a602c60f32df3cedd3c31dadd0086e5edc4"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::FAILED" ref="0ca181d774b321a511fd9a9653ce2a602c60f32df3cedd3c31dadd0086e5edc4" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>op_type</b> { <br>
+  <b>reg_succ</b>, 
+<b>rem_succ</b>, 
+<b>req_item</b>, 
+<b>res_item</b>, 
+<br>
+  <b>rel_res</b>, 
+<b>con_res</b>, 
+<b>put_item</b>, 
+<b>try_fwd</b>
+<br>
+ }</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0, 
+<b>SUCCEEDED</b>, 
+<b>FAILED</b>
+ }</td></tr>
+
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c896b8640b606e49f369d1260c041ded"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::handle_operations" ref="c896b8640b606e49f369d1260c041ded" args="(buffer_operation *op_list)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>handle_operations</b> (buffer_operation *op_list)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2648324ce0a38b40132b8502ef250e3a"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::forward" ref="2648324ce0a38b40132b8502ef250e3a" args="()" -->
+virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">forward</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">This is executed by an enqueued task, the "forwarder". <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="df21388252b8963e839dca29d2c67ea5"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_reg_succ" ref="df21388252b8963e839dca29d2c67ea5" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a> (buffer_operation *op)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Register successor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6b6cf76dff80fd679251da93351c1291"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_rem_succ" ref="6b6cf76dff80fd679251da93351c1291" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a> (buffer_operation *op)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove successor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dcbffbae514f4d95205b0845785c0a91"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_forward" ref="dcbffbae514f4d95205b0845785c0a91" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#dcbffbae514f4d95205b0845785c0a91">internal_forward</a> (buffer_operation *op)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to forward valid items to successors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="58c70e13ecd40cdaa59cda059e68de51"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_push" ref="58c70e13ecd40cdaa59cda059e68de51" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>internal_push</b> (buffer_operation *op)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="035cbd758a1a28317ba951e2447e0826"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_pop" ref="035cbd758a1a28317ba951e2447e0826" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>internal_pop</b> (buffer_operation *op)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a> (const T &source)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4072ad4d1b320d584ea837048d6e4130"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_reserve" ref="4072ad4d1b320d584ea837048d6e4130" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>internal_reserve</b> (buffer_operation *op)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue if queue is not already full.  <a href="#7c45561bafe71107d09b2bc1b8f4e681"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a> (T &destination)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1177d6a157c14cdbfd7d4b05f01605a5"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_consume" ref="1177d6a157c14cdbfd7d4b05f01605a5" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (buffer_operation *op)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue.  <a href="#48da3536245318af6cb5fd58bac78039"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed7202cd273ae36463e6ac57e9472670"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::begin" ref="ed7202cd273ae36463e6ac57e9472670" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ceeec6c56ae8e16effb3fd187e83d958"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal_release" ref="ceeec6c56ae8e16effb3fd187e83d958" args="(buffer_operation *op)" -->
+virtual void </td><td class="memItemRight" valign="bottom"><b>internal_release</b> (buffer_operation *op)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35fbb0d7e135545eb1daec2b4ae894cd"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::end" ref="35fbb0d7e135545eb1daec2b4ae894cd" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><b>end</b> ()</td></tr>
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="28807215994d4c7d3725fac693b37ec1"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_successors" ref="28807215994d4c7d3725fac693b37ec1" args="" -->
+internal::round_robin_cache<<br>
+ T, <a class="el" href="a00279.html">null_rw_mutex</a> > </td><td class="memItemRight" valign="bottom"><b>my_successors</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="62f31fe653e1158e64ddb0e163d0335c"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::begin" ref="62f31fe653e1158e64ddb0e163d0335c" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b569eeae467185c45ea78ee1ab41a215"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_parent" ref="b569eeae467185c45ea78ee1ab41a215" args="" -->
+<a class="el" href="a00311.html">task</a> * </td><td class="memItemRight" valign="bottom"><b>my_parent</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d42ddc4a6fe42350750a930302863d1"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::end" ref="3d42ddc4a6fe42350750a930302863d1" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><b>end</b> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e90b3f77cbfac9fd5fb4d53456955d4"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::forwarder_busy" ref="5e90b3f77cbfac9fd5fb4d53456955d4" args="" -->
+bool </td><td class="memItemRight" valign="bottom"><b>forwarder_busy</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4d008669d152fe291079f097da72ec74"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::my_aggregator" ref="4d008669d152fe291079f097da72ec74" args="" -->
+internal::aggregator< my_handler,<br>
+ buffer_operation > </td><td class="memItemRight" valign="bottom"><b>my_aggregator</b></td></tr>
 
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="02a18a6a10c05e3f217f0111e0f5fb72"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal::forward_task< buffer_node< T, A > >" ref="02a18a6a10c05e3f217f0111e0f5fb72" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::forward_task< buffer_node< T, A > ></b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b5526a5033ff7acc64681cff9ad76b0"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::internal::aggregating_functor< my_class, buffer_operation >" ref="0b5526a5033ff7acc64681cff9ad76b0" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::aggregating_functor< my_class, buffer_operation ></b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>buffer_operation</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, class A = cache_aligned_allocator<T>><br>
- class tbb::deprecated::concurrent_queue< T, A ></h3>
+<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
+ class tbb::flow::interface6::buffer_node< T, A ></h3>
 
-A high-performance thread-safe blocking concurrent bounded queue. 
-<p>
-This is the pre-PPL TBB concurrent queue which support boundedness and blocking semantics. Note that method names agree with the PPL-style concurrent queue. Multiple threads may each push and pop concurrently. Assignment construction is not allowed. 
+Forwards messages in arbitrary order. 
 <p>
 <hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="48da3536245318af6cb5fd58bac78039"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::pop_if_present" ref="48da3536245318af6cb5fd58bac78039" args="(T &destination)" -->
+<a class="anchor" name="f8bf4944ede4fc106423d67715beb695"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::register_successor" ref="f8bf4944ede4fc106423d67715beb695" args="(receiver< output_type > &r)" -->
 <div class="memitem">
 <div class="memproto">
 <div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
       <table class="memname">
         <tr>
-          <td class="memname">bool <a class="el" href="a00237.html">tbb::deprecated::concurrent_queue</a>< T, A >::pop_if_present           </td>
+          <td class="memname">bool <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node</a>< T, A >::register_successor           </td>
           <td>(</td>
-          <td class="paramtype">T & </td>
-          <td class="paramname"> <em>destination</em>          </td>
+          <td class="paramtype"><a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00237.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > & </td>
+          <td class="paramname"> <em>r</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline, virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Adds a new successor. 
+<p>
+Adds successor r to the list of successors; may forward tasks. 
+<p>
+Implements <a class="el" href="a00301.html#68b8941ad77b9303cf3bcb8cf1f2d28a">tbb::flow::interface6::sender< T ></a>.
+</div>
+</div><p>
+<a class="anchor" name="2074da0e39b9477c32897d6e5786196f"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::remove_successor" ref="2074da0e39b9477c32897d6e5786196f" args="(receiver< output_type > &r)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node</a>< T, A >::remove_successor           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00237.html#089520db81f6a1551dc94c01efbdd7be">output_type</a> > & </td>
+          <td class="paramname"> <em>r</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline, virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Removes a successor. 
+<p>
+Removes successor r from the list of successors. It also calls r.remove_predecessor(*this) to remove this node as a predecessor. 
+<p>
+Implements <a class="el" href="a00301.html#82f363bfb1738bb8789e167590b10ef9">tbb::flow::interface6::sender< T ></a>.
+</div>
+</div><p>
+<a class="anchor" name="8ef07c434eb763d947a7b4e80c086a49"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_consume" ref="8ef07c434eb763d947a7b4e80c086a49" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_consume           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
           <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
+          <td width="100%"><code> [inline, virtual]</code></td>
         </tr>
       </table>
 </div>
 <div class="memdoc">
 
 <p>
-Attempt to dequeue an item from head of queue. 
+Consumes a reserved item. 
 <p>
-Does not wait for item to become available. Returns true if successful; false otherwise. <dl compact><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>Use <a class="el" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop()</a> </dd></dl>
+true = item is removed from sender and reservation removed 
+<p>
+Reimplemented from <a class="el" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">tbb::flow::interface6::sender< T ></a>.
+</div>
+</div><p>
+<a class="anchor" name="aeb8aec46ca99ca022356a792c46735e"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_get" ref="aeb8aec46ca99ca022356a792c46735e" args="(T &v)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_get           </td>
+          <td>(</td>
+          <td class="paramtype">T & </td>
+          <td class="paramname"> <em>v</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline, virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
 
+<p>
+Request an item from the <a class="el" href="a00237.html">buffer_node</a>. 
+<p>
+true = v contains the returned item<br>
+ false = no item has been returned 
+<p>
+Reimplemented from <a class="el" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">tbb::flow::interface6::sender< T ></a>.
 </div>
 </div><p>
-<a class="anchor" name="7c45561bafe71107d09b2bc1b8f4e681"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::push_if_not_full" ref="7c45561bafe71107d09b2bc1b8f4e681" args="(const T &source)" -->
+<a class="anchor" name="2b02fe332e704bbe14f297802298b63a"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_put" ref="2b02fe332e704bbe14f297802298b63a" args="(const T &t)" -->
 <div class="memitem">
 <div class="memproto">
 <div class="memtemplate">
-template<typename T, class A = cache_aligned_allocator<T>> </div>
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
       <table class="memname">
         <tr>
-          <td class="memname">bool <a class="el" href="a00237.html">tbb::deprecated::concurrent_queue</a>< T, A >::push_if_not_full           </td>
+          <td class="memname">bool <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_put           </td>
           <td>(</td>
           <td class="paramtype">const T & </td>
-          <td class="paramname"> <em>source</em>          </td>
+          <td class="paramname"> <em>t</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline, virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Receive an item. 
+<p>
+true is always returned 
+<p>
+Implements <a class="el" href="a00295.html#c6d5d0cb8ebe5771be91933609fe31b8">tbb::flow::interface6::receiver< T ></a>.
+</div>
+</div><p>
+<a class="anchor" name="2c8e8f2f5f4ff5be27136cc1184a3c3e"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_release" ref="2c8e8f2f5f4ff5be27136cc1184a3c3e" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_release           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
           <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
+          <td width="100%"><code> [inline, virtual]</code></td>
         </tr>
       </table>
 </div>
 <div class="memdoc">
 
 <p>
-Enqueue an item at tail of queue if queue is not already full. 
+Release a reserved item. 
+<p>
+true = item has been released and so remains in sender 
+<p>
+Reimplemented from <a class="el" href="a00301.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< T ></a>.
+</div>
+</div><p>
+<a class="anchor" name="1cc889bb6c38bcb81757d0ebbc3a5e64"></a><!-- doxytag: member="tbb::flow::interface6::buffer_node::try_reserve" ref="1cc889bb6c38bcb81757d0ebbc3a5e64" args="(T &v)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00237.html">tbb::flow::interface6::buffer_node</a>< T, A >::try_reserve           </td>
+          <td>(</td>
+          <td class="paramtype">T & </td>
+          <td class="paramname"> <em>v</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline, virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Reserves an item. 
+<p>
+false = no item can be reserved<br>
+ true = an item is reserved 
 <p>
-Does not wait for queue to become not full. Returns true if item is pushed; false if queue was already full. 
+Reimplemented from <a class="el" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">tbb::flow::interface6::sender< T ></a>.
 </div>
 </div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00436.html">concurrent_queue.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00237.png b/doc/html/a00237.png
index 6aac5a0..425350b 100644
Binary files a/doc/html/a00237.png and b/doc/html/a00237.png differ
diff --git a/doc/html/a00238.html b/doc/html/a00238.html
index fccb7a7..a7fef17 100644
--- a/doc/html/a00238.html
+++ b/doc/html/a00238.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::concurrent_vector< T, A > Class Template Reference</title>
+<title>tbb::cache_aligned_allocator< T > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,570 +21,88 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00238.html">concurrent_vector</a></div>
-<h1>tbb::concurrent_vector< T, A > Class Template Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00238.html">cache_aligned_allocator</a></div>
+<h1>tbb::cache_aligned_allocator< T > Class Template Reference<br>
 <small>
-[<a class="el" href="a00372.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::concurrent_vector" -->Concurrent vector container.  
+[<a class="el" href="a00397.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::cache_aligned_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00442.html">concurrent_vector.h</a>></code>
+<code>#include <<a class="el" href="a00415.html">cache_aligned_allocator.h</a>></code>
 <p>
-<a href="a00032.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00007.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc85684238d4bb5e422cb8ea0bdc438f"></a><!-- doxytag: member="tbb::concurrent_vector::size_type" ref="bc85684238d4bb5e422cb8ea0bdc438f" args="" -->
-typedef internal::concurrent_vector_base_v3::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f7128452e3c43b5bf1801b61d971d17"></a><!-- doxytag: member="tbb::cache_aligned_allocator::value_type" ref="8f7128452e3c43b5bf1801b61d971d17" args="" -->
+typedef internal::allocator_type<<br>
+ T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac7083635ab59834e9afc15e6c168df5"></a><!-- doxytag: member="tbb::concurrent_vector::allocator_type" ref="ac7083635ab59834e9afc15e6c168df5" args="" -->
-typedef internal::allocator_base<<br>
- T, A >::allocator_type </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b23ef1d76c34fe1c2ebbb2f3df5b5676"></a><!-- doxytag: member="tbb::cache_aligned_allocator::pointer" ref="b23ef1d76c34fe1c2ebbb2f3df5b5676" args="" -->
+typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4543d7d45b2e461d3f8ef416974ec1f1"></a><!-- doxytag: member="tbb::concurrent_vector::value_type" ref="4543d7d45b2e461d3f8ef416974ec1f1" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d15affd67eafcabbd12bd1cd07372994"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_pointer" ref="d15affd67eafcabbd12bd1cd07372994" args="" -->
+typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e655e67dd14ed6d0cbfe7981d5fa350e"></a><!-- doxytag: member="tbb::concurrent_vector::difference_type" ref="e655e67dd14ed6d0cbfe7981d5fa350e" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c29033785d76e240ea96ae40610275d"></a><!-- doxytag: member="tbb::concurrent_vector::reference" ref="8c29033785d76e240ea96ae40610275d" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0b2a6241ab3fa9ab4f4074893fecd47"></a><!-- doxytag: member="tbb::concurrent_vector::const_reference" ref="b0b2a6241ab3fa9ab4f4074893fecd47" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74319c908a32d5dcdc6a080f9c2b8803"></a><!-- doxytag: member="tbb::concurrent_vector::pointer" ref="74319c908a32d5dcdc6a080f9c2b8803" args="" -->
-typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd80729019220cdb80872ea6b905ffb1"></a><!-- doxytag: member="tbb::concurrent_vector::const_pointer" ref="dd80729019220cdb80872ea6b905ffb1" args="" -->
-typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a049674e7f386de3ea09ff2ed6d6bbbe"></a><!-- doxytag: member="tbb::concurrent_vector::iterator" ref="a049674e7f386de3ea09ff2ed6d6bbbe" args="" -->
-typedef internal::vector_iterator<<br>
- <a class="el" href="a00238.html">concurrent_vector</a>, T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8c4e0d5867a07b1cea21d4fca2998c8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::reference" ref="e8c4e0d5867a07b1cea21d4fca2998c8" args="" -->
+typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b51a1baa7da67e283806c0d4f2fe9c69"></a><!-- doxytag: member="tbb::concurrent_vector::const_iterator" ref="b51a1baa7da67e283806c0d4f2fe9c69" args="" -->
-typedef internal::vector_iterator<<br>
- <a class="el" href="a00238.html">concurrent_vector</a>, const <br>
-T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d3d77a39f0852c42f80c6505843f450c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::const_reference" ref="d3d77a39f0852c42f80c6505843f450c" args="" -->
+typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c7e4d252bef7af22286041c39c62abe"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="2c7e4d252bef7af22286041c39c62abe" args="" -->
-typedef std::reverse_iterator<<br>
- iterator > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90ca6a2979ebee466be771f4c2f9337e"></a><!-- doxytag: member="tbb::cache_aligned_allocator::size_type" ref="90ca6a2979ebee466be771f4c2f9337e" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c59c3f9412b666a31a9052b789fb58bc"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="c59c3f9412b666a31a9052b789fb58bc" args="" -->
-typedef std::reverse_iterator<<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c3901b092e9e8185bdc3cae5913e625"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="0c3901b092e9e8185bdc3cae5913e625" args="" -->
-typedef std::reverse_iterator<<br>
- iterator, T, T &, T * > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="426145d7bd5913bc08e701c14b221046"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="426145d7bd5913bc08e701c14b221046" args="" -->
-typedef std::reverse_iterator<<br>
- const_iterator, T, const <br>
-T &, const T * > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61fd90288dba6f8808d6dafe9a249ec5"></a><!-- doxytag: member="tbb::concurrent_vector::range_type" ref="61fd90288dba6f8808d6dafe9a249ec5" args="" -->
-typedef generic_range_type<<br>
- iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d6ddf0312a820a98efd9a5f394cb9dbd"></a><!-- doxytag: member="tbb::concurrent_vector::const_range_type" ref="d6ddf0312a820a98efd9a5f394cb9dbd" args="" -->
-typedef generic_range_type<<br>
- const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b73eba293d042333f343d025c26751a4"></a><!-- doxytag: member="tbb::cache_aligned_allocator::difference_type" ref="b73eba293d042333f343d025c26751a4" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
 
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c8ca9cabfcd30ad5943324c853664b5"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="2c8ca9cabfcd30ad5943324c853664b5" args="(const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a> (const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty vector. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd8a200b99a8088435a37934b58fe335"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="dd8a200b99a8088435a37934b58fe335" args="(const concurrent_vector &vector, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a> (const <a class="el" href="a00238.html">concurrent_vector</a> &vector, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copying constructor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="64432f13f7b29bfe4acfb5568f34f3a8"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="64432f13f7b29bfe4acfb5568f34f3a8" args="(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())" -->
-template<class M> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00238.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a> (const <a class="el" href="a00238.html">concurrent_vector</a>< T, M > &vector, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copying constructor for vector with different allocator type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2a2e261dfe1cab3f73f7b1a94137cfca"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="2a2e261dfe1cab3f73f7b1a94137cfca" args="(size_type n)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a> (size_type n)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with initial size specified by argument n. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3883a8a908b44e249a57f454de3f55d8"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="3883a8a908b44e249a57f454de3f55d8" args="(size_type n, const_reference t, const allocator_type &a=allocator_type())" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a> (size_type n, const_reference t, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with initial size specified by argument n, initialization by copying of t, and given allocator instance. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4450de83c5862ea4bcd9443fd7e67419"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="4450de83c5862ea4bcd9443fd7e67419" args="(I first, I last, const allocator_type &a=allocator_type())" -->
-template<class I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00238.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a> (I first, I last, const allocator_type &a=allocator_type())</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with copying iteration range and given allocator instance. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="691f0f3cda3e489c37a657016e375eaf"></a><!-- doxytag: member="tbb::concurrent_vector::operator=" ref="691f0f3cda3e489c37a657016e375eaf" args="(const concurrent_vector &vector)" -->
-<a class="el" href="a00238.html">concurrent_vector</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#691f0f3cda3e489c37a657016e375eaf">operator=</a> (const <a class="el" href="a00238.html">concurrent_vector</a> &vector)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="19f4ab88a01b0fd056af3bba463e7bd6"></a><!-- doxytag: member="tbb::concurrent_vector::operator=" ref="19f4ab88a01b0fd056af3bba463e7bd6" args="(const concurrent_vector< T, M > &vector)" -->
-template<class M> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00238.html">concurrent_vector</a> & </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00238.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a> (const <a class="el" href="a00238.html">concurrent_vector</a>< T, M > &vector)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment for vector with different allocator type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#30484e3959892fd5392fa93c873c31f0">grow_by</a> (size_type delta)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Grow by "delta" elements.  <a href="#30484e3959892fd5392fa93c873c31f0"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a> (size_type delta)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#38274ab3f772ecba600c7daca7690102">grow_by</a> (size_type delta, const_reference t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Grow by "delta" elements using copying constuctor.  <a href="#38274ab3f772ecba600c7daca7690102"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#473a59a4c9308b93411b898b3110d26c">grow_by</a> (size_type delta, const_reference t)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a> (size_type n)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Append minimal sequence of elements such that <a class="el" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>>=n.  <a href="#47fe588214dd5fa06ab6e8ab78d83874"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a> (size_type n)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a> (const_reference item) iterator push_back(const _reference item)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Push item.  <a href="#e94e038f915c0268fdf2d3d7f87d81b8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a> (size_type index)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get reference to element at given index.  <a href="#4c52f2950bb1832886bd4458eb09d7eb"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6fade5c732cc95274d1d8277ea619d1"></a><!-- doxytag: member="tbb::concurrent_vector::operator[]" ref="c6fade5c732cc95274d1d8277ea619d1" args="(size_type index) const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a> (size_type index) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const reference to element at given index. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c073ca43e787c7cbf7b0e26d2221748"></a><!-- doxytag: member="tbb::concurrent_vector::at" ref="0c073ca43e787c7cbf7b0e26d2221748" args="(size_type index)" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#0c073ca43e787c7cbf7b0e26d2221748">at</a> (size_type index)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get reference to element at given index. Throws exceptions on errors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23e14a38af748edff96a7adc3a0f1c58"></a><!-- doxytag: member="tbb::concurrent_vector::at" ref="23e14a38af748edff96a7adc3a0f1c58" args="(size_type index) const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#23e14a38af748edff96a7adc3a0f1c58">at</a> (size_type index) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const reference to element at given index. Throws exceptions on errors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4c6ffff3bf08b92939aa2fc516edfba"></a><!-- doxytag: member="tbb::concurrent_vector::range" ref="a4c6ffff3bf08b92939aa2fc516edfba" args="(size_t grainsize=1)" -->
-range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a> (size_t grainsize=1)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get range for iterating with parallel algorithms. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d09ccfb581b879ae64203741035e193"></a><!-- doxytag: member="tbb::concurrent_vector::range" ref="3d09ccfb581b879ae64203741035e193" args="(size_t grainsize=1) const " -->
-const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#3d09ccfb581b879ae64203741035e193">range</a> (size_t grainsize=1) const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const range for iterating with parallel algorithms. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="715fe313c4a9c22731cc404dd80c9ec9"></a><!-- doxytag: member="tbb::concurrent_vector::size" ref="715fe313c4a9c22731cc404dd80c9ec9" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return size of vector. It may include elements under construction. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6426cb93cf20d3af40f3c90f1f0481a"></a><!-- doxytag: member="tbb::concurrent_vector::empty" ref="c6426cb93cf20d3af40f3c90f1f0481a" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return true if vector is not empty or has elements under construction at least. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ed6b9ae7217af5103d974045b6f5cd5"></a><!-- doxytag: member="tbb::concurrent_vector::capacity" ref="3ed6b9ae7217af5103d974045b6f5cd5" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Maximum size to which array can grow without allocating more memory. Concurrent allocations are not included in the value. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a> (size_type n)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate enough space to grow to size n without having to allocate more memory later.  <a href="#5a0ce05026994b010018f72cfdeb72c1"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8dfb0cb0eef96d440b4dcf801807a718"></a><!-- doxytag: member="tbb::concurrent_vector::resize" ref="8dfb0cb0eef96d440b4dcf801807a718" args="(size_type n)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a> (size_type n)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Resize the vector. Not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98ce6b2c6d2622f0c030b46dfac3880c"></a><!-- doxytag: member="tbb::concurrent_vector::resize" ref="98ce6b2c6d2622f0c030b46dfac3880c" args="(size_type n, const_reference t)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a> (size_type n, const_reference t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Resize the vector, copy t for new elements. Not thread-safe. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1693d1da41b1a8235871be9c6633be35"></a><!-- doxytag: member="tbb::concurrent_vector::compact" ref="1693d1da41b1a8235871be9c6633be35" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#1693d1da41b1a8235871be9c6633be35">compact</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An alias for <a class="el" href="a00238.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit()</a>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="03c6f4cf66532bf4cc907ee738a9a186"></a><!-- doxytag: member="tbb::concurrent_vector::shrink_to_fit" ref="03c6f4cf66532bf4cc907ee738a9a186" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Optimize memory usage and fragmentation. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c248a017f0576df3e7cd99627836fd6"></a><!-- doxytag: member="tbb::concurrent_vector::max_size" ref="2c248a017f0576df3e7cd99627836fd6" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#2c248a017f0576df3e7cd99627836fd6">max_size</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Upper bound on argument to reserve. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="730b23a251ecb6d37f692fb22f38e029"></a><!-- doxytag: member="tbb::concurrent_vector::begin" ref="730b23a251ecb6d37f692fb22f38e029" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#730b23a251ecb6d37f692fb22f38e029">begin</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">start iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c0b51160e5a764982ec97a455f94f2c6"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="c0b51160e5a764982ec97a455f94f2c6" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#c0b51160e5a764982ec97a455f94f2c6">end</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="78a06182276ff758788d4c0623ae0d71"></a><!-- doxytag: member="tbb::concurrent_vector::begin" ref="78a06182276ff758788d4c0623ae0d71" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#78a06182276ff758788d4c0623ae0d71">begin</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74ccd00a29171ddd61a4ea88cfa49c32"></a><!-- doxytag: member="tbb::cache_aligned_allocator::cache_aligned_allocator" ref="74ccd00a29171ddd61a4ea88cfa49c32" args="(const cache_aligned_allocator &)" -->
+ </td><td class="memItemRight" valign="bottom"><b>cache_aligned_allocator</b> (const <a class="el" href="a00238.html">cache_aligned_allocator</a> &)  throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e6aa764ce5a1cbd24526f68bc0a2f6b"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="1e6aa764ce5a1cbd24526f68bc0a2f6b" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a> () const </td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="de57e731c36a51bf39b458c9b8adee58"></a><!-- doxytag: member="tbb::cache_aligned_allocator::cache_aligned_allocator" ref="de57e731c36a51bf39b458c9b8adee58" args="(const cache_aligned_allocator< U > &)" -->
+template<typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>cache_aligned_allocator</b> (const <a class="el" href="a00238.html">cache_aligned_allocator</a>< U > &)  throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f88fcf1c920693c39bd9709db33c199f"></a><!-- doxytag: member="tbb::concurrent_vector::cbegin" ref="f88fcf1c920693c39bd9709db33c199f" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="023e0cc7cf6ebde69e1f2c12182eb12b"></a><!-- doxytag: member="tbb::cache_aligned_allocator::address" ref="023e0cc7cf6ebde69e1f2c12182eb12b" args="(reference x) const " -->
+pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c15a5d0f1cf75d687dabba07da1d46b"></a><!-- doxytag: member="tbb::concurrent_vector::cend" ref="0c15a5d0f1cf75d687dabba07da1d46b" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db4f7613b1de12d1e79285c15636cf3b"></a><!-- doxytag: member="tbb::cache_aligned_allocator::address" ref="db4f7613b1de12d1e79285c15636cf3b" args="(const_reference x) const " -->
+const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e220926d09236d98f04fe0721e5f9a1"></a><!-- doxytag: member="tbb::concurrent_vector::rbegin" ref="5e220926d09236d98f04fe0721e5f9a1" args="()" -->
-reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4cdeea67af6c1fcd8f1d5e9c4cab61e8"></a><!-- doxytag: member="tbb::cache_aligned_allocator::allocate" ref="4cdeea67af6c1fcd8f1d5e9c4cab61e8" args="(size_type n, const void *hint=0)" -->
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a> (size_type n, const void *hint=0)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="290119a4eb43cd6a9e98fa17016ba3c2"></a><!-- doxytag: member="tbb::concurrent_vector::rend" ref="290119a4eb43cd6a9e98fa17016ba3c2" args="()" -->
-reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects, starting on a cache/sector line. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d4eadf188f7d85d3805ae534e0b8e1c"></a><!-- doxytag: member="tbb::cache_aligned_allocator::deallocate" ref="3d4eadf188f7d85d3805ae534e0b8e1c" args="(pointer p, size_type)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a> (pointer p, size_type)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f9c103e18d5f212703805354074ad44"></a><!-- doxytag: member="tbb::concurrent_vector::rbegin" ref="9f9c103e18d5f212703805354074ad44" args="() const " -->
-const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#9f9c103e18d5f212703805354074ad44">rbegin</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Free block of memory that starts on a cache line. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb23b687b4c0429dab4c7f8017266cf0"></a><!-- doxytag: member="tbb::cache_aligned_allocator::max_size" ref="fb23b687b4c0429dab4c7f8017266cf0" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a> () const   throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d438b9b32ea3a8ffb703015b6dce055b"></a><!-- doxytag: member="tbb::concurrent_vector::rend" ref="d438b9b32ea3a8ffb703015b6dce055b" args="() const " -->
-const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="958ee8745c86c275bfc9533af565e017"></a><!-- doxytag: member="tbb::cache_aligned_allocator::construct" ref="958ee8745c86c275bfc9533af565e017" args="(pointer p, const value_type &value)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#958ee8745c86c275bfc9533af565e017">construct</a> (pointer p, const value_type &value)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db78a1d28c9c966050e8a2926d834a33"></a><!-- doxytag: member="tbb::concurrent_vector::crbegin" ref="db78a1d28c9c966050e8a2926d834a33" args="() const " -->
-const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fff9cece89438587997ebedf93c5e962"></a><!-- doxytag: member="tbb::concurrent_vector::crend" ref="fff9cece89438587997ebedf93c5e962" args="() const " -->
-const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#fff9cece89438587997ebedf93c5e962">crend</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15181759c0bfa2ddce5d10c7550e0002"></a><!-- doxytag: member="tbb::concurrent_vector::front" ref="15181759c0bfa2ddce5d10c7550e0002" args="()" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#15181759c0bfa2ddce5d10c7550e0002">front</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">the first item <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="502615a858eb9fa0390ee59169065e90"></a><!-- doxytag: member="tbb::concurrent_vector::front" ref="502615a858eb9fa0390ee59169065e90" args="() const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#502615a858eb9fa0390ee59169065e90">front</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">the first item const <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="41ce48d6015a1a2812d41cf620ec3476"></a><!-- doxytag: member="tbb::concurrent_vector::back" ref="41ce48d6015a1a2812d41cf620ec3476" args="()" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#41ce48d6015a1a2812d41cf620ec3476">back</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">the last item <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd518e204107d07fd08d0ec5bdfd383d"></a><!-- doxytag: member="tbb::concurrent_vector::back" ref="bd518e204107d07fd08d0ec5bdfd383d" args="() const " -->
-const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#bd518e204107d07fd08d0ec5bdfd383d">back</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">the last item const <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2fdba8e90de6a4d2300222236d46758e"></a><!-- doxytag: member="tbb::concurrent_vector::get_allocator" ref="2fdba8e90de6a4d2300222236d46758e" args="() const " -->
-allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="423e5aa15e0e3309ad86d026fd85f6f6"></a><!-- doxytag: member="tbb::concurrent_vector::assign" ref="423e5aa15e0e3309ad86d026fd85f6f6" args="(size_type n, const_reference t)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a> (size_type n, const_reference t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">assign n items by copying t item <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="93a06b3112cb804f42f40efb5e7387b4"></a><!-- doxytag: member="tbb::concurrent_vector::assign" ref="93a06b3112cb804f42f40efb5e7387b4" args="(I first, I last)" -->
-template<class I> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00238.html#93a06b3112cb804f42f40efb5e7387b4">assign</a> (I first, I last)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">assign range [first, last) <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="96c9c4bd968ed3edb8dd276854d2dae0"></a><!-- doxytag: member="tbb::concurrent_vector::swap" ref="96c9c4bd968ed3edb8dd276854d2dae0" args="(concurrent_vector &vector)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a> (<a class="el" href="a00238.html">concurrent_vector</a> &vector)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">swap two instances <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#26f937a359a66b6aae904c3cd9a3c444">clear</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear container while keeping memory allocated.  <a href="#26f937a359a66b6aae904c3cd9a3c444"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="da2444b28bb840d38f60d0030333a5fc"></a><!-- doxytag: member="tbb::concurrent_vector::~concurrent_vector" ref="da2444b28bb840d38f60d0030333a5fc" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear and destroy vector. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bb5ae659871478f1f5c68039e1273e12"></a><!-- doxytag: member="tbb::concurrent_vector::internal_vector_base" ref="bb5ae659871478f1f5c68039e1273e12" args="() const " -->
-const internal::concurrent_vector_base_v3 & </td><td class="memItemRight" valign="bottom"><b>internal_vector_base</b> () const </td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="30086a58bff79a91103723be20916b96"></a><!-- doxytag: member="tbb::concurrent_vector::internal::vector_iterator" ref="30086a58bff79a91103723be20916b96" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::vector_iterator</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd298895a4f1654b5149ec84b591ecb5"></a><!-- doxytag: member="tbb::cache_aligned_allocator::destroy" ref="cd298895a4f1654b5149ec84b591ecb5" args="(pointer p)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a> (pointer p)</td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy value at location pointed to by p. <br></td></tr>
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>generic_range_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>internal_loop_guide</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception-aware helper class for filling a segment by exception-danger operators of user class. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, class A><br>
- class tbb::concurrent_vector< T, A ></h3>
-
-Concurrent vector container. 
-<p>
-<a class="el" href="a00238.html">concurrent_vector</a> is a container having the following main properties:<ul>
-<li>It provides random indexed access to its elements. The index of the first element is 0.</li><li>It ensures safe concurrent growing its size (different threads can safely append new elements).</li><li>Adding new elements does not invalidate existing iterators and does not change indices of existing items.</li></ul>
-<p>
-<dl compact><dt><b>Compatibility</b></dt><dd>The class meets all Container Requirements and Reversible Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1). But it doesn't meet Sequence Requirements due to absence of insert() and erase() methods.</dd></dl>
-<dl compact><dt><b>Exception Safety</b></dt><dd>Methods working with memory allocation and/or new elements construction can throw an exception if allocator fails to allocate memory or element's default constructor throws one. Concurrent vector's element of type T must conform to the following requirements:<ul>
-<li>Throwing an exception is forbidden for destructor of T.</li><li>Default constructor of T must not throw an exception OR its non-virtual destructor must safely work when its object memory is zero-initialized.</li></ul>
-Otherwise, the program's behavior is undefined. </dd></dl>
-<dl compact><dt><b></b></dt><dd>If an exception happens inside growth or assignment operation, an instance of the vector becomes invalid unless it is stated otherwise in the method documentation. Invalid state means:<ul>
-<li>There are no guaranties that all items were initialized by a constructor. The rest of items is zero-filled, including item where exception happens.</li><li>An invalid vector instance cannot be repaired; it is unable to grow anymore.</li><li>Size and capacity reported by the vector are incorrect, and calculated as if the failed operation were successful.</li><li>Attempt to access not allocated elements using operator[] or iterators results in access violation or segmentation fault exc [...]
-If a concurrent grow operation successfully completes, all the elements it has added to the vector will remain valid and accessible even if one of subsequent grow operations fails.</dd></dl>
-<dl compact><dt><b>Fragmentation</b></dt><dd>Unlike an STL vector, a <a class="el" href="a00238.html">concurrent_vector</a> does not move existing elements if it needs to allocate more memory. The container is divided into a series of contiguous arrays of elements. The first reservation, growth, or assignment operation determines the size of the first array. Using small number of elements as initial size incurs fragmentation that may increase element access time. Internal layout can be o [...]
-<dl compact><dt><b>Changes since TBB 2.1</b></dt><dd><ul>
-<li>Fixed guarantees of <a class="el" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">concurrent_vector::size()</a> and <a class="el" href="a00238.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least()</a> methods to assure elements are allocated.</li><li>Methods <a class="el" href="a00238.html#c0b51160e5a764982ec97a455f94f2c6">end()</a>/rbegin()/back() are partly thread-safe since they use <a class="el" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a> to get the end [...]
-</dd></dl>
-<dl compact><dt><b>Changes since TBB 2.0</b></dt><dd><ul>
-<li>Implemented exception-safety guaranties</li><li>Added template argument for allocator</li><li>Added allocator argument in constructors</li><li>Faster index calculation</li><li>First growth call specifies a number of segments to be merged in the first allocation.</li><li>Fixed memory blow up for swarm of vector's instances of small size</li><li>Added <a class="el" href="a00238.html#38274ab3f772ecba600c7daca7690102">grow_by(size_type n, const_reference t)</a> growth using copying const [...]
-</dd></dl>
-
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="26f937a359a66b6aae904c3cd9a3c444"></a><!-- doxytag: member="tbb::concurrent_vector::clear" ref="26f937a359a66b6aae904c3cd9a3c444" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">void <a class="el" href="a00238.html">tbb::concurrent_vector</a>< T, A >::clear           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Clear container while keeping memory allocated. 
-<p>
-To free up the memory, use in conjunction with method <a class="el" href="a00238.html#1693d1da41b1a8235871be9c6633be35">compact()</a>. Not thread safe 
-</div>
-</div><p>
-<a class="anchor" name="473a59a4c9308b93411b898b3110d26c"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="473a59a4c9308b93411b898b3110d26c" args="(size_type delta, const_reference t)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">iterator <a class="el" href="a00238.html">tbb::concurrent_vector</a>< T, A >::grow_by           </td>
-          <td>(</td>
-          <td class="paramtype">size_type </td>
-          <td class="paramname"> <em>delta</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">const_reference </td>
-          <td class="paramname"> <em>t</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns iterator pointing to the first new element. 
-</div>
-</div><p>
-<a class="anchor" name="38274ab3f772ecba600c7daca7690102"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="38274ab3f772ecba600c7daca7690102" args="(size_type delta, const_reference t)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">size_type <a class="el" href="a00238.html">tbb::concurrent_vector</a>< T, A >::grow_by           </td>
-          <td>(</td>
-          <td class="paramtype">size_type </td>
-          <td class="paramname"> <em>delta</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">const_reference </td>
-          <td class="paramname"> <em>t</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Grow by "delta" elements using copying constuctor. 
-<p>
-Returns old size. 
-</div>
-</div><p>
-<a class="anchor" name="c8177b1865270ea68aa1ab9148e5e35e"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="c8177b1865270ea68aa1ab9148e5e35e" args="(size_type delta)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">iterator <a class="el" href="a00238.html">tbb::concurrent_vector</a>< T, A >::grow_by           </td>
-          <td>(</td>
-          <td class="paramtype">size_type </td>
-          <td class="paramname"> <em>delta</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Returns iterator pointing to the first new element. 
-</div>
-</div><p>
-<a class="anchor" name="30484e3959892fd5392fa93c873c31f0"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="30484e3959892fd5392fa93c873c31f0" args="(size_type delta)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">size_type <a class="el" href="a00238.html">tbb::concurrent_vector</a>< T, A >::grow_by           </td>
-          <td>(</td>
-          <td class="paramtype">size_type </td>
-          <td class="paramname"> <em>delta</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Grow by "delta" elements. 
-<p>
-Returns old size. 
-</div>
-</div><p>
-<a class="anchor" name="a7e3b67c8ccab16d0aecc80899ae799d"></a><!-- doxytag: member="tbb::concurrent_vector::grow_to_at_least" ref="a7e3b67c8ccab16d0aecc80899ae799d" args="(size_type n)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">iterator <a class="el" href="a00238.html">tbb::concurrent_vector</a>< T, A >::grow_to_at_least           </td>
-          <td>(</td>
-          <td class="paramtype">size_type </td>
-          <td class="paramname"> <em>n</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-The new elements are default constructed. Blocks until all elements in range [0..n) are allocated. May return while other elements are being constructed by other threads. Returns iterator that points to beginning of appended sequence. If no elements were appended, returns iterator pointing to nth element. 
-</div>
-</div><p>
-<a class="anchor" name="47fe588214dd5fa06ab6e8ab78d83874"></a><!-- doxytag: member="tbb::concurrent_vector::grow_to_at_least" ref="47fe588214dd5fa06ab6e8ab78d83874" args="(size_type n)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">void <a class="el" href="a00238.html">tbb::concurrent_vector</a>< T, A >::grow_to_at_least           </td>
-          <td>(</td>
-          <td class="paramtype">size_type </td>
-          <td class="paramname"> <em>n</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Append minimal sequence of elements such that <a class="el" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>>=n. 
-<p>
-The new elements are default constructed. Blocks until all elements in range [0..n) are allocated. May return while other elements are being constructed by other threads. 
-</div>
-</div><p>
-<a class="anchor" name="4c52f2950bb1832886bd4458eb09d7eb"></a><!-- doxytag: member="tbb::concurrent_vector::operator[]" ref="4c52f2950bb1832886bd4458eb09d7eb" args="(size_type index)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">reference <a class="el" href="a00238.html">tbb::concurrent_vector</a>< T, A >::operator[]           </td>
-          <td>(</td>
-          <td class="paramtype">size_type </td>
-          <td class="paramname"> <em>index</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Get reference to element at given index. 
-<p>
-This method is thread-safe for concurrent reads, and also while growing the vector, as long as the calling thread has checked that index<<a class="el" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>. 
-</div>
-</div><p>
-<a class="anchor" name="e94e038f915c0268fdf2d3d7f87d81b8"></a><!-- doxytag: member="tbb::concurrent_vector::push_back" ref="e94e038f915c0268fdf2d3d7f87d81b8" args="(const_reference item) iterator push_back(const _reference item)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">size_type <a class="el" href="a00238.html">tbb::concurrent_vector</a>< T, A >::push_back           </td>
-          <td>(</td>
-          <td class="paramtype">const_reference </td>
-          <td class="paramname"> <em>item</em>          </td>
-          <td> ) </td>
-          <td width="100%"> const<code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Push item. 
-<p>
-Returns iterator pointing to the new element. 
-</div>
-</div><p>
-<a class="anchor" name="5a0ce05026994b010018f72cfdeb72c1"></a><!-- doxytag: member="tbb::concurrent_vector::reserve" ref="5a0ce05026994b010018f72cfdeb72c1" args="(size_type n)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T, class A> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">void <a class="el" href="a00238.html">tbb::concurrent_vector</a>< T, A >::reserve           </td>
-          <td>(</td>
-          <td class="paramtype">size_type </td>
-          <td class="paramname"> <em>n</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T><br>
+ class tbb::cache_aligned_allocator< T ></h3>
 
+Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. 
 <p>
-Allocate enough space to grow to size n without having to allocate more memory later. 
+The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard. 
 <p>
-Like most of the methods provided for STL compatibility, this method is *not* thread safe. The capacity afterwards may be bigger than the requested reservation. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00442.html">concurrent_vector.h</a></ul>
+<li><a class="el" href="a00415.html">cache_aligned_allocator.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00239.html b/doc/html/a00239.html
index 76b45e0..e966827 100644
--- a/doc/html/a00239.html
+++ b/doc/html/a00239.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::continue_msg Class Reference</title>
+<title>tbb::cache_aligned_allocator< void > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,20 +21,39 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00239.html">continue_msg</a></div>
-<h1>tbb::continue_msg Class Reference</h1><!-- doxytag: class="tbb::continue_msg" -->An empty class used for messages that mean "I'm done".  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00239.html">cache_aligned_allocator< void ></a></div>
+<h1>tbb::cache_aligned_allocator< void > Class Template Reference<br>
+<small>
+[<a class="el" href="a00397.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::cache_aligned_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00415.html">cache_aligned_allocator.h</a>></code>
 <p>
-<table border="0" cellpadding="0" cellspacing="0">
+<a href="a00009.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce89776145998f0685a767b4f195272d"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::pointer" ref="ce89776145998f0685a767b4f195272d" args="" -->
+typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4431fbbe1a8cfeb19c48ad0072078f45"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::const_pointer" ref="4431fbbe1a8cfeb19c48ad0072078f45" args="" -->
+typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2ab296f4ecdd75f8e193ff92004a697d"></a><!-- doxytag: member="tbb::cache_aligned_allocator< void >::value_type" ref="2ab296f4ecdd75f8e193ff92004a697d" args="" -->
+typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-An empty class used for messages that mean "I'm done". 
+<h3>template<><br>
+ class tbb::cache_aligned_allocator< void ></h3>
+
+Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00415.html">cache_aligned_allocator.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00240.html b/doc/html/a00240.html
index 91b7c12..47fbf40 100644
--- a/doc/html/a00240.html
+++ b/doc/html/a00240.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::continue_node Class Reference</title>
+<title>tbb::captured_exception Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,45 +21,131 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00240.html">continue_node</a></div>
-<h1>tbb::continue_node Class Reference</h1><!-- doxytag: class="tbb::continue_node" --><!-- doxytag: inherits="tbb::executable_node" -->Broadcasts completion message when it receives completion messages from all predecessors. Then resets.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00240.html">captured_exception</a></div>
+<h1>tbb::captured_exception Class Reference</h1><!-- doxytag: class="tbb::captured_exception" --><!-- doxytag: inherits="tbb::tbb_exception" -->This class is used by TBB to propagate information about unhandled exceptions into the root thread.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::continue_node:
-<p><center><img src="a00240.png" usemap="#tbb::continue_node_map" border="0" alt=""></center>
-<map name="tbb::continue_node_map">
-<area href="a00244.html" alt="tbb::executable_node< Output >" shape="rect" coords="0,56,192,80">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,192,24">
+<p>Inheritance diagram for tbb::captured_exception:
+<p><center><img src="a00240.png" usemap="#tbb::captured_exception_map" border="0" alt=""></center>
+<map name="tbb::captured_exception_map">
+<area href="a00319.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,146,24">
 </map>
-<a href="a00053.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00143.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5354c2c718362e50e73dd58d66f38d21"></a><!-- doxytag: member="tbb::continue_node::input_type" ref="5354c2c718362e50e73dd58d66f38d21" args="" -->
-typedef <a class="el" href="a00239.html">continue_msg</a> </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b50d9716bcdd281df574ec758a3952f9"></a><!-- doxytag: member="tbb::captured_exception::captured_exception" ref="b50d9716bcdd281df574ec758a3952f9" args="(const captured_exception &src)" -->
+ </td><td class="memItemRight" valign="bottom"><b>captured_exception</b> (const <a class="el" href="a00240.html">captured_exception</a> &src)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="629da75fac31aa16474edbd7bbc403d4"></a><!-- doxytag: member="tbb::continue_node::output_type" ref="629da75fac31aa16474edbd7bbc403d4" args="" -->
-typedef <a class="el" href="a00239.html">continue_msg</a> </td><td class="memItemRight" valign="bottom"><b>output_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="179076f146699724f652a9b1e81bd791"></a><!-- doxytag: member="tbb::captured_exception::captured_exception" ref="179076f146699724f652a9b1e81bd791" args="(const char *name_, const char *info)" -->
+ </td><td class="memItemRight" valign="bottom"><b>captured_exception</b> (const char *name_, const char *info)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="315d3789ba8da7d1d0f2f5144d579fe3"></a><!-- doxytag: member="tbb::continue_node::predecessor_type" ref="315d3789ba8da7d1d0f2f5144d579fe3" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00239.html">input_type</a> > </td><td class="memItemRight" valign="bottom"><b>predecessor_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e95b8eb99ec9dea22934ac528a08654c"></a><!-- doxytag: member="tbb::captured_exception::operator=" ref="e95b8eb99ec9dea22934ac528a08654c" args="(const captured_exception &src)" -->
+<a class="el" href="a00240.html">captured_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00240.html">captured_exception</a> &src)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="920267f71ed69be5e962f9a4da2e9e66"></a><!-- doxytag: member="tbb::continue_node::successor_type" ref="920267f71ed69be5e962f9a4da2e9e66" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00239.html">output_type</a> > </td><td class="memItemRight" valign="bottom"><b>successor_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00240.html">captured_exception</a> *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00240.html#837a50b8f6a800bda225c39d1699643f">move</a> ()  throw ()</td></tr>
 
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f2808a5f31fccc06ad24d54f47170091"></a><!-- doxytag: member="tbb::continue_node::continue_node" ref="f2808a5f31fccc06ad24d54f47170091" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><b>continue_node</b> (<a class="el" href="a00250.html">graph</a> &g)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object.  <a href="#837a50b8f6a800bda225c39d1699643f"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00240.html#93d875d3555502ff6f18513525de204c">destroy</a> ()  throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00240.html#837a50b8f6a800bda225c39d1699643f">move()</a> method.  <a href="#93d875d3555502ff6f18513525de204c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00240.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object.  <a href="#2dd1be66ab32fa27e0ddef5707fa67ef"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5af82fd677449c5ca727fa1d7e16f9f5"></a><!-- doxytag: member="tbb::captured_exception::name" ref="5af82fd677449c5ca727fa1d7e16f9f5" args="() const " -->
+const char *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00240.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a> () const   throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6b5988ef74a1fe2a58998d110b3633e0"></a><!-- doxytag: member="tbb::captured_exception::what" ref="6b5988ef74a1fe2a58998d110b3633e0" args="() const " -->
+const char *__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00240.html#6b5988ef74a1fe2a58998d110b3633e0">what</a> () const   throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00240.html#6b5988ef74a1fe2a58998d110b3633e0">what()</a> method. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="92ed4100413eef26969f8299f6845e18"></a><!-- doxytag: member="tbb::captured_exception::set" ref="92ed4100413eef26969f8299f6845e18" args="(const char *name, const char *info)" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>set</b> (const char *name, const char *info)  throw ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5f56d05102acdba6c2f09ba6db3baeb"></a><!-- doxytag: member="tbb::captured_exception::clear" ref="d5f56d05102acdba6c2f09ba6db3baeb" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>clear</b> ()  throw ()</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Broadcasts completion message when it receives completion messages from all predecessors. Then resets. 
+This class is used by TBB to propagate information about unhandled exceptions into the root thread. 
+<p>
+Exception of this type is thrown by TBB in the root thread (thread that started a parallel algorithm ) if an unhandled exception was intercepted during the algorithm execution in one of the workers. <dl compact><dt><b>See also:</b></dt><dd><a class="el" href="a00319.html">tbb::tbb_exception</a> </dd></dl>
+
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="93d875d3555502ff6f18513525de204c"></a><!-- doxytag: member="tbb::captured_exception::destroy" ref="93d875d3555502ff6f18513525de204c" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void __TBB_EXPORTED_METHOD tbb::captured_exception::destroy           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%">  throw ()<code> [virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Destroys objects created by the <a class="el" href="a00240.html#837a50b8f6a800bda225c39d1699643f">move()</a> method. 
+<p>
+Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method. 
+<p>
+Implements <a class="el" href="a00319.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>.
+</div>
+</div><p>
+<a class="anchor" name="837a50b8f6a800bda225c39d1699643f"></a><!-- doxytag: member="tbb::captured_exception::move" ref="837a50b8f6a800bda225c39d1699643f" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="a00240.html">captured_exception</a>* __TBB_EXPORTED_METHOD tbb::captured_exception::move           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%">  throw ()<code> [virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Creates and returns pointer to the deep copy of this exception object. 
+<p>
+Move semantics is allowed. 
+<p>
+Implements <a class="el" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a>.
+</div>
+</div><p>
+<a class="anchor" name="2dd1be66ab32fa27e0ddef5707fa67ef"></a><!-- doxytag: member="tbb::captured_exception::throw_self" ref="2dd1be66ab32fa27e0ddef5707fa67ef" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tbb::captured_exception::throw_self           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline, virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Throws this exception object. 
 <p>
-Is equivalent to an executable_node< continue_msg > with an empty_body 
+Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown. 
 <p>
+Implements <a class="el" href="a00319.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a>.
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00240.png b/doc/html/a00240.png
index d27b46c..2470bea 100644
Binary files a/doc/html/a00240.png and b/doc/html/a00240.png differ
diff --git a/doc/html/a00241.html b/doc/html/a00241.html
index 34c57f4..c324f56 100644
--- a/doc/html/a00241.html
+++ b/doc/html/a00241.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::continue_receiver Class Reference</title>
+<title>tbb::combinable< T > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,135 +21,58 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00241.html">continue_receiver</a></div>
-<h1>tbb::continue_receiver Class Reference</h1><!-- doxytag: class="tbb::continue_receiver" --><!-- doxytag: inherits="tbb::receiver" -->Base class for receivers of completion messages.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00241.html">combinable</a></div>
+<h1>tbb::combinable< T > Class Template Reference<br>
+<small>
+[<a class="el" href="a00396.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::combinable" -->Thread-local storage with optional reduction.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00417.html">combinable.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::continue_receiver:
-<p><center><img src="a00241.png" usemap="#tbb::continue_receiver_map" border="0" alt=""></center>
-<map name="tbb::continue_receiver_map">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="0,0,138,24">
-</map>
-<a href="a00044.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00011.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="21acef0b97b53d92f637619012837b30"></a><!-- doxytag: member="tbb::continue_receiver::input_type" ref="21acef0b97b53d92f637619012837b30" args="" -->
-typedef <a class="el" href="a00239.html">continue_msg</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#21acef0b97b53d92f637619012837b30">input_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="52fa92968dd48560d59798ca7ba6a3a2"></a><!-- doxytag: member="tbb::continue_receiver::predecessor_type" ref="52fa92968dd48560d59798ca7ba6a3a2" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00239.html">continue_msg</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#52fa92968dd48560d59798ca7ba6a3a2">predecessor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="799d383813261426d881b10247caadba"></a><!-- doxytag: member="tbb::continue_receiver::continue_receiver" ref="799d383813261426d881b10247caadba" args="(int number_of_predecessors=0)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#799d383813261426d881b10247caadba">continue_receiver</a> (int number_of_predecessors=0)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="d03619e90e62555aa5634fcc8adadcc9"></a><!-- doxytag: member="tbb::combinable::combinable" ref="d03619e90e62555aa5634fcc8adadcc9" args="(finit _finit)" -->
+template<typename finit> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>combinable</b> (finit _finit)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9a38edb7e1e3c9be4e3848145c51a617"></a><!-- doxytag: member="tbb::continue_receiver::~continue_receiver" ref="9a38edb7e1e3c9be4e3848145c51a617" args="()" -->
-virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#9a38edb7e1e3c9be4e3848145c51a617">~continue_receiver</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c87e79ae98588a5780f708773388843"></a><!-- doxytag: member="tbb::combinable::~combinable" ref="2c87e79ae98588a5780f708773388843" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#2c87e79ae98588a5780f708773388843">~combinable</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b9fa9290cbb871f8780f9d69e1ec3b4e"></a><!-- doxytag: member="tbb::continue_receiver::register_predecessor" ref="b9fa9290cbb871f8780f9d69e1ec3b4e" args="(predecessor_type &)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#b9fa9290cbb871f8780f9d69e1ec3b4e">register_predecessor</a> (<a class="el" href="a00282.html">predecessor_type</a> &)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">destructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57012803b7bc7416452cb930121ff210"></a><!-- doxytag: member="tbb::combinable::combinable" ref="57012803b7bc7416452cb930121ff210" args="(const combinable &other)" -->
+ </td><td class="memItemRight" valign="bottom"><b>combinable</b> (const <a class="el" href="a00241.html">combinable</a> &other)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Increments the trigger threshold. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#02411d8d13b380062548aff133752cc5">remove_predecessor</a> (<a class="el" href="a00282.html">predecessor_type</a> &)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c9650d59f65b1042afa232ede57dfca9"></a><!-- doxytag: member="tbb::combinable::operator=" ref="c9650d59f65b1042afa232ede57dfca9" args="(const combinable &other)" -->
+<a class="el" href="a00241.html">combinable</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00241.html">combinable</a> &other)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Decrements the trigger threshold.  <a href="#02411d8d13b380062548aff133752cc5"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">try_put</a> (<a class="el" href="a00239.html">input_type</a>)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f09233cccb9b5e8a58874e43a703cac2"></a><!-- doxytag: member="tbb::combinable::clear" ref="f09233cccb9b5e8a58874e43a703cac2" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>clear</b> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Puts a <a class="el" href="a00239.html">continue_msg</a> to the receiver.  <a href="#a7f8b9cc6286eb2cd8d429d6279da64d"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">execute</a> ()=0</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2d7550204bcb88fa8810b5a39e9cad24"></a><!-- doxytag: member="tbb::combinable::local" ref="2d7550204bcb88fa8810b5a39e9cad24" args="()" -->
+T & </td><td class="memItemRight" valign="bottom"><b>local</b> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Does whatever should happen when the threshold is reached.  <a href="#e6bf1d21e670b78ea00c71fccbe17c78"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ddee0bc66101010aa5552db4230ca9ac"></a><!-- doxytag: member="tbb::continue_receiver::my_mutex" ref="ddee0bc66101010aa5552db4230ca9ac" args="" -->
-<a class="el" href="a00286.html">spin_mutex</a> </td><td class="memItemRight" valign="bottom"><b>my_mutex</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93a42052881ecccdd8ddff16a1b1cca1"></a><!-- doxytag: member="tbb::combinable::local" ref="93a42052881ecccdd8ddff16a1b1cca1" args="(bool &exists)" -->
+T & </td><td class="memItemRight" valign="bottom"><b>local</b> (bool &exists)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c87649e54a1d77fbe386fa13b193e8ed"></a><!-- doxytag: member="tbb::continue_receiver::my_predecessor_count" ref="c87649e54a1d77fbe386fa13b193e8ed" args="" -->
-int </td><td class="memItemRight" valign="bottom"><b>my_predecessor_count</b></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9be306b4a073066dcac4043dc189c514"></a><!-- doxytag: member="tbb::combinable::combine" ref="9be306b4a073066dcac4043dc189c514" args="(combine_func_t f_combine)" -->
+template<typename combine_func_t> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>combine</b> (combine_func_t f_combine)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f541d914398f99cff17521251742f53"></a><!-- doxytag: member="tbb::continue_receiver::my_current_count" ref="4f541d914398f99cff17521251742f53" args="" -->
-int </td><td class="memItemRight" valign="bottom"><b>my_current_count</b></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="dcd23283834149c87c345c0e476dfee8"></a><!-- doxytag: member="tbb::combinable::combine_each" ref="dcd23283834149c87c345c0e476dfee8" args="(combine_func_t f_combine)" -->
+template<typename combine_func_t> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Base class for receivers of completion messages. 
-<p>
-These receivers automatically reset, but cannot be explicitly waited on 
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="e6bf1d21e670b78ea00c71fccbe17c78"></a><!-- doxytag: member="tbb::continue_receiver::execute" ref="e6bf1d21e670b78ea00c71fccbe17c78" args="()=0" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">virtual void tbb::continue_receiver::execute           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [protected, pure virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T><br>
+ class tbb::combinable< T ></h3>
 
+Thread-local storage with optional reduction. 
 <p>
-Does whatever should happen when the threshold is reached. 
-<p>
-This should be very fast or else spawn a task. This is called while the sender is blocked in the <a class="el" href="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">try_put()</a>. 
-</div>
-</div><p>
-<a class="anchor" name="02411d8d13b380062548aff133752cc5"></a><!-- doxytag: member="tbb::continue_receiver::remove_predecessor" ref="02411d8d13b380062548aff133752cc5" args="(predecessor_type &)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">bool tbb::continue_receiver::remove_predecessor           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00282.html">predecessor_type</a> & </td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Decrements the trigger threshold. 
-<p>
-Does not check to see if the removal of the predecessor now makes the current count exceed the new threshold. So removing a predecessor while the graph is active can cause unexpected results. 
-</div>
-</div><p>
-<a class="anchor" name="a7f8b9cc6286eb2cd8d429d6279da64d"></a><!-- doxytag: member="tbb::continue_receiver::try_put" ref="a7f8b9cc6286eb2cd8d429d6279da64d" args="(input_type)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">bool tbb::continue_receiver::try_put           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00239.html">input_type</a> </td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Puts a <a class="el" href="a00239.html">continue_msg</a> to the receiver. 
-<p>
-If the message causes the message count to reach the predecessor count, <a class="el" href="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">execute()</a> is called and the message count is reset to 0. Otherwise the message count is incremented. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00417.html">combinable.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00241.png b/doc/html/a00241.png
deleted file mode 100644
index 8c138ee..0000000
Binary files a/doc/html/a00241.png and /dev/null differ
diff --git a/doc/html/a00242.html b/doc/html/a00242.html
index c4a2f60..9c325cd 100644
--- a/doc/html/a00242.html
+++ b/doc/html/a00242.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::empty_task Class Reference</title>
+<title>tbb::concurrent_bounded_queue< T, A > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,28 +21,280 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00242.html">empty_task</a></div>
-<h1>tbb::empty_task Class Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00242.html">concurrent_bounded_queue</a></div>
+<h1>tbb::concurrent_bounded_queue< T, A > Class Template Reference<br>
 <small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::empty_task" --><!-- doxytag: inherits="tbb::task" -->task that does nothing. Useful for synchronization.  
+[<a class="el" href="a00396.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::concurrent_bounded_queue" -->A high-performance thread-safe blocking concurrent bounded queue.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00567.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00432.html">concurrent_queue.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::empty_task:
-<p><center><img src="a00242.png" usemap="#tbb::empty_task_map" border="0" alt=""></center>
-<map name="tbb::empty_task_map">
-<area href="a00291.html" alt="tbb::task" shape="rect" coords="0,0,97,24">
+<p>Inheritance diagram for tbb::concurrent_bounded_queue< T, A >:
+<p><center><img src="a00242.png" usemap="#tbb::concurrent_bounded_queue< T, A >_map" border="0" alt=""></center>
+<map name="tbb::concurrent_bounded_queue< T, A >_map">
+<area href="a00249.html" alt="tbb::deprecated::concurrent_queue< T, A >" shape="rect" coords="0,56,257,80">
 </map>
-<a href="a00120.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00023.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98245517a931e5893f6601e66c51fc75"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::value_type" ref="98245517a931e5893f6601e66c51fc75" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#98245517a931e5893f6601e66c51fc75">value_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2e2726fccf6d975dc1071608cc0bbf90"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::allocator_type" ref="2e2726fccf6d975dc1071608cc0bbf90" args="" -->
+typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dcd44ca6a88c0dc7a847a47a10811f0c"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::reference" ref="dcd44ca6a88c0dc7a847a47a10811f0c" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="796713d0b9ba93a4721cbe13e4474068"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::const_reference" ref="796713d0b9ba93a4721cbe13e4474068" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef std::ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue.  <a href="#a80e4c11dbb324e4b92a24a77bbcde68"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b45c91297e69515d83d5eef85ae1f49"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::difference_type" ref="4b45c91297e69515d83d5eef85ae1f49" args="" -->
+typedef std::ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aeea2ad38b7e7fc2866f063dfed24c52"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::iterator" ref="aeea2ad38b7e7fc2866f063dfed24c52" args="" -->
+typedef internal::concurrent_queue_iterator<<br>
+ <a class="el" href="a00242.html">concurrent_bounded_queue</a>,<br>
+ T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0edd1a90e6ffa503bac1c4027116dbff"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::const_iterator" ref="0edd1a90e6ffa503bac1c4027116dbff" args="" -->
+typedef internal::concurrent_queue_iterator<<br>
+ <a class="el" href="a00242.html">concurrent_bounded_queue</a>,<br>
+ const T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e3525226732963ff0f13e89d8e6dab5b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="e3525226732963ff0f13e89d8e6dab5b" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a> (const <a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7b7fb414d2eaa8a7f5d68fc4cd63ac50"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="7b7fb414d2eaa8a7f5d68fc4cd63ac50" args="(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">concurrent_bounded_queue</a> (const <a class="el" href="a00242.html">concurrent_bounded_queue</a> &src, const <a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="a5e04dcd7db9fd9b583b4e7df832246a"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::concurrent_bounded_queue" ref="a5e04dcd7db9fd9b583b4e7df832246a" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
+template<typename InputIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00242.html#a5e04dcd7db9fd9b583b4e7df832246a">concurrent_bounded_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> &a=<a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="acaf5b510dc0dfc7780b8c956cf773cf"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::~concurrent_bounded_queue" ref="acaf5b510dc0dfc7780b8c956cf773cf" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ceb08c743b11ba88c878e73fff8af20b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::push" ref="ceb08c743b11ba88c878e73fff8af20b" args="(const T &source)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#ceb08c743b11ba88c878e73fff8af20b">push</a> (const T &source)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a> (T &destination)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Dequeue item from head of queue.  <a href="#41f4c6bd7a82ab070e840bbf81b0b123"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">try_push</a> (const T &source)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue if queue is not already full.  <a href="#2bd6232531279fb3ccbd296bea23066b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a> (T &destination)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue.  <a href="#0ca487019bbb00a196442aff78a1e4f7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return number of pushes minus number of pops.  <a href="#7dc14d1a579a4cccda9f857585e1768d"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f64924f2ee9225c368a270fc3c394db9"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::empty" ref="f64924f2ee9225c368a270fc3c394db9" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to <a class="el" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">size()</a><=0. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b2888b3e4e837d7e03f2c731963a402b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::capacity" ref="b2888b3e4e837d7e03f2c731963a402b" args="() const " -->
+<a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Maximum number of allowed elements. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a> (<a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Set the capacity.  <a href="#f3c6c934f85fd02aedbc83a16943193b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="415eb87e53b1c6a266de06ecbc490d16"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::get_allocator" ref="415eb87e53b1c6a266de06ecbc490d16" args="() const " -->
+<a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90b31e2954c6e4596c7900435a5f4bc1"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::clear" ref="90b31e2954c6e4596c7900435a5f4bc1" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">clear the queue. not thread-safe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a2637188e104503ac2c0dff633014e8"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_begin" ref="5a2637188e104503ac2c0dff633014e8" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c7267334ef11087c76c810abb9d5cbc2"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_end" ref="c7267334ef11087c76c810abb9d5cbc2" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8be757841d0bbf7744508aaf6a141d08"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_begin" ref="8be757841d0bbf7744508aaf6a141d08" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3aac91d288bf227d9d06717b44ef28f7"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::unsafe_end" ref="3aac91d288bf227d9d06717b44ef28f7" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> () const </td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>destroyer</b></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class used to ensure exception-safety of method "pop". <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-task that does nothing. Useful for synchronization. 
+<h3>template<typename T, class A = cache_aligned_allocator<T>><br>
+ class tbb::concurrent_bounded_queue< T, A ></h3>
+
+A high-performance thread-safe blocking concurrent bounded queue. 
 <p>
+This is the pre-PPL TBB concurrent queue which supports boundedness and blocking semantics. Note that method names agree with the PPL-style concurrent queue. Multiple threads may each push and pop concurrently. Assignment construction is not allowed. 
+<p>
+<hr><h2>Member Typedef Documentation</h2>
+<a class="anchor" name="a80e4c11dbb324e4b92a24a77bbcde68"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::size_type" ref="a80e4c11dbb324e4b92a24a77bbcde68" args="" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef std::ptrdiff_t <a class="el" href="a00242.html">tbb::concurrent_bounded_queue</a>< T, A >::<a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>          </td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Integral type for representing size of the queue. 
+<p>
+Note that the size_type is a signed integral type. This is because the size can be negative if there are pending pops without corresponding pushes. 
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="41f4c6bd7a82ab070e840bbf81b0b123"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::pop" ref="41f4c6bd7a82ab070e840bbf81b0b123" args="(T &destination)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="a00242.html">tbb::concurrent_bounded_queue</a>< T, A >::pop           </td>
+          <td>(</td>
+          <td class="paramtype">T & </td>
+          <td class="paramname"> <em>destination</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Dequeue item from head of queue. 
+<p>
+Block until an item becomes available, and then dequeue it. 
+</div>
+</div><p>
+<a class="anchor" name="f3c6c934f85fd02aedbc83a16943193b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::set_capacity" ref="f3c6c934f85fd02aedbc83a16943193b" args="(size_type new_capacity)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="a00242.html">tbb::concurrent_bounded_queue</a>< T, A >::set_capacity           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> </td>
+          <td class="paramname"> <em>new_capacity</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Set the capacity. 
+<p>
+Setting the capacity to 0 causes subsequent try_push operations to always fail, and subsequent push operations to block forever. 
+</div>
+</div><p>
+<a class="anchor" name="7dc14d1a579a4cccda9f857585e1768d"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::size" ref="7dc14d1a579a4cccda9f857585e1768d" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="el" href="a00242.html">tbb::concurrent_bounded_queue</a>< T, A >::size           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Return number of pushes minus number of pops. 
+<p>
+Note that the result can be negative if there are pops waiting for the corresponding pushes. The result can also exceed <a class="el" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">capacity()</a> if there are push operations in flight. 
+</div>
+</div><p>
+<a class="anchor" name="0ca487019bbb00a196442aff78a1e4f7"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::try_pop" ref="0ca487019bbb00a196442aff78a1e4f7" args="(T &destination)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00242.html">tbb::concurrent_bounded_queue</a>< T, A >::try_pop           </td>
+          <td>(</td>
+          <td class="paramtype">T & </td>
+          <td class="paramname"> <em>destination</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Attempt to dequeue an item from head of queue. 
+<p>
+Does not wait for item to become available. Returns true if successful; false otherwise. 
+</div>
+</div><p>
+<a class="anchor" name="2bd6232531279fb3ccbd296bea23066b"></a><!-- doxytag: member="tbb::concurrent_bounded_queue::try_push" ref="2bd6232531279fb3ccbd296bea23066b" args="(const T &source)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00242.html">tbb::concurrent_bounded_queue</a>< T, A >::try_push           </td>
+          <td>(</td>
+          <td class="paramtype">const T & </td>
+          <td class="paramname"> <em>source</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Enqueue an item at tail of queue if queue is not already full. 
+<p>
+Does not wait for queue to become not full. Returns true if item is pushed; false if queue was already full. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00567.html">task.h</a></ul>
+<li><a class="el" href="a00432.html">concurrent_queue.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00242.png b/doc/html/a00242.png
index 2fa6419..e9d90a2 100644
Binary files a/doc/html/a00242.png and b/doc/html/a00242.png differ
diff --git a/doc/html/a00243.html b/doc/html/a00243.html
index 069ebf5..796bd76 100644
--- a/doc/html/a00243.html
+++ b/doc/html/a00243.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference</title>
+<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,171 +21,620 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00243.html">enumerable_thread_specific</a></div>
-<h1>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00243.html">concurrent_hash_map</a></div>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator > Class Template Reference<br>
 <small>
-[<a class="el" href="a00372.html">Containers</a>]</small>
-</h1><!-- doxytag: class="tbb::interface6::enumerable_thread_specific" -->The <a class="el" href="a00243.html">enumerable_thread_specific</a> container.  
+[<a class="el" href="a00396.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map" -->Unordered map from Key to T.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00454.html">enumerable_thread_specific.h</a>></code>
+<code>#include <<a class="el" href="a00418.html">concurrent_hash_map.h</a>></code>
 <p>
-<a href="a00037.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00013.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3c03eb40955b933b01987222722ac4bd"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::allocator_type" ref="3c03eb40955b933b01987222722ac4bd" args="" -->
-typedef Allocator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#3c03eb40955b933b01987222722ac4bd">allocator_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e664e41a5b735a677f2ebbbcca0fcd80"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::key_type" ref="e664e41a5b735a677f2ebbbcca0fcd80" args="" -->
+typedef Key </td><td class="memItemRight" valign="bottom"><b>key_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Basic types. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e93f3b75e82eaa845cc1a0514eaba31a"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::value_type" ref="e93f3b75e82eaa845cc1a0514eaba31a" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="616243d5a0b6159299f2a34413e077e4"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::mapped_type" ref="616243d5a0b6159299f2a34413e077e4" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><b>mapped_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0fd259a6b20641c768079f41d3213904"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::reference" ref="0fd259a6b20641c768079f41d3213904" args="" -->
-typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ece048b19778bc31377185392ecf312b"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::value_type" ref="ece048b19778bc31377185392ecf312b" args="" -->
+typedef std::pair< const Key,<br>
+ T > </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c1d47e24439524fea72d9c10df25d54"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_reference" ref="2c1d47e24439524fea72d9c10df25d54" args="" -->
-typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="549109620a3331c83e46b8fe0636b883"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::size_type" ref="549109620a3331c83e46b8fe0636b883" args="" -->
+typedef hash_map_base::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27cf20b87f4381a69203aed11e5a34dc"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::pointer" ref="27cf20b87f4381a69203aed11e5a34dc" args="" -->
-typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0a4ffc8ac85bb2eb80a4e1909a373e2c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::difference_type" ref="0a4ffc8ac85bb2eb80a4e1909a373e2c" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e132e2a40dd6ce5472f8e13a1e80947"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_pointer" ref="0e132e2a40dd6ce5472f8e13a1e80947" args="" -->
-typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="341d2ae1e5e9d8ba05e5306a3933f31a"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::pointer" ref="341d2ae1e5e9d8ba05e5306a3933f31a" args="" -->
+typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c67c208bec3e8b77190d545bd1f150e3"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::size_type" ref="c67c208bec3e8b77190d545bd1f150e3" args="" -->
-typedef internal_collection_type::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b401731d22f457617f950416fde9bff"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_pointer" ref="4b401731d22f457617f950416fde9bff" args="" -->
+typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eda9be9a80bed094d4657948b5b7831f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::difference_type" ref="eda9be9a80bed094d4657948b5b7831f" args="" -->
-typedef internal_collection_type::difference_type </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2765bbab7bac8b74cfd79d269a2008b8"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::reference" ref="2765bbab7bac8b74cfd79d269a2008b8" args="" -->
+typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd6f8e0af3c5e5166a4223f88b03e0a5"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::iterator" ref="bd6f8e0af3c5e5166a4223f88b03e0a5" args="" -->
-typedef internal::enumerable_thread_specific_iterator<<br>
- <a class="el" href="a00238.html">internal_collection_type</a>,<br>
- value_type > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3b62b1930b2b88c98cb617f67bb9545"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_reference" ref="a3b62b1930b2b88c98cb617f67bb9545" args="" -->
+typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ff2ff1a117048f5d57aedebb12d57e1"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_iterator" ref="8ff2ff1a117048f5d57aedebb12d57e1" args="" -->
-typedef internal::enumerable_thread_specific_iterator<<br>
- <a class="el" href="a00238.html">internal_collection_type</a>,<br>
- const value_type > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83603b64f2507ee6560133d79a001eb2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::iterator" ref="83603b64f2507ee6560133d79a001eb2" args="" -->
+typedef internal::hash_map_iterator<<br>
+ <a class="el" href="a00243.html">concurrent_hash_map</a>, value_type > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d4c23a666adbf88bd3280873de9d7f39"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range_type" ref="d4c23a666adbf88bd3280873de9d7f39" args="" -->
-typedef generic_range_type<<br>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d47cbc7e0b0999b849187040f02557f5"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_iterator" ref="d47cbc7e0b0999b849187040f02557f5" args="" -->
+typedef internal::hash_map_iterator<<br>
+ <a class="el" href="a00243.html">concurrent_hash_map</a>, const <br>
+value_type > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="baeed4327d9c77f084bfb5ac8d519c96"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::range_type" ref="baeed4327d9c77f084bfb5ac8d519c96" args="" -->
+typedef internal::hash_map_range<<br>
  iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ce41c6603d8f547f11df05d1ccb2184"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_range_type" ref="0ce41c6603d8f547f11df05d1ccb2184" args="" -->
-typedef generic_range_type<<br>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e7700e8872566a5dc6d1c702b7949f4"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_range_type" ref="1e7700e8872566a5dc6d1c702b7949f4" args="" -->
+typedef internal::hash_map_range<<br>
  const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
 
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bf2a3ebce78da6d8be3b1803eb31a2e3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::allocator_type" ref="bf2a3ebce78da6d8be3b1803eb31a2e3" args="" -->
+typedef Allocator </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
+
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0cfa3a5c8f2be3bbf313d93b1fa8cdb3"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="0cfa3a5c8f2be3bbf313d93b1fa8cdb3" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#0cfa3a5c8f2be3bbf313d93b1fa8cdb3">enumerable_thread_specific</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ad413f5b666176e7669bf4c87d1ff3f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="1ad413f5b666176e7669bf4c87d1ff3f" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#1ad413f5b666176e7669bf4c87d1ff3f">concurrent_hash_map</a> (const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="46b9896317662c3cfa3c876ad7592a7c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="46b9896317662c3cfa3c876ad7592a7c" args="(size_type n, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#46b9896317662c3cfa3c876ad7592a7c">concurrent_hash_map</a> (size_type n, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty table with n preallocated buckets. This number serves also as initial concurrency level. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6fb14710893308fb47aaeee55ee30dc3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="6fb14710893308fb47aaeee55ee30dc3" args="(const concurrent_hash_map &table, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#6fb14710893308fb47aaeee55ee30dc3">concurrent_hash_map</a> (const <a class="el" href="a00243.html">concurrent_hash_map</a> &table, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="83c40f2053f208861b90390e12a36436"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::concurrent_hash_map" ref="83c40f2053f208861b90390e12a36436" args="(I first, I last, const allocator_type &a=allocator_type())" -->
+template<typename I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00243.html#83c40f2053f208861b90390e12a36436">concurrent_hash_map</a> (I first, I last, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with copying iteration range and given allocator instance. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="088d1aaccc816884a49e38f7065622c8"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::operator=" ref="088d1aaccc816884a49e38f7065622c8" args="(const concurrent_hash_map &table)" -->
+<a class="el" href="a00243.html">concurrent_hash_map</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#088d1aaccc816884a49e38f7065622c8">operator=</a> (const <a class="el" href="a00243.html">concurrent_hash_map</a> &table)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#94758113d8993cfe5afdf2d63a728869">rehash</a> (size_type n=0)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Rehashes and optionally resizes the whole table.  <a href="#94758113d8993cfe5afdf2d63a728869"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="220686fe17b197eedf19dd856cd02e36"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::clear" ref="220686fe17b197eedf19dd856cd02e36" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#220686fe17b197eedf19dd856cd02e36">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2aa8e2d28d5af1284cf78d20a9c22731"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::~concurrent_hash_map" ref="2aa8e2d28d5af1284cf78d20a9c22731" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#2aa8e2d28d5af1284cf78d20a9c22731">~concurrent_hash_map</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear table and destroy it. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ee6b69f390111c92318a85600dd9c559"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::range" ref="ee6b69f390111c92318a85600dd9c559" args="(size_type grainsize=1)" -->
+range_type </td><td class="memItemRight" valign="bottom"><b>range</b> (size_type grainsize=1)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d9a834a345415581bd801647945ea96b"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::range" ref="d9a834a345415581bd801647945ea96b" args="(size_type grainsize=1) const " -->
+const_range_type </td><td class="memItemRight" valign="bottom"><b>range</b> (size_type grainsize=1) const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35a8c373fc3d52099ae18f0553162491"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::begin" ref="35a8c373fc3d52099ae18f0553162491" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="67c50bddda53b9a10318f8981e4fc4fa"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::end" ref="67c50bddda53b9a10318f8981e4fc4fa" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>end</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c8ad3d9bb833063b3d09164199b8f7de"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::begin" ref="c8ad3d9bb833063b3d09164199b8f7de" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="75e7c0fb6addae180b6cc483b771fded"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::end" ref="75e7c0fb6addae180b6cc483b771fded" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>end</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8262e9ef1208a39e7ea087487fbe8368"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::equal_range" ref="8262e9ef1208a39e7ea087487fbe8368" args="(const Key &key)" -->
+std::pair< iterator, iterator > </td><td class="memItemRight" valign="bottom"><b>equal_range</b> (const Key &key)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b94bf1d3724f26299640e8b82787a75c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::equal_range" ref="b94bf1d3724f26299640e8b82787a75c" args="(const Key &key) const " -->
+std::pair< const_iterator,<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>equal_range</b> (const Key &key) const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6aa56a8b5a25e61a97fa0b54fe2b5659"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::size" ref="6aa56a8b5a25e61a97fa0b54fe2b5659" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Default constructor. Each local instance of T is default constructed. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="8d4b456ff9d7b289c73254eccc11db45"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="8d4b456ff9d7b289c73254eccc11db45" args="(Finit finit)" -->
-template<typename Finit> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00243.html#8d4b456ff9d7b289c73254eccc11db45">enumerable_thread_specific</a> (Finit finit)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Number of items in table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61ff2e5bb44e5469366fd5295e5d0ebe"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::empty" ref="61ff2e5bb44e5469366fd5295e5d0ebe" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#61ff2e5bb44e5469366fd5295e5d0ebe">empty</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor with initializer functor. Each local instance of T is constructed by T(finit()). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7bce6829981c9efe3f59cae2355e383e"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="7bce6829981c9efe3f59cae2355e383e" args="(const T &exemplar)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#7bce6829981c9efe3f59cae2355e383e">enumerable_thread_specific</a> (const T &exemplar)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if <a class="el" href="a00243.html#6aa56a8b5a25e61a97fa0b54fe2b5659">size()</a>==0. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2bce57fe9b594abe1e6d2568aea8b357"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::max_size" ref="2bce57fe9b594abe1e6d2568aea8b357" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#2bce57fe9b594abe1e6d2568aea8b357">max_size</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constuctor with exemplar. Each local instance of T is copied-constructed from the exemplar. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a7907d9e3e5b18e7a7b55211ef3213f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::~enumerable_thread_specific" ref="5a7907d9e3e5b18e7a7b55211ef3213f" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#5a7907d9e3e5b18e7a7b55211ef3213f">~enumerable_thread_specific</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Upper bound on size. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af34cb91b1d0f36a885a1a3432dd9af1"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_count" ref="af34cb91b1d0f36a885a1a3432dd9af1" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#af34cb91b1d0f36a885a1a3432dd9af1">bucket_count</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c8d5265ccbd5e4485996b3f3baaa5ba1"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::local" ref="c8d5265ccbd5e4485996b3f3baaa5ba1" args="()" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#c8d5265ccbd5e4485996b3f3baaa5ba1">local</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the current number of buckets. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6cbcacb4a256a85bf89576c101373ca7"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::get_allocator" ref="6cbcacb4a256a85bf89576c101373ca7" args="() const " -->
+allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">returns reference to local, discarding exists <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7dc79058d2832f7447de8e691c3455ea"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::local" ref="7dc79058d2832f7447de8e691c3455ea" args="(bool &exists)" -->
-reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#7dc79058d2832f7447de8e691c3455ea">local</a> (bool &exists)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="076f8d9e16110aac5f558777aa744eb6"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::swap" ref="076f8d9e16110aac5f558777aa744eb6" args="(concurrent_hash_map &table)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#076f8d9e16110aac5f558777aa744eb6">swap</a> (<a class="el" href="a00243.html">concurrent_hash_map</a> &table)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns reference to calling thread's local copy, creating one if necessary. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="33fd6593da1ed14340f10f67d5a69130"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::size" ref="33fd6593da1ed14340f10f67d5a69130" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#33fd6593da1ed14340f10f67d5a69130">size</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">swap two instances. Iterators are invalidated <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6968eb6feed2df36be421df0464297af"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::count" ref="6968eb6feed2df36be421df0464297af" args="(const Key &key) const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#6968eb6feed2df36be421df0464297af">count</a> (const Key &key) const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get the number of local copies. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72595886d0ac8fd0543f90038570510d"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::empty" ref="72595886d0ac8fd0543f90038570510d" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#72595886d0ac8fd0543f90038570510d">empty</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return count of items (0 or 1). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#2afcc33dade7bb24e008d60c0df38230">find</a> (<a class="el" href="a00246.html">const_accessor</a> &result, const Key &key) const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">true if there have been no local copies created <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="01d7baf8e913ab2819e97917a2ac795f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::begin" ref="01d7baf8e913ab2819e97917a2ac795f" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#01d7baf8e913ab2819e97917a2ac795f">begin</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Find item and acquire a read lock on the item.  <a href="#2afcc33dade7bb24e008d60c0df38230"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#7bc475d1968f7f0af3d736d7e8a0d7df">find</a> (<a class="el" href="a00244.html">accessor</a> &result, const Key &key)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">begin iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2456ff88252fc921b01cd8907628a4ee"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::end" ref="2456ff88252fc921b01cd8907628a4ee" args="()" -->
-iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#2456ff88252fc921b01cd8907628a4ee">end</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Find item and acquire a write lock on the item.  <a href="#7bc475d1968f7f0af3d736d7e8a0d7df"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#47fe0e60151a9bd7a444db827772a4e6">insert</a> (<a class="el" href="a00246.html">const_accessor</a> &result, const Key &key)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="84afb3906a39e399cde1c950d6351300"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::begin" ref="84afb3906a39e399cde1c950d6351300" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#84afb3906a39e399cde1c950d6351300">begin</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item (if not already present) and acquire a read lock on the item.  <a href="#47fe0e60151a9bd7a444db827772a4e6"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#54e0955ecd11575b4c07166838a72893">insert</a> (<a class="el" href="a00244.html">accessor</a> &result, const Key &key)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">begin const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cb448bb4977ce366ceb7344085cc7050"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::end" ref="cb448bb4977ce366ceb7344085cc7050" args="() const " -->
-const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#cb448bb4977ce366ceb7344085cc7050">end</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item (if not already present) and acquire a write lock on the item.  <a href="#54e0955ecd11575b4c07166838a72893"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#091efd2d12fdad4fe9e54d9629a9dfc3">insert</a> (<a class="el" href="a00246.html">const_accessor</a> &result, const value_type &value)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b22c54990b2362cd93c1a8f73de140bc"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range" ref="b22c54990b2362cd93c1a8f73de140bc" args="(size_t grainsize=1)" -->
-range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#b22c54990b2362cd93c1a8f73de140bc">range</a> (size_t grainsize=1)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already and acquire a read lock on the item.  <a href="#091efd2d12fdad4fe9e54d9629a9dfc3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#39183d78d6e8425917555ab542ab92de">insert</a> (<a class="el" href="a00244.html">accessor</a> &result, const value_type &value)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get range for parallel algorithms. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3b068000cf4dbf9b40f8bb7e3fc53e0b"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range" ref="3b068000cf4dbf9b40f8bb7e3fc53e0b" args="(size_t grainsize=1) const " -->
-const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">range</a> (size_t grainsize=1) const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already and acquire a write lock on the item.  <a href="#39183d78d6e8425917555ab542ab92de"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#3f121a316af8135de476a30fae6d7c07">insert</a> (const value_type &value)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const range for parallel algorithms. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8764176d4b6014c5d65f1051851abc8"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::clear" ref="a8764176d4b6014c5d65f1051851abc8" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#a8764176d4b6014c5d65f1051851abc8">clear</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert item by copying if there is no such key present already.  <a href="#3f121a316af8135de476a30fae6d7c07"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1dd37fad87e561151ba1e242ca94bcc1"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="1dd37fad87e561151ba1e242ca94bcc1" args="(I first, I last)" -->
+template<typename I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00243.html#1dd37fad87e561151ba1e242ca94bcc1">insert</a> (I first, I last)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys local copies. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="43bbf3a313c5431559df2946f76221e0"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="43bbf3a313c5431559df2946f76221e0" args="(const enumerable_thread_specific< U, Alloc, Cachetype > &other)" -->
-template<typename U, typename Alloc, ets_key_usage_type Cachetype> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00243.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert range [first, last). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#f27802b3a8d1863c29e743e9c6b4e870">erase</a> (const Key &key)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="25a9c336cfd5a171c29cbdd0feb84249"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="25a9c336cfd5a171c29cbdd0feb84249" args="(const enumerable_thread_specific &other)" -->
- </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00243.html">enumerable_thread_specific</a> &other)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item.  <a href="#f27802b3a8d1863c29e743e9c6b4e870"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#e698ef3d70b2d1a29a7a5551784d3653">erase</a> (<a class="el" href="a00246.html">const_accessor</a> &item_accessor)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f8f467eb4c44c58614d0f9dce687477"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::operator=" ref="1f8f467eb4c44c58614d0f9dce687477" args="(const enumerable_thread_specific &other)" -->
-<a class="el" href="a00243.html">enumerable_thread_specific</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00243.html">enumerable_thread_specific</a> &other)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by <a class="el" href="a00246.html">const_accessor</a>.  <a href="#e698ef3d70b2d1a29a7a5551784d3653"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#5f12d150d421420965db07368666a84f">erase</a> (<a class="el" href="a00244.html">accessor</a> &item_accessor)</td></tr>
 
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0e7ebbfd8e04eb22fe59b581206e7888"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::operator=" ref="0e7ebbfd8e04eb22fe59b581206e7888" args="(const enumerable_thread_specific< U, Alloc, Cachetype > &other)" -->
-template<typename U, typename Alloc, ets_key_usage_type Cachetype> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00243.html">enumerable_thread_specific</a> & </td><td class="memTemplItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00243.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Erase item by accessor.  <a href="#5f12d150d421420965db07368666a84f"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2066e7e0fec7813db8fe9c8b9368c9e5"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::node_allocator_type" ref="2066e7e0fec7813db8fe9c8b9368c9e5" args="" -->
+typedef Allocator::template <br>
+rebind< node >::other </td><td class="memItemRight" valign="bottom"><b>node_allocator_type</b></td></tr>
 
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1eac7eff6e21b7fc299b67acb36eb3c7"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::combine" ref="1eac7eff6e21b7fc299b67acb36eb3c7" args="(combine_func_t f_combine)" -->
-template<typename combine_func_t> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>combine</b> (combine_func_t f_combine)</td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="559190b7953177b4967a3312f557318f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::delete_node" ref="559190b7953177b4967a3312f557318f" args="(node_base *n)" -->
+void </td><td class="memItemRight" valign="bottom"><b>delete_node</b> (node_base *n)</td></tr>
 
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f671d7bd4c1d3a750b4be4c32a489c55"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::combine_each" ref="f671d7bd4c1d3a750b4be4c32a489c55" args="(combine_func_t f_combine)" -->
-template<typename combine_func_t> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="32ec82223d843f1c2b95fa37acb7f4bb"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::search_bucket" ref="32ec82223d843f1c2b95fa37acb7f4bb" args="(const key_type &key, bucket *b) const " -->
+node * </td><td class="memItemRight" valign="bottom"><b>search_bucket</b> (const key_type &key, bucket *b) const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4962c7da24793ccc05524cc3bbcf1efa"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::rehash_bucket" ref="4962c7da24793ccc05524cc3bbcf1efa" args="(bucket *b_new, const hashcode_t h)" -->
+void </td><td class="memItemRight" valign="bottom"><b>rehash_bucket</b> (bucket *b_new, const hashcode_t h)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3f3413264a99174a224ef96f6c4ea769"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::lookup" ref="3f3413264a99174a224ef96f6c4ea769" args="(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#3f3413264a99174a224ef96f6c4ea769">lookup</a> (bool op_insert, const Key &key, const T *t, <a class="el" href="a00246.html">const_accessor</a> *result, bool write)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Insert or find item and optionally acquire a lock on the item. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c964214eb38f54603aa75fdff6d2709"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::exclude" ref="0c964214eb38f54603aa75fdff6d2709" args="(const_accessor &item_accessor)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#0c964214eb38f54603aa75fdff6d2709">exclude</a> (<a class="el" href="a00246.html">const_accessor</a> &item_accessor)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">delete item by accessor <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="8f5373b8e1864619d1ffcf3bf3f1f13d"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_equal_range" ref="8f5373b8e1864619d1ffcf3bf3f1f13d" args="(const Key &key, I end) const " -->
+template<typename I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">std::pair< I, I > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00243.html#8f5373b8e1864619d1ffcf3bf3f1f13d">internal_equal_range</a> (const Key &key, I end) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns an iterator for an item defined by the key, or for the next item after it (if upper==true). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72c9c9e9655fcf096f5f0ed9c8ba6669"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_copy" ref="72c9c9e9655fcf096f5f0ed9c8ba6669" args="(const concurrent_hash_map &source)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a> (const <a class="el" href="a00243.html">concurrent_hash_map</a> &source)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy "source" to *this, where *this must start out empty. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1ec1fe8dfa2d7894bf0589bfdbcb1f96"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_copy" ref="1ec1fe8dfa2d7894bf0589bfdbcb1f96" args="(I first, I last)" -->
+template<typename I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>internal_copy</b> (I first, I last)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html#2f76ed101a0ccc8875b846c2f747897e">internal_fast_find</a> (const Key &key) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast find when no concurrent erasure is used. For internal use inside TBB only!  <a href="#2f76ed101a0ccc8875b846c2f747897e"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a72cb6e9873e5541295682179e5a7f74"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::my_allocator" ref="a72cb6e9873e5541295682179e5a7f74" args="" -->
+node_allocator_type </td><td class="memItemRight" valign="bottom"><b>my_allocator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="53c747a3f2d2d2c85aec866e19c31c29"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::my_hash_compare" ref="53c747a3f2d2d2c85aec866e19c31c29" args="" -->
+HashCompare </td><td class="memItemRight" valign="bottom"><b>my_hash_compare</b></td></tr>
 
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45364b2f249ceb935cff05c29fcfcf5c"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="45364b2f249ceb935cff05c29fcfcf5c" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e24acd2f6849db3377a3942807639758"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal::hash_map_iterator" ref="e24acd2f6849db3377a3942807639758" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::hash_map_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c94f21746c8902f7e0b5115a8d4da1d2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal::hash_map_range" ref="c94f21746c8902f7e0b5115a8d4da1d2" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::hash_map_range</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c0028dfa75a6baa14007355ab1ef7fc"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor" ref="2c0028dfa75a6baa14007355ab1ef7fc" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>const_accessor</b></td></tr>
 
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>generic_range_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00244.html">accessor</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allows write access to elements and combines data access, locking, and garbage collection.  <a href="a00244.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html">bucket_accessor</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">bucket accessor is to find, rehash, acquire a lock, and access a bucket  <a href="a00245.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00246.html">const_accessor</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Combines data access, locking, and garbage collection.  <a href="a00246.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>node</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A generic range, used to create range objects from the iterators. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename Allocator = cache_aligned_allocator<T>, ets_key_usage_type ETS_key_type = ets_no_key><br>
- class tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></h3>
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></h3>
 
-The <a class="el" href="a00243.html">enumerable_thread_specific</a> container. 
+Unordered map from Key to T. 
 <p>
-<a class="el" href="a00243.html">enumerable_thread_specific</a> has the following properties:<ul>
-<li>thread-local copies are lazily created, with default, exemplar or function initialization.</li><li>thread-local copies do not move (during lifetime, and excepting <a class="el" href="a00243.html#a8764176d4b6014c5d65f1051851abc8">clear()</a>) so the address of a copy is invariant.</li><li>the contained objects need not have operator=() defined if combine is not used.</li><li><a class="el" href="a00243.html">enumerable_thread_specific</a> containers may be copy-constructed or assigned. [...]
-<p>
-<dl compact><dt><b>Segmented iterator</b></dt><dd>When the thread-local objects are containers with input_iterators defined, a segmented iterator may be used to iterate over all the elements of all thread-local copies.</dd></dl>
-<dl compact><dt><b>combine and combine_each</b></dt><dd><ul>
-<li>Both methods are defined for <a class="el" href="a00243.html">enumerable_thread_specific</a>.</li><li>combine() requires the the type T have operator=() defined.</li><li>neither method modifies the contents of the object (though there is no guarantee that the applied methods do not modify the object.)</li><li>Both are evaluated in serial context (the methods are assumed to be non-benign.) </li></ul>
+<a class="el" href="a00243.html">concurrent_hash_map</a> is associative container with concurrent access.<p>
+<dl compact><dt><b>Compatibility</b></dt><dd>The class meets all Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1).</dd></dl>
+<dl compact><dt><b>Exception Safety</b></dt><dd><ul>
+<li>Hash function is not permitted to throw an exception. User-defined types Key and T are forbidden from throwing an exception in destructors.</li><li>If exception happens during <a class="el" href="a00243.html#47fe0e60151a9bd7a444db827772a4e6">insert()</a> operations, it has no effect (unless exception raised by HashCompare::hash() function during grow_segment).</li><li>If exception happens during <a class="el" href="a00243.html#088d1aaccc816884a49e38f7065622c8">operator=()</a> operati [...]
+</dd></dl>
+<dl compact><dt><b>Changes since TBB 2.1</b></dt><dd><ul>
+<li>Replaced internal algorithm and data structure. Patent is pending.</li><li>Added buckets number argument for constructor</li></ul>
+</dd></dl>
+<dl compact><dt><b>Changes since TBB 2.0</b></dt><dd><ul>
+<li>Fixed exception-safety</li><li>Added template argument for allocator</li><li>Added allocator argument in constructors</li><li>Added constructor from a range of iterators</li><li>Added several new overloaded <a class="el" href="a00243.html#47fe0e60151a9bd7a444db827772a4e6">insert()</a> methods</li><li>Added <a class="el" href="a00243.html#6cbcacb4a256a85bf89576c101373ca7">get_allocator()</a></li><li>Added <a class="el" href="a00243.html#076f8d9e16110aac5f558777aa744eb6">swap()</a></li [...]
 </dd></dl>
 
 <p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="5f12d150d421420965db07368666a84f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::erase" ref="5f12d150d421420965db07368666a84f" args="(accessor &item_accessor)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00244.html">accessor</a> & </td>
+          <td class="paramname"> <em>item_accessor</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Erase item by accessor. 
+<p>
+Return true if item was erased by particularly this call. 
+</div>
+</div><p>
+<a class="anchor" name="e698ef3d70b2d1a29a7a5551784d3653"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::erase" ref="e698ef3d70b2d1a29a7a5551784d3653" args="(const_accessor &item_accessor)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::erase           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00246.html">const_accessor</a> & </td>
+          <td class="paramname"> <em>item_accessor</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Erase item by <a class="el" href="a00246.html">const_accessor</a>. 
+<p>
+Return true if item was erased by particularly this call. 
+</div>
+</div><p>
+<a class="anchor" name="f27802b3a8d1863c29e743e9c6b4e870"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::erase" ref="f27802b3a8d1863c29e743e9c6b4e870" args="(const Key &key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename A> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, A >::erase           </td>
+          <td>(</td>
+          <td class="paramtype">const Key & </td>
+          <td class="paramname"> <em>key</em>          </td>
+          <td> ) </td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Erase item. 
+<p>
+Return true if item was erased by particularly this call. 
+</div>
+</div><p>
+<a class="anchor" name="7bc475d1968f7f0af3d736d7e8a0d7df"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::find" ref="7bc475d1968f7f0af3d736d7e8a0d7df" args="(accessor &result, const Key &key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00244.html">accessor</a> & </td>
+          <td class="paramname"> <em>result</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const Key & </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Find item and acquire a write lock on the item. 
+<p>
+Return true if item is found, false otherwise. 
+</div>
+</div><p>
+<a class="anchor" name="2afcc33dade7bb24e008d60c0df38230"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::find" ref="2afcc33dade7bb24e008d60c0df38230" args="(const_accessor &result, const Key &key) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::find           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00246.html">const_accessor</a> & </td>
+          <td class="paramname"> <em>result</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const Key & </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Find item and acquire a read lock on the item. 
+<p>
+Return true if item is found, false otherwise. 
+</div>
+</div><p>
+<a class="anchor" name="3f121a316af8135de476a30fae6d7c07"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="3f121a316af8135de476a30fae6d7c07" args="(const value_type &value)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert           </td>
+          <td>(</td>
+          <td class="paramtype">const value_type & </td>
+          <td class="paramname"> <em>value</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item by copying if there is no such key present already. 
+<p>
+Returns true if item is inserted. 
+</div>
+</div><p>
+<a class="anchor" name="39183d78d6e8425917555ab542ab92de"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="39183d78d6e8425917555ab542ab92de" args="(accessor &result, const value_type &value)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00244.html">accessor</a> & </td>
+          <td class="paramname"> <em>result</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const value_type & </td>
+          <td class="paramname"> <em>value</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item by copying if there is no such key present already and acquire a write lock on the item. 
+<p>
+Returns true if item is new. 
+</div>
+</div><p>
+<a class="anchor" name="091efd2d12fdad4fe9e54d9629a9dfc3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="091efd2d12fdad4fe9e54d9629a9dfc3" args="(const_accessor &result, const value_type &value)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00246.html">const_accessor</a> & </td>
+          <td class="paramname"> <em>result</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const value_type & </td>
+          <td class="paramname"> <em>value</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item by copying if there is no such key present already and acquire a read lock on the item. 
+<p>
+Returns true if item is new. 
+</div>
+</div><p>
+<a class="anchor" name="54e0955ecd11575b4c07166838a72893"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="54e0955ecd11575b4c07166838a72893" args="(accessor &result, const Key &key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00244.html">accessor</a> & </td>
+          <td class="paramname"> <em>result</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const Key & </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item (if not already present) and acquire a write lock on the item. 
+<p>
+Returns true if item is new. 
+</div>
+</div><p>
+<a class="anchor" name="47fe0e60151a9bd7a444db827772a4e6"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::insert" ref="47fe0e60151a9bd7a444db827772a4e6" args="(const_accessor &result, const Key &key)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::insert           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00246.html">const_accessor</a> & </td>
+          <td class="paramname"> <em>result</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const Key & </td>
+          <td class="paramname"> <em>key</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Insert item (if not already present) and acquire a read lock on the item. 
+<p>
+Returns true if item is new. 
+</div>
+</div><p>
+<a class="anchor" name="2f76ed101a0ccc8875b846c2f747897e"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::internal_fast_find" ref="2f76ed101a0ccc8875b846c2f747897e" args="(const Key &key) const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename Allocator> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">const_pointer <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, Allocator >::internal_fast_find           </td>
+          <td>(</td>
+          <td class="paramtype">const Key & </td>
+          <td class="paramname"> <em>key</em>          </td>
+          <td> ) </td>
+          <td width="100%"> const<code> [inline, protected]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Fast find when no concurrent erasure is used. For internal use inside TBB only! 
+<p>
+Return pointer to item with given key, or NULL if no such item exists. Must not be called concurrently with erasure operations. 
+</div>
+</div><p>
+<a class="anchor" name="94758113d8993cfe5afdf2d63a728869"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::rehash" ref="94758113d8993cfe5afdf2d63a728869" args="(size_type n=0)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Key, typename T, typename HashCompare, typename A> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map</a>< Key, T, HashCompare, A >::rehash           </td>
+          <td>(</td>
+          <td class="paramtype">size_type </td>
+          <td class="paramname"> <em>n</em> = <code>0</code>          </td>
+          <td> ) </td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Rehashes and optionally resizes the whole table. 
+<p>
+Useful to optimize performance before or after concurrent operations. Also enables using of <a class="el" href="a00243.html#2afcc33dade7bb24e008d60c0df38230">find()</a> and <a class="el" href="a00243.html#6968eb6feed2df36be421df0464297af">count()</a> concurrent methods in serial context. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00454.html">enumerable_thread_specific.h</a></ul>
+<li><a class="el" href="a00418.html">concurrent_hash_map.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00244.html b/doc/html/a00244.html
index 0e33679..55bf422 100644
--- a/doc/html/a00244.html
+++ b/doc/html/a00244.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::executable_node< Output > Class Template Reference</title>
+<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,63 +21,42 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00244.html">executable_node</a></div>
-<h1>tbb::executable_node< Output > Class Template Reference</h1><!-- doxytag: class="tbb::executable_node" --><!-- doxytag: inherits="tbb::graph_node" -->Implements an executable node that supports <a class="el" href="a00239.html">continue_msg</a> -> Output.  
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00243.html">concurrent_hash_map</a>::<a class="el" href="a00244.html">accessor</a></div>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor Class Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map::accessor" --><!-- doxytag: inherits="tbb::interface5::concurrent_hash_map::const_accessor" -->Allows write access to elements and combines data access, locking, and garbage collection.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00418.html">concurrent_hash_map.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::executable_node< Output >:
-<p><center><img src="a00244.png" usemap="#tbb::executable_node< Output >_map" border="0" alt=""></center>
-<map name="tbb::executable_node< Output >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,192,24">
-<area href="a00240.html" alt="tbb::continue_node" shape="rect" coords="0,112,192,136">
+<p>Inheritance diagram for tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor:
+<p><center><img src="a00244.png" usemap="#tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map" border="0" alt=""></center>
+<map name="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor_map">
+<area href="a00246.html" alt="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor" shape="rect" coords="0,0,530,24">
 </map>
-<a href="a00050.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00017.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2ff2aa9a54056c999963717dcf5e539d"></a><!-- doxytag: member="tbb::executable_node::input_type" ref="2ff2aa9a54056c999963717dcf5e539d" args="" -->
-typedef <a class="el" href="a00239.html">continue_msg</a> </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09edc2515bc199f58b29b7a54e45f4d5"></a><!-- doxytag: member="tbb::executable_node::output_type" ref="09edc2515bc199f58b29b7a54e45f4d5" args="" -->
-typedef Output </td><td class="memItemRight" valign="bottom"><b>output_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="85c2d48065a194e75175a5a4e55ea0dd"></a><!-- doxytag: member="tbb::executable_node::predecessor_type" ref="85c2d48065a194e75175a5a4e55ea0dd" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00239.html">input_type</a> > </td><td class="memItemRight" valign="bottom"><b>predecessor_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f38af33d6c53ca2822af6b739686f6b3"></a><!-- doxytag: member="tbb::executable_node::successor_type" ref="f38af33d6c53ca2822af6b739686f6b3" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< output_type > </td><td class="memItemRight" valign="bottom"><b>successor_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b648be7a95a8fb2971042c15eb112c1"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::accessor::value_type" ref="0b648be7a95a8fb2971042c15eb112c1" args="" -->
+typedef concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00244.html#0b648be7a95a8fb2971042c15eb112c1">value_type</a></td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of value. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="73d4304b322a25ed0df468e607dd1dac"></a><!-- doxytag: member="tbb::executable_node::executable_node" ref="73d4304b322a25ed0df468e607dd1dac" args="(graph &g, Body body)" -->
-template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00244.html#73d4304b322a25ed0df468e607dd1dac">executable_node</a> (<a class="el" href="a00250.html">graph</a> &g, Body body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor for executable node with <a class="el" href="a00239.html">continue_msg</a> -> Output. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="c13030111d34feeafd9cdb1dd21584f1"></a><!-- doxytag: member="tbb::executable_node::executable_node" ref="c13030111d34feeafd9cdb1dd21584f1" args="(graph &g, int number_of_predecessors, Body body)" -->
-template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00244.html#c13030111d34feeafd9cdb1dd21584f1">executable_node</a> (<a class="el" href="a00250.html">graph</a> &g, int number_of_predecessors, Body body)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor for executable node with <a class="el" href="a00239.html">continue_msg</a> -> Output. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bde6744db670181fe37a34decce95c56"></a><!-- doxytag: member="tbb::executable_node::successors" ref="bde6744db670181fe37a34decce95c56" args="()" -->
-internal::broadcast_cache<<br>
- output_type > & </td><td class="memItemRight" valign="bottom"><b>successors</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="170280ea807a22e742095de3e8c5ea38"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::accessor::operator *" ref="170280ea807a22e742095de3e8c5ea38" args="() const " -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00244.html#170280ea807a22e742095de3e8c5ea38">operator *</a> () const </td></tr>
 
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1b9b210a5ae77091dd1ed18cc36e6967"></a><!-- doxytag: member="tbb::executable_node::my_successors" ref="1b9b210a5ae77091dd1ed18cc36e6967" args="" -->
-internal::broadcast_cache<<br>
- output_type > </td><td class="memItemRight" valign="bottom"><b>my_successors</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return reference to associated value in hash table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a807920cdffe3ec5c5e282b4d1ff92a2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::accessor::operator->" ref="a807920cdffe3ec5c5e282b4d1ff92a2" args="() const " -->
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00244.html#a807920cdffe3ec5c5e282b4d1ff92a2">operator-></a> () const </td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return pointer to associated value in hash table. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Output><br>
- class tbb::executable_node< Output ></h3>
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</h3>
 
-Implements an executable node that supports <a class="el" href="a00239.html">continue_msg</a> -> Output. 
+Allows write access to elements and combines data access, locking, and garbage collection. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00418.html">concurrent_hash_map.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00244.png b/doc/html/a00244.png
index a8702b0..9fd6a57 100644
Binary files a/doc/html/a00244.png and b/doc/html/a00244.png differ
diff --git a/doc/html/a00245.html b/doc/html/a00245.html
index d4d7390..456a14b 100644
--- a/doc/html/a00245.html
+++ b/doc/html/a00245.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::filter Class Reference</title>
+<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,210 +21,39 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00245.html">filter</a></div>
-<h1>tbb::filter Class Reference<br>
-<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::filter" -->A stage in a pipeline.  
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00243.html">concurrent_hash_map</a>::<a class="el" href="a00245.html">bucket_accessor</a></div>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor Class Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map::bucket_accessor" -->bucket accessor is to find, rehash, acquire a lock, and access a bucket  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00546.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00418.html">concurrent_hash_map.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::filter:
-<p><center><img src="a00245.png" usemap="#tbb::filter_map" border="0" alt=""></center>
-<map name="tbb::filter_map">
-<area href="a00301.html" alt="tbb::thread_bound_filter" shape="rect" coords="0,56,145,80">
-</map>
-<a href="a00093.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00015.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcfec27656a69ff2072802ac001e936f"></a><!-- doxytag: member="tbb::filter::is_serial" ref="fcfec27656a69ff2072802ac001e936f" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#fcfec27656a69ff2072802ac001e936f">is_serial</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b1dcb174ab54b8612b25b6126d18d6c3"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::bucket_accessor" ref="b1dcb174ab54b8612b25b6126d18d6c3" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
+ </td><td class="memItemRight" valign="bottom"><b>bucket_accessor</b> (<a class="el" href="a00243.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter is serial. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd53206c4795ef2df5df26b795caf692"></a><!-- doxytag: member="tbb::filter::is_ordered" ref="cd53206c4795ef2df5df26b795caf692" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a> () const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d11c77f4d70a94d4fb344492bbf18007"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::acquire" ref="d11c77f4d70a94d4fb344492bbf18007" args="(concurrent_hash_map *base, const hashcode_t h, bool writer=false)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#d11c77f4d70a94d4fb344492bbf18007">acquire</a> (<a class="el" href="a00243.html">concurrent_hash_map</a> *base, const hashcode_t h, bool writer=false)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter must receive stream in order. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15c29cae5d237e6d63dbfe5c94af89d5"></a><!-- doxytag: member="tbb::filter::is_bound" ref="15c29cae5d237e6d63dbfe5c94af89d5" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">find a bucket by masked hashcode, optionally rehash, and acquire the lock <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="07d958f151a0eaa92f50fd56ad6440e2"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::is_writer" ref="07d958f151a0eaa92f50fd56ad6440e2" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter is thread-bound. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ec4dfe053e94a2349d56781ddea8477"></a><!-- doxytag: member="tbb::filter::object_may_be_null" ref="8ec4dfe053e94a2349d56781ddea8477" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">true if an input filter can emit null <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a> (void *item)=0</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Operate on an item from the input stream, and return item for output stream.  <a href="#fa1b3dc1f4f47563ccab7f4d92f5b543"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#66d159f362293e3964ba3da8bc1d2604">~filter</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy filter.  <a href="#66d159f362293e3964ba3da8bc1d2604"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#56275eb889c77c4807967133e21401bd">finalize</a> (void *)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys item if pipeline was cancelled.  <a href="#56275eb889c77c4807967133e21401bd"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1edba30e1e64e82ee4b7c6f227825817"></a><!-- doxytag: member="tbb::filter::x1" ref="1edba30e1e64e82ee4b7c6f227825817" args="((is_serial_?serial:parallel)|exact_exception_propagation))" -->
- </td><td class="memItemRight" valign="bottom"><b>x1</b> ((is_serial_?serial:parallel)|<a class="el" href="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>))</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a06145c3e7ad273ece95eb8be642b0a2"></a><!-- doxytag: member="tbb::filter::prev_filter_in_pipeline" ref="a06145c3e7ad273ece95eb8be642b0a2" args="(not_in_pipeline())" -->
- </td><td class="memItemRight" valign="bottom"><b>prev_filter_in_pipeline</b> (not_in_pipeline())</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7a54082a9165275bf7725970d756f132"></a><!-- doxytag: member="tbb::filter::my_pipeline" ref="7a54082a9165275bf7725970d756f132" args="(NULL)" -->
- </td><td class="memItemRight" valign="bottom"><b>my_pipeline</b> (NULL)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d66d6e9e27b1be74fdb9c07f899d4837"></a><!-- doxytag: member="tbb::filter::next_segment" ref="d66d6e9e27b1be74fdb9c07f899d4837" args="(NULL)" -->
- </td><td class="memItemRight" valign="bottom"><b>next_segment</b> (NULL)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3f49df3c34a3e5a8884001c30230a94"></a><!-- doxytag: member="tbb::filter::filter" ref="a3f49df3c34a3e5a8884001c30230a94" args="(mode filter_mode)" -->
- </td><td class="memItemRight" valign="bottom"><b>filter</b> (mode filter_mode)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b2b9c0dd8123a8186b46bc100d9469f5"></a><!-- doxytag: member="tbb::filter::set_end_of_input" ref="b2b9c0dd8123a8186b46bc100d9469f5" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>set_end_of_input</b> ()</td></tr>
-
-<tr><td colspan="2"><br><h2>Static Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b7de3a76e744f3d9c1bc5d437ea851d"></a><!-- doxytag: member="tbb::filter::filter_is_serial" ref="4b7de3a76e744f3d9c1bc5d437ea851d" args="" -->
-static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> = 0x1</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The lowest bit 0 is for parallel vs. serial. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a> = 0x1<<4</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">4th bit distinguishes ordered vs unordered filters.  <a href="#2e5eb65f95d8050186278077e433c5b1"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd6a6e7210efc9bcaf2c5e08767d92b5"></a><!-- doxytag: member="tbb::filter::filter_is_bound" ref="dd6a6e7210efc9bcaf2c5e08767d92b5" args="" -->
-static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> = 0x1<<5</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">5th bit distinguishes thread-bound and regular filters. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bdd02a434a6e7499dd1e8f43aae96793"></a><!-- doxytag: member="tbb::filter::filter_may_emit_null" ref="bdd02a434a6e7499dd1e8f43aae96793" args="" -->
-static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> = 0x1<<6</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">6th bit marks input filters emitting small objects <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">7th bit defines exception propagation mode expected by the application.  <a href="#f17200974c33be21f42a5f00893de028"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8228ce0751009045e8158d2e642715a6"></a><!-- doxytag: member="tbb::filter::internal::stage_task" ref="8228ce0751009045e8158d2e642715a6" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::stage_task</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d67150ca324698ba852553e223d3eb"></a><!-- doxytag: member="tbb::filter::internal::pipeline_root_task" ref="05d67150ca324698ba852553e223d3eb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_root_task</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b211ee58bada099e24280d478017cbff"></a><!-- doxytag: member="tbb::filter::pipeline" ref="b211ee58bada099e24280d478017cbff" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>pipeline</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43b69a482df8e053cb199af69eb5139"></a><!-- doxytag: member="tbb::filter::thread_bound_filter" ref="e43b69a482df8e053cb199af69eb5139" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">check whether bucket is locked for write <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa6314b861c574f86ed189b124cf5853"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::bucket_accessor::operator()" ref="fa6314b861c574f86ed189b124cf5853" args="()" -->
+bucket * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html#fa6314b861c574f86ed189b124cf5853">operator()</a> ()</td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">get bucket pointer <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-A stage in a pipeline. 
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="66d159f362293e3964ba3da8bc1d2604"></a><!-- doxytag: member="tbb::filter::~filter" ref="66d159f362293e3964ba3da8bc1d2604" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">virtual __TBB_EXPORTED_METHOD tbb::filter::~filter           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Destroy filter. 
-<p>
-If the filter was added to a pipeline, the pipeline must be destroyed first. 
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="56275eb889c77c4807967133e21401bd"></a><!-- doxytag: member="tbb::filter::finalize" ref="56275eb889c77c4807967133e21401bd" args="(void *)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">virtual void tbb::filter::finalize           </td>
-          <td>(</td>
-          <td class="paramtype">void * </td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Destroys item if pipeline was cancelled. 
-<p>
-Required to prevent memory leaks. Note it can be called concurrently even for serial filters. 
-</div>
-</div><p>
-<a class="anchor" name="fa1b3dc1f4f47563ccab7f4d92f5b543"></a><!-- doxytag: member="tbb::filter::operator()" ref="fa1b3dc1f4f47563ccab7f4d92f5b543" args="(void *item)=0" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">virtual void* tbb::filter::operator()           </td>
-          <td>(</td>
-          <td class="paramtype">void * </td>
-          <td class="paramname"> <em>item</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [pure virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</h3>
 
+bucket accessor is to find, rehash, acquire a lock, and access a bucket 
 <p>
-Operate on an item from the input stream, and return item for output stream. 
-<p>
-Returns NULL if filter is a sink. 
-</div>
-</div><p>
-<hr><h2>Member Data Documentation</h2>
-<a class="anchor" name="f17200974c33be21f42a5f00893de028"></a><!-- doxytag: member="tbb::filter::exact_exception_propagation" ref="f17200974c33be21f42a5f00893de028" args="" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">const unsigned char <a class="el" href="a00245.html#f17200974c33be21f42a5f00893de028">tbb::filter::exact_exception_propagation</a><code> [static, protected]</code>          </td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-<b>Initial value:</b><div class="fragment"><pre class="fragment">
-<span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<span class="preprocessor">            0x0</span>
-</pre></div>7th bit defines exception propagation mode expected by the application. 
-<p>
-
-</div>
-</div><p>
-<a class="anchor" name="2e5eb65f95d8050186278077e433c5b1"></a><!-- doxytag: member="tbb::filter::filter_is_out_of_order" ref="2e5eb65f95d8050186278077e433c5b1" args="" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">const unsigned char <a class="el" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter::filter_is_out_of_order</a> = 0x1<<4<code> [static, protected]</code>          </td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-4th bit distinguishes ordered vs unordered filters. 
-<p>
-The bit was not set for parallel filters in TBB 2.1 and earlier, but <a class="el" href="a00245.html#cd53206c4795ef2df5df26b795caf692">is_ordered()</a> function always treats parallel filters as out of order. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00546.html">pipeline.h</a></ul>
+<li><a class="el" href="a00418.html">concurrent_hash_map.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00246.html b/doc/html/a00246.html
index 52c4d77..6eb7733 100644
--- a/doc/html/a00246.html
+++ b/doc/html/a00246.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::filter_t< T, U > Class Template Reference</title>
+<title>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,50 +21,76 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00246.html">filter_t</a></div>
-<h1>tbb::interface6::filter_t< T, U > Class Template Reference</h1><!-- doxytag: class="tbb::interface6::filter_t" -->Class representing a chain of type-safe pipeline filters.  
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00243.html">concurrent_hash_map</a>::<a class="el" href="a00246.html">const_accessor</a></div>
+<h1>tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor Class Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_hash_map::const_accessor" -->Combines data access, locking, and garbage collection.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00546.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00418.html">concurrent_hash_map.h</a>></code>
 <p>
-<a href="a00097.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor:
+<p><center><img src="a00246.png" usemap="#tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map" border="0" alt=""></center>
+<map name="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor_map">
+<area href="a00244.html" alt="tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor" shape="rect" coords="0,56,530,80">
+</map>
+<a href="a00016.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8e50238483ba451363dccebd981d346"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::value_type" ref="a8e50238483ba451363dccebd981d346" args="" -->
+typedef const concurrent_hash_map::value_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00246.html#a8e50238483ba451363dccebd981d346">value_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of value. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af1a36ca22e38eacd72eb256ee2ecef0"></a><!-- doxytag: member="tbb::interface6::filter_t::filter_t" ref="af1a36ca22e38eacd72eb256ee2ecef0" args="(const filter_t< T, U > &rhs)" -->
- </td><td class="memItemRight" valign="bottom"><b>filter_t</b> (const <a class="el" href="a00246.html">filter_t</a>< T, U > &rhs)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="84c3080d0c6124d55c8bb4cf6055e65f"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::empty" ref="84c3080d0c6124d55c8bb4cf6055e65f" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00246.html#84c3080d0c6124d55c8bb4cf6055e65f">empty</a> () const </td></tr>
 
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="b80632a312f984a16b2a0db77859ee08"></a><!-- doxytag: member="tbb::interface6::filter_t::filter_t" ref="b80632a312f984a16b2a0db77859ee08" args="(tbb::filter::mode mode, const Body &body)" -->
-template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>filter_t</b> (tbb::filter::mode mode, const Body &body)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if result is empty. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7db006d41b49dc5f1716a913769d4698"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::release" ref="7db006d41b49dc5f1716a913769d4698" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2d87c68b6beaff12dcec7231d96d7b4c"></a><!-- doxytag: member="tbb::interface6::filter_t::operator=" ref="2d87c68b6beaff12dcec7231d96d7b4c" args="(const filter_t< T, U > &rhs)" -->
-void </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00246.html">filter_t</a>< T, U > &rhs)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Set to null. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9411df8197ceb4881ec4c7368a0a7f88"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::operator *" ref="9411df8197ceb4881ec4c7368a0a7f88" args="() const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00246.html#9411df8197ceb4881ec4c7368a0a7f88">operator *</a> () const </td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f299d149b932c2c78006c6f703b83eef"></a><!-- doxytag: member="tbb::interface6::filter_t::clear" ref="f299d149b932c2c78006c6f703b83eef" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>clear</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return reference to associated value in hash table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d03a48ecb8cd9549bd8be64b09c9b0d"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::operator->" ref="3d03a48ecb8cd9549bd8be64b09c9b0d" args="() const " -->
+const_pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00246.html#3d03a48ecb8cd9549bd8be64b09c9b0d">operator-></a> () const </td></tr>
 
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fff802cb5656e3788a89f3314aed2efe"></a><!-- doxytag: member="tbb::interface6::filter_t::internal::pipeline_proxy" ref="fff802cb5656e3788a89f3314aed2efe" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_proxy</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return pointer to associated value in hash table. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27399c613eb1aecd4660803955dda09d"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::const_accessor" ref="27399c613eb1aecd4660803955dda09d" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00246.html#27399c613eb1aecd4660803955dda09d">const_accessor</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Create empty result. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="928769b139d53427e7075c1f86148e4c"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::~const_accessor" ref="928769b139d53427e7075c1f86148e4c" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00246.html#928769b139d53427e7075c1f86148e4c">~const_accessor</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy result after releasing the underlying reference. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45ab59454c6f11fe938bbcab637cdd73"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::is_writer" ref="45ab59454c6f11fe938bbcab637cdd73" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>is_writer</b> ()</td></tr>
 
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="85c2892eff1fddcd06e28911e75838bd"></a><!-- doxytag: member="tbb::interface6::filter_t::make_filter" ref="85c2892eff1fddcd06e28911e75838bd" args="(tbb::filter::mode, const Body &)" -->
-template<typename T_, typename U_, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00246.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00246.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a> (tbb::filter::mode, const Body &)</td></tr>
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="21856da696b0765cc3db90663160d95e"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::my_node" ref="21856da696b0765cc3db90663160d95e" args="" -->
+node * </td><td class="memItemRight" valign="bottom"><b>my_node</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4936cc9432926ed38f0207828b388e24"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::my_hash" ref="4936cc9432926ed38f0207828b388e24" args="" -->
+hashcode_t </td><td class="memItemRight" valign="bottom"><b>my_hash</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d062d8ecb243a6ec62fa30bca52a1bcf"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::concurrent_hash_map< Key, T, HashCompare, Allocator >" ref="d062d8ecb243a6ec62fa30bca52a1bcf" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>concurrent_hash_map< Key, T, HashCompare, Allocator ></b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Create a filter to participate in parallel_pipeline. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="6b9b1f5ce7f2121f093b8cd1d84707ad"></a><!-- doxytag: member="tbb::interface6::filter_t::operator &" ref="6b9b1f5ce7f2121f093b8cd1d84707ad" args="(const filter_t< T_, V_ > &, const filter_t< V_, U_ > &)" -->
-template<typename T_, typename V_, typename U_> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00246.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><b>operator &</b> (const <a class="el" href="a00246.html">filter_t</a>< T_, V_ > &, const <a class="el" href="a00246.html">filter_t</a>< V_, U_ > &)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ddd77aff56c12366acc02d0f1588a706"></a><!-- doxytag: member="tbb::interface5::concurrent_hash_map::const_accessor::accessor" ref="ddd77aff56c12366acc02d0f1588a706" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>accessor</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename U><br>
- class tbb::interface6::filter_t< T, U ></h3>
+<h3>template<typename Key, typename T, typename HashCompare, typename Allocator><br>
+ class tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</h3>
 
-Class representing a chain of type-safe pipeline filters. 
+Combines data access, locking, and garbage collection. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00546.html">pipeline.h</a></ul>
+<li><a class="el" href="a00418.html">concurrent_hash_map.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00234.png b/doc/html/a00246.png
similarity index 100%
rename from doc/html/a00234.png
rename to doc/html/a00246.png
diff --git a/doc/html/a00247.html b/doc/html/a00247.html
index 8209ed4..1ab5139 100644
--- a/doc/html/a00247.html
+++ b/doc/html/a00247.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::final_scan_tag Struct Reference</title>
+<title>tbb::interface5::concurrent_priority_queue< T, Compare, A > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,27 +21,322 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00247.html">final_scan_tag</a></div>
-<h1>tbb::final_scan_tag Struct Reference<br>
-<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::final_scan_tag" -->Used to indicate that the final scan is being performed.  
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00247.html">concurrent_priority_queue</a></div>
+<h1>tbb::interface5::concurrent_priority_queue< T, Compare, A > Class Template Reference</h1><!-- doxytag: class="tbb::interface5::concurrent_priority_queue" -->Concurrent priority queue.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00528.html">parallel_scan.h</a>></code>
+<code>#include <<a class="el" href="a00429.html">concurrent_priority_queue.h</a>></code>
 <p>
-<a href="a00086.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00018.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06888e4a548788fcb2c15542d428d8c9"></a><!-- doxytag: member="tbb::final_scan_tag::is_final_scan" ref="06888e4a548788fcb2c15542d428d8c9" args="()" -->
-static bool </td><td class="memItemRight" valign="bottom"><b>is_final_scan</b> ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7c611a6b5b8f94b0e7f2afc97e31efb1"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::value_type" ref="7c611a6b5b8f94b0e7f2afc97e31efb1" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5804b3c708ef4e50d603f918ef2b9e58"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::reference" ref="5804b3c708ef4e50d603f918ef2b9e58" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4ded8601a434098605be0dcc4febc60"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::const_reference" ref="a4ded8601a434098605be0dcc4febc60" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#a4ded8601a434098605be0dcc4febc60">const_reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b679eea8d01d041625a39f719ca2b7ed"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::size_type" ref="b679eea8d01d041625a39f719ca2b7ed" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="77399bc76b3ecd60e33f7e35a5becd87"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::difference_type" ref="77399bc76b3ecd60e33f7e35a5becd87" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1712cb3a46bc1821fccc5e2cd83d5cd7"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::allocator_type" ref="1712cb3a46bc1821fccc5e2cd83d5cd7" args="" -->
+typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eefa40599afe00ea393897d8f5662e65"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="eefa40599afe00ea393897d8f5662e65" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a> (const <a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00247.html">concurrent_priority_queue</a> with default capacity. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4555b4a55415a70024c4004b51e9f385"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="4555b4a55415a70024c4004b51e9f385" args="(size_type init_capacity, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#4555b4a55415a70024c4004b51e9f385">concurrent_priority_queue</a> (<a class="el" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> init_capacity, const <a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00247.html">concurrent_priority_queue</a> with init_sz capacity. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9147cb4207017c260a0c3929c12cd40f"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="9147cb4207017c260a0c3929c12cd40f" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
+template<typename InputIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00247.html#9147cb4207017c260a0c3929c12cd40f">concurrent_priority_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a=<a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#509419e320f200456d89dc54a65140b3">concurrent_priority_queue</a> (const <a class="el" href="a00247.html">concurrent_priority_queue</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor.  <a href="#509419e320f200456d89dc54a65140b3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#c8b20e7430c5302936030bef59a562be">concurrent_priority_queue</a> (const <a class="el" href="a00247.html">concurrent_priority_queue</a> &src, const <a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> &a)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor with specific allocator.  <a href="#c8b20e7430c5302936030bef59a562be"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00247.html">concurrent_priority_queue</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a> (const <a class="el" href="a00247.html">concurrent_priority_queue</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment operator.  <a href="#2ab7f7808891027ac0f0f5b3a4be51e9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#317c508fa92df218be5d014c26c09bb7">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if empty, false otherwise.  <a href="#317c508fa92df218be5d014c26c09bb7"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the current number of elements contained in the queue.  <a href="#8b2ae25c61338c6fd59e94fe09822ba5"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#d905af7b8f6defff562f5ae9c3275763">push</a> (<a class="el" href="a00247.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> elem)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pushes elem onto the queue, increasing capacity of queue if necessary.  <a href="#d905af7b8f6defff562f5ae9c3275763"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a> (<a class="el" href="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> elem)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Gets a reference to and removes highest priority element.  <a href="#e036461a29cc40902a2bb79abf9f5146"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the queue; not thread-safe.  <a href="#0bdcdf7cde9fd369edca845bec34ca94"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#0ecdc6a04aa259374425d424ca2a6082">swap</a> (<a class="el" href="a00247.html">concurrent_priority_queue</a> &q)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Swap this queue with another; not thread-safe.  <a href="#0ecdc6a04aa259374425d424ca2a6082"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d545d444fb0d16148f9b61fd89f9a337"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::get_allocator" ref="d545d444fb0d16148f9b61fd89f9a337" args="() const " -->
+<a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return allocator object. <br></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>cpq_operation</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>my_functor_t</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Used to indicate that the final scan is being performed. 
+<h3>template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>><br>
+ class tbb::interface5::concurrent_priority_queue< T, Compare, A ></h3>
+
+Concurrent priority queue. 
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="509419e320f200456d89dc54a65140b3"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="509419e320f200456d89dc54a65140b3" args="(const concurrent_priority_queue &src)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::<a class="el" href="a00247.html">concurrent_priority_queue</a>           </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="a00247.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
+          <td class="paramname"> <em>src</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline, explicit]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Copy constructor. 
+<p>
+This operation is unsafe if there are pending concurrent operations on the src queue. 
+</div>
+</div><p>
+<a class="anchor" name="c8b20e7430c5302936030bef59a562be"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::concurrent_priority_queue" ref="c8b20e7430c5302936030bef59a562be" args="(const concurrent_priority_queue &src, const allocator_type &a)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::<a class="el" href="a00247.html">concurrent_priority_queue</a>           </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="a00247.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
+          <td class="paramname"> <em>src</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> & </td>
+          <td class="paramname"> <em>a</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Copy constructor with specific allocator. 
+<p>
+This operation is unsafe if there are pending concurrent operations on the src queue. 
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="0bdcdf7cde9fd369edca845bec34ca94"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::clear" ref="0bdcdf7cde9fd369edca845bec34ca94" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::clear           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Clear the queue; not thread-safe. 
+<p>
+This operation is unsafe if there are pending concurrent operations on the queue. Resets size, effectively emptying queue; does not free space. May not clear elements added in pending operations. 
+</div>
+</div><p>
+<a class="anchor" name="317c508fa92df218be5d014c26c09bb7"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::empty" ref="317c508fa92df218be5d014c26c09bb7" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::empty           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Returns true if empty, false otherwise. 
+<p>
+Returned value may not reflect results of pending operations. This operation reads shared data and will trigger a race condition. 
+</div>
+</div><p>
+<a class="anchor" name="2ab7f7808891027ac0f0f5b3a4be51e9"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::operator=" ref="2ab7f7808891027ac0f0f5b3a4be51e9" args="(const concurrent_priority_queue &src)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="a00247.html">concurrent_priority_queue</a>& <a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::operator=           </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="a00247.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
+          <td class="paramname"> <em>src</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Assignment operator. 
+<p>
+This operation is unsafe if there are pending concurrent operations on the src queue. 
+</div>
+</div><p>
+<a class="anchor" name="d905af7b8f6defff562f5ae9c3275763"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::push" ref="d905af7b8f6defff562f5ae9c3275763" args="(const_reference elem)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::push           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00247.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> </td>
+          <td class="paramname"> <em>elem</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Pushes elem onto the queue, increasing capacity of queue if necessary. 
+<p>
+This operation can be safely used concurrently with other push, try_pop or reserve operations. 
+</div>
+</div><p>
+<a class="anchor" name="8b2ae25c61338c6fd59e94fe09822ba5"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::size" ref="8b2ae25c61338c6fd59e94fe09822ba5" args="() const " -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::size           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"> const<code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Returns the current number of elements contained in the queue. 
+<p>
+Returned value may not reflect results of pending operations. This operation reads shared data and will trigger a race condition. 
+</div>
+</div><p>
+<a class="anchor" name="0ecdc6a04aa259374425d424ca2a6082"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::swap" ref="0ecdc6a04aa259374425d424ca2a6082" args="(concurrent_priority_queue &q)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::swap           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00247.html">concurrent_priority_queue</a>< T, Compare, A > & </td>
+          <td class="paramname"> <em>q</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Swap this queue with another; not thread-safe. 
+<p>
+This operation is unsafe if there are pending concurrent operations on the queue. 
+</div>
+</div><p>
+<a class="anchor" name="e036461a29cc40902a2bb79abf9f5146"></a><!-- doxytag: member="tbb::interface5::concurrent_priority_queue::try_pop" ref="e036461a29cc40902a2bb79abf9f5146" args="(reference elem)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue</a>< T, Compare, A >::try_pop           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> </td>
+          <td class="paramname"> <em>elem</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Gets a reference to and removes highest priority element. 
 <p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00528.html">parallel_scan.h</a></ul>
+If a highest priority element was found, sets elem and returns true, otherwise returns false. This operation can be safely used concurrently with other push, try_pop or reserve operations. 
+</div>
+</div><p>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="a00429.html">concurrent_priority_queue.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00248.html b/doc/html/a00248.html
index b394217..ee9798f 100644
--- a/doc/html/a00248.html
+++ b/doc/html/a00248.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface6::flow_control Class Reference</title>
+<title>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,28 +21,143 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00248.html">flow_control</a></div>
-<h1>tbb::interface6::flow_control Class Reference</h1><!-- doxytag: class="tbb::interface6::flow_control" -->input_filter control to signal end-of-input for parallel_pipeline  
+<a class="el" href="a00383.html">tbb</a>::<b>strict_ppl</b>::<a class="el" href="a00248.html">concurrent_queue</a></div>
+<h1>tbb::strict_ppl::concurrent_queue< T, A > Class Template Reference<br>
+<small>
+[<a class="el" href="a00396.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::strict_ppl::concurrent_queue" -->A high-performance thread-safe non-blocking concurrent queue.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00546.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00432.html">concurrent_queue.h</a>></code>
 <p>
-<a href="a00096.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00022.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="682c3978d5cb0620000994f11c44a476"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::value_type" ref="682c3978d5cb0620000994f11c44a476" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#682c3978d5cb0620000994f11c44a476">value_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Element type in the queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8d725c50a9834bb7af5b67c0aff92b8"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::reference" ref="a8d725c50a9834bb7af5b67c0aff92b8" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4d48e7ff93f81636bca2c74f7da34750"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::const_reference" ref="4d48e7ff93f81636bca2c74f7da34750" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Const reference type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8fc30e93f8342a1960357f71e4fe8a2b"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::size_type" ref="8fc30e93f8342a1960357f71e4fe8a2b" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Integral type for representing size of the queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="068576d16c7e4e05d52f9db7a45b5b65"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::difference_type" ref="068576d16c7e4e05d52f9db7a45b5b65" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Difference type for iterator. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a3956341728eaa558d8827063718cac"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::allocator_type" ref="5a3956341728eaa558d8827063718cac" args="" -->
+typedef A </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocator type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9736ac047d6da3363895c7e5b121d0c4"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::iterator" ref="9736ac047d6da3363895c7e5b121d0c4" args="" -->
+typedef internal::concurrent_queue_iterator<<br>
+ <a class="el" href="a00248.html">concurrent_queue</a>, T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9cd76d19af8c78be1bafc6ca0123ac0d"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::const_iterator" ref="9cd76d19af8c78be1bafc6ca0123ac0d" args="" -->
+typedef internal::concurrent_queue_iterator<<br>
+ <a class="el" href="a00248.html">concurrent_queue</a>, const T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b2c7123577587e3c26506db3e5abe62"></a><!-- doxytag: member="tbb::interface6::flow_control::stop" ref="4b2c7123577587e3c26506db3e5abe62" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>stop</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7c48a05a94a1f4f98fdfadfbef98ecf6"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="7c48a05a94a1f4f98fdfadfbef98ecf6" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a> (const <a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="25209656c84f2f9b030e2f9162713341"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="25209656c84f2f9b030e2f9162713341" args="(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())" -->
+template<typename InputIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00248.html#25209656c84f2f9b030e2f9162713341">concurrent_queue</a> (InputIterator begin, InputIterator end, const <a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a6b98ea11a867db8ac868f0113ca429"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::concurrent_queue" ref="8a6b98ea11a867db8ac868f0113ca429" args="(const concurrent_queue &src, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#8a6b98ea11a867db8ac868f0113ca429">concurrent_queue</a> (const <a class="el" href="a00248.html">concurrent_queue</a> &src, const <a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a> &a=<a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a>())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="830b33753d6b149c366344e29b2edd8c"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::~concurrent_queue" ref="830b33753d6b149c366344e29b2edd8c" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="73c47563ffcc4c2f6452f25a04ebe2e2"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::push" ref="73c47563ffcc4c2f6452f25a04ebe2e2" args="(const T &source)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a> (const T &source)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a> (T &result)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue.  <a href="#ae31ca0db34ef96ef1e74aa0d28c95f8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eaa35a5274606779802e9a669a706260"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_size" ref="eaa35a5274606779802e9a669a706260" args="() const " -->
+<a class="el" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#eaa35a5274606779802e9a669a706260">unsafe_size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return the number of items in the queue; thread unsafe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f3f6fce0cfa2d581d6f3b47e0613ad64"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::empty" ref="f3f6fce0cfa2d581d6f3b47e0613ad64" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Equivalent to size()==0. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c32e8e84c0524155133b4aae32d2a827"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::clear" ref="c32e8e84c0524155133b4aae32d2a827" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#c32e8e84c0524155133b4aae32d2a827">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the queue. not thread-safe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f034f70caef445fe8abc9113ec926a8d"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::get_allocator" ref="f034f70caef445fe8abc9113ec926a8d" args="() const " -->
+<a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return allocator object. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6297f48808dd7c14e6c2fe81559ca190"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_begin" ref="6297f48808dd7c14e6c2fe81559ca190" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1569f70e70521fe71944a5b0138c6ef5"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_end" ref="1569f70e70521fe71944a5b0138c6ef5" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e3e6746f7b6ecfbc16f781665ac51112"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_begin" ref="e3e6746f7b6ecfbc16f781665ac51112" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_begin</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83bf90849c08f44d25dd7a3b207a8956"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::unsafe_end" ref="83bf90849c08f44d25dd7a3b207a8956" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>unsafe_end</b> () const </td></tr>
 
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15bb80e25fbcc4213e0053d558df6462"></a><!-- doxytag: member="tbb::interface6::flow_control::internal::concrete_filter" ref="15bb80e25fbcc4213e0053d558df6462" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::concrete_filter</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-input_filter control to signal end-of-input for parallel_pipeline 
+<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
+ class tbb::strict_ppl::concurrent_queue< T, A ></h3>
+
+A high-performance thread-safe non-blocking concurrent queue. 
+<p>
+Multiple threads may each push and pop concurrently. Assignment construction is not allowed. 
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="ae31ca0db34ef96ef1e74aa0d28c95f8"></a><!-- doxytag: member="tbb::strict_ppl::concurrent_queue::try_pop" ref="ae31ca0db34ef96ef1e74aa0d28c95f8" args="(T &result)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, typename A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue</a>< T, A >::try_pop           </td>
+          <td>(</td>
+          <td class="paramtype">T & </td>
+          <td class="paramname"> <em>result</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Attempt to dequeue an item from head of queue. 
 <p>
+Does not wait for item to become available. Returns true if successful; false otherwise. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00546.html">pipeline.h</a></ul>
+<li><a class="el" href="a00432.html">concurrent_queue.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00249.html b/doc/html/a00249.html
index 8ab2586..eb4207b 100644
--- a/doc/html/a00249.html
+++ b/doc/html/a00249.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::function_node< Input, Output > Class Template Reference</title>
+<title>tbb::deprecated::concurrent_queue< T, A > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,57 +21,128 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00249.html">function_node</a></div>
-<h1>tbb::function_node< Input, Output > Class Template Reference</h1><!-- doxytag: class="tbb::function_node" --><!-- doxytag: inherits="tbb::graph_node" -->Implements a function node that supports Input -> Output.  
+<a class="el" href="a00383.html">tbb</a>::<b>deprecated</b>::<a class="el" href="a00249.html">concurrent_queue</a></div>
+<h1>tbb::deprecated::concurrent_queue< T, A > Class Template Reference<br>
+<small>
+[<a class="el" href="a00396.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::deprecated::concurrent_queue" --><!-- doxytag: inherits="tbb::concurrent_bounded_queue" -->A high-performance thread-safe blocking concurrent bounded queue.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00432.html">concurrent_queue.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::function_node< Input, Output >:
-<p><center><img src="a00249.png" usemap="#tbb::function_node< Input, Output >_map" border="0" alt=""></center>
-<map name="tbb::function_node< Input, Output >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,212,24">
+<p>Inheritance diagram for tbb::deprecated::concurrent_queue< T, A >:
+<p><center><img src="a00249.png" usemap="#tbb::deprecated::concurrent_queue< T, A >_map" border="0" alt=""></center>
+<map name="tbb::deprecated::concurrent_queue< T, A >_map">
+<area href="a00242.html" alt="tbb::concurrent_bounded_queue< T, A >" shape="rect" coords="0,0,257,24">
 </map>
-<a href="a00049.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00025.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6e6329f2e501fe2ca3af68ab506ae970"></a><!-- doxytag: member="tbb::function_node::input_type" ref="6e6329f2e501fe2ca3af68ab506ae970" args="" -->
-typedef Input </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8861a9cdf232a20b5f2569754a281871"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::iterator" ref="8861a9cdf232a20b5f2569754a281871" args="" -->
+typedef <a class="el" href="a00242.html">concurrent_bounded_queue</a><<br>
+ T, A >::iterator </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8fdb5893b95c7127cecad4e549a4f293"></a><!-- doxytag: member="tbb::function_node::output_type" ref="8fdb5893b95c7127cecad4e549a4f293" args="" -->
-typedef Output </td><td class="memItemRight" valign="bottom"><b>output_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7117842ce3ed7c5147d3c886922e64d0"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::const_iterator" ref="7117842ce3ed7c5147d3c886922e64d0" args="" -->
+typedef <a class="el" href="a00242.html">concurrent_bounded_queue</a><<br>
+ T, A >::const_iterator </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4283fbbd6c585e11d22c0fe199262e5d"></a><!-- doxytag: member="tbb::function_node::predecessor_type" ref="4283fbbd6c585e11d22c0fe199262e5d" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< input_type > </td><td class="memItemRight" valign="bottom"><b>predecessor_type</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aaf19bd7337b72f3131ece60f7315ef7"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="aaf19bd7337b72f3131ece60f7315ef7" args="(const A &a=A())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00249.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a> (const A &a=A())</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="277107a970082cf30bc73fe11232e27c"></a><!-- doxytag: member="tbb::function_node::successor_type" ref="277107a970082cf30bc73fe11232e27c" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< output_type > </td><td class="memItemRight" valign="bottom"><b>successor_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty queue. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fc092b9082f233482f3513fc3bb670f7"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="fc092b9082f233482f3513fc3bb670f7" args="(const concurrent_queue &src, const A &a=A())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00249.html#fc092b9082f233482f3513fc3bb670f7">concurrent_queue</a> (const <a class="el" href="a00249.html">concurrent_queue</a> &src, const A &a=A())</td></tr>
 
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="7bde12e8ee43d4cafbdd5b1fc2031e2b"></a><!-- doxytag: member="tbb::function_node::function_node" ref="7bde12e8ee43d4cafbdd5b1fc2031e2b" args="(graph &g, size_t concurrency, Body body)" -->
-template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00249.html#7bde12e8ee43d4cafbdd5b1fc2031e2b">function_node</a> (<a class="el" href="a00250.html">graph</a> &g, size_t concurrency, Body body)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9102b897776bd2d9e908e6604ff16b5f"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::concurrent_queue" ref="9102b897776bd2d9e908e6604ff16b5f" args="(InputIterator b, InputIterator e, const A &a=A())" -->
+template<typename InputIterator> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00249.html#9102b897776bd2d9e908e6604ff16b5f">concurrent_queue</a> (InputIterator b, InputIterator e, const A &a=A())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">[begin,end) constructor <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00249.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a> (const T &source)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue an item at tail of queue if queue is not already full.  <a href="#7c45561bafe71107d09b2bc1b8f4e681"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00249.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a> (T &destination)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d66f79bb45d6ae8e9fc97a4118451d5"></a><!-- doxytag: member="tbb::function_node::successors" ref="0d66f79bb45d6ae8e9fc97a4118451d5" args="()" -->
-internal::broadcast_cache<<br>
- output_type > & </td><td class="memItemRight" valign="bottom"><b>successors</b> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Attempt to dequeue an item from head of queue.  <a href="#48da3536245318af6cb5fd58bac78039"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed7202cd273ae36463e6ac57e9472670"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::begin" ref="ed7202cd273ae36463e6ac57e9472670" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> ()</td></tr>
 
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b7de4c1337a7aec27adff1becea08d5"></a><!-- doxytag: member="tbb::function_node::my_successors" ref="0b7de4c1337a7aec27adff1becea08d5" args="" -->
-internal::broadcast_cache<<br>
- output_type > </td><td class="memItemRight" valign="bottom"><b>my_successors</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35fbb0d7e135545eb1daec2b4ae894cd"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::end" ref="35fbb0d7e135545eb1daec2b4ae894cd" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><b>end</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="62f31fe653e1158e64ddb0e163d0335c"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::begin" ref="62f31fe653e1158e64ddb0e163d0335c" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>begin</b> () const </td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d42ddc4a6fe42350750a930302863d1"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::end" ref="3d42ddc4a6fe42350750a930302863d1" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><b>end</b> () const </td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05bffad9626d51abbd4bb82ae2a1cceb"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::internal::concurrent_queue_iterator" ref="05bffad9626d51abbd4bb82ae2a1cceb" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::concurrent_queue_iterator</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Input, typename Output = continue_msg><br>
- class tbb::function_node< Input, Output ></h3>
+<h3>template<typename T, class A = cache_aligned_allocator<T>><br>
+ class tbb::deprecated::concurrent_queue< T, A ></h3>
 
-Implements a function node that supports Input -> Output. 
+A high-performance thread-safe blocking concurrent bounded queue. 
+<p>
+This is the pre-PPL TBB concurrent queue which support boundedness and blocking semantics. Note that method names agree with the PPL-style concurrent queue. Multiple threads may each push and pop concurrently. Assignment construction is not allowed. 
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="48da3536245318af6cb5fd58bac78039"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::pop_if_present" ref="48da3536245318af6cb5fd58bac78039" args="(T &destination)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00249.html">tbb::deprecated::concurrent_queue</a>< T, A >::pop_if_present           </td>
+          <td>(</td>
+          <td class="paramtype">T & </td>
+          <td class="paramname"> <em>destination</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Attempt to dequeue an item from head of queue. 
+<p>
+Does not wait for item to become available. Returns true if successful; false otherwise. <dl compact><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>Use <a class="el" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">try_pop()</a> </dd></dl>
+
+</div>
+</div><p>
+<a class="anchor" name="7c45561bafe71107d09b2bc1b8f4e681"></a><!-- doxytag: member="tbb::deprecated::concurrent_queue::push_if_not_full" ref="7c45561bafe71107d09b2bc1b8f4e681" args="(const T &source)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A = cache_aligned_allocator<T>> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00249.html">tbb::deprecated::concurrent_queue</a>< T, A >::push_if_not_full           </td>
+          <td>(</td>
+          <td class="paramtype">const T & </td>
+          <td class="paramname"> <em>source</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Enqueue an item at tail of queue if queue is not already full. 
 <p>
+Does not wait for queue to become not full. Returns true if item is pushed; false if queue was already full. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00432.html">concurrent_queue.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00249.png b/doc/html/a00249.png
index 3b8737b..6aac5a0 100644
Binary files a/doc/html/a00249.png and b/doc/html/a00249.png differ
diff --git a/doc/html/a00250.html b/doc/html/a00250.html
index 41b9add..20f6c0b 100644
--- a/doc/html/a00250.html
+++ b/doc/html/a00250.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::graph Class Reference</title>
+<title>tbb::concurrent_vector< T, A > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,73 +21,325 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00250.html">graph</a></div>
-<h1>tbb::graph Class Reference</h1><!-- doxytag: class="tbb::graph" -->The graph class.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00250.html">concurrent_vector</a></div>
+<h1>tbb::concurrent_vector< T, A > Class Template Reference<br>
+<small>
+[<a class="el" href="a00396.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::concurrent_vector" -->Concurrent vector container.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00443.html">concurrent_vector.h</a>></code>
 <p>
-<a href="a00045.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00031.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="633b9b55e3248b785efd13264261f0e54431a30e2ba83c24deee35ce1218f08e"></a><!-- doxytag: member="tbb::graph::unlimited" ref="633b9b55e3248b785efd13264261f0e54431a30e2ba83c24deee35ce1218f08e" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>unlimited</b> = 0</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc85684238d4bb5e422cb8ea0bdc438f"></a><!-- doxytag: member="tbb::concurrent_vector::size_type" ref="bc85684238d4bb5e422cb8ea0bdc438f" args="" -->
+typedef internal::concurrent_vector_base_v3::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="633b9b55e3248b785efd13264261f0e57fa790f3b0f0dd6330e4f91ffa85759a"></a><!-- doxytag: member="tbb::graph::serial" ref="633b9b55e3248b785efd13264261f0e57fa790f3b0f0dd6330e4f91ffa85759a" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>serial</b> = 1</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac7083635ab59834e9afc15e6c168df5"></a><!-- doxytag: member="tbb::concurrent_vector::allocator_type" ref="ac7083635ab59834e9afc15e6c168df5" args="" -->
+typedef internal::allocator_base<<br>
+ T, A >::allocator_type </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#633b9b55e3248b785efd13264261f0e5">concurrency</a> { <b>unlimited</b> =  0, 
-<b>serial</b> =  1
- }</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4543d7d45b2e461d3f8ef416974ec1f1"></a><!-- doxytag: member="tbb::concurrent_vector::value_type" ref="4543d7d45b2e461d3f8ef416974ec1f1" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e655e67dd14ed6d0cbfe7981d5fa350e"></a><!-- doxytag: member="tbb::concurrent_vector::difference_type" ref="e655e67dd14ed6d0cbfe7981d5fa350e" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c29033785d76e240ea96ae40610275d"></a><!-- doxytag: member="tbb::concurrent_vector::reference" ref="8c29033785d76e240ea96ae40610275d" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0b2a6241ab3fa9ab4f4074893fecd47"></a><!-- doxytag: member="tbb::concurrent_vector::const_reference" ref="b0b2a6241ab3fa9ab4f4074893fecd47" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74319c908a32d5dcdc6a080f9c2b8803"></a><!-- doxytag: member="tbb::concurrent_vector::pointer" ref="74319c908a32d5dcdc6a080f9c2b8803" args="" -->
+typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd80729019220cdb80872ea6b905ffb1"></a><!-- doxytag: member="tbb::concurrent_vector::const_pointer" ref="dd80729019220cdb80872ea6b905ffb1" args="" -->
+typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a049674e7f386de3ea09ff2ed6d6bbbe"></a><!-- doxytag: member="tbb::concurrent_vector::iterator" ref="a049674e7f386de3ea09ff2ed6d6bbbe" args="" -->
+typedef internal::vector_iterator<<br>
+ <a class="el" href="a00250.html">concurrent_vector</a>, T > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b51a1baa7da67e283806c0d4f2fe9c69"></a><!-- doxytag: member="tbb::concurrent_vector::const_iterator" ref="b51a1baa7da67e283806c0d4f2fe9c69" args="" -->
+typedef internal::vector_iterator<<br>
+ <a class="el" href="a00250.html">concurrent_vector</a>, const <br>
+T > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c7e4d252bef7af22286041c39c62abe"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="2c7e4d252bef7af22286041c39c62abe" args="" -->
+typedef std::reverse_iterator<<br>
+ iterator > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c59c3f9412b666a31a9052b789fb58bc"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="c59c3f9412b666a31a9052b789fb58bc" args="" -->
+typedef std::reverse_iterator<<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c3901b092e9e8185bdc3cae5913e625"></a><!-- doxytag: member="tbb::concurrent_vector::reverse_iterator" ref="0c3901b092e9e8185bdc3cae5913e625" args="" -->
+typedef std::reverse_iterator<<br>
+ iterator, T, T &, T * > </td><td class="memItemRight" valign="bottom"><b>reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="426145d7bd5913bc08e701c14b221046"></a><!-- doxytag: member="tbb::concurrent_vector::const_reverse_iterator" ref="426145d7bd5913bc08e701c14b221046" args="" -->
+typedef std::reverse_iterator<<br>
+ const_iterator, T, const <br>
+T &, const T * > </td><td class="memItemRight" valign="bottom"><b>const_reverse_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61fd90288dba6f8808d6dafe9a249ec5"></a><!-- doxytag: member="tbb::concurrent_vector::range_type" ref="61fd90288dba6f8808d6dafe9a249ec5" args="" -->
+typedef generic_range_type<<br>
+ iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d6ddf0312a820a98efd9a5f394cb9dbd"></a><!-- doxytag: member="tbb::concurrent_vector::const_range_type" ref="d6ddf0312a820a98efd9a5f394cb9dbd" args="" -->
+typedef generic_range_type<<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An enumeration the provides the two most common concurrency levels: unlimited and serial. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ba8311506558a2419101722f5d49ba9"></a><!-- doxytag: member="tbb::graph::graph" ref="1ba8311506558a2419101722f5d49ba9" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#1ba8311506558a2419101722f5d49ba9">graph</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c8ca9cabfcd30ad5943324c853664b5"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="2c8ca9cabfcd30ad5943324c853664b5" args="(const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#2c8ca9cabfcd30ad5943324c853664b5">concurrent_vector</a> (const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty vector. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd8a200b99a8088435a37934b58fe335"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="dd8a200b99a8088435a37934b58fe335" args="(const concurrent_vector &vector, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#dd8a200b99a8088435a37934b58fe335">concurrent_vector</a> (const <a class="el" href="a00250.html">concurrent_vector</a> &vector, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copying constructor. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="64432f13f7b29bfe4acfb5568f34f3a8"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="64432f13f7b29bfe4acfb5568f34f3a8" args="(const concurrent_vector< T, M > &vector, const allocator_type &a=allocator_type())" -->
+template<class M> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00250.html#64432f13f7b29bfe4acfb5568f34f3a8">concurrent_vector</a> (const <a class="el" href="a00250.html">concurrent_vector</a>< T, M > &vector, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copying constructor for vector with different allocator type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2a2e261dfe1cab3f73f7b1a94137cfca"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="2a2e261dfe1cab3f73f7b1a94137cfca" args="(size_type n)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#2a2e261dfe1cab3f73f7b1a94137cfca">concurrent_vector</a> (size_type n)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with initial size specified by argument n. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3883a8a908b44e249a57f454de3f55d8"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="3883a8a908b44e249a57f454de3f55d8" args="(size_type n, const_reference t, const allocator_type &a=allocator_type())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#3883a8a908b44e249a57f454de3f55d8">concurrent_vector</a> (size_type n, const_reference t, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with initial size specified by argument n, initialization by copying of t, and given allocator instance. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4450de83c5862ea4bcd9443fd7e67419"></a><!-- doxytag: member="tbb::concurrent_vector::concurrent_vector" ref="4450de83c5862ea4bcd9443fd7e67419" args="(I first, I last, const allocator_type &a=allocator_type())" -->
+template<class I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00250.html#4450de83c5862ea4bcd9443fd7e67419">concurrent_vector</a> (I first, I last, const allocator_type &a=allocator_type())</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construction with copying iteration range and given allocator instance. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="691f0f3cda3e489c37a657016e375eaf"></a><!-- doxytag: member="tbb::concurrent_vector::operator=" ref="691f0f3cda3e489c37a657016e375eaf" args="(const concurrent_vector &vector)" -->
+<a class="el" href="a00250.html">concurrent_vector</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#691f0f3cda3e489c37a657016e375eaf">operator=</a> (const <a class="el" href="a00250.html">concurrent_vector</a> &vector)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="19f4ab88a01b0fd056af3bba463e7bd6"></a><!-- doxytag: member="tbb::concurrent_vector::operator=" ref="19f4ab88a01b0fd056af3bba463e7bd6" args="(const concurrent_vector< T, M > &vector)" -->
+template<class M> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00250.html">concurrent_vector</a> & </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00250.html#19f4ab88a01b0fd056af3bba463e7bd6">operator=</a> (const <a class="el" href="a00250.html">concurrent_vector</a>< T, M > &vector)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Assignment for vector with different allocator type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#30484e3959892fd5392fa93c873c31f0">grow_by</a> (size_type delta)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Grow by "delta" elements.  <a href="#30484e3959892fd5392fa93c873c31f0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#c8177b1865270ea68aa1ab9148e5e35e">grow_by</a> (size_type delta)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#38274ab3f772ecba600c7daca7690102">grow_by</a> (size_type delta, const_reference t)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Grow by "delta" elements using copying constuctor.  <a href="#38274ab3f772ecba600c7daca7690102"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#473a59a4c9308b93411b898b3110d26c">grow_by</a> (size_type delta, const_reference t)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least</a> (size_type n)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Append minimal sequence of elements such that <a class="el" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>>=n.  <a href="#47fe588214dd5fa06ab6e8ab78d83874"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#a7e3b67c8ccab16d0aecc80899ae799d">grow_to_at_least</a> (size_type n)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a> (const_reference item) iterator push_back(const _reference item)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Push item.  <a href="#e94e038f915c0268fdf2d3d7f87d81b8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a> (size_type index)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get reference to element at given index.  <a href="#4c52f2950bb1832886bd4458eb09d7eb"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6fade5c732cc95274d1d8277ea619d1"></a><!-- doxytag: member="tbb::concurrent_vector::operator[]" ref="c6fade5c732cc95274d1d8277ea619d1" args="(size_type index) const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#c6fade5c732cc95274d1d8277ea619d1">operator[]</a> (size_type index) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const reference to element at given index. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c073ca43e787c7cbf7b0e26d2221748"></a><!-- doxytag: member="tbb::concurrent_vector::at" ref="0c073ca43e787c7cbf7b0e26d2221748" args="(size_type index)" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#0c073ca43e787c7cbf7b0e26d2221748">at</a> (size_type index)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get reference to element at given index. Throws exceptions on errors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23e14a38af748edff96a7adc3a0f1c58"></a><!-- doxytag: member="tbb::concurrent_vector::at" ref="23e14a38af748edff96a7adc3a0f1c58" args="(size_type index) const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#23e14a38af748edff96a7adc3a0f1c58">at</a> (size_type index) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const reference to element at given index. Throws exceptions on errors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a4c6ffff3bf08b92939aa2fc516edfba"></a><!-- doxytag: member="tbb::concurrent_vector::range" ref="a4c6ffff3bf08b92939aa2fc516edfba" args="(size_t grainsize=1)" -->
+range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#a4c6ffff3bf08b92939aa2fc516edfba">range</a> (size_t grainsize=1)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get range for iterating with parallel algorithms. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3d09ccfb581b879ae64203741035e193"></a><!-- doxytag: member="tbb::concurrent_vector::range" ref="3d09ccfb581b879ae64203741035e193" args="(size_t grainsize=1) const " -->
+const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#3d09ccfb581b879ae64203741035e193">range</a> (size_t grainsize=1) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const range for iterating with parallel algorithms. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="715fe313c4a9c22731cc404dd80c9ec9"></a><!-- doxytag: member="tbb::concurrent_vector::size" ref="715fe313c4a9c22731cc404dd80c9ec9" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return size of vector. It may include elements under construction. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6426cb93cf20d3af40f3c90f1f0481a"></a><!-- doxytag: member="tbb::concurrent_vector::empty" ref="c6426cb93cf20d3af40f3c90f1f0481a" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return true if vector is not empty or has elements under construction at least. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ed6b9ae7217af5103d974045b6f5cd5"></a><!-- doxytag: member="tbb::concurrent_vector::capacity" ref="3ed6b9ae7217af5103d974045b6f5cd5" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#3ed6b9ae7217af5103d974045b6f5cd5">capacity</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Maximum size to which array can grow without allocating more memory. Concurrent allocations are not included in the value. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#5a0ce05026994b010018f72cfdeb72c1">reserve</a> (size_type n)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate enough space to grow to size n without having to allocate more memory later.  <a href="#5a0ce05026994b010018f72cfdeb72c1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8dfb0cb0eef96d440b4dcf801807a718"></a><!-- doxytag: member="tbb::concurrent_vector::resize" ref="8dfb0cb0eef96d440b4dcf801807a718" args="(size_type n)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#8dfb0cb0eef96d440b4dcf801807a718">resize</a> (size_type n)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Resize the vector. Not thread-safe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98ce6b2c6d2622f0c030b46dfac3880c"></a><!-- doxytag: member="tbb::concurrent_vector::resize" ref="98ce6b2c6d2622f0c030b46dfac3880c" args="(size_type n, const_reference t)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#98ce6b2c6d2622f0c030b46dfac3880c">resize</a> (size_type n, const_reference t)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a graph withy no nodes. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#55332084e7884a26ff288b8fe960030d">~graph</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Resize the vector, copy t for new elements. Not thread-safe. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1693d1da41b1a8235871be9c6633be35"></a><!-- doxytag: member="tbb::concurrent_vector::compact" ref="1693d1da41b1a8235871be9c6633be35" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#1693d1da41b1a8235871be9c6633be35">compact</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys the graph.  <a href="#55332084e7884a26ff288b8fe960030d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#1e5c5ae6538ec714cee107d1004705b9">increment_wait_count</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An alias for <a class="el" href="a00250.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit()</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="03c6f4cf66532bf4cc907ee738a9a186"></a><!-- doxytag: member="tbb::concurrent_vector::shrink_to_fit" ref="03c6f4cf66532bf4cc907ee738a9a186" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#03c6f4cf66532bf4cc907ee738a9a186">shrink_to_fit</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to register that an external entity may still interact with the graph.  <a href="#1e5c5ae6538ec714cee107d1004705b9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#ff3b6a3ef2ae1e661dcdb398c227b43c">decrement_wait_count</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Optimize memory usage and fragmentation. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c248a017f0576df3e7cd99627836fd6"></a><!-- doxytag: member="tbb::concurrent_vector::max_size" ref="2c248a017f0576df3e7cd99627836fd6" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#2c248a017f0576df3e7cd99627836fd6">max_size</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Deregisters an external entity that may have interacted with the graph.  <a href="#ff3b6a3ef2ae1e661dcdb398c227b43c"></a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2">template<typename Receiver, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00250.html#4c5e8dc5a45e641d534d6206838cfa7f">run</a> (Receiver &r, Body body)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Upper bound on argument to reserve. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="730b23a251ecb6d37f692fb22f38e029"></a><!-- doxytag: member="tbb::concurrent_vector::begin" ref="730b23a251ecb6d37f692fb22f38e029" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#730b23a251ecb6d37f692fb22f38e029">begin</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawns a task that runs a body and puts its output to a specific receiver.  <a href="#4c5e8dc5a45e641d534d6206838cfa7f"></a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2">template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00250.html#71213dd18099298dc74731e293c8286a">run</a> (Body body)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">start iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c0b51160e5a764982ec97a455f94f2c6"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="c0b51160e5a764982ec97a455f94f2c6" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#c0b51160e5a764982ec97a455f94f2c6">end</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawns a task that runs a function object.  <a href="#71213dd18099298dc74731e293c8286a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">wait_for_all</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="78a06182276ff758788d4c0623ae0d71"></a><!-- doxytag: member="tbb::concurrent_vector::begin" ref="78a06182276ff758788d4c0623ae0d71" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#78a06182276ff758788d4c0623ae0d71">begin</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Waits until the graph is idle and the number of decrement_wait_count calls equals the number of increment_wait_count calls.  <a href="#bafd6349fdc6563ffa02746866e30bec"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="34d61d8b6560e5b2eb42e0112701db0f"></a><!-- doxytag: member="tbb::graph::root_task" ref="34d61d8b6560e5b2eb42e0112701db0f" args="()" -->
-<a class="el" href="a00291.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#34d61d8b6560e5b2eb42e0112701db0f">root_task</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e6aa764ce5a1cbd24526f68bc0a2f6b"></a><!-- doxytag: member="tbb::concurrent_vector::end" ref="1e6aa764ce5a1cbd24526f68bc0a2f6b" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">end</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f88fcf1c920693c39bd9709db33c199f"></a><!-- doxytag: member="tbb::concurrent_vector::cbegin" ref="f88fcf1c920693c39bd9709db33c199f" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#f88fcf1c920693c39bd9709db33c199f">cbegin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">start const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c15a5d0f1cf75d687dabba07da1d46b"></a><!-- doxytag: member="tbb::concurrent_vector::cend" ref="0c15a5d0f1cf75d687dabba07da1d46b" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#0c15a5d0f1cf75d687dabba07da1d46b">cend</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e220926d09236d98f04fe0721e5f9a1"></a><!-- doxytag: member="tbb::concurrent_vector::rbegin" ref="5e220926d09236d98f04fe0721e5f9a1" args="()" -->
+reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#5e220926d09236d98f04fe0721e5f9a1">rbegin</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="290119a4eb43cd6a9e98fa17016ba3c2"></a><!-- doxytag: member="tbb::concurrent_vector::rend" ref="290119a4eb43cd6a9e98fa17016ba3c2" args="()" -->
+reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#290119a4eb43cd6a9e98fa17016ba3c2">rend</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f9c103e18d5f212703805354074ad44"></a><!-- doxytag: member="tbb::concurrent_vector::rbegin" ref="9f9c103e18d5f212703805354074ad44" args="() const " -->
+const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#9f9c103e18d5f212703805354074ad44">rbegin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d438b9b32ea3a8ffb703015b6dce055b"></a><!-- doxytag: member="tbb::concurrent_vector::rend" ref="d438b9b32ea3a8ffb703015b6dce055b" args="() const " -->
+const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#d438b9b32ea3a8ffb703015b6dce055b">rend</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db78a1d28c9c966050e8a2926d834a33"></a><!-- doxytag: member="tbb::concurrent_vector::crbegin" ref="db78a1d28c9c966050e8a2926d834a33" args="() const " -->
+const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#db78a1d28c9c966050e8a2926d834a33">crbegin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse start const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fff9cece89438587997ebedf93c5e962"></a><!-- doxytag: member="tbb::concurrent_vector::crend" ref="fff9cece89438587997ebedf93c5e962" args="() const " -->
+const_reverse_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#fff9cece89438587997ebedf93c5e962">crend</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">reverse end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15181759c0bfa2ddce5d10c7550e0002"></a><!-- doxytag: member="tbb::concurrent_vector::front" ref="15181759c0bfa2ddce5d10c7550e0002" args="()" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#15181759c0bfa2ddce5d10c7550e0002">front</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">the first item <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="502615a858eb9fa0390ee59169065e90"></a><!-- doxytag: member="tbb::concurrent_vector::front" ref="502615a858eb9fa0390ee59169065e90" args="() const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#502615a858eb9fa0390ee59169065e90">front</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">the first item const <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="41ce48d6015a1a2812d41cf620ec3476"></a><!-- doxytag: member="tbb::concurrent_vector::back" ref="41ce48d6015a1a2812d41cf620ec3476" args="()" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#41ce48d6015a1a2812d41cf620ec3476">back</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">the last item <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd518e204107d07fd08d0ec5bdfd383d"></a><!-- doxytag: member="tbb::concurrent_vector::back" ref="bd518e204107d07fd08d0ec5bdfd383d" args="() const " -->
+const_reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#bd518e204107d07fd08d0ec5bdfd383d">back</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">the last item const <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2fdba8e90de6a4d2300222236d46758e"></a><!-- doxytag: member="tbb::concurrent_vector::get_allocator" ref="2fdba8e90de6a4d2300222236d46758e" args="() const " -->
+allocator_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#2fdba8e90de6a4d2300222236d46758e">get_allocator</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">return allocator object <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="423e5aa15e0e3309ad86d026fd85f6f6"></a><!-- doxytag: member="tbb::concurrent_vector::assign" ref="423e5aa15e0e3309ad86d026fd85f6f6" args="(size_type n, const_reference t)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#423e5aa15e0e3309ad86d026fd85f6f6">assign</a> (size_type n, const_reference t)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">assign n items by copying t item <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="93a06b3112cb804f42f40efb5e7387b4"></a><!-- doxytag: member="tbb::concurrent_vector::assign" ref="93a06b3112cb804f42f40efb5e7387b4" args="(I first, I last)" -->
+template<class I> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00250.html#93a06b3112cb804f42f40efb5e7387b4">assign</a> (I first, I last)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">assign range [first, last) <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="96c9c4bd968ed3edb8dd276854d2dae0"></a><!-- doxytag: member="tbb::concurrent_vector::swap" ref="96c9c4bd968ed3edb8dd276854d2dae0" args="(concurrent_vector &vector)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#96c9c4bd968ed3edb8dd276854d2dae0">swap</a> (<a class="el" href="a00250.html">concurrent_vector</a> &vector)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">swap two instances <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#26f937a359a66b6aae904c3cd9a3c444">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear container while keeping memory allocated.  <a href="#26f937a359a66b6aae904c3cd9a3c444"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="da2444b28bb840d38f60d0030333a5fc"></a><!-- doxytag: member="tbb::concurrent_vector::~concurrent_vector" ref="da2444b28bb840d38f60d0030333a5fc" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html#da2444b28bb840d38f60d0030333a5fc">~concurrent_vector</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear and destroy vector. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bb5ae659871478f1f5c68039e1273e12"></a><!-- doxytag: member="tbb::concurrent_vector::internal_vector_base" ref="bb5ae659871478f1f5c68039e1273e12" args="() const " -->
+const internal::concurrent_vector_base_v3 & </td><td class="memItemRight" valign="bottom"><b>internal_vector_base</b> () const </td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="30086a58bff79a91103723be20916b96"></a><!-- doxytag: member="tbb::concurrent_vector::internal::vector_iterator" ref="30086a58bff79a91103723be20916b96" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::vector_iterator</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the root task of the graph. <br></td></tr>
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>run_and_put_task</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>generic_range_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>run_task</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>internal_loop_guide</b></td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception-aware helper class for filling a segment by exception-danger operators of user class. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-The graph class. 
+<h3>template<typename T, class A><br>
+ class tbb::concurrent_vector< T, A ></h3>
+
+Concurrent vector container. 
+<p>
+<a class="el" href="a00250.html">concurrent_vector</a> is a container having the following main properties:<ul>
+<li>It provides random indexed access to its elements. The index of the first element is 0.</li><li>It ensures safe concurrent growing its size (different threads can safely append new elements).</li><li>Adding new elements does not invalidate existing iterators and does not change indices of existing items.</li></ul>
 <p>
-This class serves as a handle to the graph 
+<dl compact><dt><b>Compatibility</b></dt><dd>The class meets all Container Requirements and Reversible Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1). But it doesn't meet Sequence Requirements due to absence of insert() and erase() methods.</dd></dl>
+<dl compact><dt><b>Exception Safety</b></dt><dd>Methods working with memory allocation and/or new elements construction can throw an exception if allocator fails to allocate memory or element's default constructor throws one. Concurrent vector's element of type T must conform to the following requirements:<ul>
+<li>Throwing an exception is forbidden for destructor of T.</li><li>Default constructor of T must not throw an exception OR its non-virtual destructor must safely work when its object memory is zero-initialized.</li></ul>
+Otherwise, the program's behavior is undefined. </dd></dl>
+<dl compact><dt><b></b></dt><dd>If an exception happens inside growth or assignment operation, an instance of the vector becomes invalid unless it is stated otherwise in the method documentation. Invalid state means:<ul>
+<li>There are no guaranties that all items were initialized by a constructor. The rest of items is zero-filled, including item where exception happens.</li><li>An invalid vector instance cannot be repaired; it is unable to grow anymore.</li><li>Size and capacity reported by the vector are incorrect, and calculated as if the failed operation were successful.</li><li>Attempt to access not allocated elements using operator[] or iterators results in access violation or segmentation fault exc [...]
+If a concurrent grow operation successfully completes, all the elements it has added to the vector will remain valid and accessible even if one of subsequent grow operations fails.</dd></dl>
+<dl compact><dt><b>Fragmentation</b></dt><dd>Unlike an STL vector, a <a class="el" href="a00250.html">concurrent_vector</a> does not move existing elements if it needs to allocate more memory. The container is divided into a series of contiguous arrays of elements. The first reservation, growth, or assignment operation determines the size of the first array. Using small number of elements as initial size incurs fragmentation that may increase element access time. Internal layout can be o [...]
+<dl compact><dt><b>Changes since TBB 2.1</b></dt><dd><ul>
+<li>Fixed guarantees of <a class="el" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">concurrent_vector::size()</a> and <a class="el" href="a00250.html#47fe588214dd5fa06ab6e8ab78d83874">grow_to_at_least()</a> methods to assure elements are allocated.</li><li>Methods <a class="el" href="a00250.html#c0b51160e5a764982ec97a455f94f2c6">end()</a>/rbegin()/back() are partly thread-safe since they use <a class="el" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a> to get the end [...]
+</dd></dl>
+<dl compact><dt><b>Changes since TBB 2.0</b></dt><dd><ul>
+<li>Implemented exception-safety guaranties</li><li>Added template argument for allocator</li><li>Added allocator argument in constructors</li><li>Faster index calculation</li><li>First growth call specifies a number of segments to be merged in the first allocation.</li><li>Fixed memory blow up for swarm of vector's instances of small size</li><li>Added <a class="el" href="a00250.html#38274ab3f772ecba600c7daca7690102">grow_by(size_type n, const_reference t)</a> growth using copying const [...]
+</dd></dl>
+
 <p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="55332084e7884a26ff288b8fe960030d"></a><!-- doxytag: member="tbb::graph::~graph" ref="55332084e7884a26ff288b8fe960030d" args="()" -->
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="26f937a359a66b6aae904c3cd9a3c444"></a><!-- doxytag: member="tbb::concurrent_vector::clear" ref="26f937a359a66b6aae904c3cd9a3c444" args="()" -->
 <div class="memitem">
 <div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
       <table class="memname">
         <tr>
-          <td class="memname">tbb::graph::~graph           </td>
+          <td class="memname">void <a class="el" href="a00250.html">tbb::concurrent_vector</a>< T, A >::clear           </td>
           <td>(</td>
           <td class="paramname">          </td>
           <td> ) </td>
@@ -98,20 +350,86 @@ This class serves as a handle to the graph
 <div class="memdoc">
 
 <p>
-Destroys the graph. 
+Clear container while keeping memory allocated. 
 <p>
-Calls wait_for_all on the graph, deletes all of the nodes appended by calls to add, and then destroys the root task of the graph. 
+To free up the memory, use in conjunction with method <a class="el" href="a00250.html#1693d1da41b1a8235871be9c6633be35">compact()</a>. Not thread safe 
 </div>
 </div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="ff3b6a3ef2ae1e661dcdb398c227b43c"></a><!-- doxytag: member="tbb::graph::decrement_wait_count" ref="ff3b6a3ef2ae1e661dcdb398c227b43c" args="()" -->
+<a class="anchor" name="473a59a4c9308b93411b898b3110d26c"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="473a59a4c9308b93411b898b3110d26c" args="(size_type delta, const_reference t)" -->
 <div class="memitem">
 <div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
       <table class="memname">
         <tr>
-          <td class="memname">void tbb::graph::decrement_wait_count           </td>
+          <td class="memname">iterator <a class="el" href="a00250.html">tbb::concurrent_vector</a>< T, A >::grow_by           </td>
           <td>(</td>
-          <td class="paramname">          </td>
+          <td class="paramtype">size_type </td>
+          <td class="paramname"> <em>delta</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const_reference </td>
+          <td class="paramname"> <em>t</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Returns iterator pointing to the first new element. 
+</div>
+</div><p>
+<a class="anchor" name="38274ab3f772ecba600c7daca7690102"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="38274ab3f772ecba600c7daca7690102" args="(size_type delta, const_reference t)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">size_type <a class="el" href="a00250.html">tbb::concurrent_vector</a>< T, A >::grow_by           </td>
+          <td>(</td>
+          <td class="paramtype">size_type </td>
+          <td class="paramname"> <em>delta</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const_reference </td>
+          <td class="paramname"> <em>t</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Grow by "delta" elements using copying constuctor. 
+<p>
+Returns old size. 
+</div>
+</div><p>
+<a class="anchor" name="c8177b1865270ea68aa1ab9148e5e35e"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="c8177b1865270ea68aa1ab9148e5e35e" args="(size_type delta)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">iterator <a class="el" href="a00250.html">tbb::concurrent_vector</a>< T, A >::grow_by           </td>
+          <td>(</td>
+          <td class="paramtype">size_type </td>
+          <td class="paramname"> <em>delta</em>          </td>
           <td> ) </td>
           <td width="100%"><code> [inline]</code></td>
         </tr>
@@ -120,19 +438,20 @@ Calls wait_for_all on the graph, deletes all of the nodes appended by calls to a
 <div class="memdoc">
 
 <p>
-Deregisters an external entity that may have interacted with the graph. 
-<p>
-The graph will not return from wait_for_all until all the number of decrement_wait_count calls matches the number of increment_wait_count calls. 
+Returns iterator pointing to the first new element. 
 </div>
 </div><p>
-<a class="anchor" name="1e5c5ae6538ec714cee107d1004705b9"></a><!-- doxytag: member="tbb::graph::increment_wait_count" ref="1e5c5ae6538ec714cee107d1004705b9" args="()" -->
+<a class="anchor" name="30484e3959892fd5392fa93c873c31f0"></a><!-- doxytag: member="tbb::concurrent_vector::grow_by" ref="30484e3959892fd5392fa93c873c31f0" args="(size_type delta)" -->
 <div class="memitem">
 <div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
       <table class="memname">
         <tr>
-          <td class="memname">void tbb::graph::increment_wait_count           </td>
+          <td class="memname">size_type <a class="el" href="a00250.html">tbb::concurrent_vector</a>< T, A >::grow_by           </td>
           <td>(</td>
-          <td class="paramname">          </td>
+          <td class="paramtype">size_type </td>
+          <td class="paramname"> <em>delta</em>          </td>
           <td> ) </td>
           <td width="100%"><code> [inline]</code></td>
         </tr>
@@ -141,22 +460,22 @@ The graph will not return from wait_for_all until all the number of decrement_wa
 <div class="memdoc">
 
 <p>
-Used to register that an external entity may still interact with the graph. 
+Grow by "delta" elements. 
 <p>
-The graph will not return from wait_for_all until a matching number of decrement_wait_count calls is made. 
+Returns old size. 
 </div>
 </div><p>
-<a class="anchor" name="71213dd18099298dc74731e293c8286a"></a><!-- doxytag: member="tbb::graph::run" ref="71213dd18099298dc74731e293c8286a" args="(Body body)" -->
+<a class="anchor" name="a7e3b67c8ccab16d0aecc80899ae799d"></a><!-- doxytag: member="tbb::concurrent_vector::grow_to_at_least" ref="a7e3b67c8ccab16d0aecc80899ae799d" args="(size_type n)" -->
 <div class="memitem">
 <div class="memproto">
 <div class="memtemplate">
-template<typename Body> </div>
+template<typename T, class A> </div>
       <table class="memname">
         <tr>
-          <td class="memname">void tbb::graph::run           </td>
+          <td class="memname">iterator <a class="el" href="a00250.html">tbb::concurrent_vector</a>< T, A >::grow_to_at_least           </td>
           <td>(</td>
-          <td class="paramtype">Body </td>
-          <td class="paramname"> <em>body</em>          </td>
+          <td class="paramtype">size_type </td>
+          <td class="paramname"> <em>n</em>          </td>
           <td> ) </td>
           <td width="100%"><code> [inline]</code></td>
         </tr>
@@ -165,52 +484,92 @@ template<typename Body> </div>
 <div class="memdoc">
 
 <p>
-Spawns a task that runs a function object. 
-<p>
-The task is spawned as a child of the graph. This is useful for running tasks that need to block a <a class="el" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">wait_for_all()</a> on the graph. For example a one-off source. 
+The new elements are default constructed. Blocks until all elements in range [0..n) are allocated. May return while other elements are being constructed by other threads. Returns iterator that points to beginning of appended sequence. If no elements were appended, returns iterator pointing to nth element. 
 </div>
 </div><p>
-<a class="anchor" name="4c5e8dc5a45e641d534d6206838cfa7f"></a><!-- doxytag: member="tbb::graph::run" ref="4c5e8dc5a45e641d534d6206838cfa7f" args="(Receiver &r, Body body)" -->
+<a class="anchor" name="47fe588214dd5fa06ab6e8ab78d83874"></a><!-- doxytag: member="tbb::concurrent_vector::grow_to_at_least" ref="47fe588214dd5fa06ab6e8ab78d83874" args="(size_type n)" -->
 <div class="memitem">
 <div class="memproto">
 <div class="memtemplate">
-template<typename Receiver, typename Body> </div>
+template<typename T, class A> </div>
       <table class="memname">
         <tr>
-          <td class="memname">void tbb::graph::run           </td>
+          <td class="memname">void <a class="el" href="a00250.html">tbb::concurrent_vector</a>< T, A >::grow_to_at_least           </td>
           <td>(</td>
-          <td class="paramtype">Receiver & </td>
-          <td class="paramname"> <em>r</em>, </td>
+          <td class="paramtype">size_type </td>
+          <td class="paramname"> <em>n</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
         </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Append minimal sequence of elements such that <a class="el" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>>=n. 
+<p>
+The new elements are default constructed. Blocks until all elements in range [0..n) are allocated. May return while other elements are being constructed by other threads. 
+</div>
+</div><p>
+<a class="anchor" name="4c52f2950bb1832886bd4458eb09d7eb"></a><!-- doxytag: member="tbb::concurrent_vector::operator[]" ref="4c52f2950bb1832886bd4458eb09d7eb" args="(size_type index)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+      <table class="memname">
         <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">Body </td>
-          <td class="paramname"> <em>body</em></td><td> </td>
+          <td class="memname">reference <a class="el" href="a00250.html">tbb::concurrent_vector</a>< T, A >::operator[]           </td>
+          <td>(</td>
+          <td class="paramtype">size_type </td>
+          <td class="paramname"> <em>index</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
         </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Get reference to element at given index. 
+<p>
+This method is thread-safe for concurrent reads, and also while growing the vector, as long as the calling thread has checked that index<<a class="el" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size()</a>. 
+</div>
+</div><p>
+<a class="anchor" name="e94e038f915c0268fdf2d3d7f87d81b8"></a><!-- doxytag: member="tbb::concurrent_vector::push_back" ref="e94e038f915c0268fdf2d3d7f87d81b8" args="(const_reference item) iterator push_back(const _reference item)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
+      <table class="memname">
         <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"><code> [inline]</code></td>
+          <td class="memname">size_type <a class="el" href="a00250.html">tbb::concurrent_vector</a>< T, A >::push_back           </td>
+          <td>(</td>
+          <td class="paramtype">const_reference </td>
+          <td class="paramname"> <em>item</em>          </td>
+          <td> ) </td>
+          <td width="100%"> const<code> [inline]</code></td>
         </tr>
       </table>
 </div>
 <div class="memdoc">
 
 <p>
-Spawns a task that runs a body and puts its output to a specific receiver. 
+Push item. 
 <p>
-The task is spawned as a child of the graph. This is useful for running tasks that need to block a <a class="el" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">wait_for_all()</a> on the graph. For example a one-off source. 
+Returns iterator pointing to the new element. 
 </div>
 </div><p>
-<a class="anchor" name="bafd6349fdc6563ffa02746866e30bec"></a><!-- doxytag: member="tbb::graph::wait_for_all" ref="bafd6349fdc6563ffa02746866e30bec" args="()" -->
+<a class="anchor" name="5a0ce05026994b010018f72cfdeb72c1"></a><!-- doxytag: member="tbb::concurrent_vector::reserve" ref="5a0ce05026994b010018f72cfdeb72c1" args="(size_type n)" -->
 <div class="memitem">
 <div class="memproto">
+<div class="memtemplate">
+template<typename T, class A> </div>
       <table class="memname">
         <tr>
-          <td class="memname">void tbb::graph::wait_for_all           </td>
+          <td class="memname">void <a class="el" href="a00250.html">tbb::concurrent_vector</a>< T, A >::reserve           </td>
           <td>(</td>
-          <td class="paramname">          </td>
+          <td class="paramtype">size_type </td>
+          <td class="paramname"> <em>n</em>          </td>
           <td> ) </td>
           <td width="100%"><code> [inline]</code></td>
         </tr>
@@ -219,13 +578,13 @@ The task is spawned as a child of the graph. This is useful for running tasks th
 <div class="memdoc">
 
 <p>
-Waits until the graph is idle and the number of decrement_wait_count calls equals the number of increment_wait_count calls. 
+Allocate enough space to grow to size n without having to allocate more memory later. 
 <p>
-The waiting thread will go off and steal work while it is block in the wait_for_all. 
+Like most of the methods provided for STL compatibility, this method is *not* thread safe. The capacity afterwards may be bigger than the requested reservation. 
 </div>
 </div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00443.html">concurrent_vector.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00251.html b/doc/html/a00251.html
index 43671de..53ab362 100644
--- a/doc/html/a00251.html
+++ b/doc/html/a00251.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::graph_node Class Reference</title>
+<title>tbb::flow::interface6::continue_msg Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,41 +21,20 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00251.html">graph_node</a></div>
-<h1>tbb::graph_node Class Reference</h1><!-- doxytag: class="tbb::graph_node" -->The base of all graph nodes. Allows them to be stored in a collection for deletion.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00251.html">continue_msg</a></div>
+<h1>tbb::flow::interface6::continue_msg Class Reference</h1><!-- doxytag: class="tbb::flow::interface6::continue_msg" -->An empty class used for messages that mean "I'm done".  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::graph_node:
-<p><center><img src="a00251.png" usemap="#tbb::graph_node_map" border="0" alt=""></center>
-<map name="tbb::graph_node_map">
-<area href="a00224.html" alt="tbb::broadcast_node< T >" shape="rect" coords="4716,56,9422,80">
-<area href="a00225.html" alt="tbb::buffer_node< T >" shape="rect" coords="4716,112,9422,136">
-<area href="a00244.html" alt="tbb::executable_node< Output >" shape="rect" coords="4716,168,9422,192">
-<area href="a00244.html" alt="tbb::executable_node< tbb::continue_msg >" shape="rect" coords="4716,224,9422,248">
-<area href="a00249.html" alt="tbb::function_node< Input, Output >" shape="rect" coords="4716,280,9422,304">
-<area href="a00254.html" alt="tbb::internal::join_node_base< JP, InputTuple, OutputTuple >" shape="rect" coords="4716,336,9422,360">
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type > >, OutputTuple >" shape="rect" coords="4716,392,9422,416">
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type > >, OutputTuple >" shape="rect" coords="4716,448,9422,472">
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type > >, OutputTuple >" shape="rect" coords="4716,504,9422,528">
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 4, OutputTuple >::type > >, OutputTuple >" shape= [...]
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 4, OutputTuple >::type >, tbb::internal::two_phas [...]
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 4, OutputTuple >::type >, tbb::internal::two_phas [...]
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 4, OutputTuple >::type >, tbb::internal::two_phas [...]
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 4, OutputTuple >::type >, tbb::internal::two_phas [...]
-<area href="a00254.html" alt="tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 4, OutputTuple >::type >, tbb::internal::two_phas [...]
-<area href="a00255.html" alt="tbb::limiter_node< T >" shape="rect" coords="4716,896,9422,920">
-<area href="a00285.html" alt="tbb::source_node< Output >" shape="rect" coords="4716,952,9422,976">
-</map>
-<a href="a00040.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-The base of all graph nodes. Allows them to be stored in a collection for deletion. 
+An empty class used for messages that mean "I'm done". 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00251.png b/doc/html/a00251.png
deleted file mode 100644
index 31daf9e..0000000
Binary files a/doc/html/a00251.png and /dev/null differ
diff --git a/doc/html/a00252.html b/doc/html/a00252.html
index 9fdf1d3..8ebd70d 100644
--- a/doc/html/a00252.html
+++ b/doc/html/a00252.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::improper_lock Class Reference</title>
+<title>tbb::flow::interface6::continue_node< Output > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,24 +21,65 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00252.html">improper_lock</a></div>
-<h1>tbb::improper_lock Class Reference</h1><!-- doxytag: class="tbb::improper_lock" -->Exception for PPL locks.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00252.html">continue_node</a></div>
+<h1>tbb::flow::interface6::continue_node< Output > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::continue_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node" -->Implements an executable node that supports <a class="el" href="a00251.html">continue_msg</a> -> Output.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<a href="a00139.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::continue_node< Output >:
+<p><center><img src="a00252.png" usemap="#tbb::flow::interface6::continue_node< Output >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::continue_node< Output >_map">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,271,24">
+</map>
+<a href="a00054.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7a06613c9cda6f13a6010e7f2f8d0c23"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::input_type" ref="7a06613c9cda6f13a6010e7f2f8d0c23" args="" -->
+typedef <a class="el" href="a00251.html">continue_msg</a> </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="01b4d78a352cfb7d62b5ce2d1baa24f3"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::output_type" ref="01b4d78a352cfb7d62b5ce2d1baa24f3" args="" -->
+typedef Output </td><td class="memItemRight" valign="bottom"><b>output_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9ae7fda69d7d69c55cf8b57ae7b4b613"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::predecessor_type" ref="9ae7fda69d7d69c55cf8b57ae7b4b613" args="" -->
+typedef <a class="el" href="a00301.html">sender</a>< <a class="el" href="a00251.html">input_type</a> > </td><td class="memItemRight" valign="bottom"><b>predecessor_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5a647a2b302232fe9a8f44940987f21"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::successor_type" ref="d5a647a2b302232fe9a8f44940987f21" args="" -->
+typedef <a class="el" href="a00295.html">receiver</a>< output_type > </td><td class="memItemRight" valign="bottom"><b>successor_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="868190ed9818d1d23eb65c87689657d5"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::fOutput_type" ref="868190ed9818d1d23eb65c87689657d5" args="" -->
+typedef internal::function_output<<br>
+ output_type > </td><td class="memItemRight" valign="bottom"><b>fOutput_type</b></td></tr>
+
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74213c2d20407e1fa16b70ca55ef27c6"></a><!-- doxytag: member="tbb::improper_lock::what" ref="74213c2d20407e1fa16b70ca55ef27c6" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const   throw ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="2f200db877d2f80c08d09422e8bffd5a"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::continue_node" ref="2f200db877d2f80c08d09422e8bffd5a" args="(graph &g, Body body)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00252.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a> (<a class="el" href="a00262.html">graph</a> &g, Body body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor for executable node with <a class="el" href="a00251.html">continue_msg</a> -> Output. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="7817aebf22dd125ca04df53ac488d163"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::continue_node" ref="7817aebf22dd125ca04df53ac488d163" args="(graph &g, int number_of_predecessors, Body body)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00252.html#7817aebf22dd125ca04df53ac488d163">continue_node</a> (<a class="el" href="a00262.html">graph</a> &g, int number_of_predecessors, Body body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor for executable node with <a class="el" href="a00251.html">continue_msg</a> -> Output. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="869562787fcb5c57a90aea120f26d492"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::continue_node" ref="869562787fcb5c57a90aea120f26d492" args="(const continue_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00252.html#869562787fcb5c57a90aea120f26d492">continue_node</a> (const <a class="el" href="a00252.html">continue_node</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23d3b09e13e2dbc32a6308a821e8ba29"></a><!-- doxytag: member="tbb::flow::interface6::continue_node::successors" ref="23d3b09e13e2dbc32a6308a821e8ba29" args="()" -->
+internal::broadcast_cache<<br>
+ output_type > & </td><td class="memItemRight" valign="bottom"><b>successors</b> ()</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception for PPL locks. 
+<h3>template<typename Output><br>
+ class tbb::flow::interface6::continue_node< Output ></h3>
+
+Implements an executable node that supports <a class="el" href="a00251.html">continue_msg</a> -> Output. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00252.png b/doc/html/a00252.png
new file mode 100644
index 0000000..97eb6db
Binary files /dev/null and b/doc/html/a00252.png differ
diff --git a/doc/html/a00253.html b/doc/html/a00253.html
index 0637f2d..696e637 100644
--- a/doc/html/a00253.html
+++ b/doc/html/a00253.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::invalid_multiple_scheduling Class Reference</title>
+<title>tbb::flow::interface6::continue_receiver Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,24 +21,142 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00253.html">invalid_multiple_scheduling</a></div>
-<h1>tbb::invalid_multiple_scheduling Class Reference</h1><!-- doxytag: class="tbb::invalid_multiple_scheduling" -->Exception for repeated scheduling of the same task_handle.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00253.html">continue_receiver</a></div>
+<h1>tbb::flow::interface6::continue_receiver Class Reference</h1><!-- doxytag: class="tbb::flow::interface6::continue_receiver" --><!-- doxytag: inherits="tbb::flow::interface6::receiver" -->Base class for receivers of completion messages.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<a href="a00141.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::continue_receiver:
+<p><center><img src="a00253.png" usemap="#tbb::flow::interface6::continue_receiver_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::continue_receiver_map">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="0,0,230,24">
+</map>
+<a href="a00043.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3c43c166af832d9187035985841e0a7f"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::input_type" ref="3c43c166af832d9187035985841e0a7f" args="" -->
+typedef <a class="el" href="a00251.html">continue_msg</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html#3c43c166af832d9187035985841e0a7f">input_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f9c58b3e9c46afd2518d0fd8957a5a2f"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::predecessor_type" ref="f9c58b3e9c46afd2518d0fd8957a5a2f" args="" -->
+typedef <a class="el" href="a00301.html">sender</a>< <a class="el" href="a00251.html">continue_msg</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html#f9c58b3e9c46afd2518d0fd8957a5a2f">predecessor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57082ccac880db17144db76c0f94701e"></a><!-- doxytag: member="tbb::invalid_multiple_scheduling::what" ref="57082ccac880db17144db76c0f94701e" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const   throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="177db82d548a1f8471371331890b91a8"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::continue_receiver" ref="177db82d548a1f8471371331890b91a8" args="(int number_of_predecessors=0)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html#177db82d548a1f8471371331890b91a8">continue_receiver</a> (int number_of_predecessors=0)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0b292ed7fa6556b2a735f6d1e82dc74"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::continue_receiver" ref="a0b292ed7fa6556b2a735f6d1e82dc74" args="(const continue_receiver &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html#a0b292ed7fa6556b2a735f6d1e82dc74">continue_receiver</a> (const <a class="el" href="a00253.html">continue_receiver</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e14828fa079b9835ff7267df5ee45d7"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::~continue_receiver" ref="1e14828fa079b9835ff7267df5ee45d7" args="()" -->
+virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html#1e14828fa079b9835ff7267df5ee45d7">~continue_receiver</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2fcfa4990a42417bbeb1f3c8b9ac8a22"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::register_predecessor" ref="2fcfa4990a42417bbeb1f3c8b9ac8a22" args="(predecessor_type &)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">register_predecessor</a> (<a class="el" href="a00301.html">predecessor_type</a> &)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Increments the trigger threshold. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html#cb691b18416d4742265aed84d496ebbd">remove_predecessor</a> (<a class="el" href="a00301.html">predecessor_type</a> &)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Decrements the trigger threshold.  <a href="#cb691b18416d4742265aed84d496ebbd"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html#3969c70fb89c0a982f142ae9eb5facae">try_put</a> (const <a class="el" href="a00251.html">input_type</a> &)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Puts a <a class="el" href="a00251.html">continue_msg</a> to the receiver.  <a href="#3969c70fb89c0a982f142ae9eb5facae"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute</a> ()=0</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Does whatever should happen when the threshold is reached.  <a href="#40ca8b7e96c5bc3428b4d1e409725ee5"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5cddbd33109e94a68fb5457682a62110"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::my_mutex" ref="5cddbd33109e94a68fb5457682a62110" args="" -->
+<a class="el" href="a00305.html">spin_mutex</a> </td><td class="memItemRight" valign="bottom"><b>my_mutex</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="66df49f67e70e7f8e9831d0e362ba84c"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::my_predecessor_count" ref="66df49f67e70e7f8e9831d0e362ba84c" args="" -->
+int </td><td class="memItemRight" valign="bottom"><b>my_predecessor_count</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05fd1ce3c3fd7be3e74817b31fd2f068"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::my_current_count" ref="05fd1ce3c3fd7be3e74817b31fd2f068" args="" -->
+int </td><td class="memItemRight" valign="bottom"><b>my_current_count</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a0d4c3084fd13902c2d38f31c1dc232"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::my_initial_predecessor_count" ref="8a0d4c3084fd13902c2d38f31c1dc232" args="" -->
+int </td><td class="memItemRight" valign="bottom"><b>my_initial_predecessor_count</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception for repeated scheduling of the same task_handle. 
+Base class for receivers of completion messages. 
+<p>
+These receivers automatically reset, but cannot be explicitly waited on 
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="40ca8b7e96c5bc3428b4d1e409725ee5"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::execute" ref="40ca8b7e96c5bc3428b4d1e409725ee5" args="()=0" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">virtual void tbb::flow::interface6::continue_receiver::execute           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [protected, pure virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Does whatever should happen when the threshold is reached. 
+<p>
+This should be very fast or else spawn a task. This is called while the sender is blocked in the <a class="el" href="a00253.html#3969c70fb89c0a982f142ae9eb5facae">try_put()</a>. 
+</div>
+</div><p>
+<a class="anchor" name="cb691b18416d4742265aed84d496ebbd"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::remove_predecessor" ref="cb691b18416d4742265aed84d496ebbd" args="(predecessor_type &)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool tbb::flow::interface6::continue_receiver::remove_predecessor           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00301.html">predecessor_type</a> & </td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Decrements the trigger threshold. 
+<p>
+Does not check to see if the removal of the predecessor now makes the current count exceed the new threshold. So removing a predecessor while the graph is active can cause unexpected results. 
+</div>
+</div><p>
+<a class="anchor" name="3969c70fb89c0a982f142ae9eb5facae"></a><!-- doxytag: member="tbb::flow::interface6::continue_receiver::try_put" ref="3969c70fb89c0a982f142ae9eb5facae" args="(const input_type &)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool tbb::flow::interface6::continue_receiver::try_put           </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="a00251.html">input_type</a> & </td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Puts a <a class="el" href="a00251.html">continue_msg</a> to the receiver. 
 <p>
+If the message causes the message count to reach the predecessor count, <a class="el" href="a00253.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute()</a> is called and the message count is reset to 0. Otherwise the message count is incremented. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00253.png b/doc/html/a00253.png
new file mode 100644
index 0000000..b14a696
Binary files /dev/null and b/doc/html/a00253.png differ
diff --git a/doc/html/a00254.html b/doc/html/a00254.html
index 82fd7ad..9624512 100644
--- a/doc/html/a00254.html
+++ b/doc/html/a00254.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::internal::join_node_base< JP, InputTuple, OutputTuple > Class Template Reference</title>
+<title>tbb::empty_task Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,65 +21,28 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00254.html">join_node_base</a></div>
-<h1>tbb::internal::join_node_base< JP, InputTuple, OutputTuple > Class Template Reference</h1><!-- doxytag: class="tbb::internal::join_node_base" --><!-- doxytag: inherits="tbb::graph_node,tbb::sender< OutputTuple >" --><a class="el" href="a00254.html">join_node_base</a>  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00254.html">empty_task</a></div>
+<h1>tbb::empty_task Class Reference<br>
+<small>
+[<a class="el" href="a00400.html">Task Scheduling</a>]</small>
+</h1><!-- doxytag: class="tbb::empty_task" --><!-- doxytag: inherits="tbb::task" -->task that does nothing. Useful for synchronization.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00567.html">task.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::internal::join_node_base< JP, InputTuple, OutputTuple >:
-<p><center><img src="a00254.png" usemap="#tbb::internal::join_node_base< JP, InputTuple, OutputTuple >_map" border="0" alt=""></center>
-<map name="tbb::internal::join_node_base< JP, InputTuple, OutputTuple >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,355,24">
-<area href="a00282.html" alt="tbb::sender< OutputTuple >" shape="rect" coords="365,0,720,24">
+<p>Inheritance diagram for tbb::empty_task:
+<p><center><img src="a00254.png" usemap="#tbb::empty_task_map" border="0" alt=""></center>
+<map name="tbb::empty_task_map">
+<area href="a00311.html" alt="tbb::task" shape="rect" coords="0,0,97,24">
 </map>
-<a href="a00067.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00120.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="578893d923f91b7e44a15dea8b0d7082"></a><!-- doxytag: member="tbb::internal::join_node_base::output_type" ref="578893d923f91b7e44a15dea8b0d7082" args="" -->
-typedef OutputTuple </td><td class="memItemRight" valign="bottom"><a class="el" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">output_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1212cbaa293a93c3bf334da1539556bd"></a><!-- doxytag: member="tbb::internal::join_node_base::successor_type" ref="1212cbaa293a93c3bf334da1539556bd" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="caa4c6d62f43e839024d99fb49ff4d25"></a><!-- doxytag: member="tbb::internal::join_node_base::input_ports_type" ref="caa4c6d62f43e839024d99fb49ff4d25" args="" -->
-typedef join_node_FE< JP,<br>
- InputTuple, OutputTuple > </td><td class="memItemRight" valign="bottom"><b>input_ports_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74c044c29d83c8b70496ea2d40a3e8cf"></a><!-- doxytag: member="tbb::internal::join_node_base::join_node_base" ref="74c044c29d83c8b70496ea2d40a3e8cf" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><b>join_node_base</b> (<a class="el" href="a00250.html">graph</a> &g)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4fe2bd006dbd111d1f1785ee6571dde6"></a><!-- doxytag: member="tbb::internal::join_node_base::register_successor" ref="4fe2bd006dbd111d1f1785ee6571dde6" args="(successor_type &r)" -->
-bool </td><td class="memItemRight" valign="bottom"><b>register_successor</b> (<a class="el" href="a00277.html">successor_type</a> &r)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="c3902ed788ea0c808de846b23d661548"></a><!-- doxytag: member="tbb::internal::join_node_base::input_port" ref="c3902ed788ea0c808de846b23d661548" args="(void)" -->
-template<size_t N> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00277.html">receiver</a>< typename std::tuple_element<<br>
- N, OutputTuple >::value > & </td><td class="memTemplItemRight" valign="bottom"><b>input_port</b> (void)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="46a9a783464d2739bb9dadfe794d8098"></a><!-- doxytag: member="tbb::internal::join_node_base::remove_successor" ref="46a9a783464d2739bb9dadfe794d8098" args="(successor_type &r)" -->
-bool </td><td class="memItemRight" valign="bottom"><b>remove_successor</b> (<a class="el" href="a00277.html">successor_type</a> &r)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="50c0e6465ac929a2e94d4e62a13ebeff"></a><!-- doxytag: member="tbb::internal::join_node_base::try_get" ref="50c0e6465ac929a2e94d4e62a13ebeff" args="(output_type &v)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00254.html#50c0e6465ac929a2e94d4e62a13ebeff">try_get</a> (<a class="el" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">output_type</a> &v)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the sender. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d7392be41db39cc27f6b52b4809c5f75"></a><!-- doxytag: member="tbb::internal::join_node_base::forward_task< join_node_base< JP, InputTuple, OutputTuple > >" ref="d7392be41db39cc27f6b52b4809c5f75" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>forward_task< join_node_base< JP, InputTuple, OutputTuple > ></b></td></tr>
-
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<join_policy JP, typename InputTuple, typename OutputTuple><br>
- class tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></h3>
-
-<a class="el" href="a00254.html">join_node_base</a> 
+task that does nothing. Useful for synchronization. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00567.html">task.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00254.png b/doc/html/a00254.png
index 53a922f..2fa6419 100644
Binary files a/doc/html/a00254.png and b/doc/html/a00254.png differ
diff --git a/doc/html/a00255.html b/doc/html/a00255.html
index 9d68537..51b8f44 100644
--- a/doc/html/a00255.html
+++ b/doc/html/a00255.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::limiter_node< T > Class Template Reference</title>
+<title>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,113 +21,171 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00255.html">limiter_node</a></div>
-<h1>tbb::limiter_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::limiter_node" --><!-- doxytag: inherits="tbb::graph_node,tbb::receiver,tbb::sender" -->Forwards messages only if the threshold has not been reached.  
+<a class="el" href="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00255.html">enumerable_thread_specific</a></div>
+<h1>tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type > Class Template Reference<br>
+<small>
+[<a class="el" href="a00396.html">Containers</a>]</small>
+</h1><!-- doxytag: class="tbb::interface6::enumerable_thread_specific" -->The <a class="el" href="a00255.html">enumerable_thread_specific</a> container.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00455.html">enumerable_thread_specific.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::limiter_node< T >:
-<p><center><img src="a00255.png" usemap="#tbb::limiter_node< T >_map" border="0" alt=""></center>
-<map name="tbb::limiter_node< T >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,134,24">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="144,0,278,24">
-<area href="a00282.html" alt="tbb::sender< T >" shape="rect" coords="288,0,422,24">
-</map>
-<a href="a00061.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00036.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f654b8974c613e8fd3de5a40e181d5ff"></a><!-- doxytag: member="tbb::limiter_node::input_type" ref="f654b8974c613e8fd3de5a40e181d5ff" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">input_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3c03eb40955b933b01987222722ac4bd"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::allocator_type" ref="3c03eb40955b933b01987222722ac4bd" args="" -->
+typedef Allocator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#3c03eb40955b933b01987222722ac4bd">allocator_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="370f88278dec6f584c1d08a375f9b4cd"></a><!-- doxytag: member="tbb::limiter_node::output_type" ref="370f88278dec6f584c1d08a375f9b4cd" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">output_type</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Basic types. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e93f3b75e82eaa845cc1a0514eaba31a"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::value_type" ref="e93f3b75e82eaa845cc1a0514eaba31a" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fd88ce7670e7107aef2161b45f156185"></a><!-- doxytag: member="tbb::limiter_node::predecessor_type" ref="fd88ce7670e7107aef2161b45f156185" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#fd88ce7670e7107aef2161b45f156185">predecessor_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0fd259a6b20641c768079f41d3213904"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::reference" ref="0fd259a6b20641c768079f41d3213904" args="" -->
+typedef T & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="754182cc1e5b403201495bc1fd45674b"></a><!-- doxytag: member="tbb::limiter_node::successor_type" ref="754182cc1e5b403201495bc1fd45674b" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#754182cc1e5b403201495bc1fd45674b">successor_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c1d47e24439524fea72d9c10df25d54"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_reference" ref="2c1d47e24439524fea72d9c10df25d54" args="" -->
+typedef const T & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27cf20b87f4381a69203aed11e5a34dc"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::pointer" ref="27cf20b87f4381a69203aed11e5a34dc" args="" -->
+typedef T * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e132e2a40dd6ce5472f8e13a1e80947"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_pointer" ref="0e132e2a40dd6ce5472f8e13a1e80947" args="" -->
+typedef const T * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c67c208bec3e8b77190d545bd1f150e3"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::size_type" ref="c67c208bec3e8b77190d545bd1f150e3" args="" -->
+typedef internal_collection_type::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eda9be9a80bed094d4657948b5b7831f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::difference_type" ref="eda9be9a80bed094d4657948b5b7831f" args="" -->
+typedef internal_collection_type::difference_type </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd6f8e0af3c5e5166a4223f88b03e0a5"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::iterator" ref="bd6f8e0af3c5e5166a4223f88b03e0a5" args="" -->
+typedef internal::enumerable_thread_specific_iterator<<br>
+ <a class="el" href="a00250.html">internal_collection_type</a>,<br>
+ value_type > </td><td class="memItemRight" valign="bottom"><b>iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ff2ff1a117048f5d57aedebb12d57e1"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_iterator" ref="8ff2ff1a117048f5d57aedebb12d57e1" args="" -->
+typedef internal::enumerable_thread_specific_iterator<<br>
+ <a class="el" href="a00250.html">internal_collection_type</a>,<br>
+ const value_type > </td><td class="memItemRight" valign="bottom"><b>const_iterator</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d4c23a666adbf88bd3280873de9d7f39"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range_type" ref="d4c23a666adbf88bd3280873de9d7f39" args="" -->
+typedef generic_range_type<<br>
+ iterator > </td><td class="memItemRight" valign="bottom"><b>range_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ce41c6603d8f547f11df05d1ccb2184"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::const_range_type" ref="0ce41c6603d8f547f11df05d1ccb2184" args="" -->
+typedef generic_range_type<<br>
+ const_iterator > </td><td class="memItemRight" valign="bottom"><b>const_range_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f0139fc645a51ce30b7aebb59c38a4ed"></a><!-- doxytag: member="tbb::limiter_node::limiter_node" ref="f0139fc645a51ce30b7aebb59c38a4ed" args="(graph &g, size_t threshold, int number_of_decrement_predecessors=0)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#f0139fc645a51ce30b7aebb59c38a4ed">limiter_node</a> (<a class="el" href="a00250.html">graph</a> &g, size_t threshold, int number_of_decrement_predecessors=0)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0cfa3a5c8f2be3bbf313d93b1fa8cdb3"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="0cfa3a5c8f2be3bbf313d93b1fa8cdb3" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#0cfa3a5c8f2be3bbf313d93b1fa8cdb3">enumerable_thread_specific</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Default constructor. Each local instance of T is default constructed. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="8d4b456ff9d7b289c73254eccc11db45"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="8d4b456ff9d7b289c73254eccc11db45" args="(Finit finit)" -->
+template<typename Finit> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00255.html#8d4b456ff9d7b289c73254eccc11db45">enumerable_thread_specific</a> (Finit finit)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor with initializer functor. Each local instance of T is constructed by T(finit()). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7bce6829981c9efe3f59cae2355e383e"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="7bce6829981c9efe3f59cae2355e383e" args="(const T &exemplar)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#7bce6829981c9efe3f59cae2355e383e">enumerable_thread_specific</a> (const T &exemplar)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constuctor with exemplar. Each local instance of T is copied-constructed from the exemplar. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a7907d9e3e5b18e7a7b55211ef3213f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::~enumerable_thread_specific" ref="5a7907d9e3e5b18e7a7b55211ef3213f" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#5a7907d9e3e5b18e7a7b55211ef3213f">~enumerable_thread_specific</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c8d5265ccbd5e4485996b3f3baaa5ba1"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::local" ref="c8d5265ccbd5e4485996b3f3baaa5ba1" args="()" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#c8d5265ccbd5e4485996b3f3baaa5ba1">local</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8b9dbfbfc52750fa0c6bb8849681e86"></a><!-- doxytag: member="tbb::limiter_node::register_successor" ref="b8b9dbfbfc52750fa0c6bb8849681e86" args="(receiver< output_type > &r)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#b8b9dbfbfc52750fa0c6bb8849681e86">register_successor</a> (<a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">output_type</a> > &r)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">returns reference to local, discarding exists <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7dc79058d2832f7447de8e691c3455ea"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::local" ref="7dc79058d2832f7447de8e691c3455ea" args="(bool &exists)" -->
+reference </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#7dc79058d2832f7447de8e691c3455ea">local</a> (bool &exists)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Replace the current successor with this new successor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#047d77f583e789e6d3ac6a52aba3168b">remove_successor</a> (<a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">output_type</a> > &r)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns reference to calling thread's local copy, creating one if necessary. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="33fd6593da1ed14340f10f67d5a69130"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::size" ref="33fd6593da1ed14340f10f67d5a69130" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#33fd6593da1ed14340f10f67d5a69130">size</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor from this node.  <a href="#047d77f583e789e6d3ac6a52aba3168b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a38facb46cde854cb7408bf9f3bf8999"></a><!-- doxytag: member="tbb::limiter_node::try_put" ref="a38facb46cde854cb7408bf9f3bf8999" args="(T t)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#a38facb46cde854cb7408bf9f3bf8999">try_put</a> (T t)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get the number of local copies. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72595886d0ac8fd0543f90038570510d"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::empty" ref="72595886d0ac8fd0543f90038570510d" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#72595886d0ac8fd0543f90038570510d">empty</a> () const </td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Puts an item to this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb9909b87538f5c881c7cb7577436d14"></a><!-- doxytag: member="tbb::limiter_node::register_predecessor" ref="fb9909b87538f5c881c7cb7577436d14" args="(predecessor_type &src)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#fb9909b87538f5c881c7cb7577436d14">register_predecessor</a> (<a class="el" href="a00282.html">predecessor_type</a> &src)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">true if there have been no local copies created <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="01d7baf8e913ab2819e97917a2ac795f"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::begin" ref="01d7baf8e913ab2819e97917a2ac795f" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#01d7baf8e913ab2819e97917a2ac795f">begin</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes src from the list of cached predecessors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a05cf39b2825183e9c0393890fbbbb41"></a><!-- doxytag: member="tbb::limiter_node::remove_predecessor" ref="a05cf39b2825183e9c0393890fbbbb41" args="(predecessor_type &src)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#a05cf39b2825183e9c0393890fbbbb41">remove_predecessor</a> (<a class="el" href="a00282.html">predecessor_type</a> &src)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">begin iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2456ff88252fc921b01cd8907628a4ee"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::end" ref="2456ff88252fc921b01cd8907628a4ee" args="()" -->
+iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#2456ff88252fc921b01cd8907628a4ee">end</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes src from the list of cached predecessors. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="181fa37d3e3c68ec3819ea46beed79a2"></a><!-- doxytag: member="tbb::limiter_node::decrement" ref="181fa37d3e3c68ec3819ea46beed79a2" args="" -->
-internal::decrementer< <a class="el" href="a00255.html">limiter_node</a><<br>
- T > > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">decrement</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="84afb3906a39e399cde1c950d6351300"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::begin" ref="84afb3906a39e399cde1c950d6351300" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#84afb3906a39e399cde1c950d6351300">begin</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">begin const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cb448bb4977ce366ceb7344085cc7050"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::end" ref="cb448bb4977ce366ceb7344085cc7050" args="() const " -->
+const_iterator </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#cb448bb4977ce366ceb7344085cc7050">end</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">end const iterator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b22c54990b2362cd93c1a8f73de140bc"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range" ref="b22c54990b2362cd93c1a8f73de140bc" args="(size_t grainsize=1)" -->
+range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#b22c54990b2362cd93c1a8f73de140bc">range</a> (size_t grainsize=1)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get range for parallel algorithms. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3b068000cf4dbf9b40f8bb7e3fc53e0b"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::range" ref="3b068000cf4dbf9b40f8bb7e3fc53e0b" args="(size_t grainsize=1) const " -->
+const_range_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">range</a> (size_t grainsize=1) const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Get const range for parallel algorithms. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8764176d4b6014c5d65f1051851abc8"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::clear" ref="a8764176d4b6014c5d65f1051851abc8" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html#a8764176d4b6014c5d65f1051851abc8">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys local copies. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="43bbf3a313c5431559df2946f76221e0"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="43bbf3a313c5431559df2946f76221e0" args="(const enumerable_thread_specific< U, Alloc, Cachetype > &other)" -->
+template<typename U, typename Alloc, ets_key_usage_type Cachetype> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00255.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="25a9c336cfd5a171c29cbdd0feb84249"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="25a9c336cfd5a171c29cbdd0feb84249" args="(const enumerable_thread_specific &other)" -->
+ </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b> (const <a class="el" href="a00255.html">enumerable_thread_specific</a> &other)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f8f467eb4c44c58614d0f9dce687477"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::operator=" ref="1f8f467eb4c44c58614d0f9dce687477" args="(const enumerable_thread_specific &other)" -->
+<a class="el" href="a00255.html">enumerable_thread_specific</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00255.html">enumerable_thread_specific</a> &other)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0e7ebbfd8e04eb22fe59b581206e7888"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::operator=" ref="0e7ebbfd8e04eb22fe59b581206e7888" args="(const enumerable_thread_specific< U, Alloc, Cachetype > &other)" -->
+template<typename U, typename Alloc, ets_key_usage_type Cachetype> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00255.html">enumerable_thread_specific</a> & </td><td class="memTemplItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00255.html">enumerable_thread_specific</a>< U, Alloc, Cachetype > &other)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1eac7eff6e21b7fc299b67acb36eb3c7"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::combine" ref="1eac7eff6e21b7fc299b67acb36eb3c7" args="(combine_func_t f_combine)" -->
+template<typename combine_func_t> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>combine</b> (combine_func_t f_combine)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f671d7bd4c1d3a750b4be4c32a489c55"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::combine_each" ref="f671d7bd4c1d3a750b4be4c32a489c55" args="(combine_func_t f_combine)" -->
+template<typename combine_func_t> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>combine_each</b> (combine_func_t f_combine)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The internal receiver< continue_msg > that decrements the count. <br></td></tr>
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed05e0c262c5a8869bf1395e1fb4bcf9"></a><!-- doxytag: member="tbb::limiter_node::internal::forward_task< limiter_node< T > >" ref="ed05e0c262c5a8869bf1395e1fb4bcf9" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::forward_task< limiter_node< T > ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="45364b2f249ceb935cff05c29fcfcf5c"></a><!-- doxytag: member="tbb::interface6::enumerable_thread_specific::enumerable_thread_specific" ref="45364b2f249ceb935cff05c29fcfcf5c" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>enumerable_thread_specific</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b43677b60c786d1071a7efd6f195c3be"></a><!-- doxytag: member="tbb::limiter_node::internal::decrementer< limiter_node< T > >" ref="b43677b60c786d1071a7efd6f195c3be" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::decrementer< limiter_node< T > ></b></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>generic_range_type</b></td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A generic range, used to create range objects from the iterators. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::limiter_node< T ></h3>
+<h3>template<typename T, typename Allocator = cache_aligned_allocator<T>, ets_key_usage_type ETS_key_type = ets_no_key><br>
+ class tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></h3>
 
-Forwards messages only if the threshold has not been reached. 
+The <a class="el" href="a00255.html">enumerable_thread_specific</a> container. 
 <p>
-This node forwards items until its threshold is reached. It contains no buffering. If the downstream node rejects, the message is dropped. 
+<a class="el" href="a00255.html">enumerable_thread_specific</a> has the following properties:<ul>
+<li>thread-local copies are lazily created, with default, exemplar or function initialization.</li><li>thread-local copies do not move (during lifetime, and excepting <a class="el" href="a00255.html#a8764176d4b6014c5d65f1051851abc8">clear()</a>) so the address of a copy is invariant.</li><li>the contained objects need not have operator=() defined if combine is not used.</li><li><a class="el" href="a00255.html">enumerable_thread_specific</a> containers may be copy-constructed or assigned. [...]
 <p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="047d77f583e789e6d3ac6a52aba3168b"></a><!-- doxytag: member="tbb::limiter_node::remove_successor" ref="047d77f583e789e6d3ac6a52aba3168b" args="(receiver< output_type > &r)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename T> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00255.html">tbb::limiter_node</a>< T >::remove_successor           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">output_type</a> > & </td>
-          <td class="paramname"> <em>r</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<dl compact><dt><b>Segmented iterator</b></dt><dd>When the thread-local objects are containers with input_iterators defined, a segmented iterator may be used to iterate over all the elements of all thread-local copies.</dd></dl>
+<dl compact><dt><b>combine and combine_each</b></dt><dd><ul>
+<li>Both methods are defined for <a class="el" href="a00255.html">enumerable_thread_specific</a>.</li><li>combine() requires the the type T have operator=() defined.</li><li>neither method modifies the contents of the object (though there is no guarantee that the applied methods do not modify the object.)</li><li>Both are evaluated in serial context (the methods are assumed to be non-benign.) </li></ul>
+</dd></dl>
 
 <p>
-Removes a successor from this node. 
-<p>
-r.remove_predecessor(*this) is also called. 
-<p>
-Implements <a class="el" href="a00282.html#3f345427e812e8741370308ff88f30bf">tbb::sender< T ></a>.
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00455.html">enumerable_thread_specific.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00255.png b/doc/html/a00255.png
deleted file mode 100644
index 1683483..0000000
Binary files a/doc/html/a00255.png and /dev/null differ
diff --git a/doc/html/a00256.html b/doc/html/a00256.html
index 14fb16f..7ebc5a4 100644
--- a/doc/html/a00256.html
+++ b/doc/html/a00256.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::missing_wait Class Reference</title>
+<title>tbb::filter Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,24 +21,210 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00256.html">missing_wait</a></div>
-<h1>tbb::missing_wait Class Reference</h1><!-- doxytag: class="tbb::missing_wait" -->Exception for missing wait on structured_task_group.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00256.html">filter</a></div>
+<h1>tbb::filter Class Reference<br>
+<small>
+[<a class="el" href="a00395.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::filter" -->A stage in a pipeline.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00543.html">pipeline.h</a>></code>
 <p>
-<a href="a00140.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::filter:
+<p><center><img src="a00256.png" usemap="#tbb::filter_map" border="0" alt=""></center>
+<map name="tbb::filter_map">
+<area href="a00322.html" alt="tbb::thread_bound_filter" shape="rect" coords="0,56,145,80">
+</map>
+<a href="a00091.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fe3f8527f9013266dc845a4ff22dd2cf"></a><!-- doxytag: member="tbb::missing_wait::what" ref="fe3f8527f9013266dc845a4ff22dd2cf" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const   throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fcfec27656a69ff2072802ac001e936f"></a><!-- doxytag: member="tbb::filter::is_serial" ref="fcfec27656a69ff2072802ac001e936f" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html#fcfec27656a69ff2072802ac001e936f">is_serial</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter is serial. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd53206c4795ef2df5df26b795caf692"></a><!-- doxytag: member="tbb::filter::is_ordered" ref="cd53206c4795ef2df5df26b795caf692" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter must receive stream in order. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15c29cae5d237e6d63dbfe5c94af89d5"></a><!-- doxytag: member="tbb::filter::is_bound" ref="15c29cae5d237e6d63dbfe5c94af89d5" args="() const " -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a> () const </td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">True if filter is thread-bound. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ec4dfe053e94a2349d56781ddea8477"></a><!-- doxytag: member="tbb::filter::object_may_be_null" ref="8ec4dfe053e94a2349d56781ddea8477" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">true if an input filter can emit null <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a> (void *item)=0</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Operate on an item from the input stream, and return item for output stream.  <a href="#fa1b3dc1f4f47563ccab7f4d92f5b543"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html#66d159f362293e3964ba3da8bc1d2604">~filter</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy filter.  <a href="#66d159f362293e3964ba3da8bc1d2604"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html#56275eb889c77c4807967133e21401bd">finalize</a> (void *)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys item if pipeline was cancelled.  <a href="#56275eb889c77c4807967133e21401bd"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1edba30e1e64e82ee4b7c6f227825817"></a><!-- doxytag: member="tbb::filter::x1" ref="1edba30e1e64e82ee4b7c6f227825817" args="((is_serial_?serial:parallel)|exact_exception_propagation))" -->
+ </td><td class="memItemRight" valign="bottom"><b>x1</b> ((is_serial_?serial:parallel)|<a class="el" href="a00256.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>))</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a06145c3e7ad273ece95eb8be642b0a2"></a><!-- doxytag: member="tbb::filter::prev_filter_in_pipeline" ref="a06145c3e7ad273ece95eb8be642b0a2" args="(not_in_pipeline())" -->
+ </td><td class="memItemRight" valign="bottom"><b>prev_filter_in_pipeline</b> (not_in_pipeline())</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7a54082a9165275bf7725970d756f132"></a><!-- doxytag: member="tbb::filter::my_pipeline" ref="7a54082a9165275bf7725970d756f132" args="(NULL)" -->
+ </td><td class="memItemRight" valign="bottom"><b>my_pipeline</b> (NULL)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d66d6e9e27b1be74fdb9c07f899d4837"></a><!-- doxytag: member="tbb::filter::next_segment" ref="d66d6e9e27b1be74fdb9c07f899d4837" args="(NULL)" -->
+ </td><td class="memItemRight" valign="bottom"><b>next_segment</b> (NULL)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3f49df3c34a3e5a8884001c30230a94"></a><!-- doxytag: member="tbb::filter::filter" ref="a3f49df3c34a3e5a8884001c30230a94" args="(mode filter_mode)" -->
+ </td><td class="memItemRight" valign="bottom"><b>filter</b> (mode filter_mode)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b2b9c0dd8123a8186b46bc100d9469f5"></a><!-- doxytag: member="tbb::filter::set_end_of_input" ref="b2b9c0dd8123a8186b46bc100d9469f5" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>set_end_of_input</b> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Static Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b7de3a76e744f3d9c1bc5d437ea851d"></a><!-- doxytag: member="tbb::filter::filter_is_serial" ref="4b7de3a76e744f3d9c1bc5d437ea851d" args="" -->
+static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> = 0x1</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The lowest bit 0 is for parallel vs. serial. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a> = 0x1<<4</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">4th bit distinguishes ordered vs unordered filters.  <a href="#2e5eb65f95d8050186278077e433c5b1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd6a6e7210efc9bcaf2c5e08767d92b5"></a><!-- doxytag: member="tbb::filter::filter_is_bound" ref="dd6a6e7210efc9bcaf2c5e08767d92b5" args="" -->
+static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> = 0x1<<5</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">5th bit distinguishes thread-bound and regular filters. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bdd02a434a6e7499dd1e8f43aae96793"></a><!-- doxytag: member="tbb::filter::filter_may_emit_null" ref="bdd02a434a6e7499dd1e8f43aae96793" args="" -->
+static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> = 0x1<<6</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">6th bit marks input filters emitting small objects <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static const unsigned char </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">7th bit defines exception propagation mode expected by the application.  <a href="#f17200974c33be21f42a5f00893de028"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8228ce0751009045e8158d2e642715a6"></a><!-- doxytag: member="tbb::filter::internal::stage_task" ref="8228ce0751009045e8158d2e642715a6" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::stage_task</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d67150ca324698ba852553e223d3eb"></a><!-- doxytag: member="tbb::filter::internal::pipeline_root_task" ref="05d67150ca324698ba852553e223d3eb" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_root_task</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b211ee58bada099e24280d478017cbff"></a><!-- doxytag: member="tbb::filter::pipeline" ref="b211ee58bada099e24280d478017cbff" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>pipeline</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43b69a482df8e053cb199af69eb5139"></a><!-- doxytag: member="tbb::filter::thread_bound_filter" ref="e43b69a482df8e053cb199af69eb5139" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception for missing wait on structured_task_group. 
+A stage in a pipeline. 
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="66d159f362293e3964ba3da8bc1d2604"></a><!-- doxytag: member="tbb::filter::~filter" ref="66d159f362293e3964ba3da8bc1d2604" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">virtual __TBB_EXPORTED_METHOD tbb::filter::~filter           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Destroy filter. 
+<p>
+If the filter was added to a pipeline, the pipeline must be destroyed first. 
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="56275eb889c77c4807967133e21401bd"></a><!-- doxytag: member="tbb::filter::finalize" ref="56275eb889c77c4807967133e21401bd" args="(void *)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">virtual void tbb::filter::finalize           </td>
+          <td>(</td>
+          <td class="paramtype">void * </td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline, virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Destroys item if pipeline was cancelled. 
+<p>
+Required to prevent memory leaks. Note it can be called concurrently even for serial filters. 
+</div>
+</div><p>
+<a class="anchor" name="fa1b3dc1f4f47563ccab7f4d92f5b543"></a><!-- doxytag: member="tbb::filter::operator()" ref="fa1b3dc1f4f47563ccab7f4d92f5b543" args="(void *item)=0" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">virtual void* tbb::filter::operator()           </td>
+          <td>(</td>
+          <td class="paramtype">void * </td>
+          <td class="paramname"> <em>item</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [pure virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Operate on an item from the input stream, and return item for output stream. 
+<p>
+Returns NULL if filter is a sink. 
+</div>
+</div><p>
+<hr><h2>Member Data Documentation</h2>
+<a class="anchor" name="f17200974c33be21f42a5f00893de028"></a><!-- doxytag: member="tbb::filter::exact_exception_propagation" ref="f17200974c33be21f42a5f00893de028" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned char <a class="el" href="a00256.html#f17200974c33be21f42a5f00893de028">tbb::filter::exact_exception_propagation</a><code> [static, protected]</code>          </td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+<b>Initial value:</b><div class="fragment"><pre class="fragment">
+<span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
+<span class="preprocessor">            0x0</span>
+</pre></div>7th bit defines exception propagation mode expected by the application. 
+<p>
+
+</div>
+</div><p>
+<a class="anchor" name="2e5eb65f95d8050186278077e433c5b1"></a><!-- doxytag: member="tbb::filter::filter_is_out_of_order" ref="2e5eb65f95d8050186278077e433c5b1" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">const unsigned char <a class="el" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter::filter_is_out_of_order</a> = 0x1<<4<code> [static, protected]</code>          </td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+4th bit distinguishes ordered vs unordered filters. 
 <p>
+The bit was not set for parallel filters in TBB 2.1 and earlier, but <a class="el" href="a00256.html#cd53206c4795ef2df5df26b795caf692">is_ordered()</a> function always treats parallel filters as out of order. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00543.html">pipeline.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00245.png b/doc/html/a00256.png
similarity index 100%
rename from doc/html/a00245.png
rename to doc/html/a00256.png
diff --git a/doc/html/a00257.html b/doc/html/a00257.html
index b0adee3..6c49c54 100644
--- a/doc/html/a00257.html
+++ b/doc/html/a00257.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::movable_exception< ExceptionData > Class Template Reference</title>
+<title>tbb::interface6::filter_t< T, U > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,145 +21,50 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00257.html">movable_exception</a></div>
-<h1>tbb::movable_exception< ExceptionData > Class Template Reference</h1><!-- doxytag: class="tbb::movable_exception" --><!-- doxytag: inherits="tbb::tbb_exception" -->Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread.  
+<a class="el" href="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00257.html">filter_t</a></div>
+<h1>tbb::interface6::filter_t< T, U > Class Template Reference</h1><!-- doxytag: class="tbb::interface6::filter_t" -->Class representing a chain of type-safe pipeline filters.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00543.html">pipeline.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::movable_exception< ExceptionData >:
-<p><center><img src="a00257.png" usemap="#tbb::movable_exception< ExceptionData >_map" border="0" alt=""></center>
-<map name="tbb::movable_exception< ExceptionData >_map">
-<area href="a00298.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,248,24">
-</map>
-<a href="a00144.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00095.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="43dfdc5298df3aa8a7d7d146604f84ef"></a><!-- doxytag: member="tbb::movable_exception::movable_exception" ref="43dfdc5298df3aa8a7d7d146604f84ef" args="(const ExceptionData &data_)" -->
- </td><td class="memItemRight" valign="bottom"><b>movable_exception</b> (const ExceptionData &data_)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af1a36ca22e38eacd72eb256ee2ecef0"></a><!-- doxytag: member="tbb::interface6::filter_t::filter_t" ref="af1a36ca22e38eacd72eb256ee2ecef0" args="(const filter_t< T, U > &rhs)" -->
+ </td><td class="memItemRight" valign="bottom"><b>filter_t</b> (const <a class="el" href="a00257.html">filter_t</a>< T, U > &rhs)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="48f97fbf1e5d66c5977891f4375ee4d9"></a><!-- doxytag: member="tbb::movable_exception::movable_exception" ref="48f97fbf1e5d66c5977891f4375ee4d9" args="(const movable_exception &src)" -->
- </td><td class="memItemRight" valign="bottom"><b>movable_exception</b> (const <a class="el" href="a00257.html">movable_exception</a> &src)  throw ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="b80632a312f984a16b2a0db77859ee08"></a><!-- doxytag: member="tbb::interface6::filter_t::filter_t" ref="b80632a312f984a16b2a0db77859ee08" args="(tbb::filter::mode mode, const Body &body)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>filter_t</b> (tbb::filter::mode mode, const Body &body)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dfafefe27f2afaa7c7894ca9c71cc568"></a><!-- doxytag: member="tbb::movable_exception::operator=" ref="dfafefe27f2afaa7c7894ca9c71cc568" args="(const movable_exception &src)" -->
-const <a class="el" href="a00257.html">movable_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00257.html">movable_exception</a> &src)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2d87c68b6beaff12dcec7231d96d7b4c"></a><!-- doxytag: member="tbb::interface6::filter_t::operator=" ref="2d87c68b6beaff12dcec7231d96d7b4c" args="(const filter_t< T, U > &rhs)" -->
+void </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00257.html">filter_t</a>< T, U > &rhs)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="47114cbc20c8e13cac3108749a3e085d"></a><!-- doxytag: member="tbb::movable_exception::data" ref="47114cbc20c8e13cac3108749a3e085d" args="()" -->
-ExceptionData & </td><td class="memItemRight" valign="bottom"><b>data</b> ()  throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f299d149b932c2c78006c6f703b83eef"></a><!-- doxytag: member="tbb::interface6::filter_t::clear" ref="f299d149b932c2c78006c6f703b83eef" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>clear</b> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7d93c000d862d2558efd9a34817adbce"></a><!-- doxytag: member="tbb::movable_exception::data" ref="7d93c000d862d2558efd9a34817adbce" args="() const " -->
-const ExceptionData & </td><td class="memItemRight" valign="bottom"><b>data</b> () const   throw ()</td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fff802cb5656e3788a89f3314aed2efe"></a><!-- doxytag: member="tbb::interface6::filter_t::internal::pipeline_proxy" ref="fff802cb5656e3788a89f3314aed2efe" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_proxy</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc5f5c4739b17ac5211ac58226c2f5a5"></a><!-- doxytag: member="tbb::movable_exception::name" ref="bc5f5c4739b17ac5211ac58226c2f5a5" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const   throw ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="85c2892eff1fddcd06e28911e75838bd"></a><!-- doxytag: member="tbb::interface6::filter_t::make_filter" ref="85c2892eff1fddcd06e28911e75838bd" args="(tbb::filter::mode, const Body &)" -->
+template<typename T_, typename U_, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00257.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00257.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a> (tbb::filter::mode, const Body &)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b33a89bccf0c63106f1270c7bfaaf54f"></a><!-- doxytag: member="tbb::movable_exception::what" ref="b33a89bccf0c63106f1270c7bfaaf54f" args="() const " -->
-const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const   throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Create a filter to participate in parallel_pipeline. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="6b9b1f5ce7f2121f093b8cd1d84707ad"></a><!-- doxytag: member="tbb::interface6::filter_t::operator &" ref="6b9b1f5ce7f2121f093b8cd1d84707ad" args="(const filter_t< T_, V_ > &, const filter_t< V_, U_ > &)" -->
+template<typename T_, typename V_, typename U_> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"><a class="el" href="a00257.html">filter_t</a>< T_, U_ > </td><td class="memTemplItemRight" valign="bottom"><b>operator &</b> (const <a class="el" href="a00257.html">filter_t</a>< T_, V_ > &, const <a class="el" href="a00257.html">filter_t</a>< V_, U_ > &)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">what()</a> method. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00257.html">movable_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> ()  throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object.  <a href="#1aea0ad179d6f0481fe7f3495f66adf9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> ()  throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">move()</a> method.  <a href="#7a46873119d9f85a7b0009c13e41a258"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00257.html#17cffba35811c92b7e65d63506b69602">throw_self</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object.  <a href="#17cffba35811c92b7e65d63506b69602"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8c0ae2089ae784b28907cf748b89416"></a><!-- doxytag: member="tbb::movable_exception::my_exception_data" ref="a8c0ae2089ae784b28907cf748b89416" args="" -->
-ExceptionData </td><td class="memItemRight" valign="bottom"><a class="el" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">User data. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename ExceptionData><br>
- class tbb::movable_exception< ExceptionData ></h3>
-
-Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread. 
-<p>
-Code using TBB can instantiate this template with an arbitrary ExceptionData type and throw this exception object. Such exceptions are intercepted by the TBB scheduler and delivered to the root thread (). <dl compact><dt><b>See also:</b></dt><dd><a class="el" href="a00298.html">tbb::tbb_exception</a> </dd></dl>
-
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="7a46873119d9f85a7b0009c13e41a258"></a><!-- doxytag: member="tbb::movable_exception::destroy" ref="7a46873119d9f85a7b0009c13e41a258" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename ExceptionData> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">void <a class="el" href="a00257.html">tbb::movable_exception</a>< ExceptionData >::destroy           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%">  throw ()<code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Destroys objects created by the <a class="el" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">move()</a> method. 
-<p>
-Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method. 
-<p>
-Implements <a class="el" href="a00298.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>.
-</div>
-</div><p>
-<a class="anchor" name="1aea0ad179d6f0481fe7f3495f66adf9"></a><!-- doxytag: member="tbb::movable_exception::move" ref="1aea0ad179d6f0481fe7f3495f66adf9" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename ExceptionData> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="a00257.html">movable_exception</a>* <a class="el" href="a00257.html">tbb::movable_exception</a>< ExceptionData >::move           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%">  throw ()<code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T, typename U><br>
+ class tbb::interface6::filter_t< T, U ></h3>
 
+Class representing a chain of type-safe pipeline filters. 
 <p>
-Creates and returns pointer to the deep copy of this exception object. 
-<p>
-Move semantics is allowed. 
-<p>
-Implements <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a>.
-</div>
-</div><p>
-<a class="anchor" name="17cffba35811c92b7e65d63506b69602"></a><!-- doxytag: member="tbb::movable_exception::throw_self" ref="17cffba35811c92b7e65d63506b69602" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename ExceptionData> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">void <a class="el" href="a00257.html">tbb::movable_exception</a>< ExceptionData >::throw_self           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Throws this exception object. 
-<p>
-Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown. 
-<p>
-Implements <a class="el" href="a00298.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a>.
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00543.html">pipeline.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00258.html b/doc/html/a00258.html
index b2eaf43..75898ea 100644
--- a/doc/html/a00258.html
+++ b/doc/html/a00258.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::mutex Class Reference</title>
+<title>tbb::final_scan_tag Struct Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,110 +21,27 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00258.html">mutex</a></div>
-<h1>tbb::mutex Class Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00258.html">final_scan_tag</a></div>
+<h1>tbb::final_scan_tag Struct Reference<br>
 <small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::mutex" -->Wrapper around the platform's native reader-writer lock.  
+[<a class="el" href="a00395.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::final_scan_tag" -->Used to indicate that the final scan is being performed.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00499.html">mutex.h</a>></code>
+<code>#include <<a class="el" href="a00518.html">parallel_scan.h</a>></code>
 <p>
-<a href="a00078.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00083.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f1ec84d5815263ceae853f06ddb4cac"></a><!-- doxytag: member="tbb::mutex::native_handle_type" ref="9f1ec84d5815263ceae853f06ddb4cac" args="" -->
-typedef LPCRITICAL_SECTION </td><td class="memItemRight" valign="bottom"><a class="el" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06888e4a548788fcb2c15542d428d8c9"></a><!-- doxytag: member="tbb::final_scan_tag::is_final_scan" ref="06888e4a548788fcb2c15542d428d8c9" args="()" -->
+static bool </td><td class="memItemRight" valign="bottom"><b>is_final_scan</b> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return native_handle. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a1f4d4b88a03eb3e95c76569b91a0792"></a><!-- doxytag: member="tbb::mutex::native_handle_type" ref="a1f4d4b88a03eb3e95c76569b91a0792" args="" -->
-typedef pthread_mutex_t * </td><td class="memItemRight" valign="bottom"><b>native_handle_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c907aa5ae5274da759c4188c8ab196034e5963fe9e27d7c4d0a2d4ffa24a50a7"></a><!-- doxytag: member="tbb::mutex::INITIALIZED" ref="c907aa5ae5274da759c4188c8ab196034e5963fe9e27d7c4d0a2d4ffa24a50a7" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>INITIALIZED</b> = 0x1234</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c907aa5ae5274da759c4188c8ab19603646f4766864612448d6f9b21ff61abcd"></a><!-- doxytag: member="tbb::mutex::DESTROYED" ref="c907aa5ae5274da759c4188c8ab19603646f4766864612448d6f9b21ff61abcd" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>DESTROYED</b> = 0x789A</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c907aa5ae5274da759c4188c8ab196031de5796ebbbaa1e30d19e5d54f0f6555"></a><!-- doxytag: member="tbb::mutex::HELD" ref="c907aa5ae5274da759c4188c8ab196031de5796ebbbaa1e30d19e5d54f0f6555" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>HELD</b> = 0x56CD</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>state_t</b> { <b>INITIALIZED</b> = 0x1234, 
-<b>DESTROYED</b> = 0x789A, 
-<b>HELD</b> = 0x56CD
- }</td></tr>
-
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05313cb77d4f85213103d4dab74ed454"></a><!-- doxytag: member="tbb::mutex::mutex" ref="05313cb77d4f85213103d4dab74ed454" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00258.html#05313cb77d4f85213103d4dab74ed454">mutex</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4470e61c24c129a0299ca6c17240adbb"></a><!-- doxytag: member="tbb::mutex::lock" ref="4470e61c24c129a0299ca6c17240adbb" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00258.html#4470e61c24c129a0299ca6c17240adbb">lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00258.html#4331652c79dea1c1131bd59ab161b234">try_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking).  <a href="#4331652c79dea1c1131bd59ab161b234"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fc9ef443ae75d966695546be399cc6b"></a><!-- doxytag: member="tbb::mutex::unlock" ref="5fc9ef443ae75d966695546be399cc6b" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00258.html#5fc9ef443ae75d966695546be399cc6b">unlock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="caf34349c0fbe7b44f1a2ca0a3150dd0"></a><!-- doxytag: member="tbb::mutex::native_handle" ref="caf34349c0fbe7b44f1a2ca0a3150dd0" args="()" -->
-<a class="el" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> </td><td class="memItemRight" valign="bottom"><b>native_handle</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="795649a185b0d6af6dc81c5f378616dd"></a><!-- doxytag: member="tbb::mutex::set_state" ref="795649a185b0d6af6dc81c5f378616dd" args="(state_t to)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00258.html#795649a185b0d6af6dc81c5f378616dd">set_state</a> (state_t to)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Set the internal state. <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17b78176054e2bac1ff35b9535d1ea0c"></a><!-- doxytag: member="tbb::mutex::is_rw_mutex" ref="17b78176054e2bac1ff35b9535d1ea0c" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d4558e5a7c5b8d8e158ec7a1079669bd"></a><!-- doxytag: member="tbb::mutex::is_recursive_mutex" ref="d4558e5a7c5b8d8e158ec7a1079669bd" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f023a29c61451d02359095cbff0f3d45"></a><!-- doxytag: member="tbb::mutex::is_fair_mutex" ref="f023a29c61451d02359095cbff0f3d45" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html">scoped_lock</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern.  <a href="a00259.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Wrapper around the platform's native reader-writer lock. 
-<p>
-For testing purposes only. 
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="4331652c79dea1c1131bd59ab161b234"></a><!-- doxytag: member="tbb::mutex::try_lock" ref="4331652c79dea1c1131bd59ab161b234" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">bool tbb::mutex::try_lock           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Try acquiring lock (non-blocking). 
+Used to indicate that the final scan is being performed. 
 <p>
-Return true if lock acquired; false otherwise. 
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00499.html">mutex.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00518.html">parallel_scan.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00259.html b/doc/html/a00259.html
index acd000a..bd90879 100644
--- a/doc/html/a00259.html
+++ b/doc/html/a00259.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::mutex::scoped_lock Class Reference</title>
+<title>tbb::interface6::flow_control Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,51 +21,28 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00258.html">mutex</a>::<a class="el" href="a00259.html">scoped_lock</a></div>
-<h1>tbb::mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::mutex::scoped_lock" -->The scoped locking pattern.  
+<a class="el" href="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00259.html">flow_control</a></div>
+<h1>tbb::interface6::flow_control Class Reference</h1><!-- doxytag: class="tbb::interface6::flow_control" -->input_filter control to signal end-of-input for parallel_pipeline  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00499.html">mutex.h</a>></code>
+<code>#include <<a class="el" href="a00543.html">pipeline.h</a>></code>
 <p>
-<a href="a00079.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00094.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d403ae51b484df5d86d85ae38f11e6e"></a><!-- doxytag: member="tbb::mutex::scoped_lock::scoped_lock" ref="1d403ae51b484df5d86d85ae38f11e6e" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b2c7123577587e3c26506db3e5abe62"></a><!-- doxytag: member="tbb::interface6::flow_control::stop" ref="4b2c7123577587e3c26506db3e5abe62" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>stop</b> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="605a6b9af0f8cdabdf81825e0de99600"></a><!-- doxytag: member="tbb::mutex::scoped_lock::scoped_lock" ref="605a6b9af0f8cdabdf81825e0de99600" args="(mutex &mutex)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a> (<a class="el" href="a00258.html">mutex</a> &<a class="el" href="a00258.html">mutex</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ebbbecaf4311e9df7362cb76ceaa368"></a><!-- doxytag: member="tbb::mutex::scoped_lock::~scoped_lock" ref="0ebbbecaf4311e9df7362cb76ceaa368" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="862e022841cdc522e4296a5533b22efd"></a><!-- doxytag: member="tbb::mutex::scoped_lock::acquire" ref="862e022841cdc522e4296a5533b22efd" args="(mutex &mutex)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#862e022841cdc522e4296a5533b22efd">acquire</a> (<a class="el" href="a00258.html">mutex</a> &<a class="el" href="a00258.html">mutex</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="591e0c49b82bcedffcbe0923f1b915ec"></a><!-- doxytag: member="tbb::mutex::scoped_lock::try_acquire" ref="591e0c49b82bcedffcbe0923f1b915ec" args="(mutex &mutex)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a> (<a class="el" href="a00258.html">mutex</a> &<a class="el" href="a00258.html">mutex</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d51d18cd99df3b2e93bf07378d0992c"></a><!-- doxytag: member="tbb::mutex::scoped_lock::release" ref="0d51d18cd99df3b2e93bf07378d0992c" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00259.html#0d51d18cd99df3b2e93bf07378d0992c">release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93062a14ad2e50e2b7b485b913170779"></a><!-- doxytag: member="tbb::mutex::scoped_lock::mutex" ref="93062a14ad2e50e2b7b485b913170779" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>mutex</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15bb80e25fbcc4213e0053d558df6462"></a><!-- doxytag: member="tbb::interface6::flow_control::internal::concrete_filter" ref="15bb80e25fbcc4213e0053d558df6462" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::concrete_filter</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped locking pattern. 
-<p>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks. 
+input_filter control to signal end-of-input for parallel_pipeline 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00499.html">mutex.h</a></ul>
+<li><a class="el" href="a00543.html">pipeline.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00260.html b/doc/html/a00260.html
index cfb1ce9..91ec502 100644
--- a/doc/html/a00260.html
+++ b/doc/html/a00260.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::null_mutex Class Reference</title>
+<title>tbb::flow::interface6::function_node< Input, Output,, Allocator > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,39 +21,60 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00260.html">null_mutex</a></div>
-<h1>tbb::null_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::null_mutex" -->A mutex which does nothing.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00260.html">function_node</a></div>
+<h1>tbb::flow::interface6::function_node< Input, Output,, Allocator > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::function_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node" -->Implements a function node that supports Input -> Output.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00501.html">null_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<a href="a00080.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::function_node< Input, Output,, Allocator >:
+<p><center><img src="a00260.png" usemap="#tbb::flow::interface6::function_node< Input, Output,, Allocator >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::function_node< Input, Output,, Allocator >_map">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,368,24">
+</map>
+<a href="a00048.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a960bed8b19a4d111ca047de206f5f77"></a><!-- doxytag: member="tbb::null_mutex::is_rw_mutex" ref="a960bed8b19a4d111ca047de206f5f77" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eed5be58daf252aebed0df276ef9829b"></a><!-- doxytag: member="tbb::flow::interface6::function_node::input_type" ref="eed5be58daf252aebed0df276ef9829b" args="" -->
+typedef Input </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0fefed74b341d43ccf0e2fc30d31b75"></a><!-- doxytag: member="tbb::null_mutex::is_recursive_mutex" ref="a0fefed74b341d43ccf0e2fc30d31b75" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = true</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a6b1ada4ae95bcc11f3ecc7d8b407038"></a><!-- doxytag: member="tbb::flow::interface6::function_node::output_type" ref="a6b1ada4ae95bcc11f3ecc7d8b407038" args="" -->
+typedef Output </td><td class="memItemRight" valign="bottom"><b>output_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="707cf399055d68177b1d64c2e112603a"></a><!-- doxytag: member="tbb::null_mutex::is_fair_mutex" ref="707cf399055d68177b1d64c2e112603a" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7bffd3b755433095325cc554ea2ae752"></a><!-- doxytag: member="tbb::flow::interface6::function_node::predecessor_type" ref="7bffd3b755433095325cc554ea2ae752" args="" -->
+typedef <a class="el" href="a00301.html">sender</a>< input_type > </td><td class="memItemRight" valign="bottom"><b>predecessor_type</b></td></tr>
 
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00261.html">scoped_lock</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c24f9bbb872a81053cea4f38e214f458"></a><!-- doxytag: member="tbb::flow::interface6::function_node::successor_type" ref="c24f9bbb872a81053cea4f38e214f458" args="" -->
+typedef <a class="el" href="a00295.html">receiver</a>< output_type > </td><td class="memItemRight" valign="bottom"><b>successor_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6bde48df8336f0bdc4fbb8c1879e13d6"></a><!-- doxytag: member="tbb::flow::interface6::function_node::fOutput_type" ref="6bde48df8336f0bdc4fbb8c1879e13d6" args="" -->
+typedef internal::function_output<<br>
+ output_type > </td><td class="memItemRight" valign="bottom"><b>fOutput_type</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="5c215b40e3daf73d1c6802ecb5aded6c"></a><!-- doxytag: member="tbb::flow::interface6::function_node::function_node" ref="5c215b40e3daf73d1c6802ecb5aded6c" args="(graph &g, size_t concurrency, Body body)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a> (<a class="el" href="a00262.html">graph</a> &g, size_t concurrency, Body body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5132323fd2ac6a00ea0c78beda78723"></a><!-- doxytag: member="tbb::flow::interface6::function_node::function_node" ref="d5132323fd2ac6a00ea0c78beda78723" args="(const function_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00260.html#d5132323fd2ac6a00ea0c78beda78723">function_node</a> (const <a class="el" href="a00260.html">function_node</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ffad8dcf70ebebc751dcf2c82cd5e1ad"></a><!-- doxytag: member="tbb::flow::interface6::function_node::successors" ref="ffad8dcf70ebebc751dcf2c82cd5e1ad" args="()" -->
+internal::broadcast_cache<<br>
+ output_type > & </td><td class="memItemRight" valign="bottom"><b>successors</b> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex.  <a href="a00261.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-A mutex which does nothing. 
-<p>
-A <a class="el" href="a00260.html">null_mutex</a> does no operation and simulates success. 
+<h3>template<typename Input, typename Output = continue_msg, graph_buffer_policy = queueing, typename Allocator = cache_aligned_allocator<Input>><br>
+ class tbb::flow::interface6::function_node< Input, Output,, Allocator ></h3>
+
+Implements a function node that supports Input -> Output. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00501.html">null_mutex.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00260.png b/doc/html/a00260.png
new file mode 100644
index 0000000..75bb777
Binary files /dev/null and b/doc/html/a00260.png differ
diff --git a/doc/html/a00261.html b/doc/html/a00261.html
index 4f7621e..6d5a273 100644
--- a/doc/html/a00261.html
+++ b/doc/html/a00261.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::null_mutex::scoped_lock Class Reference</title>
+<title>tbb::flow::interface6::function_node< Input, Output, queueing, Allocator > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,33 +21,69 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00260.html">null_mutex</a>::<a class="el" href="a00261.html">scoped_lock</a></div>
-<h1>tbb::null_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::null_mutex::scoped_lock" -->Represents acquisition of a mutex.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00261.html">function_node< Input, Output, queueing, Allocator ></a></div>
+<h1>tbb::flow::interface6::function_node< Input, Output, queueing, Allocator > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node" -->Implements a function node that supports Input -> Output.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00501.html">null_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<a href="a00081.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >:
+<p><center><img src="a00261.png" usemap="#tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >_map">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,424,24">
+</map>
+<a href="a00049.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="765e64065919fdd9665e78b5ec4d3c6f"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::scoped_lock" ref="765e64065919fdd9665e78b5ec4d3c6f" args="(null_mutex &)" -->
- </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b> (<a class="el" href="a00260.html">null_mutex</a> &)</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2d8e92791b85100f8a53f7b2335c60c"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::input_type" ref="d2d8e92791b85100f8a53f7b2335c60c" args="" -->
+typedef Input </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="df1b2d30d065b64efcee71021129760a"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::output_type" ref="df1b2d30d065b64efcee71021129760a" args="" -->
+typedef Output </td><td class="memItemRight" valign="bottom"><b>output_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8d8519eb42d5ddbba668a575b24a720a"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::predecessor_type" ref="8d8519eb42d5ddbba668a575b24a720a" args="" -->
+typedef <a class="el" href="a00301.html">sender</a>< input_type > </td><td class="memItemRight" valign="bottom"><b>predecessor_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f6889f00ca3946906e89e856988bb890"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::acquire" ref="f6889f00ca3946906e89e856988bb890" args="(null_mutex &)" -->
-void </td><td class="memItemRight" valign="bottom"><b>acquire</b> (<a class="el" href="a00260.html">null_mutex</a> &)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb82369d652cd58b169f9a2e8f7ed023"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::successor_type" ref="eb82369d652cd58b169f9a2e8f7ed023" args="" -->
+typedef <a class="el" href="a00295.html">receiver</a>< output_type > </td><td class="memItemRight" valign="bottom"><b>successor_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90eb562a9de52b33362a6fe237b3df42"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::try_acquire" ref="90eb562a9de52b33362a6fe237b3df42" args="(null_mutex &)" -->
-bool </td><td class="memItemRight" valign="bottom"><b>try_acquire</b> (<a class="el" href="a00260.html">null_mutex</a> &)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6083108a1ca5a4f1464511e378e4bedf"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::fInput_type" ref="6083108a1ca5a4f1464511e378e4bedf" args="" -->
+typedef internal::function_input<<br>
+ input_type, output_type,<br>
+ Allocator > </td><td class="memItemRight" valign="bottom"><b>fInput_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b29fdf07b4c295850a6e433001c2c6a7"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::release" ref="b29fdf07b4c295850a6e433001c2c6a7" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>release</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4259f2853fb3af09518df3efb44ed8d5"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::queue_type" ref="4259f2853fb3af09518df3efb44ed8d5" args="" -->
+typedef internal::function_input_queue<<br>
+ input_type, Allocator > </td><td class="memItemRight" valign="bottom"><b>queue_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="431ce7232e788562d9152493961ee4b9"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::fOutput_type" ref="431ce7232e788562d9152493961ee4b9" args="" -->
+typedef internal::function_output<<br>
+ output_type > </td><td class="memItemRight" valign="bottom"><b>fOutput_type</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="5b9019c1e6e9b2c41c986a384bd179db"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::function_node" ref="5b9019c1e6e9b2c41c986a384bd179db" args="(graph &g, size_t concurrency, Body body)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00261.html#5b9019c1e6e9b2c41c986a384bd179db">function_node</a> (<a class="el" href="a00262.html">graph</a> &g, size_t concurrency, Body body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="01055081ed477714503820035db3a965"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::function_node" ref="01055081ed477714503820035db3a965" args="(const function_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00261.html#01055081ed477714503820035db3a965">function_node</a> (const <a class="el" href="a00260.html">function_node</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="34125123f0c8d9c13dbd6f52148608a1"></a><!-- doxytag: member="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >::successors" ref="34125123f0c8d9c13dbd6f52148608a1" args="()" -->
+internal::broadcast_cache<<br>
+ output_type > & </td><td class="memItemRight" valign="bottom"><b>successors</b> ()</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Represents acquisition of a mutex. 
+<h3>template<typename Input, typename Output, typename Allocator><br>
+ class tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></h3>
+
+Implements a function node that supports Input -> Output. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00501.html">null_mutex.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00261.png b/doc/html/a00261.png
new file mode 100644
index 0000000..349b919
Binary files /dev/null and b/doc/html/a00261.png differ
diff --git a/doc/html/a00262.html b/doc/html/a00262.html
index 684d1ea..f74449d 100644
--- a/doc/html/a00262.html
+++ b/doc/html/a00262.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::null_rw_mutex Class Reference</title>
+<title>tbb::flow::interface6::graph Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,39 +21,199 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00262.html">null_rw_mutex</a></div>
-<h1>tbb::null_rw_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::null_rw_mutex" -->A rw mutex which does nothing.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00262.html">graph</a></div>
+<h1>tbb::flow::interface6::graph Class Reference</h1><!-- doxytag: class="tbb::flow::interface6::graph" -->The graph class.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00502.html">null_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<a href="a00082.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00044.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2f3235cbf63812f72e5755a4c820f523"></a><!-- doxytag: member="tbb::null_rw_mutex::is_rw_mutex" ref="2f3235cbf63812f72e5755a4c820f523" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = true</td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4ab3d4b5208ece28c4c3ced647e26e12"></a><!-- doxytag: member="tbb::flow::interface6::graph::graph" ref="4ab3d4b5208ece28c4c3ced647e26e12" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e33ac3b047901e69e7997a16e221a330"></a><!-- doxytag: member="tbb::null_rw_mutex::is_recursive_mutex" ref="e33ac3b047901e69e7997a16e221a330" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = true</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a graph withy no nodes. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#8a7d424c0616a1c37a908ead182e2fe5">~graph</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e5248faf1412f9283185a0b5d72d7456"></a><!-- doxytag: member="tbb::null_rw_mutex::is_fair_mutex" ref="e5248faf1412f9283185a0b5d72d7456" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys the graph.  <a href="#8a7d424c0616a1c37a908ead182e2fe5"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#a993b789d1e488e0c3929135beae560e">increment_wait_count</a> ()</td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to register that an external entity may still interact with the graph.  <a href="#a993b789d1e488e0c3929135beae560e"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#29b85506870f13a884a21655aec2a65d">decrement_wait_count</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Deregisters an external entity that may have interacted with the graph.  <a href="#29b85506870f13a884a21655aec2a65d"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename Receiver, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00262.html#50a7938df01b6148ab2c0696835f002e">run</a> (Receiver &r, Body body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawns a task that runs a body and puts its output to a specific receiver.  <a href="#50a7938df01b6148ab2c0696835f002e"></a><br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00262.html#c1145b00e063793a7e7bf994d202c7a0">run</a> (Body body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawns a task that runs a function object.  <a href="#c1145b00e063793a7e7bf994d202c7a0"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Waits until the graph is idle and the number of decrement_wait_count calls equals the number of increment_wait_count calls.  <a href="#a66b0020f7514b86d030fa8aea073d37"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7f4e3ae90811a5d8b597146b5b586d10"></a><!-- doxytag: member="tbb::flow::interface6::graph::root_task" ref="7f4e3ae90811a5d8b597146b5b586d10" args="()" -->
+<a class="el" href="a00311.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html#7f4e3ae90811a5d8b597146b5b586d10">root_task</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the root task of the graph. <br></td></tr>
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html">scoped_lock</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>run_and_put_task</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>run_task</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex.  <a href="a00263.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-A rw mutex which does nothing. 
+The graph class. 
+<p>
+This class serves as a handle to the graph 
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="8a7d424c0616a1c37a908ead182e2fe5"></a><!-- doxytag: member="tbb::flow::interface6::graph::~graph" ref="8a7d424c0616a1c37a908ead182e2fe5" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">tbb::flow::interface6::graph::~graph           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Destroys the graph. 
+<p>
+Calls wait_for_all on the graph, deletes all of the nodes appended by calls to add, and then destroys the root task of the graph. 
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="29b85506870f13a884a21655aec2a65d"></a><!-- doxytag: member="tbb::flow::interface6::graph::decrement_wait_count" ref="29b85506870f13a884a21655aec2a65d" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tbb::flow::interface6::graph::decrement_wait_count           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Deregisters an external entity that may have interacted with the graph. 
+<p>
+The graph will not return from wait_for_all until all the number of decrement_wait_count calls matches the number of increment_wait_count calls. 
+</div>
+</div><p>
+<a class="anchor" name="a993b789d1e488e0c3929135beae560e"></a><!-- doxytag: member="tbb::flow::interface6::graph::increment_wait_count" ref="a993b789d1e488e0c3929135beae560e" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tbb::flow::interface6::graph::increment_wait_count           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Used to register that an external entity may still interact with the graph. 
+<p>
+The graph will not return from wait_for_all until a matching number of decrement_wait_count calls is made. 
+</div>
+</div><p>
+<a class="anchor" name="c1145b00e063793a7e7bf994d202c7a0"></a><!-- doxytag: member="tbb::flow::interface6::graph::run" ref="c1145b00e063793a7e7bf994d202c7a0" args="(Body body)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Body> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void tbb::flow::interface6::graph::run           </td>
+          <td>(</td>
+          <td class="paramtype">Body </td>
+          <td class="paramname"> <em>body</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Spawns a task that runs a function object. 
+<p>
+The task is spawned as a child of the graph. This is useful for running tasks that need to block a <a class="el" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all()</a> on the graph. For example a one-off source. 
+</div>
+</div><p>
+<a class="anchor" name="50a7938df01b6148ab2c0696835f002e"></a><!-- doxytag: member="tbb::flow::interface6::graph::run" ref="50a7938df01b6148ab2c0696835f002e" args="(Receiver &r, Body body)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Receiver, typename Body> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void tbb::flow::interface6::graph::run           </td>
+          <td>(</td>
+          <td class="paramtype">Receiver & </td>
+          <td class="paramname"> <em>r</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">Body </td>
+          <td class="paramname"> <em>body</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Spawns a task that runs a body and puts its output to a specific receiver. 
+<p>
+The task is spawned as a child of the graph. This is useful for running tasks that need to block a <a class="el" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all()</a> on the graph. For example a one-off source. 
+</div>
+</div><p>
+<a class="anchor" name="a66b0020f7514b86d030fa8aea073d37"></a><!-- doxytag: member="tbb::flow::interface6::graph::wait_for_all" ref="a66b0020f7514b86d030fa8aea073d37" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void tbb::flow::interface6::graph::wait_for_all           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
 <p>
-A <a class="el" href="a00262.html">null_rw_mutex</a> is a rw mutex that does nothing and simulates successful operation. 
+Waits until the graph is idle and the number of decrement_wait_count calls equals the number of increment_wait_count calls. 
 <p>
+The waiting thread will go off and steal work while it is block in the wait_for_all. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00502.html">null_rw_mutex.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00263.html b/doc/html/a00263.html
index fdf6e21..f52f173 100644
--- a/doc/html/a00263.html
+++ b/doc/html/a00263.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::null_rw_mutex::scoped_lock Class Reference</title>
+<title>tbb::flow::interface6::graph_node Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,39 +21,33 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00262.html">null_rw_mutex</a>::<a class="el" href="a00263.html">scoped_lock</a></div>
-<h1>tbb::null_rw_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::null_rw_mutex::scoped_lock" -->Represents acquisition of a mutex.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00263.html">graph_node</a></div>
+<h1>tbb::flow::interface6::graph_node Class Reference</h1><!-- doxytag: class="tbb::flow::interface6::graph_node" -->The base of all graph nodes. Allows them to be stored in a collection for deletion.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00502.html">null_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<a href="a00083.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::graph_node:
+<p><center><img src="a00263.png" usemap="#tbb::flow::interface6::graph_node_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::graph_node_map">
+<area href="a00236.html" alt="tbb::flow::interface6::broadcast_node< T >" shape="rect" coords="552,56,1094,80">
+<area href="a00237.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="552,112,1094,136">
+<area href="a00252.html" alt="tbb::flow::interface6::continue_node< Output >" shape="rect" coords="552,168,1094,192">
+<area href="a00260.html" alt="tbb::flow::interface6::function_node< Input, Output,, Allocator >" shape="rect" coords="552,224,1094,248">
+<area href="a00261.html" alt="tbb::flow::interface6::function_node< Input, Output, queueing, Allocator >" shape="rect" coords="552,280,1094,304">
+<area href="a00266.html" alt="tbb::flow::interface6::limiter_node< T >" shape="rect" coords="552,336,1094,360">
+<area href="a00274.html" alt="tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator >" shape="rect" coords="552,392,1094,416">
+<area href="a00274.html" alt="tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator >" shape="rect" coords="552,448,1094,472">
+<area href="a00304.html" alt="tbb::flow::interface6::source_node< Output >" shape="rect" coords="552,504,1094,528">
+</map>
+<a href="a00039.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e11281a13a7b6243c6c9ab243c5ad5a8"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::scoped_lock" ref="e11281a13a7b6243c6c9ab243c5ad5a8" args="(null_rw_mutex &, bool=true)" -->
- </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b> (<a class="el" href="a00262.html">null_rw_mutex</a> &, bool=true)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72c4c302fdfc20187a650348e432b0a7"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::acquire" ref="72c4c302fdfc20187a650348e432b0a7" args="(null_rw_mutex &, bool=true)" -->
-void </td><td class="memItemRight" valign="bottom"><b>acquire</b> (<a class="el" href="a00262.html">null_rw_mutex</a> &, bool=true)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa1e2a5592ee2672470ea44d98f1c498"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::upgrade_to_writer" ref="fa1e2a5592ee2672470ea44d98f1c498" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>upgrade_to_writer</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="efcb7948649e1652d59aaff9c8ea40f1"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::downgrade_to_reader" ref="efcb7948649e1652d59aaff9c8ea40f1" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><b>downgrade_to_reader</b> ()</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="56686c4dfe4a32a1d9bd8e7e729130e6"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::try_acquire" ref="56686c4dfe4a32a1d9bd8e7e729130e6" args="(null_rw_mutex &, bool=true)" -->
-bool </td><td class="memItemRight" valign="bottom"><b>try_acquire</b> (<a class="el" href="a00262.html">null_rw_mutex</a> &, bool=true)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6146c803a4ad2f14263fdc019a72b5a9"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::release" ref="6146c803a4ad2f14263fdc019a72b5a9" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><b>release</b> ()</td></tr>
-
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Represents acquisition of a mutex. 
+The base of all graph nodes. Allows them to be stored in a collection for deletion. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00502.html">null_rw_mutex.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00263.png b/doc/html/a00263.png
new file mode 100644
index 0000000..dc4610c
Binary files /dev/null and b/doc/html/a00263.png differ
diff --git a/doc/html/a00264.html b/doc/html/a00264.html
index 36e896b..49a65e4 100644
--- a/doc/html/a00264.html
+++ b/doc/html/a00264.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::parallel_do_feeder< Item > Class Template Reference</title>
+<title>tbb::improper_lock Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,39 +21,24 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00264.html">parallel_do_feeder</a></div>
-<h1>tbb::parallel_do_feeder< Item > Class Template Reference</h1><!-- doxytag: class="tbb::parallel_do_feeder" -->Class the user supplied algorithm body uses to add new tasks.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00264.html">improper_lock</a></div>
+<h1>tbb::improper_lock Class Reference</h1><!-- doxytag: class="tbb::improper_lock" -->Exception for PPL locks.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00503.html">parallel_do.h</a>></code>
+<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
 <p>
-<a href="a00084.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00139.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="40baaf0f6856f4491dd0adf896c93516"></a><!-- doxytag: member="tbb::parallel_do_feeder::add" ref="40baaf0f6856f4491dd0adf896c93516" args="(const Item &item)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00264.html#40baaf0f6856f4491dd0adf896c93516">add</a> (const Item &item)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a work item to a running parallel_do. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b381179b22f5f5e8511470c73d64b37f"></a><!-- doxytag: member="tbb::parallel_do_feeder::internal::parallel_do_feeder_impl" ref="b381179b22f5f5e8511470c73d64b37f" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::parallel_do_feeder_impl</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="74213c2d20407e1fa16b70ca55ef27c6"></a><!-- doxytag: member="tbb::improper_lock::what" ref="74213c2d20407e1fa16b70ca55ef27c6" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const   throw ()</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Item><br>
- class tbb::parallel_do_feeder< Item ></h3>
-
-Class the user supplied algorithm body uses to add new tasks. 
-<p>
-<dl compact><dt><b>Parameters:</b></dt><dd>
-  <table border="0" cellspacing="2" cellpadding="0">
-    <tr><td valign="top"></td><td valign="top"><em>Item</em> </td><td>Work item type </td></tr>
-  </table>
-</dl>
-
+Exception for PPL locks. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00503.html">parallel_do.h</a></ul>
+<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00265.html b/doc/html/a00265.html
index 20ed470..1fcde07 100644
--- a/doc/html/a00265.html
+++ b/doc/html/a00265.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::parallel_while< Body > Class Template Reference</title>
+<title>tbb::invalid_multiple_scheduling Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,114 +21,24 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00265.html">parallel_while</a></div>
-<h1>tbb::parallel_while< Body > Class Template Reference<br>
-<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::parallel_while" -->Parallel iteration over a stream, with optional addition of more work.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00265.html">invalid_multiple_scheduling</a></div>
+<h1>tbb::invalid_multiple_scheduling Class Reference</h1><!-- doxytag: class="tbb::invalid_multiple_scheduling" -->Exception for repeated scheduling of the same task_handle.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00537.html">parallel_while.h</a>></code>
+<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
 <p>
-<a href="a00087.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00141.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa297e53d3af2a101e712bc200233e9c"></a><!-- doxytag: member="tbb::parallel_while::value_type" ref="fa297e53d3af2a101e712bc200233e9c" args="" -->
-typedef Body::argument_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html#fa297e53d3af2a101e712bc200233e9c">value_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of items. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="36e26ba3880c7bcf804a97ba0cbe133f"></a><!-- doxytag: member="tbb::parallel_while::parallel_while" ref="36e26ba3880c7bcf804a97ba0cbe133f" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty non-running parallel while. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6fcfc973cc56b79c6d0fbb8a31be7e84"></a><!-- doxytag: member="tbb::parallel_while::~parallel_while" ref="6fcfc973cc56b79c6d0fbb8a31be7e84" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor cleans up data members before returning. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2">template<typename Stream> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00265.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a> (Stream &stream, const Body &body)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57082ccac880db17144db76c0f94701e"></a><!-- doxytag: member="tbb::invalid_multiple_scheduling::what" ref="57082ccac880db17144db76c0f94701e" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const   throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Apply body.apply to each item in the stream.  <a href="#b32a0a6e5e09ebb7fad3e6652c19afe5"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html#e131c560057a58229992b61eb8dba4c6">add</a> (const <a class="el" href="a00265.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> &item)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a work item while running.  <a href="#e131c560057a58229992b61eb8dba4c6"></a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Body><br>
- class tbb::parallel_while< Body ></h3>
-
-Parallel iteration over a stream, with optional addition of more work. 
-<p>
-The Body b has the requirement: <br>
- "b(v)" <br>
- "b.argument_type" <br>
- where v is an argument_type 
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="e131c560057a58229992b61eb8dba4c6"></a><!-- doxytag: member="tbb::parallel_while::add" ref="e131c560057a58229992b61eb8dba4c6" args="(const value_type &item)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Body> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">void <a class="el" href="a00265.html">tbb::parallel_while</a>< Body >::add           </td>
-          <td>(</td>
-          <td class="paramtype">const <a class="el" href="a00265.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> & </td>
-          <td class="paramname"> <em>item</em>          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Add a work item while running. 
-<p>
-Should be executed only by body.apply or a thread spawned therefrom. 
-</div>
-</div><p>
-<a class="anchor" name="b32a0a6e5e09ebb7fad3e6652c19afe5"></a><!-- doxytag: member="tbb::parallel_while::run" ref="b32a0a6e5e09ebb7fad3e6652c19afe5" args="(Stream &stream, const Body &body)" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Body> </div>
-<div class="memtemplate">
-template<typename Stream> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">void <a class="el" href="a00265.html">tbb::parallel_while</a>< Body >::run           </td>
-          <td>(</td>
-          <td class="paramtype">Stream & </td>
-          <td class="paramname"> <em>stream</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">const Body & </td>
-          <td class="paramname"> <em>body</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Apply body.apply to each item in the stream. 
+Exception for repeated scheduling of the same task_handle. 
 <p>
-A Stream s has the requirements <br>
- "S::value_type" <br>
- "s.pop_if_present(value) is convertible to bool 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00537.html">parallel_while.h</a></ul>
+<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00266.html b/doc/html/a00266.html
index 20bed39..50c218a 100644
--- a/doc/html/a00266.html
+++ b/doc/html/a00266.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::pipeline Class Reference</title>
+<title>tbb::flow::interface6::limiter_node< T > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,85 +21,117 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00266.html">pipeline</a></div>
-<h1>tbb::pipeline Class Reference<br>
-<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::pipeline" -->A processing pipeline that applies filters to items.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00266.html">limiter_node</a></div>
+<h1>tbb::flow::interface6::limiter_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::limiter_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node,tbb::flow::interface6::receiver,tbb::flow::interface6::sender" -->Forwards messages only if the threshold has not been reached.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00546.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<a href="a00095.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::limiter_node< T >:
+<p><center><img src="a00266.png" usemap="#tbb::flow::interface6::limiter_node< T >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::limiter_node< T >_map">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,226,24">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="236,0,462,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="472,0,698,24">
+</map>
+<a href="a00063.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="596dc3beba27099c4c8581cb419e1a59"></a><!-- doxytag: member="tbb::pipeline::pipeline" ref="596dc3beba27099c4c8581cb419e1a59" args="()" -->
-__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="035196d3c9240ef041f528ebcde8baa7"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::input_type" ref="035196d3c9240ef041f528ebcde8baa7" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">input_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty pipeline. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6e67fc480147c0b88a483b85db6457b0"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::output_type" ref="6e67fc480147c0b88a483b85db6457b0" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">output_type</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="38fb5c9c8395dd6f89a4ae2011a83e0d"></a><!-- doxytag: member="tbb::pipeline::add_filter" ref="38fb5c9c8395dd6f89a4ae2011a83e0d" args="(filter &filter_)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a> (<a class="el" href="a00245.html">filter</a> &filter_)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f89fcf44f38eb33f965ee5362d3e68e9"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::predecessor_type" ref="f89fcf44f38eb33f965ee5362d3e68e9" args="" -->
+typedef <a class="el" href="a00301.html">sender</a>< <a class="el" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#f89fcf44f38eb33f965ee5362d3e68e9">predecessor_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add filter to end of pipeline. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f627616049b3fe36801f37ee40403ef8"></a><!-- doxytag: member="tbb::pipeline::run" ref="f627616049b3fe36801f37ee40403ef8" args="(size_t max_number_of_live_tokens)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#f627616049b3fe36801f37ee40403ef8">run</a> (size_t max_number_of_live_tokens)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8945e4dd6ea759ff9e4735da13f12ef"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::successor_type" ref="e8945e4dd6ea759ff9e4735da13f12ef" args="" -->
+typedef <a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#e8945e4dd6ea759ff9e4735da13f12ef">successor_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Run the pipeline to completion. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93d7fec8cd607b803dd2d79fb46bd260"></a><!-- doxytag: member="tbb::pipeline::run" ref="93d7fec8cd607b803dd2d79fb46bd260" args="(size_t max_number_of_live_tokens, tbb::task_group_context &context)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#93d7fec8cd607b803dd2d79fb46bd260">run</a> (size_t max_number_of_live_tokens, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="831b06576f46fe2bf3ed0f86b793c1b2"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::limiter_node" ref="831b06576f46fe2bf3ed0f86b793c1b2" args="(graph &g, size_t threshold, int num_decrement_predecessors=0)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a> (<a class="el" href="a00262.html">graph</a> &g, size_t threshold, int num_decrement_predecessors=0)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Run the pipeline to completion with user-supplied context. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c84aef5b834b555ee220b176e25931e"></a><!-- doxytag: member="tbb::pipeline::clear" ref="2c84aef5b834b555ee220b176e25931e" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#2c84aef5b834b555ee220b176e25931e">clear</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83d3ab884543b070ee5b345a87f241fa"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::limiter_node" ref="83d3ab884543b070ee5b345a87f241fa" args="(const limiter_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#83d3ab884543b070ee5b345a87f241fa">limiter_node</a> (const <a class="el" href="a00266.html">limiter_node</a> &src)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove all filters from the pipeline. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8228ce0751009045e8158d2e642715a6"></a><!-- doxytag: member="tbb::pipeline::internal::stage_task" ref="8228ce0751009045e8158d2e642715a6" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::stage_task</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c76561d8d871b4769876988a4de12a9b"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::register_successor" ref="c76561d8d871b4769876988a4de12a9b" args="(receiver< output_type > &r)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#c76561d8d871b4769876988a4de12a9b">register_successor</a> (<a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > &r)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Replace the current successor with this new successor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#275e328063c121b3e506ccef2a825d28">remove_successor</a> (<a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > &r)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor from this node.  <a href="#275e328063c121b3e506ccef2a825d28"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="55a02d458a4d8ffa6accd7a70605da2f"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::try_put" ref="55a02d458a4d8ffa6accd7a70605da2f" args="(const T &t)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#55a02d458a4d8ffa6accd7a70605da2f">try_put</a> (const T &t)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d67150ca324698ba852553e223d3eb"></a><!-- doxytag: member="tbb::pipeline::internal::pipeline_root_task" ref="05d67150ca324698ba852553e223d3eb" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_root_task</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Puts an item to this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="de70a0e88ce7655d8c14b6af57f7496f"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::register_predecessor" ref="de70a0e88ce7655d8c14b6af57f7496f" args="(predecessor_type &src)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#de70a0e88ce7655d8c14b6af57f7496f">register_predecessor</a> (<a class="el" href="a00301.html">predecessor_type</a> &src)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c991e50853b0cac7da039550344d3ef"></a><!-- doxytag: member="tbb::pipeline::filter" ref="4c991e50853b0cac7da039550344d3ef" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>filter</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes src from the list of cached predecessors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c530e7b469454e2340460795f2da3317"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::remove_predecessor" ref="c530e7b469454e2340460795f2da3317" args="(predecessor_type &src)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#c530e7b469454e2340460795f2da3317">remove_predecessor</a> (<a class="el" href="a00301.html">predecessor_type</a> &src)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43b69a482df8e053cb199af69eb5139"></a><!-- doxytag: member="tbb::pipeline::thread_bound_filter" ref="e43b69a482df8e053cb199af69eb5139" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes src from the list of cached predecessors. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3344b2461966631b6ee34b79fb105c7"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::decrement" ref="a3344b2461966631b6ee34b79fb105c7" args="" -->
+internal::decrementer< <a class="el" href="a00266.html">limiter_node</a><<br>
+ T > > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9d033d41ff53a0ae6ef824aceee7ecbc"></a><!-- doxytag: member="tbb::pipeline::internal::pipeline_cleaner" ref="9d033d41ff53a0ae6ef824aceee7ecbc" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_cleaner</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The internal receiver< continue_msg > that decrements the count. <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed05e0c262c5a8869bf1395e1fb4bcf9"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::internal::forward_task< limiter_node< T > >" ref="ed05e0c262c5a8869bf1395e1fb4bcf9" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::forward_task< limiter_node< T > ></b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d1ed99300bc4520a481583c448d6fafd"></a><!-- doxytag: member="tbb::pipeline::tbb::interface6::internal::pipeline_proxy" ref="d1ed99300bc4520a481583c448d6fafd" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>tbb::interface6::internal::pipeline_proxy</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b43677b60c786d1071a7efd6f195c3be"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::internal::decrementer< limiter_node< T > >" ref="b43677b60c786d1071a7efd6f195c3be" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::decrementer< limiter_node< T > ></b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-A processing pipeline that applies filters to items. 
+<h3>template<typename T><br>
+ class tbb::flow::interface6::limiter_node< T ></h3>
+
+Forwards messages only if the threshold has not been reached. 
+<p>
+This node forwards items until its threshold is reached. It contains no buffering. If the downstream node rejects, the message is dropped. 
 <p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="49513c6c24f9d5bbbb27edca5efe01c9"></a><!-- doxytag: member="tbb::pipeline::~pipeline" ref="49513c6c24f9d5bbbb27edca5efe01c9" args="()" -->
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="275e328063c121b3e506ccef2a825d28"></a><!-- doxytag: member="tbb::flow::interface6::limiter_node::remove_successor" ref="275e328063c121b3e506ccef2a825d28" args="(receiver< output_type > &r)" -->
 <div class="memitem">
 <div class="memproto">
+<div class="memtemplate">
+template<typename T> </div>
       <table class="memname">
         <tr>
-          <td class="memname">virtual __TBB_EXPORTED_METHOD tbb::pipeline::~pipeline           </td>
+          <td class="memname">bool <a class="el" href="a00266.html">tbb::flow::interface6::limiter_node</a>< T >::remove_successor           </td>
           <td>(</td>
-          <td class="paramname">          </td>
+          <td class="paramtype"><a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">output_type</a> > & </td>
+          <td class="paramname"> <em>r</em>          </td>
           <td> ) </td>
-          <td width="100%"><code> [virtual]</code></td>
+          <td width="100%"><code> [inline, virtual]</code></td>
         </tr>
       </table>
 </div>
 <div class="memdoc">
 
 <p>
-Though the current implementation declares the destructor virtual, do not rely on this detail. The virtualness is deprecated and may disappear in future versions of TBB. 
+Removes a successor from this node. 
+<p>
+r.remove_predecessor(*this) is also called. 
+<p>
+Implements <a class="el" href="a00301.html#82f363bfb1738bb8789e167590b10ef9">tbb::flow::interface6::sender< T ></a>.
 </div>
 </div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00546.html">pipeline.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00266.png b/doc/html/a00266.png
new file mode 100644
index 0000000..4eedec5
Binary files /dev/null and b/doc/html/a00266.png differ
diff --git a/doc/html/a00267.html b/doc/html/a00267.html
index 7ce5427..0c73575 100644
--- a/doc/html/a00267.html
+++ b/doc/html/a00267.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::pre_scan_tag Struct Reference</title>
+<title>tbb::internal::machine_load_store_relaxed< T, S > Struct Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,27 +21,27 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00267.html">pre_scan_tag</a></div>
-<h1>tbb::pre_scan_tag Struct Reference<br>
-<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::pre_scan_tag" -->Used to indicate that the initial scan is being performed.  
-<a href="#_details">More...</a>
+<a class="el" href="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00267.html">machine_load_store_relaxed</a></div>
+<h1>tbb::internal::machine_load_store_relaxed< T, S > Struct Template Reference</h1><!-- doxytag: class="tbb::internal::machine_load_store_relaxed" --><code>#include <<a class="el" href="a00594.html">tbb_machine.h</a>></code>
 <p>
-<code>#include <<a class="el" href="a00528.html">parallel_scan.h</a>></code>
-<p>
-<a href="a00085.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00155.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d45d2cf548e51140ad6faafbea8ca6b5"></a><!-- doxytag: member="tbb::pre_scan_tag::is_final_scan" ref="d45d2cf548e51140ad6faafbea8ca6b5" args="()" -->
-static bool </td><td class="memItemRight" valign="bottom"><b>is_final_scan</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="de10ed2fe8788773adb55f265db38587"></a><!-- doxytag: member="tbb::internal::machine_load_store_relaxed::load" ref="de10ed2fe8788773adb55f265db38587" args="(const volatile T &location)" -->
+static T </td><td class="memItemRight" valign="bottom"><b>load</b> (const volatile T &location)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d72090653905a4c94aa6836bc190044"></a><!-- doxytag: member="tbb::internal::machine_load_store_relaxed::store" ref="1d72090653905a4c94aa6836bc190044" args="(volatile T &location, T value)" -->
+static void </td><td class="memItemRight" valign="bottom"><b>store</b> (volatile T &location, T value)</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Used to indicate that the initial scan is being performed. 
+<h3>template<typename T, size_t S><br>
+ struct tbb::internal::machine_load_store_relaxed< T, S ></h3>
+
+Volatile should not incur any additional cost on IA32, Intel64, and Sparc TSO architectures. However on architectures with weak memory ordering compiler may generate code with acquire/release semantics for operations on volatile data. 
 <p>
 <hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00528.html">parallel_scan.h</a></ul>
+<li><a class="el" href="a00594.html">tbb_machine.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00268.html b/doc/html/a00268.html
index 8cc1111..29c0de0 100644
--- a/doc/html/a00268.html
+++ b/doc/html/a00268.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::priority_queue_node< T, Compare > Class Template Reference</title>
+<title>tbb::internal::machine_load_store_seq_cst< T, 8 > Struct Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,103 +21,27 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00268.html">priority_queue_node</a></div>
-<h1>tbb::priority_queue_node< T, Compare > Class Template Reference</h1><!-- doxytag: class="tbb::priority_queue_node" --><!-- doxytag: inherits="tbb::buffer_node" -->Forwards messages in priority order.  
-<a href="#_details">More...</a>
+<a class="el" href="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00268.html">machine_load_store_seq_cst< T, 8 ></a></div>
+<h1>tbb::internal::machine_load_store_seq_cst< T, 8 > Struct Template Reference</h1><!-- doxytag: class="tbb::internal::machine_load_store_seq_cst< T, 8 >" --><code>#include <<a class="el" href="a00594.html">tbb_machine.h</a>></code>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
-<p>
-<p>Inheritance diagram for tbb::priority_queue_node< T, Compare >:
-<p><center><img src="a00268.png" usemap="#tbb::priority_queue_node< T, Compare >_map" border="0" alt=""></center>
-<map name="tbb::priority_queue_node< T, Compare >_map">
-<area href="a00225.html" alt="tbb::buffer_node< T >" shape="rect" coords="252,56,494,80">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,242,24">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="252,0,494,24">
-<area href="a00282.html" alt="tbb::sender< T >" shape="rect" coords="504,0,746,24">
-</map>
-<a href="a00060.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00154.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="40fdedd4829aeae3ebd1a5fdaf39b23d"></a><!-- doxytag: member="tbb::priority_queue_node::input_type" ref="40fdedd4829aeae3ebd1a5fdaf39b23d" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">input_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3b3fa4479416e7cb6d4a6a4b175c2b15"></a><!-- doxytag: member="tbb::priority_queue_node::output_type" ref="3b3fa4479416e7cb6d4a6a4b175c2b15" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#3b3fa4479416e7cb6d4a6a4b175c2b15">output_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98900a87758cac05500fcbc74113cebf"></a><!-- doxytag: member="tbb::priority_queue_node::predecessor_type" ref="98900a87758cac05500fcbc74113cebf" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#98900a87758cac05500fcbc74113cebf">predecessor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e01014f2e5ceea292c68f6fe47391c57"></a><!-- doxytag: member="tbb::priority_queue_node::successor_type" ref="e01014f2e5ceea292c68f6fe47391c57" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00268.html#3b3fa4479416e7cb6d4a6a4b175c2b15">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#e01014f2e5ceea292c68f6fe47391c57">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1630f68674c4b201346a391b1e8d3f5d"></a><!-- doxytag: member="tbb::priority_queue_node::priority_queue_node" ref="1630f68674c4b201346a391b1e8d3f5d" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#1630f68674c4b201346a391b1e8d3f5d">priority_queue_node</a> (<a class="el" href="a00250.html">graph</a> &g)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="de11b7abff98005607d7fa7466faf7b0"></a><!-- doxytag: member="tbb::priority_queue_node::size_type" ref="de11b7abff98005607d7fa7466faf7b0" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <br>
->::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9e233a0b91aa4622406999f82f275658"></a><!-- doxytag: member="tbb::priority_queue_node::item_type" ref="9e233a0b91aa4622406999f82f275658" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <br>
->::item_type </td><td class="memItemRight" valign="bottom"><b>item_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9da8c5e1d88446a861aaaf833dff9563"></a><!-- doxytag: member="tbb::priority_queue_node::prio_operation" ref="9da8c5e1d88446a861aaaf833dff9563" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <br>
->::buffer_operation </td><td class="memItemRight" valign="bottom"><b>prio_operation</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d735772d27a4946170769b4a44fc62c2164d37794dce6b5f579b76189b6c0021"></a><!-- doxytag: member="tbb::priority_queue_node::WAIT" ref="d735772d27a4946170769b4a44fc62c2164d37794dce6b5f579b76189b6c0021" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d735772d27a4946170769b4a44fc62c2b65b5f4fbcf64463d6db76340f7813b6"></a><!-- doxytag: member="tbb::priority_queue_node::SUCCEEDED" ref="d735772d27a4946170769b4a44fc62c2b65b5f4fbcf64463d6db76340f7813b6" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d735772d27a4946170769b4a44fc62c211ee259c9aa9cc587e0e16386f14ce31"></a><!-- doxytag: member="tbb::priority_queue_node::FAILED" ref="d735772d27a4946170769b4a44fc62c211ee259c9aa9cc587e0e16386f14ce31" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0, 
-<b>SUCCEEDED</b>, 
-<b>FAILED</b>
- }</td></tr>
-
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="89ea37a545db6d58f0efba624c5478e5"></a><!-- doxytag: member="tbb::priority_queue_node::handle_operations" ref="89ea37a545db6d58f0efba624c5478e5" args="(prio_operation *op_list)" -->
-void </td><td class="memItemRight" valign="bottom"><b>handle_operations</b> (prio_operation *op_list)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="79161e73f79cc43b2c2b08367504dfda"></a><!-- doxytag: member="tbb::priority_queue_node::internal_forward" ref="79161e73f79cc43b2c2b08367504dfda" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">internal_forward</a> (prio_operation *op)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to forward valid items to successors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="baf920c99c8b5cdb3274e69180d38721"></a><!-- doxytag: member="tbb::priority_queue_node::internal_push" ref="baf920c99c8b5cdb3274e69180d38721" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_push</b> (prio_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9ad1406abcb8944fce20fdffc536b802"></a><!-- doxytag: member="tbb::priority_queue_node::internal_pop" ref="9ad1406abcb8944fce20fdffc536b802" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_pop</b> (prio_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2679c01cb715be0fa27daef8ca7abcd6"></a><!-- doxytag: member="tbb::priority_queue_node::internal_reserve" ref="2679c01cb715be0fa27daef8ca7abcd6" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_reserve</b> (prio_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f622ca82a370e324131d129007989f17"></a><!-- doxytag: member="tbb::priority_queue_node::internal_consume" ref="f622ca82a370e324131d129007989f17" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (prio_operation *op)</td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e765439a2cd7ddd871b20dc72148d600"></a><!-- doxytag: member="tbb::internal::machine_load_store_seq_cst< T, 8 >::load" ref="e765439a2cd7ddd871b20dc72148d600" args="(const volatile T &location)" -->
+static T </td><td class="memItemRight" valign="bottom"><b>load</b> (const volatile T &location)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b72aaba1fed1691779f695b6aa052073"></a><!-- doxytag: member="tbb::priority_queue_node::internal_release" ref="b72aaba1fed1691779f695b6aa052073" args="(prio_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_release</b> (prio_operation *op)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05fcfe2752cabb32ff9db4fbef59bb8b"></a><!-- doxytag: member="tbb::internal::machine_load_store_seq_cst< T, 8 >::store" ref="05fcfe2752cabb32ff9db4fbef59bb8b" args="(volatile T &location, T value)" -->
+static void </td><td class="memItemRight" valign="bottom"><b>store</b> (volatile T &location, T value)</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, typename Compare = std::less<T>><br>
- class tbb::priority_queue_node< T, Compare ></h3>
+<h3>template<typename T><br>
+ struct tbb::internal::machine_load_store_seq_cst< T, 8 ></h3>
 
-Forwards messages in priority order. 
+The implementation does not use functions __TBB_machine_load8/store8 as they are not required to be sequentially consistent. 
 <p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00594.html">tbb_machine.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00268.png b/doc/html/a00268.png
deleted file mode 100644
index 55c8b1f..0000000
Binary files a/doc/html/a00268.png and /dev/null differ
diff --git a/doc/html/a00269.html b/doc/html/a00269.html
index dec2744..05e37b2 100644
--- a/doc/html/a00269.html
+++ b/doc/html/a00269.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::queue_node< T > Class Template Reference</title>
+<title>tbb::interface6::memory_pool< Alloc > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,91 +21,32 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00269.html">queue_node</a></div>
-<h1>tbb::queue_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::queue_node" --><!-- doxytag: inherits="tbb::buffer_node" -->Forwards messages in FIFO order.  
+<a class="el" href="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00269.html">memory_pool</a></div>
+<h1>tbb::interface6::memory_pool< Alloc > Class Template Reference</h1><!-- doxytag: class="tbb::interface6::memory_pool" -->Thread-safe growable pool allocator for variable-size requests.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00480.html">memory_pool.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::queue_node< T >:
-<p><center><img src="a00269.png" usemap="#tbb::queue_node< T >_map" border="0" alt=""></center>
-<map name="tbb::queue_node< T >_map">
-<area href="a00225.html" alt="tbb::buffer_node< T >" shape="rect" coords="170,56,330,80">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,160,24">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="170,0,330,24">
-<area href="a00282.html" alt="tbb::sender< T >" shape="rect" coords="340,0,500,24">
-<area href="a00283.html" alt="tbb::sequencer_node< T >" shape="rect" coords="170,168,330,192">
-</map>
-<a href="a00058.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00072.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27016487003a4ff2908748c3cf11c1fe"></a><!-- doxytag: member="tbb::queue_node::input_type" ref="27016487003a4ff2908748c3cf11c1fe" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#27016487003a4ff2908748c3cf11c1fe">input_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d227f122eebe2f9489ba763ff24fd6fb"></a><!-- doxytag: member="tbb::queue_node::output_type" ref="d227f122eebe2f9489ba763ff24fd6fb" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#d227f122eebe2f9489ba763ff24fd6fb">output_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="83bc7308a38f1d205377d78ec14931d1"></a><!-- doxytag: member="tbb::queue_node::predecessor_type" ref="83bc7308a38f1d205377d78ec14931d1" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00269.html#27016487003a4ff2908748c3cf11c1fe">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#83bc7308a38f1d205377d78ec14931d1">predecessor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c3b1d76b66b1292f6a1b6dae52c67a0e"></a><!-- doxytag: member="tbb::queue_node::successor_type" ref="c3b1d76b66b1292f6a1b6dae52c67a0e" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00269.html#d227f122eebe2f9489ba763ff24fd6fb">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#c3b1d76b66b1292f6a1b6dae52c67a0e">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1564c6bf9573b13d6854b0e8f7ce2b68"></a><!-- doxytag: member="tbb::queue_node::queue_node" ref="1564c6bf9573b13d6854b0e8f7ce2b68" args="(graph &g)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">queue_node</a> (<a class="el" href="a00250.html">graph</a> &g)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e7be2008c0a07209fbf44e50f644615"></a><!-- doxytag: member="tbb::queue_node::size_type" ref="0e7be2008c0a07209fbf44e50f644615" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <br>
->::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f68f9d697f8dc5304db1e2890b1c6706"></a><!-- doxytag: member="tbb::queue_node::queue_operation" ref="f68f9d697f8dc5304db1e2890b1c6706" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <br>
->::buffer_operation </td><td class="memItemRight" valign="bottom"><b>queue_operation</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1003f4ce06f418a04dfb1e4ba782a074ad957ef8596b42f852dac7c3efc00fe0"></a><!-- doxytag: member="tbb::queue_node::WAIT" ref="1003f4ce06f418a04dfb1e4ba782a074ad957ef8596b42f852dac7c3efc00fe0" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1003f4ce06f418a04dfb1e4ba782a074db31905871417f86773801713c507df9"></a><!-- doxytag: member="tbb::queue_node::SUCCEEDED" ref="1003f4ce06f418a04dfb1e4ba782a074db31905871417f86773801713c507df9" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1003f4ce06f418a04dfb1e4ba782a0748dcea56812e8c7a7ae1dd26404bc2d05"></a><!-- doxytag: member="tbb::queue_node::FAILED" ref="1003f4ce06f418a04dfb1e4ba782a0748dcea56812e8c7a7ae1dd26404bc2d05" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0, 
-<b>SUCCEEDED</b>, 
-<b>FAILED</b>
- }</td></tr>
-
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb58bac5ac355e5134c51125e601fa2a"></a><!-- doxytag: member="tbb::queue_node::internal_forward" ref="fb58bac5ac355e5134c51125e601fa2a" args="(queue_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">internal_forward</a> (queue_operation *op)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to forward valid items to successors. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6ea932194502a5e3a02f4aad24820f60"></a><!-- doxytag: member="tbb::queue_node::internal_pop" ref="6ea932194502a5e3a02f4aad24820f60" args="(queue_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_pop</b> (queue_operation *op)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="017f4ba18079116367e856e2f0eb42e9"></a><!-- doxytag: member="tbb::queue_node::internal_reserve" ref="017f4ba18079116367e856e2f0eb42e9" args="(queue_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_reserve</b> (queue_operation *op)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2822528265718a4c779591fc37c02ca8"></a><!-- doxytag: member="tbb::interface6::memory_pool::memory_pool" ref="2822528265718a4c779591fc37c02ca8" args="(const Alloc &src=Alloc())" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#2822528265718a4c779591fc37c02ca8">memory_pool</a> (const Alloc &src=Alloc())</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7bac37b32f69f4731195f7da1e4524d7"></a><!-- doxytag: member="tbb::queue_node::internal_consume" ref="7bac37b32f69f4731195f7da1e4524d7" args="(queue_operation *op)" -->
-void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (queue_operation *op)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">construct pool with underlying allocator <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fdad7c4ed08332ec384491a71b721957"></a><!-- doxytag: member="tbb::interface6::memory_pool::~memory_pool" ref="fdad7c4ed08332ec384491a71b721957" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html#fdad7c4ed08332ec384491a71b721957">~memory_pool</a> ()</td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">destroy pool <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::queue_node< T ></h3>
+<h3>template<typename Alloc><br>
+ class tbb::interface6::memory_pool< Alloc ></h3>
 
-Forwards messages in FIFO order. 
+Thread-safe growable pool allocator for variable-size requests. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00480.html">memory_pool.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00269.png b/doc/html/a00269.png
deleted file mode 100644
index c2da07b..0000000
Binary files a/doc/html/a00269.png and /dev/null differ
diff --git a/doc/html/a00270.html b/doc/html/a00270.html
index 6824b2a..d3b2b28 100644
--- a/doc/html/a00270.html
+++ b/doc/html/a00270.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::queuing_mutex Class Reference</title>
+<title>tbb::interface6::memory_pool_allocator< T, P > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,49 +21,109 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00270.html">queuing_mutex</a></div>
-<h1>tbb::queuing_mutex Class Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00270.html">memory_pool_allocator</a></div>
+<h1>tbb::interface6::memory_pool_allocator< T, P > Class Template Reference<br>
 <small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::queuing_mutex" -->Queuing lock with local-only spinning.  
+[<a class="el" href="a00397.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::interface6::memory_pool_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00560.html">queuing_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00480.html">memory_pool.h</a>></code>
 <p>
-<a href="a00098.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00068.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="364d1a4b2174091802a0c1a7177fd037"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::value_type" ref="364d1a4b2174091802a0c1a7177fd037" args="" -->
+typedef tbb::internal::allocator_type<<br>
+ T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="841174744c7bebbe9a8ec4cd35b7e8c8"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::pointer" ref="841174744c7bebbe9a8ec4cd35b7e8c8" args="" -->
+typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8867631698ca08b5b8c849693f45cef4"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::const_pointer" ref="8867631698ca08b5b8c849693f45cef4" args="" -->
+typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4419d14b95793fea5e80c1a7ad85b4b3"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::reference" ref="4419d14b95793fea5e80c1a7ad85b4b3" args="" -->
+typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57a51cd687993c94d486a0ff0b7a783f"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::const_reference" ref="57a51cd687993c94d486a0ff0b7a783f" args="" -->
+typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fd9f0aaee1039cc64fa4342ee93fd43e"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::size_type" ref="fd9f0aaee1039cc64fa4342ee93fd43e" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4340f60415582d0eca834b47b22f5d62"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::difference_type" ref="4340f60415582d0eca834b47b22f5d62" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b389ad9c4db7293e4bdb5b8cda69ec04"></a><!-- doxytag: member="tbb::queuing_mutex::queuing_mutex" ref="b389ad9c4db7293e4bdb5b8cda69ec04" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d06264c6dc8ed178d8c14998f0511b27"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::memory_pool_allocator" ref="d06264c6dc8ed178d8c14998f0511b27" args="(pool_type &pool)" -->
+ </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b> (pool_type &pool)  throw ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="655f7aef5ba5dbe79f76b493270794af"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::memory_pool_allocator" ref="655f7aef5ba5dbe79f76b493270794af" args="(const memory_pool_allocator &src)" -->
+ </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b> (const <a class="el" href="a00270.html">memory_pool_allocator</a> &src)  throw ()</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0d1d98389a82d65a4229db8e28363420"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::memory_pool_allocator" ref="0d1d98389a82d65a4229db8e28363420" args="(const memory_pool_allocator< U, P > &src)" -->
+template<typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>memory_pool_allocator</b> (const <a class="el" href="a00270.html">memory_pool_allocator</a>< U, P > &src)  throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="96c1fe92760dcd1c5a7ed52c6599a72f"></a><!-- doxytag: member="tbb::queuing_mutex::internal_construct" ref="96c1fe92760dcd1c5a7ed52c6599a72f" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="727129bc029510733b3e95ea10f6bee3"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::address" ref="727129bc029510733b3e95ea10f6bee3" args="(reference x) const " -->
+pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
 
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="420932f70ff3b85f7280ff11a133938d"></a><!-- doxytag: member="tbb::queuing_mutex::is_rw_mutex" ref="420932f70ff3b85f7280ff11a133938d" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e250b83998b01dbea88c43085e15139a"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::address" ref="e250b83998b01dbea88c43085e15139a" args="(const_reference x) const " -->
+const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dc0c749f3a4e6ea75418677cb8f9205f"></a><!-- doxytag: member="tbb::queuing_mutex::is_recursive_mutex" ref="dc0c749f3a4e6ea75418677cb8f9205f" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="365bd64d284c80d85bb2149a12681526"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::allocate" ref="365bd64d284c80d85bb2149a12681526" args="(size_type n, const void *=0)" -->
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html#365bd64d284c80d85bb2149a12681526">allocate</a> (size_type n, const void *=0)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="55d5339e4ca04b759f90c0c1ef966539"></a><!-- doxytag: member="tbb::queuing_mutex::is_fair_mutex" ref="55d5339e4ca04b759f90c0c1ef966539" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4e24a03de38638af07548383024c54ab"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::deallocate" ref="4e24a03de38638af07548383024c54ab" args="(pointer p, size_type)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html#4e24a03de38638af07548383024c54ab">deallocate</a> (pointer p, size_type)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Free previously allocated block of memory. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="beebdb6144df8ba219fadfad4de866ea"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::max_size" ref="beebdb6144df8ba219fadfad4de866ea" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html#beebdb6144df8ba219fadfad4de866ea">max_size</a> () const   throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c7e1671b725894b94ce9a6ac544e24f2"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::construct" ref="c7e1671b725894b94ce9a6ac544e24f2" args="(pointer p, const value_type &value)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html#c7e1671b725894b94ce9a6ac544e24f2">construct</a> (pointer p, const value_type &value)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3af27e1f8535cc512134ec9a82ff4fc"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::destroy" ref="a3af27e1f8535cc512134ec9a82ff4fc" args="(pointer p)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html#a3af27e1f8535cc512134ec9a82ff4fc">destroy</a> (pointer p)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy value at location pointed to by p. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b9b545d2d31ef4b711ca87ba7aa18976"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::pool_type" ref="b9b545d2d31ef4b711ca87ba7aa18976" args="" -->
+typedef P </td><td class="memItemRight" valign="bottom"><b>pool_type</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f22e947018eb99cde5f44ee3d339499"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::my_pool" ref="9f22e947018eb99cde5f44ee3d339499" args="" -->
+pool_type * </td><td class="memItemRight" valign="bottom"><b>my_pool</b></td></tr>
 
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="193c7eeb6ed852d587b652828f52ca92"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::memory_pool_allocator" ref="193c7eeb6ed852d587b652828f52ca92" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b></td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f4fe0fa75b911081eff469ddb3e7e52a"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::operator==" ref="f4fe0fa75b911081eff469ddb3e7e52a" args="(const memory_pool_allocator< V, R > &a, const memory_pool_allocator< U, R > &b)" -->
+template<typename V, typename U, typename R> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00270.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00270.html">memory_pool_allocator</a>< U, R > &b)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4bb06a39de4a5290b4ec03be19d61c36"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator::operator!=" ref="4bb06a39de4a5290b4ec03be19d61c36" args="(const memory_pool_allocator< V, R > &a, const memory_pool_allocator< U, R > &b)" -->
+template<typename V, typename U, typename R> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00270.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00270.html">memory_pool_allocator</a>< U, R > &b)</td></tr>
 
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html">scoped_lock</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern.  <a href="a00271.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Queuing lock with local-only spinning. 
+<h3>template<typename T, typename P = internal::pool_base><br>
+ class tbb::interface6::memory_pool_allocator< T, P ></h3>
+
+Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00560.html">queuing_mutex.h</a></ul>
+<li><a class="el" href="a00480.html">memory_pool.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00271.html b/doc/html/a00271.html
index 298e651..fdb5806 100644
--- a/doc/html/a00271.html
+++ b/doc/html/a00271.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::queuing_mutex::scoped_lock Class Reference</title>
+<title>tbb::interface6::memory_pool_allocator< void, P > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,68 +21,69 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00270.html">queuing_mutex</a>::<a class="el" href="a00271.html">scoped_lock</a></div>
-<h1>tbb::queuing_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::queuing_mutex::scoped_lock" -->The scoped locking pattern.  
+<a class="el" href="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00271.html">memory_pool_allocator< void, P ></a></div>
+<h1>tbb::interface6::memory_pool_allocator< void, P > Class Template Reference<br>
+<small>
+[<a class="el" href="a00397.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::interface6::memory_pool_allocator< void, P >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00560.html">queuing_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00480.html">memory_pool.h</a>></code>
 <p>
-<a href="a00099.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00070.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7cc2e35b1d34d0543b5a029414ef41f8"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::pool_type" ref="7cc2e35b1d34d0543b5a029414ef41f8" args="" -->
+typedef P </td><td class="memItemRight" valign="bottom"><b>pool_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="48afbf9aed30662f09217c1fe229861d"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::pointer" ref="48afbf9aed30662f09217c1fe229861d" args="" -->
+typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="94ac6954c897981fc8adf6bf5978145b"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::const_pointer" ref="94ac6954c897981fc8adf6bf5978145b" args="" -->
+typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2b9b8af832a8b240cf22c5cc37406f45"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::value_type" ref="2b9b8af832a8b240cf22c5cc37406f45" args="" -->
+typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1601367c80ed73278e1234012631df24"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::memory_pool_allocator" ref="1601367c80ed73278e1234012631df24" args="(pool_type &pool)" -->
+ </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b> (pool_type &pool)  throw ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e4ce5d3f231c9e786aee8f64d53c7f1a"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::memory_pool_allocator" ref="e4ce5d3f231c9e786aee8f64d53c7f1a" args="(const memory_pool_allocator &src)" -->
+ </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b> (const <a class="el" href="a00270.html">memory_pool_allocator</a> &src)  throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex.  <a href="#db0fa3967491014572e24d6607bdc971"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9b51ef972f5618ac17caadb58841ab6d"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::scoped_lock" ref="9b51ef972f5618ac17caadb58841ab6d" args="(queuing_mutex &m)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a> (<a class="el" href="a00270.html">queuing_mutex</a> &m)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="49bd821cb72e23714d7efc480ac4cc9d"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::memory_pool_allocator" ref="49bd821cb72e23714d7efc480ac4cc9d" args="(const memory_pool_allocator< U, P > &src)" -->
+template<typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>memory_pool_allocator</b> (const <a class="el" href="a00270.html">memory_pool_allocator</a>< U, P > &src)  throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac2c576a93570957d694192a5f491443"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::~scoped_lock" ref="ac2c576a93570957d694192a5f491443" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="67b8e6e057db62e7fdbe985ce275b039"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::my_pool" ref="67b8e6e057db62e7fdbe985ce275b039" args="" -->
+pool_type * </td><td class="memItemRight" valign="bottom"><b>my_pool</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="533e4fc8355ee321206a0609c42d909d"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::acquire" ref="533e4fc8355ee321206a0609c42d909d" args="(queuing_mutex &m)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#533e4fc8355ee321206a0609c42d909d">acquire</a> (<a class="el" href="a00270.html">queuing_mutex</a> &m)</td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="193c7eeb6ed852d587b652828f52ca92"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::memory_pool_allocator" ref="193c7eeb6ed852d587b652828f52ca92" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>memory_pool_allocator</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e5a014fb817599386a87170cf2cf51a9"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::try_acquire" ref="e5a014fb817599386a87170cf2cf51a9" args="(queuing_mutex &m)" -->
-bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a> (<a class="el" href="a00270.html">queuing_mutex</a> &m)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f4fe0fa75b911081eff469ddb3e7e52a"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::operator==" ref="f4fe0fa75b911081eff469ddb3e7e52a" args="(const memory_pool_allocator< V, R > &a, const memory_pool_allocator< U, R > &b)" -->
+template<typename V, typename U, typename R> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00270.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00270.html">memory_pool_allocator</a>< U, R > &b)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex if free (i.e. non-blocking). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3bf2b8c87ff22115be9b2eac179f2d30"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::release" ref="3bf2b8c87ff22115be9b2eac179f2d30" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a> ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4bb06a39de4a5290b4ec03be19d61c36"></a><!-- doxytag: member="tbb::interface6::memory_pool_allocator< void, P >::operator!=" ref="4bb06a39de4a5290b4ec03be19d61c36" args="(const memory_pool_allocator< V, R > &a, const memory_pool_allocator< U, R > &b)" -->
+template<typename V, typename U, typename R> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00270.html">memory_pool_allocator</a>< V, R > &a, const <a class="el" href="a00270.html">memory_pool_allocator</a>< U, R > &b)</td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped locking pattern. 
-<p>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks. 
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="db0fa3967491014572e24d6607bdc971"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::scoped_lock" ref="db0fa3967491014572e24d6607bdc971" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">tbb::queuing_mutex::scoped_lock::scoped_lock           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<h3>template<typename P><br>
+ class tbb::interface6::memory_pool_allocator< void, P ></h3>
 
+Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. 
 <p>
-Construct lock that has not acquired a mutex. 
-<p>
-Equivalent to zero-initialization of *this. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00560.html">queuing_mutex.h</a></ul>
+<li><a class="el" href="a00480.html">memory_pool.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00272.html b/doc/html/a00272.html
index ef65cd2..6a898d6 100644
--- a/doc/html/a00272.html
+++ b/doc/html/a00272.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::queuing_rw_mutex Class Reference</title>
+<title>tbb::missing_wait Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,55 +21,24 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00272.html">queuing_rw_mutex</a></div>
-<h1>tbb::queuing_rw_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::queuing_rw_mutex" -->Reader-writer lock with local-only spinning.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00272.html">missing_wait</a></div>
+<h1>tbb::missing_wait Class Reference</h1><!-- doxytag: class="tbb::missing_wait" -->Exception for missing wait on structured_task_group.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00561.html">queuing_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
 <p>
-<a href="a00100.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00140.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="85c90877c3447690ac4e2ac4ff8dea5e"></a><!-- doxytag: member="tbb::queuing_rw_mutex::queuing_rw_mutex" ref="85c90877c3447690ac4e2ac4ff8dea5e" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fe3f8527f9013266dc845a4ff22dd2cf"></a><!-- doxytag: member="tbb::missing_wait::what" ref="fe3f8527f9013266dc845a4ff22dd2cf" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><b>what</b> () const   throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ba73e3d95cfdf8323880bc623af9099"></a><!-- doxytag: member="tbb::queuing_rw_mutex::~queuing_rw_mutex" ref="1ba73e3d95cfdf8323880bc623af9099" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor asserts if the mutex is acquired, i.e. q_tail is non-NULL. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb88522d145ad7bcf5bebfa7d2a6122b"></a><!-- doxytag: member="tbb::queuing_rw_mutex::internal_construct" ref="eb88522d145ad7bcf5bebfa7d2a6122b" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
-
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0dc1e28d3033e8f9556f5b13b7b57d0f"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_rw_mutex" ref="0dc1e28d3033e8f9556f5b13b7b57d0f" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = true</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e6ad08ef251f9ea898bd5f67963869c5"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_recursive_mutex" ref="e6ad08ef251f9ea898bd5f67963869c5" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="147b34120505e419f6ea8d631ec4375d"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_fair_mutex" ref="147b34120505e419f6ea8d631ec4375d" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
-
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html">scoped_lock</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern.  <a href="a00273.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Reader-writer lock with local-only spinning. 
-<p>
-Adapted from Krieger, Stumm, et al. pseudocode at <a href="http://www.eecg.toronto.edu/parallel/pubs_abs.html#Krieger_etal_ICPP93">http://www.eecg.toronto.edu/parallel/pubs_abs.html#Krieger_etal_ICPP93</a> 
+Exception for missing wait on structured_task_group. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00561.html">queuing_rw_mutex.h</a></ul>
+<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00273.html b/doc/html/a00273.html
index c760ba3..b7a6db8 100644
--- a/doc/html/a00273.html
+++ b/doc/html/a00273.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::queuing_rw_mutex::scoped_lock Class Reference</title>
+<title>tbb::movable_exception< ExceptionData > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,97 +21,145 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00272.html">queuing_rw_mutex</a>::<a class="el" href="a00273.html">scoped_lock</a></div>
-<h1>tbb::queuing_rw_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::queuing_rw_mutex::scoped_lock" -->The scoped locking pattern.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00273.html">movable_exception</a></div>
+<h1>tbb::movable_exception< ExceptionData > Class Template Reference</h1><!-- doxytag: class="tbb::movable_exception" --><!-- doxytag: inherits="tbb::tbb_exception" -->Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00561.html">queuing_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
 <p>
-<a href="a00101.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::movable_exception< ExceptionData >:
+<p><center><img src="a00273.png" usemap="#tbb::movable_exception< ExceptionData >_map" border="0" alt=""></center>
+<map name="tbb::movable_exception< ExceptionData >_map">
+<area href="a00319.html" alt="tbb::tbb_exception" shape="rect" coords="0,0,248,24">
+</map>
+<a href="a00144.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="43dfdc5298df3aa8a7d7d146604f84ef"></a><!-- doxytag: member="tbb::movable_exception::movable_exception" ref="43dfdc5298df3aa8a7d7d146604f84ef" args="(const ExceptionData &data_)" -->
+ </td><td class="memItemRight" valign="bottom"><b>movable_exception</b> (const ExceptionData &data_)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex.  <a href="#c62e365be7bcbba091c9ea7454a4d22c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fbb8798792d3aebb136c46fc63d2529e"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::scoped_lock" ref="fbb8798792d3aebb136c46fc63d2529e" args="(queuing_rw_mutex &m, bool write=true)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a> (<a class="el" href="a00272.html">queuing_rw_mutex</a> &m, bool write=true)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="48f97fbf1e5d66c5977891f4375ee4d9"></a><!-- doxytag: member="tbb::movable_exception::movable_exception" ref="48f97fbf1e5d66c5977891f4375ee4d9" args="(const movable_exception &src)" -->
+ </td><td class="memItemRight" valign="bottom"><b>movable_exception</b> (const <a class="el" href="a00273.html">movable_exception</a> &src)  throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="32c7d67a660d23ebbaab1a1d2826d31a"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::~scoped_lock" ref="32c7d67a660d23ebbaab1a1d2826d31a" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dfafefe27f2afaa7c7894ca9c71cc568"></a><!-- doxytag: member="tbb::movable_exception::operator=" ref="dfafefe27f2afaa7c7894ca9c71cc568" args="(const movable_exception &src)" -->
+const <a class="el" href="a00273.html">movable_exception</a> & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00273.html">movable_exception</a> &src)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8dd5ab8686e76de21587544dbb681e0"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::acquire" ref="a8dd5ab8686e76de21587544dbb681e0" args="(queuing_rw_mutex &m, bool write=true)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a> (<a class="el" href="a00272.html">queuing_rw_mutex</a> &m, bool write=true)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="47114cbc20c8e13cac3108749a3e085d"></a><!-- doxytag: member="tbb::movable_exception::data" ref="47114cbc20c8e13cac3108749a3e085d" args="()" -->
+ExceptionData & </td><td class="memItemRight" valign="bottom"><b>data</b> ()  throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2e4ff6c9ec2fee6682f95290d1f42baa"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::try_acquire" ref="2e4ff6c9ec2fee6682f95290d1f42baa" args="(queuing_rw_mutex &m, bool write=true)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a> (<a class="el" href="a00272.html">queuing_rw_mutex</a> &m, bool write=true)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7d93c000d862d2558efd9a34817adbce"></a><!-- doxytag: member="tbb::movable_exception::data" ref="7d93c000d862d2558efd9a34817adbce" args="() const " -->
+const ExceptionData & </td><td class="memItemRight" valign="bottom"><b>data</b> () const   throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="67ae221109ddc69510ab593874e435d4"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::release" ref="67ae221109ddc69510ab593874e435d4" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#67ae221109ddc69510ab593874e435d4">release</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bc5f5c4739b17ac5211ac58226c2f5a5"></a><!-- doxytag: member="tbb::movable_exception::name" ref="bc5f5c4739b17ac5211ac58226c2f5a5" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const   throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b33a89bccf0c63106f1270c7bfaaf54f"></a><!-- doxytag: member="tbb::movable_exception::what" ref="b33a89bccf0c63106f1270c7bfaaf54f" args="() const " -->
+const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const   throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Upgrade reader to become a writer.  <a href="#11ba1da4a722c9e6f73339a52c487e82"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d2f93edf7b15ec4bcee138823220c52"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::downgrade_to_reader" ref="0d2f93edf7b15ec4bcee138823220c52" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">what()</a> method. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00273.html">movable_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> ()  throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Downgrade writer to become a reader. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object.  <a href="#1aea0ad179d6f0481fe7f3495f66adf9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> ()  throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">move()</a> method.  <a href="#7a46873119d9f85a7b0009c13e41a258"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#17cffba35811c92b7e65d63506b69602">throw_self</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object.  <a href="#17cffba35811c92b7e65d63506b69602"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8c0ae2089ae784b28907cf748b89416"></a><!-- doxytag: member="tbb::movable_exception::my_exception_data" ref="a8c0ae2089ae784b28907cf748b89416" args="" -->
+ExceptionData </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">User data. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped locking pattern. 
+<h3>template<typename ExceptionData><br>
+ class tbb::movable_exception< ExceptionData ></h3>
+
+Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread. 
 <p>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks. 
+Code using TBB can instantiate this template with an arbitrary ExceptionData type and throw this exception object. Such exceptions are intercepted by the TBB scheduler and delivered to the root thread (). <dl compact><dt><b>See also:</b></dt><dd><a class="el" href="a00319.html">tbb::tbb_exception</a> </dd></dl>
+
 <p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="c62e365be7bcbba091c9ea7454a4d22c"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::scoped_lock" ref="c62e365be7bcbba091c9ea7454a4d22c" args="()" -->
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="7a46873119d9f85a7b0009c13e41a258"></a><!-- doxytag: member="tbb::movable_exception::destroy" ref="7a46873119d9f85a7b0009c13e41a258" args="()" -->
 <div class="memitem">
 <div class="memproto">
+<div class="memtemplate">
+template<typename ExceptionData> </div>
       <table class="memname">
         <tr>
-          <td class="memname">tbb::queuing_rw_mutex::scoped_lock::scoped_lock           </td>
+          <td class="memname">void <a class="el" href="a00273.html">tbb::movable_exception</a>< ExceptionData >::destroy           </td>
           <td>(</td>
           <td class="paramname">          </td>
           <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
+          <td width="100%">  throw ()<code> [inline, virtual]</code></td>
         </tr>
       </table>
 </div>
 <div class="memdoc">
 
 <p>
-Construct lock that has not acquired a mutex. 
+Destroys objects created by the <a class="el" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">move()</a> method. 
+<p>
+Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method. 
 <p>
-Equivalent to zero-initialization of *this. 
+Implements <a class="el" href="a00319.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>.
 </div>
 </div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="11ba1da4a722c9e6f73339a52c487e82"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::upgrade_to_writer" ref="11ba1da4a722c9e6f73339a52c487e82" args="()" -->
+<a class="anchor" name="1aea0ad179d6f0481fe7f3495f66adf9"></a><!-- doxytag: member="tbb::movable_exception::move" ref="1aea0ad179d6f0481fe7f3495f66adf9" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename ExceptionData> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="a00273.html">movable_exception</a>* <a class="el" href="a00273.html">tbb::movable_exception</a>< ExceptionData >::move           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%">  throw ()<code> [inline, virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Creates and returns pointer to the deep copy of this exception object. 
+<p>
+Move semantics is allowed. 
+<p>
+Implements <a class="el" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a>.
+</div>
+</div><p>
+<a class="anchor" name="17cffba35811c92b7e65d63506b69602"></a><!-- doxytag: member="tbb::movable_exception::throw_self" ref="17cffba35811c92b7e65d63506b69602" args="()" -->
 <div class="memitem">
 <div class="memproto">
+<div class="memtemplate">
+template<typename ExceptionData> </div>
       <table class="memname">
         <tr>
-          <td class="memname">bool tbb::queuing_rw_mutex::scoped_lock::upgrade_to_writer           </td>
+          <td class="memname">void <a class="el" href="a00273.html">tbb::movable_exception</a>< ExceptionData >::throw_self           </td>
           <td>(</td>
           <td class="paramname">          </td>
           <td> ) </td>
-          <td width="100%"></td>
+          <td width="100%"><code> [inline, virtual]</code></td>
         </tr>
       </table>
 </div>
 <div class="memdoc">
 
 <p>
-Upgrade reader to become a writer. 
+Throws this exception object. 
+<p>
+Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown. 
 <p>
-Returns true if the upgrade happened without re-acquiring the lock and false if opposite 
+Implements <a class="el" href="a00319.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a>.
 </div>
 </div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00561.html">queuing_rw_mutex.h</a></ul>
+<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00257.png b/doc/html/a00273.png
similarity index 100%
rename from doc/html/a00257.png
rename to doc/html/a00273.png
diff --git a/doc/html/a00274.html b/doc/html/a00274.html
index 141f667..8623998 100644
--- a/doc/html/a00274.html
+++ b/doc/html/a00274.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::reader_writer_lock Class Reference</title>
+<title>tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,195 +21,45 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00274.html">reader_writer_lock</a></div>
-<h1>tbb::interface5::reader_writer_lock Class Reference<br>
-<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock" -->Writer-preference reader-writer lock with local-only spinning on readers.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00274.html">multioutput_function_node</a></div>
+<h1>tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::multioutput_function_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node" -->implements a function node that supports Input -> (set of outputs)  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00562.html">reader_writer_lock.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<a href="a00102.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator >:
+<p><center><img src="a00274.png" usemap="#tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator >_map">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,434,24">
+</map>
+<a href="a00050.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf005142e2b9af377a8d33c6604d858862"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::waiting_nonblocking" ref="6f921f0d7c1812ceb5674418c8b6ccaf005142e2b9af377a8d33c6604d858862" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>waiting_nonblocking</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="caf2ee1047fb85e2b4b02afe7877c385"></a><!-- doxytag: member="tbb::flow::interface6::multioutput_function_node::input_type" ref="caf2ee1047fb85e2b4b02afe7877c385" args="" -->
+typedef Input </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf18bcc9aae8f056c34fb61bb7fc39b432"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::waiting" ref="6f921f0d7c1812ceb5674418c8b6ccaf18bcc9aae8f056c34fb61bb7fc39b432" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>waiting</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c49aae50bb04b3439e6e88bf449a01a9"></a><!-- doxytag: member="tbb::flow::interface6::multioutput_function_node::ports_type" ref="c49aae50bb04b3439e6e88bf449a01a9" args="" -->
+typedef internal::wrap_tuple_elements<<br>
+ N, internal::function_output,<br>
+ Output >::type </td><td class="memItemRight" valign="bottom"><b>ports_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf423c082d5cdc9bb12d0eeadcae56adb5"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::active" ref="6f921f0d7c1812ceb5674418c8b6ccaf423c082d5cdc9bb12d0eeadcae56adb5" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>active</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccafa9a5b17bdfb0a6d59b3cd58fecbd9610"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::invalid" ref="6f921f0d7c1812ceb5674418c8b6ccafa9a5b17bdfb0a6d59b3cd58fecbd9610" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>invalid</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> { <b>waiting_nonblocking</b>, 
-<b>waiting</b>, 
-<b>active</b>, 
-<b>invalid</b>
- }</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Status type for nodes associated with lock instances.  <a href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">More...</a><br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c1431c4293e777efd9aab9a95c2a46e1"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::reader_writer_lock" ref="c1431c4293e777efd9aab9a95c2a46e1" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00274.html">reader_writer_lock</a>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5135f64f7b7339017f33d956445edbee"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::~reader_writer_lock" ref="5135f64f7b7339017f33d956445edbee" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructs a <a class="el" href="a00274.html">reader_writer_lock</a> object. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00274.html">reader_writer_lock</a> for write.  <a href="#2653d1a2d560059a51219a8ceab3ade9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#721eb173e154ab38292273e9266a9b07">try_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00274.html">reader_writer_lock</a> for write.  <a href="#721eb173e154ab38292273e9266a9b07"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a> ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="6054e8a5fe0159b5ec04c2a06687310c"></a><!-- doxytag: member="tbb::flow::interface6::multioutput_function_node::multioutput_function_node" ref="6054e8a5fe0159b5ec04c2a06687310c" args="(graph &g, size_t concurrency, Body body)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>multioutput_function_node</b> (<a class="el" href="a00262.html">graph</a> &g, size_t concurrency, Body body)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00274.html">reader_writer_lock</a> for read.  <a href="#d9d16a24d9f6c3dada73c6b9ff214f5b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="57f90e91362c343e4e80e2f305851220"></a><!-- doxytag: member="tbb::flow::interface6::multioutput_function_node::multioutput_function_node" ref="57f90e91362c343e4e80e2f305851220" args="(const multioutput_function_node &other)" -->
+ </td><td class="memItemRight" valign="bottom"><b>multioutput_function_node</b> (const <a class="el" href="a00274.html">multioutput_function_node</a> &other)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00274.html">reader_writer_lock</a> for read.  <a href="#595fb23952e3b89426b1f7938dea9b11"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5113b32689305599b2c36b5831547704"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::unlock" ref="5113b32689305599b2c36b5831547704" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html#5113b32689305599b2c36b5831547704">unlock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Releases the <a class="el" href="a00274.html">reader_writer_lock</a>. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="680274059774b9188889d34986314f81"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read" ref="680274059774b9188889d34986314f81" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock_read</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html">scoped_lock</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for write locks.  <a href="a00275.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html">scoped_lock_read</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for read locks.  <a href="a00276.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Writer-preference reader-writer lock with local-only spinning on readers. 
-<p>
-Loosely adapted from Mellor-Crummey and Scott pseudocode at <a href="http://www.cs.rochester.edu/research/synchronization/pseudocode/rw.html#s_wp">http://www.cs.rochester.edu/research/synchronization/pseudocode/rw.html#s_wp</a> 
-<p>
-<hr><h2>Member Enumeration Documentation</h2>
-<a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::status_t" ref="6f921f0d7c1812ceb5674418c8b6ccaf" args="" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">enum <a class="el" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock::status_t</a>          </td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<h3>template<typename Input, typename Output, graph_buffer_policy = queueing, typename Allocator = cache_aligned_allocator<Input>><br>
+ class tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></h3>
 
+implements a function node that supports Input -> (set of outputs) 
 <p>
-Status type for nodes associated with lock instances. 
-<p>
-waiting_nonblocking: the wait state for nonblocking lock instances; for writes, these transition straight to active states; for reads, these are unused.<p>
-waiting: the start and spin state for all lock instances; these will transition to active state when appropriate. Non-blocking write locks transition from this state to waiting_nonblocking immediately.<p>
-active: the active state means that the lock instance holds the lock; it will transition to invalid state during node deletion<p>
-invalid: the end state for all nodes; this is set in the destructor so if we encounter this state, we are looking at memory that has already been freed<p>
-The state diagrams below describe the status transitions. Single arrows indicate that the thread that owns the node is responsible for the transition; double arrows indicate that any thread could make the transition.<p>
-State diagram for <a class="el" href="a00275.html">scoped_lock</a> status:<p>
-waiting ----------> waiting_nonblocking | _____________/ | V V V active -----------------> invalid<p>
-State diagram for <a class="el" href="a00276.html">scoped_lock_read</a> status:<p>
-waiting | V active ----------------->invalid 
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="2653d1a2d560059a51219a8ceab3ade9"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::lock" ref="2653d1a2d560059a51219a8ceab3ade9" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::lock           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Acquires the <a class="el" href="a00274.html">reader_writer_lock</a> for write. 
-<p>
-If the lock is currently held in write mode by another context, the writer will block by spinning on a local variable. Exceptions thrown: <a class="el" href="a00252.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00274.html">reader_writer_lock</a> that it already has write ownership of. 
-</div>
-</div><p>
-<a class="anchor" name="d9d16a24d9f6c3dada73c6b9ff214f5b"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::lock_read" ref="d9d16a24d9f6c3dada73c6b9ff214f5b" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::lock_read           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Acquires the <a class="el" href="a00274.html">reader_writer_lock</a> for read. 
-<p>
-If the lock is currently held by a writer, this reader will block and wait until the writers are done. Exceptions thrown: <a class="el" href="a00252.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00274.html">reader_writer_lock</a> that it already has write ownership of. 
-</div>
-</div><p>
-<a class="anchor" name="721eb173e154ab38292273e9266a9b07"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::try_lock" ref="721eb173e154ab38292273e9266a9b07" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">bool __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::try_lock           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Tries to acquire the <a class="el" href="a00274.html">reader_writer_lock</a> for write. 
-<p>
-This function does not block. Return Value: True or false, depending on whether the lock is acquired or not. If the lock is already held by this acquiring context, <a class="el" href="a00274.html#721eb173e154ab38292273e9266a9b07">try_lock()</a> returns false. 
-</div>
-</div><p>
-<a class="anchor" name="595fb23952e3b89426b1f7938dea9b11"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::try_lock_read" ref="595fb23952e3b89426b1f7938dea9b11" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">bool __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::try_lock_read           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Tries to acquire the <a class="el" href="a00274.html">reader_writer_lock</a> for read. 
-<p>
-This function does not block. Return Value: True or false, depending on whether the lock is acquired or not. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00562.html">reader_writer_lock.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00274.png b/doc/html/a00274.png
new file mode 100644
index 0000000..f84a6bc
Binary files /dev/null and b/doc/html/a00274.png differ
diff --git a/doc/html/a00275.html b/doc/html/a00275.html
index 1b98338..c24ca20 100644
--- a/doc/html/a00275.html
+++ b/doc/html/a00275.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::reader_writer_lock::scoped_lock Class Reference</title>
+<title>tbb::mutex Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,41 +21,110 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00274.html">reader_writer_lock</a>::<a class="el" href="a00275.html">scoped_lock</a></div>
-<h1>tbb::interface5::reader_writer_lock::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock::scoped_lock" -->The scoped lock pattern for write locks.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00275.html">mutex</a></div>
+<h1>tbb::mutex Class Reference<br>
+<small>
+[<a class="el" href="a00398.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::mutex" -->Wrapper around the platform's native reader-writer lock.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00562.html">reader_writer_lock.h</a>></code>
+<code>#include <<a class="el" href="a00487.html">mutex.h</a>></code>
 <p>
-<a href="a00103.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00074.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9f1ec84d5815263ceae853f06ddb4cac"></a><!-- doxytag: member="tbb::mutex::native_handle_type" ref="9f1ec84d5815263ceae853f06ddb4cac" args="" -->
+typedef LPCRITICAL_SECTION </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return native_handle. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a1f4d4b88a03eb3e95c76569b91a0792"></a><!-- doxytag: member="tbb::mutex::native_handle_type" ref="a1f4d4b88a03eb3e95c76569b91a0792" args="" -->
+typedef pthread_mutex_t * </td><td class="memItemRight" valign="bottom"><b>native_handle_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c907aa5ae5274da759c4188c8ab196034e5963fe9e27d7c4d0a2d4ffa24a50a7"></a><!-- doxytag: member="tbb::mutex::INITIALIZED" ref="c907aa5ae5274da759c4188c8ab196034e5963fe9e27d7c4d0a2d4ffa24a50a7" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>INITIALIZED</b> = 0x1234</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c907aa5ae5274da759c4188c8ab19603646f4766864612448d6f9b21ff61abcd"></a><!-- doxytag: member="tbb::mutex::DESTROYED" ref="c907aa5ae5274da759c4188c8ab19603646f4766864612448d6f9b21ff61abcd" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>DESTROYED</b> = 0x789A</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c907aa5ae5274da759c4188c8ab196031de5796ebbbaa1e30d19e5d54f0f6555"></a><!-- doxytag: member="tbb::mutex::HELD" ref="c907aa5ae5274da759c4188c8ab196031de5796ebbbaa1e30d19e5d54f0f6555" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>HELD</b> = 0x56CD</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>state_t</b> { <b>INITIALIZED</b> = 0x1234, 
+<b>DESTROYED</b> = 0x789A, 
+<b>HELD</b> = 0x56CD
+ }</td></tr>
+
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf19f20e082887c1bb0ba6b0911c3583"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::scoped_lock" ref="cf19f20e082887c1bb0ba6b0911c3583" args="(reader_writer_lock &lock)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a> (<a class="el" href="a00274.html">reader_writer_lock</a> &lock)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05313cb77d4f85213103d4dab74ed454"></a><!-- doxytag: member="tbb::mutex::mutex" ref="05313cb77d4f85213103d4dab74ed454" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#05313cb77d4f85213103d4dab74ed454">mutex</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4470e61c24c129a0299ca6c17240adbb"></a><!-- doxytag: member="tbb::mutex::lock" ref="4470e61c24c129a0299ca6c17240adbb" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#4470e61c24c129a0299ca6c17240adbb">lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#4331652c79dea1c1131bd59ab161b234">try_lock</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct with blocking attempt to acquire write lock on the passed-in lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="70246e0260493625ff956fa5926fc71f"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::~scoped_lock" ref="70246e0260493625ff956fa5926fc71f" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking).  <a href="#4331652c79dea1c1131bd59ab161b234"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fc9ef443ae75d966695546be399cc6b"></a><!-- doxytag: member="tbb::mutex::unlock" ref="5fc9ef443ae75d966695546be399cc6b" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#5fc9ef443ae75d966695546be399cc6b">unlock</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor, releases the write lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aea1cb0e88be9874f0f72e52063d0b90"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::operator new" ref="aea1cb0e88be9874f0f72e52063d0b90" args="(size_t s)" -->
-void * </td><td class="memItemRight" valign="bottom"><b>operator new</b> (size_t s)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="caf34349c0fbe7b44f1a2ca0a3150dd0"></a><!-- doxytag: member="tbb::mutex::native_handle" ref="caf34349c0fbe7b44f1a2ca0a3150dd0" args="()" -->
+<a class="el" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> </td><td class="memItemRight" valign="bottom"><b>native_handle</b> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db804a05fcd37f7e81b94752e45039f7"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::operator delete" ref="db804a05fcd37f7e81b94752e45039f7" args="(void *p)" -->
-void </td><td class="memItemRight" valign="bottom"><b>operator delete</b> (void *p)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="795649a185b0d6af6dc81c5f378616dd"></a><!-- doxytag: member="tbb::mutex::set_state" ref="795649a185b0d6af6dc81c5f378616dd" args="(state_t to)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html#795649a185b0d6af6dc81c5f378616dd">set_state</a> (state_t to)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Set the internal state. <br></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17b78176054e2bac1ff35b9535d1ea0c"></a><!-- doxytag: member="tbb::mutex::is_rw_mutex" ref="17b78176054e2bac1ff35b9535d1ea0c" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d4558e5a7c5b8d8e158ec7a1079669bd"></a><!-- doxytag: member="tbb::mutex::is_recursive_mutex" ref="d4558e5a7c5b8d8e158ec7a1079669bd" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f023a29c61451d02359095cbff0f3d45"></a><!-- doxytag: member="tbb::mutex::is_fair_mutex" ref="f023a29c61451d02359095cbff0f3d45" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
 
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="38eb53abbe72543f5967c63aa95b403e"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::reader_writer_lock" ref="38eb53abbe72543f5967c63aa95b403e" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>reader_writer_lock</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html">scoped_lock</a></td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern.  <a href="a00276.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped lock pattern for write locks. 
+Wrapper around the platform's native reader-writer lock. 
+<p>
+For testing purposes only. 
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="4331652c79dea1c1131bd59ab161b234"></a><!-- doxytag: member="tbb::mutex::try_lock" ref="4331652c79dea1c1131bd59ab161b234" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool tbb::mutex::try_lock           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
 <p>
-Scoped locks help avoid the common problem of forgetting to release the lock. This type is also serves as the node for queuing locks. 
+Try acquiring lock (non-blocking). 
 <p>
+Return true if lock acquired; false otherwise. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00562.html">reader_writer_lock.h</a></ul>
+<li><a class="el" href="a00487.html">mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00276.html b/doc/html/a00276.html
index cb8c4ab..efdbef7 100644
--- a/doc/html/a00276.html
+++ b/doc/html/a00276.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::reader_writer_lock::scoped_lock_read Class Reference</title>
+<title>tbb::mutex::scoped_lock Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,39 +21,51 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00274.html">reader_writer_lock</a>::<a class="el" href="a00276.html">scoped_lock_read</a></div>
-<h1>tbb::interface5::reader_writer_lock::scoped_lock_read Class Reference</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock::scoped_lock_read" -->The scoped lock pattern for read locks.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00275.html">mutex</a>::<a class="el" href="a00276.html">scoped_lock</a></div>
+<h1>tbb::mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::mutex::scoped_lock" -->The scoped locking pattern.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00562.html">reader_writer_lock.h</a>></code>
+<code>#include <<a class="el" href="a00487.html">mutex.h</a>></code>
 <p>
-<a href="a00104.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00075.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="87ab0dc8f7216e6ba0f7acd6aec33064"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::scoped_lock_read" ref="87ab0dc8f7216e6ba0f7acd6aec33064" args="(reader_writer_lock &lock)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a> (<a class="el" href="a00274.html">reader_writer_lock</a> &lock)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d403ae51b484df5d86d85ae38f11e6e"></a><!-- doxytag: member="tbb::mutex::scoped_lock::scoped_lock" ref="1d403ae51b484df5d86d85ae38f11e6e" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct with blocking attempt to acquire read lock on the passed-in lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd21c5f3d555d64d1de8658e15bf4966"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::~scoped_lock_read" ref="bd21c5f3d555d64d1de8658e15bf4966" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="605a6b9af0f8cdabdf81825e0de99600"></a><!-- doxytag: member="tbb::mutex::scoped_lock::scoped_lock" ref="605a6b9af0f8cdabdf81825e0de99600" args="(mutex &mutex)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#605a6b9af0f8cdabdf81825e0de99600">scoped_lock</a> (<a class="el" href="a00275.html">mutex</a> &<a class="el" href="a00275.html">mutex</a>)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor, releases the read lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f09e1817dddf97cc2182a573945eef91"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::operator new" ref="f09e1817dddf97cc2182a573945eef91" args="(size_t s)" -->
-void * </td><td class="memItemRight" valign="bottom"><b>operator new</b> (size_t s)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0ebbbecaf4311e9df7362cb76ceaa368"></a><!-- doxytag: member="tbb::mutex::scoped_lock::~scoped_lock" ref="0ebbbecaf4311e9df7362cb76ceaa368" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f9e148ec33895c0d2669ff6820cf164"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::operator delete" ref="4f9e148ec33895c0d2669ff6820cf164" args="(void *p)" -->
-void </td><td class="memItemRight" valign="bottom"><b>operator delete</b> (void *p)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="862e022841cdc522e4296a5533b22efd"></a><!-- doxytag: member="tbb::mutex::scoped_lock::acquire" ref="862e022841cdc522e4296a5533b22efd" args="(mutex &mutex)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#862e022841cdc522e4296a5533b22efd">acquire</a> (<a class="el" href="a00275.html">mutex</a> &<a class="el" href="a00275.html">mutex</a>)</td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="591e0c49b82bcedffcbe0923f1b915ec"></a><!-- doxytag: member="tbb::mutex::scoped_lock::try_acquire" ref="591e0c49b82bcedffcbe0923f1b915ec" args="(mutex &mutex)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a> (<a class="el" href="a00275.html">mutex</a> &<a class="el" href="a00275.html">mutex</a>)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d51d18cd99df3b2e93bf07378d0992c"></a><!-- doxytag: member="tbb::mutex::scoped_lock::release" ref="0d51d18cd99df3b2e93bf07378d0992c" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00276.html#0d51d18cd99df3b2e93bf07378d0992c">release</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="38eb53abbe72543f5967c63aa95b403e"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::reader_writer_lock" ref="38eb53abbe72543f5967c63aa95b403e" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>reader_writer_lock</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93062a14ad2e50e2b7b485b913170779"></a><!-- doxytag: member="tbb::mutex::scoped_lock::mutex" ref="93062a14ad2e50e2b7b485b913170779" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>mutex</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped lock pattern for read locks. 
+The scoped locking pattern. 
+<p>
+It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00562.html">reader_writer_lock.h</a></ul>
+<li><a class="el" href="a00487.html">mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00277.html b/doc/html/a00277.html
index 8ed75e7..b0bc02e 100644
--- a/doc/html/a00277.html
+++ b/doc/html/a00277.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::receiver< T > Class Template Reference</title>
+<title>tbb::null_mutex Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,61 +21,39 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00277.html">receiver</a></div>
-<h1>tbb::receiver< T > Class Template Reference</h1><!-- doxytag: class="tbb::receiver" -->Pure virtual template class that defines a receiver of messages of type T.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00277.html">null_mutex</a></div>
+<h1>tbb::null_mutex Class Reference<br>
+<small>
+[<a class="el" href="a00398.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::null_mutex" -->A mutex which does nothing.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00489.html">null_mutex.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::receiver< T >:
-<p><center><img src="a00277.png" usemap="#tbb::receiver< T >_map" border="0" alt=""></center>
-<map name="tbb::receiver< T >_map">
-<area href="a00224.html" alt="tbb::broadcast_node< T >" shape="rect" coords="0,56,242,80">
-<area href="a00225.html" alt="tbb::buffer_node< T >" shape="rect" coords="252,56,494,80">
-<area href="a00241.html" alt="tbb::continue_receiver" shape="rect" coords="504,56,746,80">
-<area href="a00304.html" alt="tbb::internal::two_phase_port< T >" shape="rect" coords="756,56,998,80">
-<area href="a00255.html" alt="tbb::limiter_node< T >" shape="rect" coords="1008,56,1250,80">
-<area href="a00268.html" alt="tbb::priority_queue_node< T, Compare >" shape="rect" coords="126,112,368,136">
-<area href="a00269.html" alt="tbb::queue_node< T >" shape="rect" coords="378,112,620,136">
-<area href="a00283.html" alt="tbb::sequencer_node< T >" shape="rect" coords="378,168,620,192">
-</map>
-<a href="a00043.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00076.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9cfd5ef0d67d5bbfb5f9a76d75e62765"></a><!-- doxytag: member="tbb::receiver::input_type" ref="9cfd5ef0d67d5bbfb5f9a76d75e62765" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#9cfd5ef0d67d5bbfb5f9a76d75e62765">input_type</a></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a960bed8b19a4d111ca047de206f5f77"></a><!-- doxytag: member="tbb::null_mutex::is_rw_mutex" ref="a960bed8b19a4d111ca047de206f5f77" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c802c845b51c6d129153b684d33f7310"></a><!-- doxytag: member="tbb::receiver::predecessor_type" ref="c802c845b51c6d129153b684d33f7310" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#c802c845b51c6d129153b684d33f7310">predecessor_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a0fefed74b341d43ccf0e2fc30d31b75"></a><!-- doxytag: member="tbb::null_mutex::is_recursive_mutex" ref="a0fefed74b341d43ccf0e2fc30d31b75" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = true</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="18f74b83abae0ee1e4ce07942797ef27"></a><!-- doxytag: member="tbb::receiver::~receiver" ref="18f74b83abae0ee1e4ce07942797ef27" args="()" -->
-virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="707cf399055d68177b1d64c2e112603a"></a><!-- doxytag: member="tbb::null_mutex::is_fair_mutex" ref="707cf399055d68177b1d64c2e112603a" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6e5422b03b4570138f227b3d5d0073b8"></a><!-- doxytag: member="tbb::receiver::try_put" ref="6e5422b03b4570138f227b3d5d0073b8" args="(T t)=0" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#6e5422b03b4570138f227b3d5d0073b8">try_put</a> (T t)=0</td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html">scoped_lock</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Put an item to the receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14ae737c8fca4c8bf8e1a736dfbac444"></a><!-- doxytag: member="tbb::receiver::register_predecessor" ref="14ae737c8fca4c8bf8e1a736dfbac444" args="(predecessor_type &)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a> (<a class="el" href="a00282.html">predecessor_type</a> &)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a predecessor to the node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2f23b40b328dc254a7c2a0a30f408e4"></a><!-- doxytag: member="tbb::receiver::remove_predecessor" ref="d2f23b40b328dc254a7c2a0a30f408e4" args="(predecessor_type &)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a> (<a class="el" href="a00282.html">predecessor_type</a> &)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove a predecessor from the node. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex.  <a href="a00278.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::receiver< T ></h3>
-
-Pure virtual template class that defines a receiver of messages of type T. 
+A mutex which does nothing. 
+<p>
+A <a class="el" href="a00277.html">null_mutex</a> does no operation and simulates success. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00489.html">null_mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00277.png b/doc/html/a00277.png
deleted file mode 100644
index fdfa4c6..0000000
Binary files a/doc/html/a00277.png and /dev/null differ
diff --git a/doc/html/a00278.html b/doc/html/a00278.html
index 4b1721c..7218bd8 100644
--- a/doc/html/a00278.html
+++ b/doc/html/a00278.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::recursive_mutex Class Reference</title>
+<title>tbb::null_mutex::scoped_lock Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,92 +21,33 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00278.html">recursive_mutex</a></div>
-<h1>tbb::recursive_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::recursive_mutex" -->Mutex that allows recursive mutex acquisition.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00277.html">null_mutex</a>::<a class="el" href="a00278.html">scoped_lock</a></div>
+<h1>tbb::null_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::null_mutex::scoped_lock" -->Represents acquisition of a mutex.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00563.html">recursive_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00489.html">null_mutex.h</a>></code>
 <p>
-<a href="a00105.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00077.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="889fa8cc32dd707eef7c0f52dda09c0d"></a><!-- doxytag: member="tbb::recursive_mutex::native_handle_type" ref="889fa8cc32dd707eef7c0f52dda09c0d" args="" -->
-typedef LPCRITICAL_SECTION </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return native_handle. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="26a40fae42bf6cd9f3f77ee7482d6164"></a><!-- doxytag: member="tbb::recursive_mutex::native_handle_type" ref="26a40fae42bf6cd9f3f77ee7482d6164" args="" -->
-typedef pthread_mutex_t * </td><td class="memItemRight" valign="bottom"><b>native_handle_type</b></td></tr>
-
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2fceb7f95c24a8cd1457d4527e4b8c6"></a><!-- doxytag: member="tbb::recursive_mutex::recursive_mutex" ref="d2fceb7f95c24a8cd1457d4527e4b8c6" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired <a class="el" href="a00278.html">recursive_mutex</a>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c342c69d47f4bb0b393535dee4015d6"></a><!-- doxytag: member="tbb::recursive_mutex::lock" ref="4c342c69d47f4bb0b393535dee4015d6" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html#4c342c69d47f4bb0b393535dee4015d6">lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html#86e719b0afee25704af11ab97694d240">try_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking).  <a href="#86e719b0afee25704af11ab97694d240"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f0a96e26b7f074588dc31e32524856ae"></a><!-- doxytag: member="tbb::recursive_mutex::unlock" ref="f0a96e26b7f074588dc31e32524856ae" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html#f0a96e26b7f074588dc31e32524856ae">unlock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6baa9ce4b394c39622456fd8a68f8bd8"></a><!-- doxytag: member="tbb::recursive_mutex::native_handle" ref="6baa9ce4b394c39622456fd8a68f8bd8" args="()" -->
-<a class="el" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> </td><td class="memItemRight" valign="bottom"><b>native_handle</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="765e64065919fdd9665e78b5ec4d3c6f"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::scoped_lock" ref="765e64065919fdd9665e78b5ec4d3c6f" args="(null_mutex &)" -->
+ </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b> (<a class="el" href="a00277.html">null_mutex</a> &)</td></tr>
 
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="718cc53f6b33d8c396ccca0e4ebc5606"></a><!-- doxytag: member="tbb::recursive_mutex::is_rw_mutex" ref="718cc53f6b33d8c396ccca0e4ebc5606" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f6889f00ca3946906e89e856988bb890"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::acquire" ref="f6889f00ca3946906e89e856988bb890" args="(null_mutex &)" -->
+void </td><td class="memItemRight" valign="bottom"><b>acquire</b> (<a class="el" href="a00277.html">null_mutex</a> &)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f6149d7541063d8b35afd98df6f0f89d"></a><!-- doxytag: member="tbb::recursive_mutex::is_recursive_mutex" ref="f6149d7541063d8b35afd98df6f0f89d" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = true</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90eb562a9de52b33362a6fe237b3df42"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::try_acquire" ref="90eb562a9de52b33362a6fe237b3df42" args="(null_mutex &)" -->
+bool </td><td class="memItemRight" valign="bottom"><b>try_acquire</b> (<a class="el" href="a00277.html">null_mutex</a> &)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f01aacad6b9b9d51573c0803323182fe"></a><!-- doxytag: member="tbb::recursive_mutex::is_fair_mutex" ref="f01aacad6b9b9d51573c0803323182fe" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b29fdf07b4c295850a6e433001c2c6a7"></a><!-- doxytag: member="tbb::null_mutex::scoped_lock::release" ref="b29fdf07b4c295850a6e433001c2c6a7" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>release</b> ()</td></tr>
 
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html">scoped_lock</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern.  <a href="a00279.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Mutex that allows recursive mutex acquisition. 
-<p>
-Mutex that allows recursive mutex acquisition. 
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="86e719b0afee25704af11ab97694d240"></a><!-- doxytag: member="tbb::recursive_mutex::try_lock" ref="86e719b0afee25704af11ab97694d240" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">bool tbb::recursive_mutex::try_lock           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Try acquiring lock (non-blocking). 
+Represents acquisition of a mutex. 
 <p>
-Return true if lock acquired; false otherwise. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00563.html">recursive_mutex.h</a></ul>
+<li><a class="el" href="a00489.html">null_mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00279.html b/doc/html/a00279.html
index 353c73f..a908754 100644
--- a/doc/html/a00279.html
+++ b/doc/html/a00279.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::recursive_mutex::scoped_lock Class Reference</title>
+<title>tbb::null_rw_mutex Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,51 +21,39 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00278.html">recursive_mutex</a>::<a class="el" href="a00279.html">scoped_lock</a></div>
-<h1>tbb::recursive_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::recursive_mutex::scoped_lock" -->The scoped locking pattern.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00279.html">null_rw_mutex</a></div>
+<h1>tbb::null_rw_mutex Class Reference<br>
+<small>
+[<a class="el" href="a00398.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::null_rw_mutex" -->A rw mutex which does nothing.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00563.html">recursive_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00490.html">null_rw_mutex.h</a>></code>
 <p>
-<a href="a00106.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00078.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d82d4d36fbf9727a493d26ae50855fe7"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::scoped_lock" ref="d82d4d36fbf9727a493d26ae50855fe7" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2f3235cbf63812f72e5755a4c820f523"></a><!-- doxytag: member="tbb::null_rw_mutex::is_rw_mutex" ref="2f3235cbf63812f72e5755a4c820f523" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = true</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a <a class="el" href="a00278.html">recursive_mutex</a>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dec17713c4c1321ac8fec66816d0c602"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::scoped_lock" ref="dec17713c4c1321ac8fec66816d0c602" args="(recursive_mutex &mutex)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a> (<a class="el" href="a00278.html">recursive_mutex</a> &<a class="el" href="a00258.html">mutex</a>)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e33ac3b047901e69e7997a16e221a330"></a><!-- doxytag: member="tbb::null_rw_mutex::is_recursive_mutex" ref="e33ac3b047901e69e7997a16e221a330" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = true</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c1197ffb8f3cd9d4fed71d7e06265b7c"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::~scoped_lock" ref="c1197ffb8f3cd9d4fed71d7e06265b7c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e5248faf1412f9283185a0b5d72d7456"></a><!-- doxytag: member="tbb::null_rw_mutex::is_fair_mutex" ref="e5248faf1412f9283185a0b5d72d7456" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7fb04da37cccf8c99b1f9102d9074f9a"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::acquire" ref="7fb04da37cccf8c99b1f9102d9074f9a" args="(recursive_mutex &mutex)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a> (<a class="el" href="a00278.html">recursive_mutex</a> &<a class="el" href="a00258.html">mutex</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="36bfc3e93e3ef6340abef4901444d340"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::try_acquire" ref="36bfc3e93e3ef6340abef4901444d340" args="(recursive_mutex &mutex)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a> (<a class="el" href="a00278.html">recursive_mutex</a> &<a class="el" href="a00258.html">mutex</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given <a class="el" href="a00278.html">recursive_mutex</a>. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac480ea0e9d5ea0345a67d57008b6263"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::release" ref="ac480ea0e9d5ea0345a67d57008b6263" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html#ac480ea0e9d5ea0345a67d57008b6263">release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="459818b78a3e9985dc5a9d5638b6593e"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::recursive_mutex" ref="459818b78a3e9985dc5a9d5638b6593e" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>recursive_mutex</b></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html">scoped_lock</a></td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex.  <a href="a00280.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-The scoped locking pattern. 
+A rw mutex which does nothing. 
 <p>
-It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks. 
+A <a class="el" href="a00279.html">null_rw_mutex</a> is a rw mutex that does nothing and simulates successful operation. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00563.html">recursive_mutex.h</a></ul>
+<li><a class="el" href="a00490.html">null_rw_mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00280.html b/doc/html/a00280.html
index 91d9c3b..acf08f1 100644
--- a/doc/html/a00280.html
+++ b/doc/html/a00280.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::scalable_allocator< T > Class Template Reference</title>
+<title>tbb::null_rw_mutex::scoped_lock Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,86 +21,39 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00280.html">scalable_allocator</a></div>
-<h1>tbb::scalable_allocator< T > Class Template Reference<br>
-<small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::scalable_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00279.html">null_rw_mutex</a>::<a class="el" href="a00280.html">scoped_lock</a></div>
+<h1>tbb::null_rw_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::null_rw_mutex::scoped_lock" -->Represents acquisition of a mutex.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00564.html">scalable_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00490.html">null_rw_mutex.h</a>></code>
 <p>
-<a href="a00107.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00079.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a1cf13c339ee177a103a7e19bf2710a"></a><!-- doxytag: member="tbb::scalable_allocator::value_type" ref="5a1cf13c339ee177a103a7e19bf2710a" args="" -->
-typedef internal::allocator_type<<br>
- T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a5121ec62bc79faba6a4b674d59e7260"></a><!-- doxytag: member="tbb::scalable_allocator::pointer" ref="a5121ec62bc79faba6a4b674d59e7260" args="" -->
-typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="846a6fcec3bc7fa3839a12266a729a02"></a><!-- doxytag: member="tbb::scalable_allocator::const_pointer" ref="846a6fcec3bc7fa3839a12266a729a02" args="" -->
-typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="254d7749de9277bb7711470c04d963ea"></a><!-- doxytag: member="tbb::scalable_allocator::reference" ref="254d7749de9277bb7711470c04d963ea" args="" -->
-typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="acad193a7f6e16253f772ba3e9b2c98f"></a><!-- doxytag: member="tbb::scalable_allocator::const_reference" ref="acad193a7f6e16253f772ba3e9b2c98f" args="" -->
-typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4a5cb7482f222a14b513bbdd4ad8507d"></a><!-- doxytag: member="tbb::scalable_allocator::size_type" ref="4a5cb7482f222a14b513bbdd4ad8507d" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cb96c23f650cf91a73e2810b54c481bb"></a><!-- doxytag: member="tbb::scalable_allocator::difference_type" ref="cb96c23f650cf91a73e2810b54c481bb" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eee1873729ed05c7f92544c3ff0c08bc"></a><!-- doxytag: member="tbb::scalable_allocator::scalable_allocator" ref="eee1873729ed05c7f92544c3ff0c08bc" args="(const scalable_allocator &)" -->
- </td><td class="memItemRight" valign="bottom"><b>scalable_allocator</b> (const <a class="el" href="a00280.html">scalable_allocator</a> &)  throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e11281a13a7b6243c6c9ab243c5ad5a8"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::scoped_lock" ref="e11281a13a7b6243c6c9ab243c5ad5a8" args="(null_rw_mutex &, bool=true)" -->
+ </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b> (<a class="el" href="a00279.html">null_rw_mutex</a> &, bool=true)</td></tr>
 
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="d56dc9f231c59f912297ac3c3b3b93b6"></a><!-- doxytag: member="tbb::scalable_allocator::scalable_allocator" ref="d56dc9f231c59f912297ac3c3b3b93b6" args="(const scalable_allocator< U > &)" -->
-template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>scalable_allocator</b> (const <a class="el" href="a00280.html">scalable_allocator</a>< U > &)  throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="72c4c302fdfc20187a650348e432b0a7"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::acquire" ref="72c4c302fdfc20187a650348e432b0a7" args="(null_rw_mutex &, bool=true)" -->
+void </td><td class="memItemRight" valign="bottom"><b>acquire</b> (<a class="el" href="a00279.html">null_rw_mutex</a> &, bool=true)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="78fa13a188b542ea724d45a9dbf5a071"></a><!-- doxytag: member="tbb::scalable_allocator::address" ref="78fa13a188b542ea724d45a9dbf5a071" args="(reference x) const " -->
-pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa1e2a5592ee2672470ea44d98f1c498"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::upgrade_to_writer" ref="fa1e2a5592ee2672470ea44d98f1c498" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>upgrade_to_writer</b> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14be4ad8eb478c87e240e605221ab455"></a><!-- doxytag: member="tbb::scalable_allocator::address" ref="14be4ad8eb478c87e240e605221ab455" args="(const_reference x) const " -->
-const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="efcb7948649e1652d59aaff9c8ea40f1"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::downgrade_to_reader" ref="efcb7948649e1652d59aaff9c8ea40f1" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>downgrade_to_reader</b> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="726b1586d05d44665a36e1c7b2699bfd"></a><!-- doxytag: member="tbb::scalable_allocator::allocate" ref="726b1586d05d44665a36e1c7b2699bfd" args="(size_type n, const void *=0)" -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a> (size_type n, const void *=0)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="56686c4dfe4a32a1d9bd8e7e729130e6"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::try_acquire" ref="56686c4dfe4a32a1d9bd8e7e729130e6" args="(null_rw_mutex &, bool=true)" -->
+bool </td><td class="memItemRight" valign="bottom"><b>try_acquire</b> (<a class="el" href="a00279.html">null_rw_mutex</a> &, bool=true)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f806a238c18cbcfb531e1e0a0d2ec59d"></a><!-- doxytag: member="tbb::scalable_allocator::deallocate" ref="f806a238c18cbcfb531e1e0a0d2ec59d" args="(pointer p, size_type)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a> (pointer p, size_type)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Free previously allocated block of memory. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="880e766f1d913988c21973dbdd874fd5"></a><!-- doxytag: member="tbb::scalable_allocator::max_size" ref="880e766f1d913988c21973dbdd874fd5" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html#880e766f1d913988c21973dbdd874fd5">max_size</a> () const   throw ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ae824c87fcc35467057fd3304c5e97ba"></a><!-- doxytag: member="tbb::scalable_allocator::construct" ref="ae824c87fcc35467057fd3304c5e97ba" args="(pointer p, const value_type &value)" -->
-void </td><td class="memItemRight" valign="bottom"><b>construct</b> (pointer p, const value_type &value)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="743f878b04a492bf7ae0e82a64dc20c8"></a><!-- doxytag: member="tbb::scalable_allocator::destroy" ref="743f878b04a492bf7ae0e82a64dc20c8" args="(pointer p)" -->
-void </td><td class="memItemRight" valign="bottom"><b>destroy</b> (pointer p)</td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6146c803a4ad2f14263fdc019a72b5a9"></a><!-- doxytag: member="tbb::null_rw_mutex::scoped_lock::release" ref="6146c803a4ad2f14263fdc019a72b5a9" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><b>release</b> ()</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::scalable_allocator< T ></h3>
-
-Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. 
-<p>
-The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard. 
+Represents acquisition of a mutex. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00564.html">scalable_allocator.h</a></ul>
+<li><a class="el" href="a00490.html">null_rw_mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00281.html b/doc/html/a00281.html
index 408f1a1..b818881 100644
--- a/doc/html/a00281.html
+++ b/doc/html/a00281.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::scalable_allocator< void > Class Template Reference</title>
+<title>tbb::parallel_do_feeder< Item > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,39 +21,39 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00281.html">scalable_allocator< void ></a></div>
-<h1>tbb::scalable_allocator< void > Class Template Reference<br>
-<small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::scalable_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00281.html">parallel_do_feeder</a></div>
+<h1>tbb::parallel_do_feeder< Item > Class Template Reference</h1><!-- doxytag: class="tbb::parallel_do_feeder" -->Class the user supplied algorithm body uses to add new tasks.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00564.html">scalable_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00491.html">parallel_do.h</a>></code>
 <p>
-<a href="a00109.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00080.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2046816029c2c7856f7684aed2af9cff"></a><!-- doxytag: member="tbb::scalable_allocator< void >::pointer" ref="2046816029c2c7856f7684aed2af9cff" args="" -->
-typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="40baaf0f6856f4491dd0adf896c93516"></a><!-- doxytag: member="tbb::parallel_do_feeder::add" ref="40baaf0f6856f4491dd0adf896c93516" args="(const Item &item)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html#40baaf0f6856f4491dd0adf896c93516">add</a> (const Item &item)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="591c568d23f8aadf6ea8d1dc939c4e75"></a><!-- doxytag: member="tbb::scalable_allocator< void >::const_pointer" ref="591c568d23f8aadf6ea8d1dc939c4e75" args="" -->
-typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="64dbab666af0740c30b77edac9f157ce"></a><!-- doxytag: member="tbb::scalable_allocator< void >::value_type" ref="64dbab666af0740c30b77edac9f157ce" args="" -->
-typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a work item to a running parallel_do. <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b381179b22f5f5e8511470c73d64b37f"></a><!-- doxytag: member="tbb::parallel_do_feeder::internal::parallel_do_feeder_impl" ref="b381179b22f5f5e8511470c73d64b37f" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::parallel_do_feeder_impl</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<><br>
- class tbb::scalable_allocator< void ></h3>
+<h3>template<typename Item><br>
+ class tbb::parallel_do_feeder< Item ></h3>
+
+Class the user supplied algorithm body uses to add new tasks. 
+<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+  <table border="0" cellspacing="2" cellpadding="0">
+    <tr><td valign="top"></td><td valign="top"><em>Item</em> </td><td>Work item type </td></tr>
+  </table>
+</dl>
 
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00564.html">scalable_allocator.h</a></ul>
+<li><a class="el" href="a00491.html">parallel_do.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00282.html b/doc/html/a00282.html
index 6357af6..f6b39db 100644
--- a/doc/html/a00282.html
+++ b/doc/html/a00282.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::sender< T > Class Template Reference</title>
+<title>tbb::parallel_while< Body > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,67 +21,114 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00282.html">sender</a></div>
-<h1>tbb::sender< T > Class Template Reference</h1><!-- doxytag: class="tbb::sender" -->Pure virtual template class that defines a sender of messages of type T.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00282.html">parallel_while</a></div>
+<h1>tbb::parallel_while< Body > Class Template Reference<br>
+<small>
+[<a class="el" href="a00395.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::parallel_while" -->Parallel iteration over a stream, with optional addition of more work.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00527.html">parallel_while.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::sender< T >:
-<p><center><img src="a00282.png" usemap="#tbb::sender< T >_map" border="0" alt=""></center>
-<map name="tbb::sender< T >_map">
-<area href="a00224.html" alt="tbb::broadcast_node< T >" shape="rect" coords="0,56,242,80">
-<area href="a00225.html" alt="tbb::buffer_node< T >" shape="rect" coords="252,56,494,80">
-<area href="a00255.html" alt="tbb::limiter_node< T >" shape="rect" coords="504,56,746,80">
-<area href="a00268.html" alt="tbb::priority_queue_node< T, Compare >" shape="rect" coords="126,112,368,136">
-<area href="a00269.html" alt="tbb::queue_node< T >" shape="rect" coords="378,112,620,136">
-<area href="a00283.html" alt="tbb::sequencer_node< T >" shape="rect" coords="378,168,620,192">
-</map>
-<a href="a00042.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00084.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d3aa21714dfc464e65a471816e38ea89"></a><!-- doxytag: member="tbb::sender::output_type" ref="d3aa21714dfc464e65a471816e38ea89" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#d3aa21714dfc464e65a471816e38ea89">output_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa297e53d3af2a101e712bc200233e9c"></a><!-- doxytag: member="tbb::parallel_while::value_type" ref="fa297e53d3af2a101e712bc200233e9c" args="" -->
+typedef Body::argument_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">value_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c0746cda7dfd266f01acaf6cd5d4b77d"></a><!-- doxytag: member="tbb::sender::successor_type" ref="c0746cda7dfd266f01acaf6cd5d4b77d" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#c0746cda7dfd266f01acaf6cd5d4b77d">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Type of items. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="be48ac70174cf8e08e2b0279cd6343d3"></a><!-- doxytag: member="tbb::sender::register_successor" ref="be48ac70174cf8e08e2b0279cd6343d3" args="(successor_type &r)=0" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">register_successor</a> (<a class="el" href="a00277.html">successor_type</a> &r)=0</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a new successor to this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3f345427e812e8741370308ff88f30bf"></a><!-- doxytag: member="tbb::sender::remove_successor" ref="3f345427e812e8741370308ff88f30bf" args="(successor_type &r)=0" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#3f345427e812e8741370308ff88f30bf">remove_successor</a> (<a class="el" href="a00277.html">successor_type</a> &r)=0</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor from this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bf8c9235810354f3353a899c982645de"></a><!-- doxytag: member="tbb::sender::try_get" ref="bf8c9235810354f3353a899c982645de" args="(T &)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#bf8c9235810354f3353a899c982645de">try_get</a> (T &)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="36e26ba3880c7bcf804a97ba0cbe133f"></a><!-- doxytag: member="tbb::parallel_while::parallel_while" ref="36e26ba3880c7bcf804a97ba0cbe133f" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3506c7275aeeb2fc3ba5d5f10ee0adac"></a><!-- doxytag: member="tbb::sender::try_reserve" ref="3506c7275aeeb2fc3ba5d5f10ee0adac" args="(T &)" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">try_reserve</a> (T &)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty non-running parallel while. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6fcfc973cc56b79c6d0fbb8a31be7e84"></a><!-- doxytag: member="tbb::parallel_while::~parallel_while" ref="6fcfc973cc56b79c6d0fbb8a31be7e84" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserves an item in the sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="28c41df1c0c7ed485b4a691ec8f30098"></a><!-- doxytag: member="tbb::sender::try_release" ref="28c41df1c0c7ed485b4a691ec8f30098" args="()" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">try_release</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor cleans up data members before returning. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2">template<typename Stream> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00282.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a> (Stream &stream, const Body &body)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Releases the reserved item. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="add46946c4c7330422733432e4032fac"></a><!-- doxytag: member="tbb::sender::try_consume" ref="add46946c4c7330422733432e4032fac" args="()" -->
-virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">try_consume</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Apply body.apply to each item in the stream.  <a href="#b32a0a6e5e09ebb7fad3e6652c19afe5"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html#e131c560057a58229992b61eb8dba4c6">add</a> (const <a class="el" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> &item)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Consumes the reserved item. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a work item while running.  <a href="#e131c560057a58229992b61eb8dba4c6"></a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::sender< T ></h3>
+<h3>template<typename Body><br>
+ class tbb::parallel_while< Body ></h3>
+
+Parallel iteration over a stream, with optional addition of more work. 
+<p>
+The Body b has the requirement: <br>
+ "b(v)" <br>
+ "b.argument_type" <br>
+ where v is an argument_type 
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="e131c560057a58229992b61eb8dba4c6"></a><!-- doxytag: member="tbb::parallel_while::add" ref="e131c560057a58229992b61eb8dba4c6" args="(const value_type &item)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Body> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="a00282.html">tbb::parallel_while</a>< Body >::add           </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">value_type</a> & </td>
+          <td class="paramname"> <em>item</em>          </td>
+          <td> ) </td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
 
-Pure virtual template class that defines a sender of messages of type T. 
 <p>
+Add a work item while running. 
+<p>
+Should be executed only by body.apply or a thread spawned therefrom. 
+</div>
+</div><p>
+<a class="anchor" name="b32a0a6e5e09ebb7fad3e6652c19afe5"></a><!-- doxytag: member="tbb::parallel_while::run" ref="b32a0a6e5e09ebb7fad3e6652c19afe5" args="(Stream &stream, const Body &body)" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Body> </div>
+<div class="memtemplate">
+template<typename Stream> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">void <a class="el" href="a00282.html">tbb::parallel_while</a>< Body >::run           </td>
+          <td>(</td>
+          <td class="paramtype">Stream & </td>
+          <td class="paramname"> <em>stream</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const Body & </td>
+          <td class="paramname"> <em>body</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Apply body.apply to each item in the stream. 
+<p>
+A Stream s has the requirements <br>
+ "S::value_type" <br>
+ "s.pop_if_present(value) is convertible to bool 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00527.html">parallel_while.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00282.png b/doc/html/a00282.png
deleted file mode 100644
index d11da04..0000000
Binary files a/doc/html/a00282.png and /dev/null differ
diff --git a/doc/html/a00283.html b/doc/html/a00283.html
index 24d25ac..454d174 100644
--- a/doc/html/a00283.html
+++ b/doc/html/a00283.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::sequencer_node< T > Class Template Reference</title>
+<title>tbb::internal::partition_type_base Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,82 +21,36 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00283.html">sequencer_node</a></div>
-<h1>tbb::sequencer_node< T > Class Template Reference</h1><!-- doxytag: class="tbb::sequencer_node" --><!-- doxytag: inherits="tbb::queue_node" -->Forwards messages in sequence order.  
+<a class="el" href="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00283.html">partition_type_base</a></div>
+<h1>tbb::internal::partition_type_base Class Reference</h1><!-- doxytag: class="tbb::internal::partition_type_base" -->Provides backward-compatible methods for partition objects without affinity.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00531.html">partitioner.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::sequencer_node< T >:
-<p><center><img src="a00283.png" usemap="#tbb::sequencer_node< T >_map" border="0" alt=""></center>
-<map name="tbb::sequencer_node< T >_map">
-<area href="a00269.html" alt="tbb::queue_node< T >" shape="rect" coords="170,112,330,136">
-<area href="a00225.html" alt="tbb::buffer_node< T >" shape="rect" coords="170,56,330,80">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,160,24">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="170,0,330,24">
-<area href="a00282.html" alt="tbb::sender< T >" shape="rect" coords="340,0,500,24">
-</map>
-<a href="a00059.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00086.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a73e4a3ae6c430281f08226d448ebfc8"></a><!-- doxytag: member="tbb::sequencer_node::input_type" ref="a73e4a3ae6c430281f08226d448ebfc8" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">input_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0c613bb01103dfcfbc3f9cbe943f95b0"></a><!-- doxytag: member="tbb::sequencer_node::output_type" ref="0c613bb01103dfcfbc3f9cbe943f95b0" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html#0c613bb01103dfcfbc3f9cbe943f95b0">output_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6581686ef0cf8e13c0270687628af5eb"></a><!-- doxytag: member="tbb::sequencer_node::predecessor_type" ref="6581686ef0cf8e13c0270687628af5eb" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< <a class="el" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html#6581686ef0cf8e13c0270687628af5eb">predecessor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3591313e30d0f485a09106686067411f"></a><!-- doxytag: member="tbb::sequencer_node::successor_type" ref="3591313e30d0f485a09106686067411f" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00283.html#0c613bb01103dfcfbc3f9cbe943f95b0">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html#3591313e30d0f485a09106686067411f">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="c3138c1c96b76ae9f13b0abbf7029590"></a><!-- doxytag: member="tbb::sequencer_node::sequencer_node" ref="c3138c1c96b76ae9f13b0abbf7029590" args="(graph &g, const Sequencer &s)" -->
-template<typename Sequencer> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00283.html#c3138c1c96b76ae9f13b0abbf7029590">sequencer_node</a> (<a class="el" href="a00250.html">graph</a> &g, const Sequencer &s)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5b43011addf53239ccf8cdeaeab76e7"></a><!-- doxytag: member="tbb::internal::partition_type_base::set_affinity" ref="d5b43011addf53239ccf8cdeaeab76e7" args="(task &)" -->
+void </td><td class="memItemRight" valign="bottom"><b>set_affinity</b> (<a class="el" href="a00311.html">task</a> &)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c87d80feebaf2bae4af22b5f2459b37e"></a><!-- doxytag: member="tbb::sequencer_node::~sequencer_node" ref="c87d80feebaf2bae4af22b5f2459b37e" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html#c87d80feebaf2bae4af22b5f2459b37e">~sequencer_node</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2bffce16dee5796448bf12c8ccecd94c"></a><!-- doxytag: member="tbb::internal::partition_type_base::note_affinity" ref="2bffce16dee5796448bf12c8ccecd94c" args="(task::affinity_id)" -->
+void </td><td class="memItemRight" valign="bottom"><b>note_affinity</b> (<a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a>)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cfc1242acfbd4ed1f4f041fdcacccb20"></a><!-- doxytag: member="tbb::sequencer_node::size_type" ref="cfc1242acfbd4ed1f4f041fdcacccb20" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <br>
->::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="87962b93599ff172cd4b64f2995ebc71"></a><!-- doxytag: member="tbb::internal::partition_type_base::continue_after_execute_range" ref="87962b93599ff172cd4b64f2995ebc71" args="()" -->
+<a class="el" href="a00311.html">task</a> * </td><td class="memItemRight" valign="bottom"><b>continue_after_execute_range</b> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8b9307a6214b57cabe426833b9f44fb0"></a><!-- doxytag: member="tbb::sequencer_node::sequencer_operation" ref="8b9307a6214b57cabe426833b9f44fb0" args="" -->
-typedef <a class="el" href="a00225.html">buffer_node</a>< T <br>
->::buffer_operation </td><td class="memItemRight" valign="bottom"><b>sequencer_operation</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="baca041e2b854196a411f1d0ca7ae905"></a><!-- doxytag: member="tbb::internal::partition_type_base::decide_whether_to_delay" ref="baca041e2b854196a411f1d0ca7ae905" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><b>decide_whether_to_delay</b> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b4dffb9323be2efc5112aaa853bac219e3998df4805f713bc2839c055678548"></a><!-- doxytag: member="tbb::sequencer_node::WAIT" ref="0b4dffb9323be2efc5112aaa853bac219e3998df4805f713bc2839c055678548" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b4dffb9323be2efc5112aaa853bac2128dcec463d3112149f813ecd4dfdd956"></a><!-- doxytag: member="tbb::sequencer_node::SUCCEEDED" ref="0b4dffb9323be2efc5112aaa853bac2128dcec463d3112149f813ecd4dfdd956" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0b4dffb9323be2efc5112aaa853bac21a1766b4675effb3b6b03b315b51057ed"></a><!-- doxytag: member="tbb::sequencer_node::FAILED" ref="0b4dffb9323be2efc5112aaa853bac21a1766b4675effb3b6b03b315b51057ed" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0, 
-<b>SUCCEEDED</b>, 
-<b>FAILED</b>
- }</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17686f1a5119802cad38369d0580d05f"></a><!-- doxytag: member="tbb::internal::partition_type_base::spawn_or_delay" ref="17686f1a5119802cad38369d0580d05f" args="(bool, task &b)" -->
+void </td><td class="memItemRight" valign="bottom"><b>spawn_or_delay</b> (bool, <a class="el" href="a00311.html">task</a> &b)</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::sequencer_node< T ></h3>
-
-Forwards messages in sequence order. 
+Provides backward-compatible methods for partition objects without affinity. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00531.html">partitioner.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00283.png b/doc/html/a00283.png
deleted file mode 100644
index 0d1eae7..0000000
Binary files a/doc/html/a00283.png and /dev/null differ
diff --git a/doc/html/a00284.html b/doc/html/a00284.html
index a3e2a83..5f30066 100644
--- a/doc/html/a00284.html
+++ b/doc/html/a00284.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::simple_partitioner Class Reference</title>
+<title>tbb::pipeline Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,38 +21,85 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00284.html">simple_partitioner</a></div>
-<h1>tbb::simple_partitioner Class Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00284.html">pipeline</a></div>
+<h1>tbb::pipeline Class Reference<br>
 <small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::simple_partitioner" -->A simple partitioner.  
+[<a class="el" href="a00395.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::pipeline" -->A processing pipeline that applies filters to items.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00541.html">partitioner.h</a>></code>
+<code>#include <<a class="el" href="a00543.html">pipeline.h</a>></code>
 <p>
-<a href="a00088.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00093.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="596dc3beba27099c4c8581cb419e1a59"></a><!-- doxytag: member="tbb::pipeline::pipeline" ref="596dc3beba27099c4c8581cb419e1a59" args="()" -->
+__TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty pipeline. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="38fb5c9c8395dd6f89a4ae2011a83e0d"></a><!-- doxytag: member="tbb::pipeline::add_filter" ref="38fb5c9c8395dd6f89a4ae2011a83e0d" args="(filter &filter_)" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a> (<a class="el" href="a00256.html">filter</a> &filter_)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Add filter to end of pipeline. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f627616049b3fe36801f37ee40403ef8"></a><!-- doxytag: member="tbb::pipeline::run" ref="f627616049b3fe36801f37ee40403ef8" args="(size_t max_number_of_live_tokens)" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html#f627616049b3fe36801f37ee40403ef8">run</a> (size_t max_number_of_live_tokens)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Run the pipeline to completion. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93d7fec8cd607b803dd2d79fb46bd260"></a><!-- doxytag: member="tbb::pipeline::run" ref="93d7fec8cd607b803dd2d79fb46bd260" args="(size_t max_number_of_live_tokens, tbb::task_group_context &context)" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html#93d7fec8cd607b803dd2d79fb46bd260">run</a> (size_t max_number_of_live_tokens, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Run the pipeline to completion with user-supplied context. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c84aef5b834b555ee220b176e25931e"></a><!-- doxytag: member="tbb::pipeline::clear" ref="2c84aef5b834b555ee220b176e25931e" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html#2c84aef5b834b555ee220b176e25931e">clear</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove all filters from the pipeline. <br></td></tr>
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a47f7e0208a2bf68f35b51b27d2ddf2a"></a><!-- doxytag: member="tbb::simple_partitioner::internal::start_for" ref="a47f7e0208a2bf68f35b51b27d2ddf2a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_for</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8228ce0751009045e8158d2e642715a6"></a><!-- doxytag: member="tbb::pipeline::internal::stage_task" ref="8228ce0751009045e8158d2e642715a6" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::stage_task</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d67150ca324698ba852553e223d3eb"></a><!-- doxytag: member="tbb::pipeline::internal::pipeline_root_task" ref="05d67150ca324698ba852553e223d3eb" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_root_task</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8f710e431b62c2a48914bd99d0fe034"></a><!-- doxytag: member="tbb::simple_partitioner::internal::start_reduce" ref="e8f710e431b62c2a48914bd99d0fe034" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_reduce</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c991e50853b0cac7da039550344d3ef"></a><!-- doxytag: member="tbb::pipeline::filter" ref="4c991e50853b0cac7da039550344d3ef" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>filter</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::simple_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43b69a482df8e053cb199af69eb5139"></a><!-- doxytag: member="tbb::pipeline::thread_bound_filter" ref="e43b69a482df8e053cb199af69eb5139" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b></td></tr>
 
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>partition_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9d033d41ff53a0ae6ef824aceee7ecbc"></a><!-- doxytag: member="tbb::pipeline::internal::pipeline_cleaner" ref="9d033d41ff53a0ae6ef824aceee7ecbc" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::pipeline_cleaner</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d1ed99300bc4520a481583c448d6fafd"></a><!-- doxytag: member="tbb::pipeline::tbb::interface6::internal::pipeline_proxy" ref="d1ed99300bc4520a481583c448d6fafd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>tbb::interface6::internal::pipeline_proxy</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-A simple partitioner. 
+A processing pipeline that applies filters to items. 
 <p>
-Divides the range until the range is not divisible. 
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="49513c6c24f9d5bbbb27edca5efe01c9"></a><!-- doxytag: member="tbb::pipeline::~pipeline" ref="49513c6c24f9d5bbbb27edca5efe01c9" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">virtual __TBB_EXPORTED_METHOD tbb::pipeline::~pipeline           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
 <p>
+Though the current implementation declares the destructor virtual, do not rely on this detail. The virtualness is deprecated and may disappear in future versions of TBB. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00541.html">partitioner.h</a></ul>
+<li><a class="el" href="a00543.html">pipeline.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00285.html b/doc/html/a00285.html
index c55dacb..4c84e65 100644
--- a/doc/html/a00285.html
+++ b/doc/html/a00285.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::source_node< Output > Class Template Reference</title>
+<title>tbb::pre_scan_tag Struct Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,105 +21,27 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00285.html">source_node</a></div>
-<h1>tbb::source_node< Output > Class Template Reference</h1><!-- doxytag: class="tbb::source_node" --><!-- doxytag: inherits="tbb::graph_node,tbb::sender< Output >" -->An executable node that acts as a source, i.e. it has no predecessors.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00285.html">pre_scan_tag</a></div>
+<h1>tbb::pre_scan_tag Struct Reference<br>
+<small>
+[<a class="el" href="a00395.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::pre_scan_tag" -->Used to indicate that the initial scan is being performed.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00518.html">parallel_scan.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::source_node< Output >:
-<p><center><img src="a00285.png" usemap="#tbb::source_node< Output >_map" border="0" alt=""></center>
-<map name="tbb::source_node< Output >_map">
-<area href="a00251.html" alt="tbb::graph_node" shape="rect" coords="0,0,170,24">
-<area href="a00282.html" alt="tbb::sender< Output >" shape="rect" coords="180,0,350,24">
-</map>
-<a href="a00048.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00082.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c5a2c6ab64bcd798724976d7d75ba92f"></a><!-- doxytag: member="tbb::source_node::output_type" ref="c5a2c6ab64bcd798724976d7d75ba92f" args="" -->
-typedef Output </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The type of the output message, which is complete. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="217d72bbc6e7a4b35ef014dd9a15efca"></a><!-- doxytag: member="tbb::source_node::successor_type" ref="217d72bbc6e7a4b35ef014dd9a15efca" args="" -->
-typedef <a class="el" href="a00277.html">receiver</a>< Output > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#217d72bbc6e7a4b35ef014dd9a15efca">successor_type</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The type of successors of this node. <br></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0513272133a06db6742873671af98f21"></a><!-- doxytag: member="tbb::source_node::source_node" ref="0513272133a06db6742873671af98f21" args="(graph &g, Body body, bool is_active=true)" -->
-template<typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00285.html#0513272133a06db6742873671af98f21">source_node</a> (<a class="el" href="a00250.html">graph</a> &g, Body body, bool is_active=true)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor for a node with a successor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90c94a8a52cc3d19cf393ce289e80733"></a><!-- doxytag: member="tbb::source_node::~source_node" ref="90c94a8a52cc3d19cf393ce289e80733" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#90c94a8a52cc3d19cf393ce289e80733">~source_node</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The destructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce601874ec5cbb0996f6dcb8e43badb8"></a><!-- doxytag: member="tbb::source_node::register_successor" ref="ce601874ec5cbb0996f6dcb8e43badb8" args="(receiver< output_type > &r)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#ce601874ec5cbb0996f6dcb8e43badb8">register_successor</a> (<a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a new successor to this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="de069bfc6fae7ed4e82b2a1fbb58b721"></a><!-- doxytag: member="tbb::source_node::remove_successor" ref="de069bfc6fae7ed4e82b2a1fbb58b721" args="(receiver< output_type > &r)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#de069bfc6fae7ed4e82b2a1fbb58b721">remove_successor</a> (<a class="el" href="a00277.html">receiver</a>< <a class="el" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> > &r)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor from this node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0434d2933ad082d3c43a4ec774150511"></a><!-- doxytag: member="tbb::source_node::try_get" ref="0434d2933ad082d3c43a4ec774150511" args="(output_type &v)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#0434d2933ad082d3c43a4ec774150511">try_get</a> (<a class="el" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> &v)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the node. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ecac0bb52cff61912dcd186647ccd1bf"></a><!-- doxytag: member="tbb::source_node::try_reserve" ref="ecac0bb52cff61912dcd186647ccd1bf" args="(output_type &v)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">try_reserve</a> (<a class="el" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> &v)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserves an item. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">try_release</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release a reserved item.  <a href="#3dd7e998aa3e7258b3b5731307df23a0"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="809f51859ca4dd04204591d76c8572eb"></a><!-- doxytag: member="tbb::source_node::try_consume" ref="809f51859ca4dd04204591d76c8572eb" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#809f51859ca4dd04204591d76c8572eb">try_consume</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Consumes a reserved item. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d71ed386c53032463f3435f79a15b6ff"></a><!-- doxytag: member="tbb::source_node::activate" ref="d71ed386c53032463f3435f79a15b6ff" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html#d71ed386c53032463f3435f79a15b6ff">activate</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Activates a node that was created in the inactive state. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15fb463802e1e30f5f836535d490874c"></a><!-- doxytag: member="tbb::source_node::internal::source_task< source_node< output_type > >" ref="15fb463802e1e30f5f836535d490874c" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::source_task< source_node< output_type > ></b></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d45d2cf548e51140ad6faafbea8ca6b5"></a><!-- doxytag: member="tbb::pre_scan_tag::is_final_scan" ref="d45d2cf548e51140ad6faafbea8ca6b5" args="()" -->
+static bool </td><td class="memItemRight" valign="bottom"><b>is_final_scan</b> ()</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Output><br>
- class tbb::source_node< Output ></h3>
-
-An executable node that acts as a source, i.e. it has no predecessors. 
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="3dd7e998aa3e7258b3b5731307df23a0"></a><!-- doxytag: member="tbb::source_node::try_release" ref="3dd7e998aa3e7258b3b5731307df23a0" args="()" -->
-<div class="memitem">
-<div class="memproto">
-<div class="memtemplate">
-template<typename Output> </div>
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00285.html">tbb::source_node</a>< Output >::try_release           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Release a reserved item. 
-<p>
-true = item has been released and so remains in sender, dest must request or reserve future items 
+Used to indicate that the initial scan is being performed. 
 <p>
-Reimplemented from <a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">tbb::sender< Output ></a>.
-</div>
-</div><p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00518.html">parallel_scan.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00285.png b/doc/html/a00285.png
deleted file mode 100644
index faf755d..0000000
Binary files a/doc/html/a00285.png and /dev/null differ
diff --git a/doc/html/a00286.html b/doc/html/a00286.html
index 498cbb2..4a39f04 100644
--- a/doc/html/a00286.html
+++ b/doc/html/a00286.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::spin_mutex Class Reference</title>
+<title>tbb::flow::interface6::priority_queue_node< T, Compare, A > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,105 +21,107 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00286.html">spin_mutex</a></div>
-<h1>tbb::spin_mutex Class Reference<br>
-<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::spin_mutex" -->A lock that occupies a single byte.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00286.html">priority_queue_node</a></div>
+<h1>tbb::flow::interface6::priority_queue_node< T, Compare, A > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::priority_queue_node" --><!-- doxytag: inherits="tbb::flow::interface6::buffer_node" -->Forwards messages in priority order.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00565.html">spin_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<a href="a00111.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::priority_queue_node< T, Compare, A >:
+<p><center><img src="a00286.png" usemap="#tbb::flow::interface6::priority_queue_node< T, Compare, A >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::priority_queue_node< T, Compare, A >_map">
+<area href="a00237.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="362,56,714,80">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,352,24">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="362,0,714,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="724,0,1076,24">
+</map>
+<a href="a00062.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b2829b518979874ad3d2a939e14ae7bd"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::input_type" ref="b2829b518979874ad3d2a939e14ae7bd" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2cb099b590246b6bc93cc15e78c6ee5c"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::output_type" ref="2cb099b590246b6bc93cc15e78c6ee5c" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#2cb099b590246b6bc93cc15e78c6ee5c">output_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fdea783bf9d5a4c98e794ac7e0f84ccf"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::predecessor_type" ref="fdea783bf9d5a4c98e794ac7e0f84ccf" args="" -->
+typedef <a class="el" href="a00301.html">sender</a>< <a class="el" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#fdea783bf9d5a4c98e794ac7e0f84ccf">predecessor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09ab5064ca8192e68c03da47603e68eb"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::successor_type" ref="09ab5064ca8192e68c03da47603e68eb" args="" -->
+typedef <a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00286.html#2cb099b590246b6bc93cc15e78c6ee5c">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#09ab5064ca8192e68c03da47603e68eb">successor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="497ec2612615249bf5a294eb1b7b93b3"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::priority_queue_node" ref="497ec2612615249bf5a294eb1b7b93b3" args="(graph &g)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a> (<a class="el" href="a00262.html">graph</a> &g)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="17a4f66e23d54100b64805405e905d62"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::priority_queue_node" ref="17a4f66e23d54100b64805405e905d62" args="(const priority_queue_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#17a4f66e23d54100b64805405e905d62">priority_queue_node</a> (const <a class="el" href="a00286.html">priority_queue_node</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d1c6c5e02b9cc144b2b3ccc9f18bf047"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::size_type" ref="d1c6c5e02b9cc144b2b3ccc9f18bf047" args="" -->
+typedef <a class="el" href="a00237.html">buffer_node</a>< T, A <br>
+>::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb98634e74bee4d82676f1aca0f6864c"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::item_type" ref="eb98634e74bee4d82676f1aca0f6864c" args="" -->
+typedef <a class="el" href="a00237.html">buffer_node</a>< T, A <br>
+>::item_type </td><td class="memItemRight" valign="bottom"><b>item_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f80f04dc8886a8a6b177123f094bdb43"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::prio_operation" ref="f80f04dc8886a8a6b177123f094bdb43" args="" -->
+typedef <a class="el" href="a00237.html">buffer_node</a>< T, A <br>
+>::buffer_operation </td><td class="memItemRight" valign="bottom"><b>prio_operation</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired lock.  <a href="#3d8fb44644fd8d41ada1fbeba7409be3"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b3fa21632815f8fab2fd6c67ec0d48c"></a><!-- doxytag: member="tbb::spin_mutex::internal_construct" ref="4b3fa21632815f8fab2fd6c67ec0d48c" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="274cc306c7a22cf9e27c4c2c3a66ce8e579c547cd1c044d3e6190401d87ee101"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::WAIT" ref="274cc306c7a22cf9e27c4c2c3a66ce8e579c547cd1c044d3e6190401d87ee101" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f748989e19b6045e3a2d2ee73626a28"></a><!-- doxytag: member="tbb::spin_mutex::lock" ref="4f748989e19b6045e3a2d2ee73626a28" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#4f748989e19b6045e3a2d2ee73626a28">lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="274cc306c7a22cf9e27c4c2c3a66ce8e67ced6b76fb4bcd40404499619fbd0b9"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::SUCCEEDED" ref="274cc306c7a22cf9e27c4c2c3a66ce8e67ced6b76fb4bcd40404499619fbd0b9" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="274cc306c7a22cf9e27c4c2c3a66ce8eb74545a431cbeaf85ab0bfcec52261ff"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::FAILED" ref="274cc306c7a22cf9e27c4c2c3a66ce8eb74545a431cbeaf85ab0bfcec52261ff" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking).  <a href="#8f9a58fb56a2b4c5efe1a7f7c1ae2074"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e843ee6265f57f27d228ba91e7308ef"></a><!-- doxytag: member="tbb::spin_mutex::unlock" ref="0e843ee6265f57f27d228ba91e7308ef" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0, 
+<b>SUCCEEDED</b>, 
+<b>FAILED</b>
+ }</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a7c93ca9e7ab656037a43984f24c051"></a><!-- doxytag: member="tbb::spin_mutex::is_rw_mutex" ref="5a7c93ca9e7ab656037a43984f24c051" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="abff2e0891477135c24f44747e991c6c"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::handle_operations" ref="abff2e0891477135c24f44747e991c6c" args="(prio_operation *op_list)" -->
+void </td><td class="memItemRight" valign="bottom"><b>handle_operations</b> (prio_operation *op_list)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a967c455d0d80c9bbe030905201391b6"></a><!-- doxytag: member="tbb::spin_mutex::is_recursive_mutex" ref="a967c455d0d80c9bbe030905201391b6" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed2d8dc0a9c1c2571e4a69df2f2209e5"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_forward" ref="ed2d8dc0a9c1c2571e4a69df2f2209e5" args="(prio_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">internal_forward</a> (prio_operation *op)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ec12e4036073fb684b6d2d33493ed0aa"></a><!-- doxytag: member="tbb::spin_mutex::is_fair_mutex" ref="ec12e4036073fb684b6d2d33493ed0aa" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to forward valid items to successors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05d8747ea54ca84a7196f8cacdc81ca5"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_push" ref="05d8747ea54ca84a7196f8cacdc81ca5" args="(prio_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_push</b> (prio_operation *op)</td></tr>
 
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6c7cd11240fbe0737344f36b587492f9"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_pop" ref="6c7cd11240fbe0737344f36b587492f9" args="(prio_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_pop</b> (prio_operation *op)</td></tr>
 
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html">scoped_lock</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9238c5c44ccc46ed1be218651f36feea"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_reserve" ref="9238c5c44ccc46ed1be218651f36feea" args="(prio_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_reserve</b> (prio_operation *op)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="caefc7ba7a16a7120b6b37de42e705b4"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_consume" ref="caefc7ba7a16a7120b6b37de42e705b4" args="(prio_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (prio_operation *op)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="400304719e359e66e9560157577fc2fe"></a><!-- doxytag: member="tbb::flow::interface6::priority_queue_node::internal_release" ref="400304719e359e66e9560157577fc2fe" args="(prio_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_release</b> (prio_operation *op)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex.  <a href="a00287.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-A lock that occupies a single byte. 
-<p>
-A <a class="el" href="a00286.html">spin_mutex</a> is a spin mutex that fits in a single byte. It should be used only for locking short critical sections (typically less than 20 instructions) when fairness is not an issue. If zero-initialized, the mutex is considered unheld. 
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="3d8fb44644fd8d41ada1fbeba7409be3"></a><!-- doxytag: member="tbb::spin_mutex::spin_mutex" ref="3d8fb44644fd8d41ada1fbeba7409be3" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">tbb::spin_mutex::spin_mutex           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T, typename Compare = std::less<T>, typename A = cache_aligned_allocator<T>><br>
+ class tbb::flow::interface6::priority_queue_node< T, Compare, A ></h3>
 
+Forwards messages in priority order. 
 <p>
-Construct unacquired lock. 
-<p>
-Equivalent to zero-initialization of *this. 
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="8f9a58fb56a2b4c5efe1a7f7c1ae2074"></a><!-- doxytag: member="tbb::spin_mutex::try_lock" ref="8f9a58fb56a2b4c5efe1a7f7c1ae2074" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">bool tbb::spin_mutex::try_lock           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Try acquiring lock (non-blocking). 
-<p>
-Return true if lock acquired; false otherwise. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00565.html">spin_mutex.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00286.png b/doc/html/a00286.png
new file mode 100644
index 0000000..1e0df07
Binary files /dev/null and b/doc/html/a00286.png differ
diff --git a/doc/html/a00287.html b/doc/html/a00287.html
index 9aa03c7..0325bb7 100644
--- a/doc/html/a00287.html
+++ b/doc/html/a00287.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::spin_mutex::scoped_lock Class Reference</title>
+<title>tbb::flow::interface6::queue_node< T, A > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,71 +21,95 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00286.html">spin_mutex</a>::<a class="el" href="a00287.html">scoped_lock</a></div>
-<h1>tbb::spin_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::spin_mutex::scoped_lock" -->Represents acquisition of a mutex.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00287.html">queue_node</a></div>
+<h1>tbb::flow::interface6::queue_node< T, A > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::queue_node" --><!-- doxytag: inherits="tbb::flow::interface6::buffer_node" -->Forwards messages in FIFO order.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00565.html">spin_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<a href="a00112.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::queue_node< T, A >:
+<p><center><img src="a00287.png" usemap="#tbb::flow::interface6::queue_node< T, A >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::queue_node< T, A >_map">
+<area href="a00237.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="280,56,550,80">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,270,24">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="280,0,550,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="560,0,830,24">
+<area href="a00302.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="280,168,550,192">
+</map>
+<a href="a00060.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e71030845210b6c4c7380eb9e11a2ac"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::input_type" ref="1e71030845210b6c4c7380eb9e11a2ac" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="25b5a53ab1f9a342644fa3759bc0b1ad"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::output_type" ref="25b5a53ab1f9a342644fa3759bc0b1ad" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#25b5a53ab1f9a342644fa3759bc0b1ad">output_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5e2fdd33c45d44549dee9c1638e19898"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::predecessor_type" ref="5e2fdd33c45d44549dee9c1638e19898" args="" -->
+typedef <a class="el" href="a00301.html">sender</a>< <a class="el" href="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#5e2fdd33c45d44549dee9c1638e19898">predecessor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f35076a19f256f9e7a61bed77ca1ccc5"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::successor_type" ref="f35076a19f256f9e7a61bed77ca1ccc5" args="" -->
+typedef <a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00287.html#25b5a53ab1f9a342644fa3759bc0b1ad">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#f35076a19f256f9e7a61bed77ca1ccc5">successor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="29ae680ae7f5e685c2e15535b9c855b3"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::scoped_lock" ref="29ae680ae7f5e685c2e15535b9c855b3" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c716593a92448b0f429d1f3a38e67996"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::queue_node" ref="c716593a92448b0f429d1f3a38e67996" args="(graph &g)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#c716593a92448b0f429d1f3a38e67996">queue_node</a> (<a class="el" href="a00262.html">graph</a> &g)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0226762d9ebba28311b7b1518d948ab1"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::queue_node" ref="0226762d9ebba28311b7b1518d948ab1" args="(const queue_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#0226762d9ebba28311b7b1518d948ab1">queue_node</a> (const <a class="el" href="a00287.html">queue_node</a> &src)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a84ab6bb43d056468ac5df3626219513"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::size_type" ref="a84ab6bb43d056468ac5df3626219513" args="" -->
+typedef <a class="el" href="a00237.html">buffer_node</a>< T, A <br>
+>::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct without acquiring a mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5ce6807050a9e8f87bcb4a65dccb12ef"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::scoped_lock" ref="5ce6807050a9e8f87bcb4a65dccb12ef" args="(spin_mutex &m)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a> (<a class="el" href="a00286.html">spin_mutex</a> &m)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="63c3b0a76cd7964dec2f3d54afbb05f3"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::queue_operation" ref="63c3b0a76cd7964dec2f3d54afbb05f3" args="" -->
+typedef <a class="el" href="a00237.html">buffer_node</a>< T, A <br>
+>::buffer_operation </td><td class="memItemRight" valign="bottom"><b>queue_operation</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct and acquire lock on a mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ee3c338732b1f64b0b32a757807a30d"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::acquire" ref="3ee3c338732b1f64b0b32a757807a30d" args="(spin_mutex &m)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a> (<a class="el" href="a00286.html">spin_mutex</a> &m)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b748e310297e1e3f88952a2a9876bab979763449c8716cdd38fda58e607551f1"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::WAIT" ref="b748e310297e1e3f88952a2a9876bab979763449c8716cdd38fda58e607551f1" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a> (<a class="el" href="a00286.html">spin_mutex</a> &m)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b748e310297e1e3f88952a2a9876bab923e845160e46a20fb8550132f04e94aa"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::SUCCEEDED" ref="b748e310297e1e3f88952a2a9876bab923e845160e46a20fb8550132f04e94aa" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking).  <a href="#9297ec188534b45dc0ca48f2f39a0501"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eeb615e68e963e6bf8d9c11402d0ce8e"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::release" ref="eeb615e68e963e6bf8d9c11402d0ce8e" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b748e310297e1e3f88952a2a9876bab9ad699b139814d0746be2266041081474"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::FAILED" ref="b748e310297e1e3f88952a2a9876bab9ad699b139814d0746be2266041081474" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac6fa425d1f06c56d8b70abc51aac844"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::~scoped_lock" ref="ac6fa425d1f06c56d8b70abc51aac844" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0, 
+<b>SUCCEEDED</b>, 
+<b>FAILED</b>
+ }</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy lock. If holding a lock, releases the lock first. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6ee2a2cdaf6a2128849e7d7723d9174f"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::spin_mutex" ref="6ee2a2cdaf6a2128849e7d7723d9174f" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>spin_mutex</b></td></tr>
+<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eadcbbb81f9a9d223afabe0f40e77ecb"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::internal_forward" ref="eadcbbb81f9a9d223afabe0f40e77ecb" args="(queue_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">internal_forward</a> (queue_operation *op)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to forward valid items to successors. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cfd2350a4c9d14486a8a9285acb9ca49"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::internal_pop" ref="cfd2350a4c9d14486a8a9285acb9ca49" args="(queue_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_pop</b> (queue_operation *op)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bf478ff2ae265ec859928191e2f7dbe3"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::internal_reserve" ref="bf478ff2ae265ec859928191e2f7dbe3" args="(queue_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_reserve</b> (queue_operation *op)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d67eee760d9fd829064927e7fe1b54fb"></a><!-- doxytag: member="tbb::flow::interface6::queue_node::internal_consume" ref="d67eee760d9fd829064927e7fe1b54fb" args="(queue_operation *op)" -->
+void </td><td class="memItemRight" valign="bottom"><b>internal_consume</b> (queue_operation *op)</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Represents acquisition of a mutex. 
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="9297ec188534b45dc0ca48f2f39a0501"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::try_acquire" ref="9297ec188534b45dc0ca48f2f39a0501" args="(spin_mutex &m)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">bool tbb::spin_mutex::scoped_lock::try_acquire           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00286.html">spin_mutex</a> & </td>
-          <td class="paramname"> <em>m</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
+ class tbb::flow::interface6::queue_node< T, A ></h3>
 
+Forwards messages in FIFO order. 
 <p>
-Try acquiring lock (non-blocking). 
-<p>
-Return true if lock acquired; false otherwise. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00565.html">spin_mutex.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00287.png b/doc/html/a00287.png
new file mode 100644
index 0000000..09b37ae
Binary files /dev/null and b/doc/html/a00287.png differ
diff --git a/doc/html/a00288.html b/doc/html/a00288.html
index 747b447..ef43229 100644
--- a/doc/html/a00288.html
+++ b/doc/html/a00288.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::spin_rw_mutex_v3 Class Reference</title>
+<title>tbb::queuing_mutex Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,53 +21,34 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00288.html">spin_rw_mutex_v3</a></div>
-<h1>tbb::spin_rw_mutex_v3 Class Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00288.html">queuing_mutex</a></div>
+<h1>tbb::queuing_mutex Class Reference<br>
 <small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::spin_rw_mutex_v3" -->Fast, unfair, spinning reader-writer lock with backoff and writer-preference.  
+[<a class="el" href="a00398.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::queuing_mutex" -->Queuing lock with local-only spinning.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00566.html">spin_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00557.html">queuing_mutex.h</a>></code>
 <p>
-<a href="a00113.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00096.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61332b2756de89f3f5f69310cbb6e70c"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::spin_rw_mutex_v3" ref="61332b2756de89f3f5f69310cbb6e70c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b389ad9c4db7293e4bdb5b8cda69ec04"></a><!-- doxytag: member="tbb::queuing_mutex::queuing_mutex" ref="b389ad9c4db7293e4bdb5b8cda69ec04" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9a815fb2759e55072ed413f1b6970cf3"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::~spin_rw_mutex_v3" ref="9a815fb2759e55072ed413f1b6970cf3" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="96c1fe92760dcd1c5a7ed52c6599a72f"></a><!-- doxytag: member="tbb::queuing_mutex::internal_construct" ref="96c1fe92760dcd1c5a7ed52c6599a72f" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor asserts if the mutex is acquired, i.e. state is zero. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4007d6e1523dbc3c2bb7f889ab789a8a"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::lock" ref="4007d6e1523dbc3c2bb7f889ab789a8a" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire writer lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#088bb256be794cc47d3b83791632fdfc">try_lock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring writer lock (non-blocking).  <a href="#088bb256be794cc47d3b83791632fdfc"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f9f52ead2098eb5fb12da59d5ae53b55"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::unlock" ref="f9f52ead2098eb5fb12da59d5ae53b55" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="13f799708ac4ca437a16be202e263e18"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::lock_read" ref="13f799708ac4ca437a16be202e263e18" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#13f799708ac4ca437a16be202e263e18">lock_read</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire reader lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html#b8667415869013f840d976aa406d385a">try_lock_read</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring reader lock (non-blocking).  <a href="#b8667415869013f840d976aa406d385a"></a><br></td></tr>
 <tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c1e60f22c01604ca93c41b8334cc15e"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_rw_mutex" ref="4c1e60f22c01604ca93c41b8334cc15e" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = true</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="420932f70ff3b85f7280ff11a133938d"></a><!-- doxytag: member="tbb::queuing_mutex::is_rw_mutex" ref="420932f70ff3b85f7280ff11a133938d" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="681a816fe76d6ca7752303f9dcc3c4b2"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_recursive_mutex" ref="681a816fe76d6ca7752303f9dcc3c4b2" args="" -->
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dc0c749f3a4e6ea75418677cb8f9205f"></a><!-- doxytag: member="tbb::queuing_mutex::is_recursive_mutex" ref="dc0c749f3a4e6ea75418677cb8f9205f" args="" -->
 static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4dd66d90df6247da6050e88b2aa3b820"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_fair_mutex" ref="4dd66d90df6247da6050e88b2aa3b820" args="" -->
-static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="55d5339e4ca04b759f90c0c1ef966539"></a><!-- doxytag: member="tbb::queuing_mutex::is_fair_mutex" ref="55d5339e4ca04b759f90c0c1ef966539" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
 
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html">scoped_lock</a></td></tr>
@@ -75,53 +56,10 @@ static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_
 <tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern.  <a href="a00289.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Fast, unfair, spinning reader-writer lock with backoff and writer-preference. 
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="088bb256be794cc47d3b83791632fdfc"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::try_lock" ref="088bb256be794cc47d3b83791632fdfc" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">bool tbb::spin_rw_mutex_v3::try_lock           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Try acquiring writer lock (non-blocking). 
-<p>
-Return true if lock acquired; false otherwise. 
-</div>
-</div><p>
-<a class="anchor" name="b8667415869013f840d976aa406d385a"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::try_lock_read" ref="b8667415869013f840d976aa406d385a" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">bool tbb::spin_rw_mutex_v3::try_lock_read           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Try acquiring reader lock (non-blocking). 
+Queuing lock with local-only spinning. 
 <p>
-Return true if reader lock acquired; false otherwise. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00566.html">spin_rw_mutex.h</a></ul>
+<li><a class="el" href="a00557.html">queuing_mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00289.html b/doc/html/a00289.html
index 335ba2b..ea58887 100644
--- a/doc/html/a00289.html
+++ b/doc/html/a00289.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::spin_rw_mutex_v3::scoped_lock Class Reference</title>
+<title>tbb::queuing_mutex::scoped_lock Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,53 +21,38 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00288.html">spin_rw_mutex_v3</a>::<a class="el" href="a00289.html">scoped_lock</a></div>
-<h1>tbb::spin_rw_mutex_v3::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::spin_rw_mutex_v3::scoped_lock" -->The scoped locking pattern.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00288.html">queuing_mutex</a>::<a class="el" href="a00289.html">scoped_lock</a></div>
+<h1>tbb::queuing_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::queuing_mutex::scoped_lock" -->The scoped locking pattern.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00566.html">spin_rw_mutex.h</a>></code>
+<code>#include <<a class="el" href="a00557.html">queuing_mutex.h</a>></code>
 <p>
-<a href="a00114.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00097.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex.  <a href="#d6ea60dee5563f702379bf5e51aa8806"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="42a92d4f8fdde425b111cfa8a9228071"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock" ref="42a92d4f8fdde425b111cfa8a9228071" args="(spin_rw_mutex &m, bool write=true)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a> (<a class="el" href="a00288.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex.  <a href="#db0fa3967491014572e24d6607bdc971"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9b51ef972f5618ac17caadb58841ab6d"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::scoped_lock" ref="9b51ef972f5618ac17caadb58841ab6d" args="(queuing_mutex &m)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#9b51ef972f5618ac17caadb58841ab6d">scoped_lock</a> (<a class="el" href="a00288.html">queuing_mutex</a> &m)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d7eaaa3f2e2c5dc11e7005811b1bdd04"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::~scoped_lock" ref="d7eaaa3f2e2c5dc11e7005811b1bdd04" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac2c576a93570957d694192a5f491443"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::~scoped_lock" ref="ac2c576a93570957d694192a5f491443" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0b646ec5be02a127d159bbb7ca65353"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::acquire" ref="b0b646ec5be02a127d159bbb7ca65353" args="(spin_rw_mutex &m, bool write=true)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a> (<a class="el" href="a00288.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="533e4fc8355ee321206a0609c42d909d"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::acquire" ref="533e4fc8355ee321206a0609c42d909d" args="(queuing_mutex &m)" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#533e4fc8355ee321206a0609c42d909d">acquire</a> (<a class="el" href="a00288.html">queuing_mutex</a> &m)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e5a014fb817599386a87170cf2cf51a9"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::try_acquire" ref="e5a014fb817599386a87170cf2cf51a9" args="(queuing_mutex &m)" -->
+bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a> (<a class="el" href="a00288.html">queuing_mutex</a> &m)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Upgrade reader to become a writer.  <a href="#3f0b1e3f2efab63336400348bd070226"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61b14d00a78185c9b2d206ebfc379124"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::release" ref="61b14d00a78185c9b2d206ebfc379124" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#61b14d00a78185c9b2d206ebfc379124">release</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex if free (i.e. non-blocking). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3bf2b8c87ff22115be9b2eac179f2d30"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::release" ref="3bf2b8c87ff22115be9b2eac179f2d30" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c2c2c38a08cb9080e87099fac3e5bc94"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::downgrade_to_reader" ref="c2c2c38a08cb9080e87099fac3e5bc94" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Downgrade writer to become a reader. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9879626968d9b9a04cd2ec0fb2e84ae1"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::try_acquire" ref="9879626968d9b9a04cd2ec0fb2e84ae1" args="(spin_rw_mutex &m, bool write=true)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a> (<a class="el" href="a00288.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given mutex. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d96d1a1fcc3d79ef3e5c06a53b8ffeaa"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::mutex" ref="d96d1a1fcc3d79ef3e5c06a53b8ffeaa" args="" -->
-<a class="el" href="a00288.html">spin_rw_mutex</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The pointer to the current mutex that is held, or NULL if no mutex is held. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">is_writer</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">If mutex!=NULL, then is_writer is true if holding a writer lock, false if holding a reader lock.  <a href="#6b5a7c3c67a36b05c4df8410d32627d8"></a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
 The scoped locking pattern. 
@@ -75,12 +60,12 @@ The scoped locking pattern.
 It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks. 
 <p>
 <hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="d6ea60dee5563f702379bf5e51aa8806"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock" ref="d6ea60dee5563f702379bf5e51aa8806" args="()" -->
+<a class="anchor" name="db0fa3967491014572e24d6607bdc971"></a><!-- doxytag: member="tbb::queuing_mutex::scoped_lock::scoped_lock" ref="db0fa3967491014572e24d6607bdc971" args="()" -->
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock           </td>
+          <td class="memname">tbb::queuing_mutex::scoped_lock::scoped_lock           </td>
           <td>(</td>
           <td class="paramname">          </td>
           <td> ) </td>
@@ -96,48 +81,8 @@ Construct lock that has not acquired a mutex.
 Equivalent to zero-initialization of *this. 
 </div>
 </div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="3f0b1e3f2efab63336400348bd070226"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::upgrade_to_writer" ref="3f0b1e3f2efab63336400348bd070226" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">bool tbb::spin_rw_mutex_v3::scoped_lock::upgrade_to_writer           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Upgrade reader to become a writer. 
-<p>
-Returns true if the upgrade happened without re-acquiring the lock and false if opposite 
-</div>
-</div><p>
-<hr><h2>Member Data Documentation</h2>
-<a class="anchor" name="6b5a7c3c67a36b05c4df8410d32627d8"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::is_writer" ref="6b5a7c3c67a36b05c4df8410d32627d8" args="" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">bool <a class="el" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock::is_writer</a><code> [protected]</code>          </td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-If mutex!=NULL, then is_writer is true if holding a writer lock, false if holding a reader lock. 
-<p>
-Not defined if not holding a lock. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00566.html">spin_rw_mutex.h</a></ul>
+<li><a class="el" href="a00557.html">queuing_mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00290.html b/doc/html/a00290.html
index e45523b..0114ab0 100644
--- a/doc/html/a00290.html
+++ b/doc/html/a00290.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::split Class Reference</title>
+<title>tbb::queuing_rw_mutex Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,25 +21,55 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00290.html">split</a></div>
-<h1>tbb::split Class Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00290.html">queuing_rw_mutex</a></div>
+<h1>tbb::queuing_rw_mutex Class Reference<br>
 <small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::split" -->Dummy type that distinguishes splitting constructor from copy constructor.  
+[<a class="el" href="a00398.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::queuing_rw_mutex" -->Reader-writer lock with local-only spinning.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00600.html">tbb_stddef.h</a>></code>
+<code>#include <<a class="el" href="a00558.html">queuing_rw_mutex.h</a>></code>
 <p>
-<table border="0" cellpadding="0" cellspacing="0">
+<a href="a00098.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="85c90877c3447690ac4e2ac4ff8dea5e"></a><!-- doxytag: member="tbb::queuing_rw_mutex::queuing_rw_mutex" ref="85c90877c3447690ac4e2ac4ff8dea5e" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00290.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ba73e3d95cfdf8323880bc623af9099"></a><!-- doxytag: member="tbb::queuing_rw_mutex::~queuing_rw_mutex" ref="1ba73e3d95cfdf8323880bc623af9099" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00290.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor asserts if the mutex is acquired, i.e. q_tail is non-NULL. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eb88522d145ad7bcf5bebfa7d2a6122b"></a><!-- doxytag: member="tbb::queuing_rw_mutex::internal_construct" ref="eb88522d145ad7bcf5bebfa7d2a6122b" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
+
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0dc1e28d3033e8f9556f5b13b7b57d0f"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_rw_mutex" ref="0dc1e28d3033e8f9556f5b13b7b57d0f" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = true</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e6ad08ef251f9ea898bd5f67963869c5"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_recursive_mutex" ref="e6ad08ef251f9ea898bd5f67963869c5" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="147b34120505e419f6ea8d631ec4375d"></a><!-- doxytag: member="tbb::queuing_rw_mutex::is_fair_mutex" ref="147b34120505e419f6ea8d631ec4375d" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = true</td></tr>
+
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html">scoped_lock</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern.  <a href="a00291.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Dummy type that distinguishes splitting constructor from copy constructor. 
+Reader-writer lock with local-only spinning. 
 <p>
-See description of parallel_for and parallel_reduce for example usages. 
+Adapted from Krieger, Stumm, et al. pseudocode at <a href="http://www.eecg.toronto.edu/parallel/pubs_abs.html#Krieger_etal_ICPP93">http://www.eecg.toronto.edu/parallel/pubs_abs.html#Krieger_etal_ICPP93</a> 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00600.html">tbb_stddef.h</a></ul>
+<li><a class="el" href="a00558.html">queuing_rw_mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00291.html b/doc/html/a00291.html
index 95a1bc4..442c9ba 100644
--- a/doc/html/a00291.html
+++ b/doc/html/a00291.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::task Class Reference</title>
+<title>tbb::queuing_rw_mutex::scoped_lock Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,294 +21,58 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00291.html">task</a></div>
-<h1>tbb::task Class Reference<br>
-<small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task" -->Base class for user-defined tasks.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00290.html">queuing_rw_mutex</a>::<a class="el" href="a00291.html">scoped_lock</a></div>
+<h1>tbb::queuing_rw_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::queuing_rw_mutex::scoped_lock" -->The scoped locking pattern.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00567.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00558.html">queuing_rw_mutex.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::task:
-<p><center><img src="a00291.png" usemap="#tbb::task_map" border="0" alt=""></center>
-<map name="tbb::task_map">
-<area href="a00242.html" alt="tbb::empty_task" shape="rect" coords="0,56,97,80">
-</map>
-<a href="a00119.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00099.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef internal::affinity_id </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An id as used for specifying affinity.  <a href="#d61bb32389d3857bf7511d69beaafb76"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task is running, and will be destroyed after method <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> completes.  <a href="#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task to be rescheduled.  <a href="#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task is in ready pool, or is going to be put there, or was just taken off.  <a href="#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task object is freshly allocated or recycled.  <a href="#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task object is on free list, or is going to be put there, or was just taken off.  <a href="#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task to be recycled as continuation  <a href="#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> { <br>
-  <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>, 
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>, 
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>, 
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>, 
-<br>
-  <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>, 
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a>
-<br>
- }</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enumeration of task states that the scheduler considers.  <a href="a00291.html#4a3c415562d17905390ea5b49d12293e">More...</a><br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98245ee0473f84cb19dbbf8c81134908"></a><!-- doxytag: member="tbb::task::~task" ref="98245ee0473f84cb19dbbf8c81134908" args="()" -->
-virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#98245ee0473f84cb19dbbf8c81134908">~task</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="22c298cd40937a431a06777423f002f6"></a><!-- doxytag: member="tbb::task::execute" ref="22c298cd40937a431a06777423f002f6" args="()=0" -->
-virtual <a class="el" href="a00291.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute</a> ()=0</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Should be overridden by derived classes. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">internal::allocate_continuation_proxy & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#1434c79a5138993269d034008bff7329">allocate_continuation</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a continuation task of *this.  <a href="#1434c79a5138993269d034008bff7329"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ff794f7053cd9148d5f280fbf07377f"></a><!-- doxytag: member="tbb::task::allocate_child" ref="1ff794f7053cd9148d5f280fbf07377f" args="()" -->
-internal::allocate_child_proxy & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a child task of *this. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a> (<a class="el" href="a00291.html">task</a> &t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy a task.  <a href="#dfaacf92685e5f86393bf657b2853bf8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Change this to be a continuation of its former self.  <a href="#a67a79e18f62b43a623a00cfbd76db4c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Recommended to use, safe variant of recycle_as_continuation.  <a href="#3b290d14109704e2b69dc1ac980a7a76"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db399855177438bbc9cc61d508dae8d2"></a><!-- doxytag: member="tbb::task::recycle_as_child_of" ref="db399855177438bbc9cc61d508dae8d2" args="(task &new_parent)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a> (<a class="el" href="a00291.html">task</a> &new_parent)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Change this to be a child of new_parent. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Schedule this for reexecution after current <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> returns.  <a href="#4f1be9bbcdb487830dbe298b68d85144"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7653ceef53a188d05b5c779e1104b698"></a><!-- doxytag: member="tbb::task::depth" ref="7653ceef53a188d05b5c779e1104b698" args="() const " -->
-intptr_t </td><td class="memItemRight" valign="bottom"><b>depth</b> () const </td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e864e9c80e3d79f00d77fb99f4757621"></a><!-- doxytag: member="tbb::task::set_depth" ref="e864e9c80e3d79f00d77fb99f4757621" args="(intptr_t)" -->
-void </td><td class="memItemRight" valign="bottom"><b>set_depth</b> (intptr_t)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c83fcc26f6513f0e06de70cbab9dee46"></a><!-- doxytag: member="tbb::task::add_to_depth" ref="c83fcc26f6513f0e06de70cbab9dee46" args="(int)" -->
-void </td><td class="memItemRight" valign="bottom"><b>add_to_depth</b> (int)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06a4206a57e8e12a439b14d6d41cfd92"></a><!-- doxytag: member="tbb::task::set_ref_count" ref="06a4206a57e8e12a439b14d6d41cfd92" args="(int count)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a> (int count)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Set reference count. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Atomically increment reference count and returns its old value.  <a href="#f5fb43c7ad0de5a4b95703cebc39e345"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Atomically decrement reference count and returns its new value.  <a href="#ef4680f5c148020c5e7e43ddef44cd5d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ce28ca9baa771cfc37ecd72e69c4f3c"></a><!-- doxytag: member="tbb::task::spawn_and_wait_for_all" ref="3ce28ca9baa771cfc37ecd72e69c4f3c" args="(task &child)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a> (<a class="el" href="a00291.html">task</a> &child)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Similar to spawn followed by wait_for_all, but more efficient. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="894ab68378e502776d8220eea7ce9fa1"></a><!-- doxytag: member="tbb::task::spawn_and_wait_for_all" ref="894ab68378e502776d8220eea7ce9fa1" args="(task_list &list)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a> (<a class="el" href="a00294.html">task_list</a> &list)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Similar to spawn followed by wait_for_all, but more efficient. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Wait for reference count to become one, and set reference count to zero.  <a href="#53d2615ad9c38859b4c8080936600283"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="314e98ee4347ccec83efcb9ee22e8596"></a><!-- doxytag: member="tbb::task::parent" ref="314e98ee4347ccec83efcb9ee22e8596" args="() const " -->
-<a class="el" href="a00291.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#314e98ee4347ccec83efcb9ee22e8596">parent</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task on whose behalf this task is working, or NULL if this is a root. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00293.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">This method is deprecated and will be removed in the future.  <a href="#d8c36a93f3972590fbb65ff1cef3173b"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5987123486afca36ddebb9e2a8b7779a"></a><!-- doxytag: member="tbb::task::group" ref="5987123486afca36ddebb9e2a8b7779a" args="()" -->
-<a class="el" href="a00293.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">group</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to the task group descriptor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f9169402702f56bf519448aaf34450aa"></a><!-- doxytag: member="tbb::task::is_stolen_task" ref="f9169402702f56bf519448aaf34450aa" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if task was stolen from the task pool of another thread. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0af7b2d7e6e8b4333b2accfce3dfb374"></a><!-- doxytag: member="tbb::task::state" ref="0af7b2d7e6e8b4333b2accfce3dfb374" args="() const " -->
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Current execution state. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad774f55eaec008ae02b236423209ced"></a><!-- doxytag: member="tbb::task::ref_count" ref="ad774f55eaec008ae02b236423209ced" args="() const " -->
-int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#ad774f55eaec008ae02b236423209ced">ref_count</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The internal reference count. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c26718b3b247cd13deb1a741902e7105"></a><!-- doxytag: member="tbb::task::is_owned_by_current_thread" ref="c26718b3b247cd13deb1a741902e7105" args="() const " -->
-bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Obsolete, and only retained for the sake of backward compatibility. Always returns true. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dca19d7a45487a7d67a0db517e2b57c9"></a><!-- doxytag: member="tbb::task::set_affinity" ref="dca19d7a45487a7d67a0db517e2b57c9" args="(affinity_id id)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a> (<a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Set affinity for this task. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3a920a56b0bcf2801518fb45b2c9d2be"></a><!-- doxytag: member="tbb::task::affinity" ref="3a920a56b0bcf2801518fb45b2c9d2be" args="() const " -->
-<a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Current affinity of this task. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a> (<a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Invoked by scheduler to notify task that it ran on unexpected thread.  <a href="#713c338c8eeaebdc5a6b10a69c039b06"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a> (<a class="el" href="a00293.html">task_group_context</a> &ctx)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex.  <a href="#c62e365be7bcbba091c9ea7454a4d22c"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fbb8798792d3aebb136c46fc63d2529e"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::scoped_lock" ref="fbb8798792d3aebb136c46fc63d2529e" args="(queuing_rw_mutex &m, bool write=true)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#fbb8798792d3aebb136c46fc63d2529e">scoped_lock</a> (<a class="el" href="a00290.html">queuing_rw_mutex</a> &m, bool write=true)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Moves this task from its current group into another one.  <a href="#62247be9a637a814c8e8f4bcfb3a1908"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="32c7d67a660d23ebbaab1a1d2826d31a"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::~scoped_lock" ref="32c7d67a660d23ebbaab1a1d2826d31a" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Initiates cancellation of all tasks in this cancellation group and its subordinate groups.  <a href="#0f3fb4aac549ab642022450a4bd13326"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="025f18118c057c4c8db87ff2ce8df975"></a><!-- doxytag: member="tbb::task::is_cancelled" ref="025f18118c057c4c8db87ff2ce8df975" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a8dd5ab8686e76de21587544dbb681e0"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::acquire" ref="a8dd5ab8686e76de21587544dbb681e0" args="(queuing_rw_mutex &m, bool write=true)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a> (<a class="el" href="a00290.html">queuing_rw_mutex</a> &m, bool write=true)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if the context has received cancellation request. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9ac8d1542d67d9d80121ff986801ac26"></a><!-- doxytag: member="tbb::task::set_group_priority" ref="9ac8d1542d67d9d80121ff986801ac26" args="(priority_t p)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a> (priority_t p)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2e4ff6c9ec2fee6682f95290d1f42baa"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::try_acquire" ref="2e4ff6c9ec2fee6682f95290d1f42baa" args="(queuing_rw_mutex &m, bool write=true)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a> (<a class="el" href="a00290.html">queuing_rw_mutex</a> &m, bool write=true)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Changes priority of the task group this task belongs to. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e1d969a1ccab6796e3b8b2c1a5be33d2"></a><!-- doxytag: member="tbb::task::group_priority" ref="e1d969a1ccab6796e3b8b2c1a5be33d2" args="() const " -->
-priority_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="67ae221109ddc69510ab593874e435d4"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::release" ref="67ae221109ddc69510ab593874e435d4" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#67ae221109ddc69510ab593874e435d4">release</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Retrieves current priority of the task group this task belongs to. <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23acb0da0afd690da797f9f882027d34"></a><!-- doxytag: member="tbb::task::allocate_root" ref="23acb0da0afd690da797f9f882027d34" args="()" -->
-static internal::allocate_root_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#23acb0da0afd690da797f9f882027d34">allocate_root</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a root task. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ccc518caf31075a3e073996d2d240a4"></a><!-- doxytag: member="tbb::task::allocate_root" ref="8ccc518caf31075a3e073996d2d240a4" args="(task_group_context &ctx)" -->
-static internal::allocate_root_with_context_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a> (<a class="el" href="a00293.html">task_group_context</a> &ctx)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a root task associated with user supplied context. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce8ce689c26a4ddf343829bc3c73290a"></a><!-- doxytag: member="tbb::task::spawn_root_and_wait" ref="ce8ce689c26a4ddf343829bc3c73290a" args="(task &root)" -->
-static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a> (<a class="el" href="a00291.html">task</a> &root)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawn task allocated by allocate_root, wait for it to complete, and deallocate it. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a> (<a class="el" href="a00294.html">task_list</a> &root_list)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Spawn root tasks on list and wait for all of them to finish.  <a href="#c33c7edbaec67aa8a56f48986a9dc69f"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a> (<a class="el" href="a00291.html">task</a> &t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue task for starvation-resistant execution.  <a href="#8365d063c0cc9d7bd616bca47256b93c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fe6bf6aaf84e664134fabb6c4f409ea9"></a><!-- doxytag: member="tbb::task::enqueue" ref="fe6bf6aaf84e664134fabb6c4f409ea9" args="(task &t, priority_t p)" -->
-static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a> (<a class="el" href="a00291.html">task</a> &t, priority_t p)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue task for starvation-resistant execution on the specified priority level. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd43e8d6249738efafd12d6a4c72c5e3"></a><!-- doxytag: member="tbb::task::self" ref="bd43e8d6249738efafd12d6a4c72c5e3" args="()" -->
-static <a class="el" href="a00291.html">task</a> &__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The innermost task being executed or destroyed by the current thread at the moment. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2bce8ec6e44706e70128f5cf91b76e67"></a><!-- doxytag: member="tbb::task::task" ref="2bce8ec6e44706e70128f5cf91b76e67" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">task</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Default constructor. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="81d0122aee4ddae419a743ee50d7038e"></a><!-- doxytag: member="tbb::task::interface5::internal::task_base" ref="81d0122aee4ddae419a743ee50d7038e" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>interface5::internal::task_base</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5eabadbca46f93ce6fb08290e85a0a65"></a><!-- doxytag: member="tbb::task::task_list" ref="5eabadbca46f93ce6fb08290e85a0a65" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>task_list</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e296810002652d771f692e20ca87e898"></a><!-- doxytag: member="tbb::task::internal::scheduler" ref="e296810002652d771f692e20ca87e898" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::scheduler</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="387b945c106854e1ed525f0668092930"></a><!-- doxytag: member="tbb::task::internal::allocate_root_proxy" ref="387b945c106854e1ed525f0668092930" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_root_proxy</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ecedb9436fb30df30cb3a52c64bb97e5"></a><!-- doxytag: member="tbb::task::internal::allocate_root_with_context_proxy" ref="ecedb9436fb30df30cb3a52c64bb97e5" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_root_with_context_proxy</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9987b3b1174772e5e853bd94b9f15350"></a><!-- doxytag: member="tbb::task::internal::allocate_continuation_proxy" ref="9987b3b1174772e5e853bd94b9f15350" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_continuation_proxy</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f9e255654086b52fe107e4d8bbc8b7d"></a><!-- doxytag: member="tbb::task::internal::allocate_child_proxy" ref="1f9e255654086b52fe107e4d8bbc8b7d" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_child_proxy</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e99ce0045ea3c55d239f38ea026b8a7"></a><!-- doxytag: member="tbb::task::internal::allocate_additional_child_of_proxy" ref="0e99ce0045ea3c55d239f38ea026b8a7" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_additional_child_of_proxy</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Upgrade reader to become a writer.  <a href="#11ba1da4a722c9e6f73339a52c487e82"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d2f93edf7b15ec4bcee138823220c52"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::downgrade_to_reader" ref="0d2f93edf7b15ec4bcee138823220c52" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a> ()</td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Downgrade writer to become a reader. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Base class for user-defined tasks. 
-<p>
-<hr><h2>Member Typedef Documentation</h2>
-<a class="anchor" name="d61bb32389d3857bf7511d69beaafb76"></a><!-- doxytag: member="tbb::task::affinity_id" ref="d61bb32389d3857bf7511d69beaafb76" args="" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">typedef internal::affinity_id <a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">tbb::task::affinity_id</a>          </td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-An id as used for specifying affinity. 
-<p>
-Guaranteed to be integral type. Value of 0 means no affinity. 
-</div>
-</div><p>
-<hr><h2>Member Enumeration Documentation</h2>
-<a class="anchor" name="4a3c415562d17905390ea5b49d12293e"></a><!-- doxytag: member="tbb::task::state_type" ref="4a3c415562d17905390ea5b49d12293e" args="" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">enum <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">tbb::task::state_type</a>          </td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
+The scoped locking pattern. 
 <p>
-Enumeration of task states that the scheduler considers. 
+It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks. 
 <p>
-<dl compact><dt><b>Enumerator: </b></dt><dd>
-<table border="0" cellspacing="2" cellpadding="0">
-<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9"></a><!-- doxytag: member="executing" ref="4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9" args="" -->executing</em> </td><td>
-task is running, and will be destroyed after method <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> completes. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513"></a><!-- doxytag: member="reexecute" ref="4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513" args="" -->reexecute</em> </td><td>
-task to be rescheduled. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a"></a><!-- doxytag: member="ready" ref="4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a" args="" -->ready</em> </td><td>
-task is in ready pool, or is going to be put there, or was just taken off. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c"></a><!-- doxytag: member="allocated" ref="4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c" args="" -->allocated</em> </td><td>
-task object is freshly allocated or recycled. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735"></a><!-- doxytag: member="freed" ref="4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735" args="" -->freed</em> </td><td>
-task object is on free list, or is going to be put there, or was just taken off. </td></tr>
-<tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d"></a><!-- doxytag: member="recycle" ref="4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d" args="" -->recycle</em> </td><td>
-task to be recycled as continuation </td></tr>
-</table>
-</dl>
-
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="1434c79a5138993269d034008bff7329"></a><!-- doxytag: member="tbb::task::allocate_continuation" ref="1434c79a5138993269d034008bff7329" args="()" -->
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="c62e365be7bcbba091c9ea7454a4d22c"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::scoped_lock" ref="c62e365be7bcbba091c9ea7454a4d22c" args="()" -->
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">internal::allocate_continuation_proxy& tbb::task::allocate_continuation           </td>
+          <td class="memname">tbb::queuing_rw_mutex::scoped_lock::scoped_lock           </td>
           <td>(</td>
           <td class="paramname">          </td>
           <td> ) </td>
@@ -319,43 +83,21 @@ task to be recycled as continuation </td></tr>
 <div class="memdoc">
 
 <p>
-Returns proxy for overloaded new that allocates a continuation task of *this. 
+Construct lock that has not acquired a mutex. 
 <p>
-The continuation's parent becomes the parent of *this. 
+Equivalent to zero-initialization of *this. 
 </div>
 </div><p>
-<a class="anchor" name="0f3fb4aac549ab642022450a4bd13326"></a><!-- doxytag: member="tbb::task::cancel_group_execution" ref="0f3fb4aac549ab642022450a4bd13326" args="()" -->
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="11ba1da4a722c9e6f73339a52c487e82"></a><!-- doxytag: member="tbb::queuing_rw_mutex::scoped_lock::upgrade_to_writer" ref="11ba1da4a722c9e6f73339a52c487e82" args="()" -->
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">bool tbb::task::cancel_group_execution           </td>
+          <td class="memname">bool tbb::queuing_rw_mutex::scoped_lock::upgrade_to_writer           </td>
           <td>(</td>
           <td class="paramname">          </td>
           <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Initiates cancellation of all tasks in this cancellation group and its subordinate groups. 
-<p>
-<dl compact><dt><b>Returns:</b></dt><dd>false if cancellation has already been requested, true otherwise. </dd></dl>
-
-</div>
-</div><p>
-<a class="anchor" name="62247be9a637a814c8e8f4bcfb3a1908"></a><!-- doxytag: member="tbb::task::change_group" ref="62247be9a637a814c8e8f4bcfb3a1908" args="(task_group_context &ctx)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void __TBB_EXPORTED_METHOD tbb::task::change_group           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00293.html">task_group_context</a> & </td>
-          <td class="paramname"> <em>ctx</em>          </td>
-          <td> ) </td>
           <td width="100%"></td>
         </tr>
       </table>
@@ -363,253 +105,13 @@ Initiates cancellation of all tasks in this cancellation group and its subordina
 <div class="memdoc">
 
 <p>
-Moves this task from its current group into another one. 
-<p>
-Argument ctx specifies the new group.<p>
-The primary purpose of this method is to associate unique task group context with a task allocated for subsequent enqueuing. In contrast to spawned tasks enqueued ones normally outlive the scope where they were created. This makes traditional usage model where task group context are allocated locally on the stack inapplicable. Dynamic allocation of context objects is performance inefficient. Method <a class="el" href="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">change_group()</a> allow [...]
-</div>
-</div><p>
-<a class="anchor" name="d8c36a93f3972590fbb65ff1cef3173b"></a><!-- doxytag: member="tbb::task::context" ref="d8c36a93f3972590fbb65ff1cef3173b" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname"><a class="el" href="a00293.html">task_group_context</a>* tbb::task::context           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-This method is deprecated and will be removed in the future. 
-<p>
-Use method <a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">group()</a> instead. 
-</div>
-</div><p>
-<a class="anchor" name="ef4680f5c148020c5e7e43ddef44cd5d"></a><!-- doxytag: member="tbb::task::decrement_ref_count" ref="ef4680f5c148020c5e7e43ddef44cd5d" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">int tbb::task::decrement_ref_count           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Atomically decrement reference count and returns its new value. 
-<p>
-Has release semantics. 
-</div>
-</div><p>
-<a class="anchor" name="dfaacf92685e5f86393bf657b2853bf8"></a><!-- doxytag: member="tbb::task::destroy" ref="dfaacf92685e5f86393bf657b2853bf8" args="(task &t)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void __TBB_EXPORTED_METHOD tbb::task::destroy           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00291.html">task</a> & </td>
-          <td class="paramname"> <em>t</em>          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Destroy a task. 
-<p>
-Usually, calling this method is unnecessary, because a task is implicitly deleted after its <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> method runs. However, sometimes a task needs to be explicitly deallocated, such as when a root task is used as the parent in spawn_and_wait_for_all. 
-</div>
-</div><p>
-<a class="anchor" name="8365d063c0cc9d7bd616bca47256b93c"></a><!-- doxytag: member="tbb::task::enqueue" ref="8365d063c0cc9d7bd616bca47256b93c" args="(task &t)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">static void tbb::task::enqueue           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00291.html">task</a> & </td>
-          <td class="paramname"> <em>t</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, static]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Enqueue task for starvation-resistant execution. 
-<p>
-The task will be enqueued on the normal priority level disregarding the priority of its task group.<p>
-The rationale of such semantics is that priority of an enqueued task is statically fixed at the moment of its enqueuing, while task group priority is dynamic. Thus automatic priority inheritance would be generally a subject to the race, which may result in unexpected behavior.<p>
-Use <a class="el" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">enqueue()</a> overload with explicit priority value and <a class="el" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">task::group_priority()</a> method to implement such priority inheritance when it is really necessary. 
-</div>
-</div><p>
-<a class="anchor" name="f5fb43c7ad0de5a4b95703cebc39e345"></a><!-- doxytag: member="tbb::task::increment_ref_count" ref="f5fb43c7ad0de5a4b95703cebc39e345" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void tbb::task::increment_ref_count           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Atomically increment reference count and returns its old value. 
-<p>
-Has acquire semantics 
-</div>
-</div><p>
-<a class="anchor" name="713c338c8eeaebdc5a6b10a69c039b06"></a><!-- doxytag: member="tbb::task::note_affinity" ref="713c338c8eeaebdc5a6b10a69c039b06" args="(affinity_id id)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">virtual void __TBB_EXPORTED_METHOD tbb::task::note_affinity           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td>
-          <td class="paramname"> <em>id</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [virtual]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Invoked by scheduler to notify task that it ran on unexpected thread. 
-<p>
-Invoked before method <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> runs, if task is stolen, or task has affinity but will be executed on another thread.<p>
-The default action does nothing. 
-</div>
-</div><p>
-<a class="anchor" name="a67a79e18f62b43a623a00cfbd76db4c"></a><!-- doxytag: member="tbb::task::recycle_as_continuation" ref="a67a79e18f62b43a623a00cfbd76db4c" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void tbb::task::recycle_as_continuation           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Change this to be a continuation of its former self. 
-<p>
-The caller must guarantee that the task's refcount does not become zero until after the method <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. Typically, this is done by having method <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> return a pointer to a child of the task. If the guarantee cannot be made, use method recycle_as_safe_continuation instead.<p>
-Because of the hazard, this method may be deprecated in the future. 
-</div>
-</div><p>
-<a class="anchor" name="3b290d14109704e2b69dc1ac980a7a76"></a><!-- doxytag: member="tbb::task::recycle_as_safe_continuation" ref="3b290d14109704e2b69dc1ac980a7a76" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void tbb::task::recycle_as_safe_continuation           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Recommended to use, safe variant of recycle_as_continuation. 
-<p>
-For safety, it requires additional increment of ref_count. With no decendants and ref_count of 1, it has the semantics of recycle_to_reexecute. 
-</div>
-</div><p>
-<a class="anchor" name="4f1be9bbcdb487830dbe298b68d85144"></a><!-- doxytag: member="tbb::task::recycle_to_reexecute" ref="4f1be9bbcdb487830dbe298b68d85144" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void tbb::task::recycle_to_reexecute           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Schedule this for reexecution after current <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. 
-<p>
-Made obsolete by recycle_as_safe_continuation; may become deprecated. 
-</div>
-</div><p>
-<a class="anchor" name="c33c7edbaec67aa8a56f48986a9dc69f"></a><!-- doxytag: member="tbb::task::spawn_root_and_wait" ref="c33c7edbaec67aa8a56f48986a9dc69f" args="(task_list &root_list)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void tbb::task::spawn_root_and_wait           </td>
-          <td>(</td>
-          <td class="paramtype"><a class="el" href="a00294.html">task_list</a> & </td>
-          <td class="paramname"> <em>root_list</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline, static]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Spawn root tasks on list and wait for all of them to finish. 
-<p>
-If there are more tasks than worker threads, the tasks are spawned in order of front to back. 
-</div>
-</div><p>
-<a class="anchor" name="53d2615ad9c38859b4c8080936600283"></a><!-- doxytag: member="tbb::task::wait_for_all" ref="53d2615ad9c38859b4c8080936600283" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void tbb::task::wait_for_all           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Wait for reference count to become one, and set reference count to zero. 
+Upgrade reader to become a writer. 
 <p>
-Works on tasks while waiting. 
+Returns true if the upgrade happened without re-acquiring the lock and false if opposite 
 </div>
 </div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00567.html">task.h</a></ul>
+<li><a class="el" href="a00558.html">queuing_rw_mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00292.html b/doc/html/a00292.html
index 7836bb9..5a61803 100644
--- a/doc/html/a00292.html
+++ b/doc/html/a00292.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::interface5::internal::task_base Class Reference</title>
+<title>tbb::interface5::reader_writer_lock Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,22 +21,195 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<b>internal</b>::<a class="el" href="a00292.html">task_base</a></div>
-<h1>tbb::interface5::internal::task_base Class Reference</h1><!-- doxytag: class="tbb::interface5::internal::task_base" -->Base class for methods that became static in TBB 3.0.  
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00292.html">reader_writer_lock</a></div>
+<h1>tbb::interface5::reader_writer_lock Class Reference<br>
+<small>
+[<a class="el" href="a00398.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock" -->Writer-preference reader-writer lock with local-only spinning on readers.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00567.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00559.html">reader_writer_lock.h</a>></code>
 <p>
-<a href="a00116.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00100.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf005142e2b9af377a8d33c6604d858862"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::waiting_nonblocking" ref="6f921f0d7c1812ceb5674418c8b6ccaf005142e2b9af377a8d33c6604d858862" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>waiting_nonblocking</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf18bcc9aae8f056c34fb61bb7fc39b432"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::waiting" ref="6f921f0d7c1812ceb5674418c8b6ccaf18bcc9aae8f056c34fb61bb7fc39b432" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>waiting</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf423c082d5cdc9bb12d0eeadcae56adb5"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::active" ref="6f921f0d7c1812ceb5674418c8b6ccaf423c082d5cdc9bb12d0eeadcae56adb5" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>active</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccafa9a5b17bdfb0a6d59b3cd58fecbd9610"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::invalid" ref="6f921f0d7c1812ceb5674418c8b6ccafa9a5b17bdfb0a6d59b3cd58fecbd9610" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>invalid</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> { <b>waiting_nonblocking</b>, 
+<b>waiting</b>, 
+<b>active</b>, 
+<b>invalid</b>
+ }</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Status type for nodes associated with lock instances.  <a href="a00292.html#6f921f0d7c1812ceb5674418c8b6ccaf">More...</a><br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c1431c4293e777efd9aab9a95c2a46e1"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::reader_writer_lock" ref="c1431c4293e777efd9aab9a95c2a46e1" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructs a new <a class="el" href="a00292.html">reader_writer_lock</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5135f64f7b7339017f33d956445edbee"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::~reader_writer_lock" ref="5135f64f7b7339017f33d956445edbee" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructs a <a class="el" href="a00292.html">reader_writer_lock</a> object. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00292.html">reader_writer_lock</a> for write.  <a href="#2653d1a2d560059a51219a8ceab3ade9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#721eb173e154ab38292273e9266a9b07">try_lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00292.html">reader_writer_lock</a> for write.  <a href="#721eb173e154ab38292273e9266a9b07"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquires the <a class="el" href="a00292.html">reader_writer_lock</a> for read.  <a href="#d9d16a24d9f6c3dada73c6b9ff214f5b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Tries to acquire the <a class="el" href="a00292.html">reader_writer_lock</a> for read.  <a href="#595fb23952e3b89426b1f7938dea9b11"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5113b32689305599b2c36b5831547704"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::unlock" ref="5113b32689305599b2c36b5831547704" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html#5113b32689305599b2c36b5831547704">unlock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Releases the <a class="el" href="a00292.html">reader_writer_lock</a>. <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="680274059774b9188889d34986314f81"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read" ref="680274059774b9188889d34986314f81" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>scoped_lock_read</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html">scoped_lock</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for write locks.  <a href="a00293.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html">scoped_lock_read</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped lock pattern for read locks.  <a href="a00294.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Base class for methods that became static in TBB 3.0. 
+Writer-preference reader-writer lock with local-only spinning on readers. 
 <p>
-TBB's evolution caused the "this" argument for several methods to become obsolete. However, for backwards binary compatibility, the new methods need distinct names, otherwise the One Definition Rule would be broken. Hence the new methods are defined in this private base class, and then exposed in class task via using declarations. 
+Loosely adapted from Mellor-Crummey and Scott pseudocode at <a href="http://www.cs.rochester.edu/research/synchronization/pseudocode/rw.html#s_wp">http://www.cs.rochester.edu/research/synchronization/pseudocode/rw.html#s_wp</a> 
 <p>
+<hr><h2>Member Enumeration Documentation</h2>
+<a class="anchor" name="6f921f0d7c1812ceb5674418c8b6ccaf"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::status_t" ref="6f921f0d7c1812ceb5674418c8b6ccaf" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="a00292.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock::status_t</a>          </td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Status type for nodes associated with lock instances. 
+<p>
+waiting_nonblocking: the wait state for nonblocking lock instances; for writes, these transition straight to active states; for reads, these are unused.<p>
+waiting: the start and spin state for all lock instances; these will transition to active state when appropriate. Non-blocking write locks transition from this state to waiting_nonblocking immediately.<p>
+active: the active state means that the lock instance holds the lock; it will transition to invalid state during node deletion<p>
+invalid: the end state for all nodes; this is set in the destructor so if we encounter this state, we are looking at memory that has already been freed<p>
+The state diagrams below describe the status transitions. Single arrows indicate that the thread that owns the node is responsible for the transition; double arrows indicate that any thread could make the transition.<p>
+State diagram for <a class="el" href="a00293.html">scoped_lock</a> status:<p>
+waiting ----------> waiting_nonblocking | _____________/ | V V V active -----------------> invalid<p>
+State diagram for <a class="el" href="a00294.html">scoped_lock_read</a> status:<p>
+waiting | V active ----------------->invalid 
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="2653d1a2d560059a51219a8ceab3ade9"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::lock" ref="2653d1a2d560059a51219a8ceab3ade9" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::lock           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Acquires the <a class="el" href="a00292.html">reader_writer_lock</a> for write. 
+<p>
+If the lock is currently held in write mode by another context, the writer will block by spinning on a local variable. Exceptions thrown: <a class="el" href="a00264.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00292.html">reader_writer_lock</a> that it already has write ownership of. 
+</div>
+</div><p>
+<a class="anchor" name="d9d16a24d9f6c3dada73c6b9ff214f5b"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::lock_read" ref="d9d16a24d9f6c3dada73c6b9ff214f5b" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::lock_read           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Acquires the <a class="el" href="a00292.html">reader_writer_lock</a> for read. 
+<p>
+If the lock is currently held by a writer, this reader will block and wait until the writers are done. Exceptions thrown: <a class="el" href="a00264.html">improper_lock</a> The context tries to acquire a <a class="el" href="a00292.html">reader_writer_lock</a> that it already has write ownership of. 
+</div>
+</div><p>
+<a class="anchor" name="721eb173e154ab38292273e9266a9b07"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::try_lock" ref="721eb173e154ab38292273e9266a9b07" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::try_lock           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Tries to acquire the <a class="el" href="a00292.html">reader_writer_lock</a> for write. 
+<p>
+This function does not block. Return Value: True or false, depending on whether the lock is acquired or not. If the lock is already held by this acquiring context, <a class="el" href="a00292.html#721eb173e154ab38292273e9266a9b07">try_lock()</a> returns false. 
+</div>
+</div><p>
+<a class="anchor" name="595fb23952e3b89426b1f7938dea9b11"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::try_lock_read" ref="595fb23952e3b89426b1f7938dea9b11" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool __TBB_EXPORTED_METHOD tbb::interface5::reader_writer_lock::try_lock_read           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Tries to acquire the <a class="el" href="a00292.html">reader_writer_lock</a> for read. 
+<p>
+This function does not block. Return Value: True or false, depending on whether the lock is acquired or not. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00567.html">task.h</a></ul>
+<li><a class="el" href="a00559.html">reader_writer_lock.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00293.html b/doc/html/a00293.html
index 98fd8a2..e6cf4ee 100644
--- a/doc/html/a00293.html
+++ b/doc/html/a00293.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::task_group_context Class Reference</title>
+<title>tbb::interface5::reader_writer_lock::scoped_lock Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,219 +21,41 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00293.html">task_group_context</a></div>
-<h1>tbb::task_group_context Class Reference<br>
-<small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task_group_context" -->Used to form groups of tasks.  
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00292.html">reader_writer_lock</a>::<a class="el" href="a00293.html">scoped_lock</a></div>
+<h1>tbb::interface5::reader_writer_lock::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock::scoped_lock" -->The scoped lock pattern for write locks.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00567.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00559.html">reader_writer_lock.h</a>></code>
 <p>
-<a href="a00117.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00101.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5af85179a348162d4ddd66b6fc0d60fb4fda16c4f77defd3d0f6aad87fceed4"></a><!-- doxytag: member="tbb::task_group_context::isolated" ref="d5af85179a348162d4ddd66b6fc0d60fb4fda16c4f77defd3d0f6aad87fceed4" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>isolated</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5af85179a348162d4ddd66b6fc0d60fc7f37e067ba1fca8a5c809d20522662b"></a><!-- doxytag: member="tbb::task_group_context::bound" ref="d5af85179a348162d4ddd66b6fc0d60fc7f37e067ba1fca8a5c809d20522662b" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>bound</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8dce4661b346756cb4f584529ecd0ebf774f9c21343eba6303927b5ae0be44c"></a><!-- doxytag: member="tbb::task_group_context::exact_exception" ref="b8dce4661b346756cb4f584529ecd0ebf774f9c21343eba6303927b5ae0be44c" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>exact_exception</b> = 0x0001ul << traits_offset</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8dce4661b346756cb4f584529ecd0eb4002d8f90c8c9f7c3f80ad349aee7cce"></a><!-- doxytag: member="tbb::task_group_context::concurrent_wait" ref="b8dce4661b346756cb4f584529ecd0eb4002d8f90c8c9f7c3f80ad349aee7cce" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>concurrent_wait</b> = 0x0004ul << traits_offset</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><b>default_traits</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>kind_type</b> { <b>isolated</b>, 
-<b>bound</b>
- }</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>traits_type</b> { <b>exact_exception</b> =  0x0001ul << traits_offset, 
-<b>concurrent_wait</b> =  0x0004ul << traits_offset, 
-<b>default_traits</b>
- }</td></tr>
-
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#19fee08fb8ac98adccfe69c1aa63c491">task_group_context</a> (kind_type relation_with_parent=bound, uintptr_t traits=default_traits)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Default & binding constructor.  <a href="#19fee08fb8ac98adccfe69c1aa63c491"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#6d30d16bf1cd22f86c6afaf29c2b430c">reset</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cf19f20e082887c1bb0ba6b0911c3583"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::scoped_lock" ref="cf19f20e082887c1bb0ba6b0911c3583" args="(reader_writer_lock &lock)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#cf19f20e082887c1bb0ba6b0911c3583">scoped_lock</a> (<a class="el" href="a00292.html">reader_writer_lock</a> &lock)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forcefully reinitializes the context after the task tree it was associated with is completed.  <a href="#6d30d16bf1cd22f86c6afaf29c2b430c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#8bcdfdf4e6bfb76125b6de15c00b571d">cancel_group_execution</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct with blocking attempt to acquire write lock on the passed-in lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="70246e0260493625ff956fa5926fc71f"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::~scoped_lock" ref="70246e0260493625ff956fa5926fc71f" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Initiates cancellation of all tasks in this cancellation group and its subordinate groups.  <a href="#8bcdfdf4e6bfb76125b6de15c00b571d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4db72f16210b0a991b2c134d6763a4cc"></a><!-- doxytag: member="tbb::task_group_context::is_group_execution_cancelled" ref="4db72f16210b0a991b2c134d6763a4cc" args="() const " -->
-bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#4db72f16210b0a991b2c134d6763a4cc">is_group_execution_cancelled</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor, releases the write lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="aea1cb0e88be9874f0f72e52063d0b90"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::operator new" ref="aea1cb0e88be9874f0f72e52063d0b90" args="(size_t s)" -->
+void * </td><td class="memItemRight" valign="bottom"><b>operator new</b> (size_t s)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if the context received cancellation request. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#d97c8a03615594b71b4ef06ff75cf561">register_pending_exception</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db804a05fcd37f7e81b94752e45039f7"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::operator delete" ref="db804a05fcd37f7e81b94752e45039f7" args="(void *p)" -->
+void </td><td class="memItemRight" valign="bottom"><b>operator delete</b> (void *p)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Records the pending exception, and cancels the task group.  <a href="#d97c8a03615594b71b4ef06ff75cf561"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c4272d4d9ab65d600ca70fc2c8c4b039"></a><!-- doxytag: member="tbb::task_group_context::set_priority" ref="c4272d4d9ab65d600ca70fc2c8c4b039" args="(priority_t)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#c4272d4d9ab65d600ca70fc2c8c4b039">set_priority</a> (priority_t)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Changes priority of the task grop. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2f2342b9e6c9c03703248ac13ad0271d"></a><!-- doxytag: member="tbb::task_group_context::priority" ref="2f2342b9e6c9c03703248ac13ad0271d" args="() const " -->
-priority_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#2f2342b9e6c9c03703248ac13ad0271d">priority</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Retrieves current priority of the current task group. <br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html#49a55352084fd44b8863d182e839e6dc">init</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Out-of-line part of the constructor.  <a href="#49a55352084fd44b8863d182e839e6dc"></a><br></td></tr>
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fdfd61b0801af54e93367fc2d02cb54a"></a><!-- doxytag: member="tbb::task_group_context::internal::generic_scheduler" ref="fdfd61b0801af54e93367fc2d02cb54a" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::generic_scheduler</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="087690120218a0868a4a91ef388319af"></a><!-- doxytag: member="tbb::task_group_context::task_scheduler_init" ref="087690120218a0868a4a91ef388319af" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>task_scheduler_init</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e656073628561c8fd68f6134d527e2de"></a><!-- doxytag: member="tbb::task_group_context::task" ref="e656073628561c8fd68f6134d527e2de" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>task</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ecedb9436fb30df30cb3a52c64bb97e5"></a><!-- doxytag: member="tbb::task_group_context::internal::allocate_root_with_context_proxy" ref="ecedb9436fb30df30cb3a52c64bb97e5" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>internal::allocate_root_with_context_proxy</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="38eb53abbe72543f5967c63aa95b403e"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock::reader_writer_lock" ref="38eb53abbe72543f5967c63aa95b403e" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>reader_writer_lock</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Used to form groups of tasks. 
-<p>
-The context services explicit cancellation requests from user code, and unhandled exceptions intercepted during tasks execution. Intercepting an exception results in generating internal cancellation requests (which is processed in exactly the same way as external ones).<p>
-The context is associated with one or more root tasks and defines the cancellation group that includes all the descendants of the corresponding root task(s). Association is established when a context object is passed as an argument to the <a class="el" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root()</a> method. See <a class="el" href="a00293.html#19fee08fb8ac98adccfe69c1aa63c491">task_group_context::task_group_context</a> for more details.<p>
-The context can be bound to another one, and other contexts can be bound to it, forming a tree-like structure: parent -> this -> children. Arrows here designate cancellation propagation direction. If a task in a cancellation group is canceled all the other tasks in this group and groups bound to it (as children) get canceled too.<p>
-IMPLEMENTATION NOTE: When adding new members to <a class="el" href="a00293.html">task_group_context</a> or changing types of existing ones, update the size of both padding buffers (_leading_padding and _trailing_padding) appropriately. See also VERSIONING NOTE at the constructor definition below. 
-<p>
-<hr><h2>Constructor & Destructor Documentation</h2>
-<a class="anchor" name="19fee08fb8ac98adccfe69c1aa63c491"></a><!-- doxytag: member="tbb::task_group_context::task_group_context" ref="19fee08fb8ac98adccfe69c1aa63c491" args="(kind_type relation_with_parent=bound, uintptr_t traits=default_traits)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">tbb::task_group_context::task_group_context           </td>
-          <td>(</td>
-          <td class="paramtype">kind_type </td>
-          <td class="paramname"> <em>relation_with_parent</em> = <code>bound</code>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">uintptr_t </td>
-          <td class="paramname"> <em>traits</em> = <code>default_traits</code></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"><code> [inline]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Default & binding constructor. 
-<p>
-By default a bound context is created. That is this context will be bound (as child) to the context of the task calling task::allocate_root(this_context) method. Cancellation requests passed to the parent context are propagated to all the contexts bound to it. Similarly priority change is propagated from the parent context to its children.<p>
-If task_group_context::isolated is used as the argument, then the tasks associated with this context will never be affected by events in any other context.<p>
-Creating isolated contexts involve much less overhead, but they have limited utility. Normally when an exception occurs in an algorithm that has nested ones running, it is desirably to have all the nested algorithms canceled as well. Such a behavior requires nested algorithms to use bound contexts.<p>
-There is one good place where using isolated algorithms is beneficial. It is a master thread. That is if a particular algorithm is invoked directly from the master thread (not from a TBB task), supplying it with explicitly created isolated context will result in a faster algorithm startup.<p>
-VERSIONING NOTE: Implementation(s) of <a class="el" href="a00293.html">task_group_context</a> constructor(s) cannot be made entirely out-of-line because the run-time version must be set by the user code. This will become critically important for binary compatibility, if we ever have to change the size of the context object.<p>
-Boosting the runtime version will also be necessary if new data fields are introduced in the currently unused padding areas and these fields are updated by inline methods. 
-</div>
-</div><p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="8bcdfdf4e6bfb76125b6de15c00b571d"></a><!-- doxytag: member="tbb::task_group_context::cancel_group_execution" ref="8bcdfdf4e6bfb76125b6de15c00b571d" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">bool __TBB_EXPORTED_METHOD tbb::task_group_context::cancel_group_execution           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Initiates cancellation of all tasks in this cancellation group and its subordinate groups. 
-<p>
-<dl compact><dt><b>Returns:</b></dt><dd>false if cancellation has already been requested, true otherwise.</dd></dl>
-Note that canceling never fails. When false is returned, it just means that another thread (or this one) has already sent cancellation request to this context or to one of its ancestors (if this context is bound). It is guaranteed that when this method is concurrently called on the same not yet cancelled context, true will be returned by one and only one invocation. 
-</div>
-</div><p>
-<a class="anchor" name="49a55352084fd44b8863d182e839e6dc"></a><!-- doxytag: member="tbb::task_group_context::init" ref="49a55352084fd44b8863d182e839e6dc" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void __TBB_EXPORTED_METHOD tbb::task_group_context::init           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [protected]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Out-of-line part of the constructor. 
-<p>
-Singled out to ensure backward binary compatibility of the future versions. 
-</div>
-</div><p>
-<a class="anchor" name="d97c8a03615594b71b4ef06ff75cf561"></a><!-- doxytag: member="tbb::task_group_context::register_pending_exception" ref="d97c8a03615594b71b4ef06ff75cf561" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void __TBB_EXPORTED_METHOD tbb::task_group_context::register_pending_exception           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Records the pending exception, and cancels the task group. 
-<p>
-May be called only from inside a catch-block. If the context is already canceled, does nothing. The method brings the task group associated with this context exactly into the state it would be in, if one of its tasks threw the currently pending exception during its execution. In other words, it emulates the actions of the scheduler's dispatch loop exception handler. 
-</div>
-</div><p>
-<a class="anchor" name="6d30d16bf1cd22f86c6afaf29c2b430c"></a><!-- doxytag: member="tbb::task_group_context::reset" ref="6d30d16bf1cd22f86c6afaf29c2b430c" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void __TBB_EXPORTED_METHOD tbb::task_group_context::reset           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
+The scoped lock pattern for write locks. 
 <p>
-Forcefully reinitializes the context after the task tree it was associated with is completed. 
+Scoped locks help avoid the common problem of forgetting to release the lock. This type also serves as the node for queuing locks. 
 <p>
-Because the method assumes that all the tasks that used to be associated with this context have already finished, calling it while the context is still in use somewhere in the task hierarchy leads to undefined behavior.<p>
-IMPORTANT: This method is not thread safe!<p>
-The method does not change the context's parent if it is set. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00567.html">task.h</a></ul>
+<li><a class="el" href="a00559.html">reader_writer_lock.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00294.html b/doc/html/a00294.html
index 4656519..dd4f498 100644
--- a/doc/html/a00294.html
+++ b/doc/html/a00294.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::task_list Class Reference</title>
+<title>tbb::interface5::reader_writer_lock::scoped_lock_read Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,57 +21,39 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00294.html">task_list</a></div>
-<h1>tbb::task_list Class Reference<br>
-<small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task_list" -->A list of children.  
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<a class="el" href="a00292.html">reader_writer_lock</a>::<a class="el" href="a00294.html">scoped_lock_read</a></div>
+<h1>tbb::interface5::reader_writer_lock::scoped_lock_read Class Reference</h1><!-- doxytag: class="tbb::interface5::reader_writer_lock::scoped_lock_read" -->The scoped lock pattern for read locks.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00567.html">task.h</a>></code>
+<code>#include <<a class="el" href="a00559.html">reader_writer_lock.h</a>></code>
 <p>
-<a href="a00121.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00102.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="416341c2047eaef50417b41eaf7e9de6"></a><!-- doxytag: member="tbb::task_list::task_list" ref="416341c2047eaef50417b41eaf7e9de6" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#416341c2047eaef50417b41eaf7e9de6">task_list</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="87ab0dc8f7216e6ba0f7acd6aec33064"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::scoped_lock_read" ref="87ab0dc8f7216e6ba0f7acd6aec33064" args="(reader_writer_lock &lock)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#87ab0dc8f7216e6ba0f7acd6aec33064">scoped_lock_read</a> (<a class="el" href="a00292.html">reader_writer_lock</a> &lock)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty list. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6d438f1499a02db1e59c24ab6043e5ba"></a><!-- doxytag: member="tbb::task_list::~task_list" ref="6d438f1499a02db1e59c24ab6043e5ba" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct with blocking attempt to acquire read lock on the passed-in lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd21c5f3d555d64d1de8658e15bf4966"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::~scoped_lock_read" ref="bd21c5f3d555d64d1de8658e15bf4966" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys the list, but does not destroy the task objects. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f3ac31e092814b90929f81bb30441959"></a><!-- doxytag: member="tbb::task_list::empty" ref="f3ac31e092814b90929f81bb30441959" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#f3ac31e092814b90929f81bb30441959">empty</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor, releases the read lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f09e1817dddf97cc2182a573945eef91"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::operator new" ref="f09e1817dddf97cc2182a573945eef91" args="(size_t s)" -->
+void * </td><td class="memItemRight" valign="bottom"><b>operator new</b> (size_t s)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">True if list if empty; false otherwise. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4cd34756bc4763dafb8c84838a0124ff"></a><!-- doxytag: member="tbb::task_list::push_back" ref="4cd34756bc4763dafb8c84838a0124ff" args="(task &task)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a> (<a class="el" href="a00291.html">task</a> &<a class="el" href="a00291.html">task</a>)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f9e148ec33895c0d2669ff6820cf164"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::operator delete" ref="4f9e148ec33895c0d2669ff6820cf164" args="(void *p)" -->
+void </td><td class="memItemRight" valign="bottom"><b>operator delete</b> (void *p)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Push task onto back of list. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fe85df5ed524418389d34051750347d"></a><!-- doxytag: member="tbb::task_list::pop_front" ref="5fe85df5ed524418389d34051750347d" args="()" -->
-<a class="el" href="a00291.html">task</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#5fe85df5ed524418389d34051750347d">pop_front</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pop the front task from the list. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fce446ee13e025969945328f3ff59b95"></a><!-- doxytag: member="tbb::task_list::clear" ref="fce446ee13e025969945328f3ff59b95" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#fce446ee13e025969945328f3ff59b95">clear</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the list. <br></td></tr>
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e656073628561c8fd68f6134d527e2de"></a><!-- doxytag: member="tbb::task_list::task" ref="e656073628561c8fd68f6134d527e2de" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>task</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="81d0122aee4ddae419a743ee50d7038e"></a><!-- doxytag: member="tbb::task_list::interface5::internal::task_base" ref="81d0122aee4ddae419a743ee50d7038e" args="" -->
-class </td><td class="memItemRight" valign="bottom"><b>interface5::internal::task_base</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="38eb53abbe72543f5967c63aa95b403e"></a><!-- doxytag: member="tbb::interface5::reader_writer_lock::scoped_lock_read::reader_writer_lock" ref="38eb53abbe72543f5967c63aa95b403e" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>reader_writer_lock</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-A list of children. 
-<p>
-Used for method task::spawn_children 
+The scoped lock pattern for read locks. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00567.html">task.h</a></ul>
+<li><a class="el" href="a00559.html">reader_writer_lock.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00295.html b/doc/html/a00295.html
index a485399..8589e2a 100644
--- a/doc/html/a00295.html
+++ b/doc/html/a00295.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::task_scheduler_init Class Reference</title>
+<title>tbb::flow::interface6::receiver< T > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,142 +21,60 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00295.html">task_scheduler_init</a></div>
-<h1>tbb::task_scheduler_init Class Reference<br>
-<small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
-</h1><!-- doxytag: class="tbb::task_scheduler_init" -->Class delimiting the scope of task scheduler activity.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00295.html">receiver</a></div>
+<h1>tbb::flow::interface6::receiver< T > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::receiver" -->Pure virtual template class that defines a receiver of messages of type T.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00584.html">task_scheduler_init.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<a href="a00128.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::receiver< T >:
+<p><center><img src="a00295.png" usemap="#tbb::flow::interface6::receiver< T >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::receiver< T >_map">
+<area href="a00236.html" alt="tbb::flow::interface6::broadcast_node< T >" shape="rect" coords="0,56,352,80">
+<area href="a00237.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="362,56,714,80">
+<area href="a00253.html" alt="tbb::flow::interface6::continue_receiver" shape="rect" coords="724,56,1076,80">
+<area href="a00266.html" alt="tbb::flow::interface6::limiter_node< T >" shape="rect" coords="1086,56,1438,80">
+<area href="a00286.html" alt="tbb::flow::interface6::priority_queue_node< T, Compare, A >" shape="rect" coords="181,112,533,136">
+<area href="a00287.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="543,112,895,136">
+<area href="a00302.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="543,168,895,192">
+</map>
+<a href="a00042.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#d476053cc712e572554823492a5229ce">initialize</a> (int number_of_threads=<a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Ensure that scheduler exists for this thread.  <a href="#d476053cc712e572554823492a5229ce"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a> (int number_of_threads, stack_size_type thread_stack_size)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The overloaded method with stack size parameter.  <a href="#d5ed214a8bb53b0466ed91ff4734b9a3"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f73257e04cb7fb9bd5be2b635d9016f1"></a><!-- doxytag: member="tbb::task_scheduler_init::terminate" ref="f73257e04cb7fb9bd5be2b635d9016f1" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Inverse of method initialize. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="421600bf9bf9338bcf937063f2ff0e90"></a><!-- doxytag: member="tbb::task_scheduler_init::task_scheduler_init" ref="421600bf9bf9338bcf937063f2ff0e90" args="(int number_of_threads=automatic, stack_size_type thread_stack_size=0)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a> (int number_of_threads=<a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0)</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0d0524c99313dedea1e04464bbf2f7ef"></a><!-- doxytag: member="tbb::flow::interface6::receiver::input_type" ref="0d0524c99313dedea1e04464bbf2f7ef" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#0d0524c99313dedea1e04464bbf2f7ef">input_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Shorthand for default constructor followed by call to initialize(number_of_threads). <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4da6c86292d80c703a66c1f6f5299488"></a><!-- doxytag: member="tbb::task_scheduler_init::~task_scheduler_init" ref="4da6c86292d80c703a66c1f6f5299488" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7fa8cff811e7c1589b805a4bb4c7a74f"></a><!-- doxytag: member="tbb::flow::interface6::receiver::predecessor_type" ref="7fa8cff811e7c1589b805a4bb4c7a74f" args="" -->
+typedef <a class="el" href="a00301.html">sender</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#7fa8cff811e7c1589b805a4bb4c7a74f">predecessor_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy scheduler for this thread if thread has no other live task_scheduler_inits. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="12752282977029f23416642bc03e8b74"></a><!-- doxytag: member="tbb::task_scheduler_init::is_active" ref="12752282977029f23416642bc03e8b74" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#12752282977029f23416642bc03e8b74">is_active</a> () const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b00699b235435f7b65b663d5063624a1"></a><!-- doxytag: member="tbb::flow::interface6::receiver::~receiver" ref="b00699b235435f7b65b663d5063624a1" args="()" -->
+virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if scheduler is active (initialized); false otherwise. <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c6d5d0cb8ebe5771be91933609fe31b8"></a><!-- doxytag: member="tbb::flow::interface6::receiver::try_put" ref="c6d5d0cb8ebe5771be91933609fe31b8" args="(const T &t)=0" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#c6d5d0cb8ebe5771be91933609fe31b8">try_put</a> (const T &t)=0</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the number of threads TBB scheduler would create if initialized by default.  <a href="#ba00714c33a41a3c2216f48613971cab"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f5988e2b0fbb2d533fcbb7f2583743f"></a><!-- doxytag: member="tbb::task_scheduler_init::automatic" ref="8f5988e2b0fbb2d533fcbb7f2583743f" args="" -->
-static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Put an item to the receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="30e3316466efe3a713c23062b6e806f3"></a><!-- doxytag: member="tbb::flow::interface6::receiver::register_predecessor" ref="30e3316466efe3a713c23062b6e806f3" args="(predecessor_type &)" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a> (<a class="el" href="a00301.html">predecessor_type</a> &)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Typedef for number of threads that is automatic. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e6c860f1e559026ff3ef4599c0d6c514"></a><!-- doxytag: member="tbb::task_scheduler_init::deferred" ref="e6c860f1e559026ff3ef4599c0d6c514" args="" -->
-static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a predecessor to the node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3bc76547b51d3c9b633e3987d22dce95"></a><!-- doxytag: member="tbb::flow::interface6::receiver::remove_predecessor" ref="3bc76547b51d3c9b633e3987d22dce95" args="(predecessor_type &)" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a> (<a class="el" href="a00301.html">predecessor_type</a> &)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Argument to <a class="el" href="a00295.html#d476053cc712e572554823492a5229ce">initialize()</a> or constructor that causes initialization to be deferred. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove a predecessor from the node. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Class delimiting the scope of task scheduler activity. 
-<p>
-A thread can construct a <a class="el" href="a00295.html">task_scheduler_init</a> object and keep it alive while it uses TBB's tasking subsystem (including parallel algorithms).<p>
-This class allows to customize properties of the TBB task pool to some extent. For example it can limit concurrency level of parallel work initiated by the given thread. It also can be used to specify stack size of the TBB worker threads, though this setting is not effective if the thread pool has already been created.<p>
-If a parallel construct is used without <a class="el" href="a00295.html">task_scheduler_init</a> object previously created, the scheduler will be initialized automatically with default settings, and will persist until this thread exits. Default concurrency level is defined as described in <a class="el" href="a00295.html#d476053cc712e572554823492a5229ce">task_scheduler_init::initialize()</a>. 
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="ba00714c33a41a3c2216f48613971cab"></a><!-- doxytag: member="tbb::task_scheduler_init::default_num_threads" ref="ba00714c33a41a3c2216f48613971cab" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">static int __TBB_EXPORTED_FUNC tbb::task_scheduler_init::default_num_threads           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"><code> [static]</code></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T><br>
+ class tbb::flow::interface6::receiver< T ></h3>
 
+Pure virtual template class that defines a receiver of messages of type T. 
 <p>
-Returns the number of threads TBB scheduler would create if initialized by default. 
-<p>
-Result returned by this method does not depend on whether the scheduler has already been initialized.<p>
-Because tbb 2.0 does not support blocking tasks yet, you may use this method to boost the number of threads in the tbb's internal pool, if your tasks are doing I/O operations. The optimal number of additional threads depends on how much time your tasks spend in the blocked state.<p>
-Before TBB 3.0 U4 this method returned the number of logical CPU in the system. Currently on Windows, Linux and FreeBSD it returns the number of logical CPUs available to the current process in accordance with its affinity mask.<p>
-NOTE: The return value of this method never changes after its first invocation. This means that changes in the process affinity mask that took place after this method was first invoked will not affect the number of worker threads in the TBB worker threads pool. 
-</div>
-</div><p>
-<a class="anchor" name="d5ed214a8bb53b0466ed91ff4734b9a3"></a><!-- doxytag: member="tbb::task_scheduler_init::initialize" ref="d5ed214a8bb53b0466ed91ff4734b9a3" args="(int number_of_threads, stack_size_type thread_stack_size)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void __TBB_EXPORTED_METHOD tbb::task_scheduler_init::initialize           </td>
-          <td>(</td>
-          <td class="paramtype">int </td>
-          <td class="paramname"> <em>number_of_threads</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">stack_size_type </td>
-          <td class="paramname"> <em>thread_stack_size</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-The overloaded method with stack size parameter. 
-<p>
-Overloading is necessary to preserve ABI compatibility 
-</div>
-</div><p>
-<a class="anchor" name="d476053cc712e572554823492a5229ce"></a><!-- doxytag: member="tbb::task_scheduler_init::initialize" ref="d476053cc712e572554823492a5229ce" args="(int number_of_threads=automatic)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void __TBB_EXPORTED_METHOD tbb::task_scheduler_init::initialize           </td>
-          <td>(</td>
-          <td class="paramtype">int </td>
-          <td class="paramname"> <em>number_of_threads</em> = <code><a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></code>          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-Ensure that scheduler exists for this thread. 
-<p>
-A value of -1 lets TBB decide on the number of threads, which is usually maximal hardware concurrency for this process, that is the number of logical CPUs on the machine (possibly limited by the processor affinity mask of this process (Windows) or of this thread (Linux, FreeBSD). It is preferable option for production code because it helps to avoid nasty surprises when several TBB based components run side-by-side or in a nested fashion inside the same process.<p>
-The number_of_threads is ignored if any other task_scheduler_inits currently exist. A thread may construct multiple task_scheduler_inits. Doing so does no harm because the underlying scheduler is reference counted. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00584.html">task_scheduler_init.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00295.png b/doc/html/a00295.png
new file mode 100644
index 0000000..73ffc73
Binary files /dev/null and b/doc/html/a00295.png differ
diff --git a/doc/html/a00296.html b/doc/html/a00296.html
index 6c0662e..022bbab 100644
--- a/doc/html/a00296.html
+++ b/doc/html/a00296.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::tbb_allocator< T > Class Template Reference</title>
+<title>tbb::recursive_mutex Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,104 +21,92 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00296.html">tbb_allocator</a></div>
-<h1>tbb::tbb_allocator< T > Class Template Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00296.html">recursive_mutex</a></div>
+<h1>tbb::recursive_mutex Class Reference<br>
 <small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::tbb_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  
+[<a class="el" href="a00398.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::recursive_mutex" -->Mutex that allows recursive mutex acquisition.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00588.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00560.html">recursive_mutex.h</a>></code>
 <p>
-<a href="a00130.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00103.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3cdd9619bc0a802763e7823068f83a4c"></a><!-- doxytag: member="tbb::tbb_allocator::value_type" ref="3cdd9619bc0a802763e7823068f83a4c" args="" -->
-typedef internal::allocator_type<<br>
- T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="889fa8cc32dd707eef7c0f52dda09c0d"></a><!-- doxytag: member="tbb::recursive_mutex::native_handle_type" ref="889fa8cc32dd707eef7c0f52dda09c0d" args="" -->
+typedef LPCRITICAL_SECTION </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f979d0e74d7c6e5aeb0d26408776a9e1"></a><!-- doxytag: member="tbb::tbb_allocator::pointer" ref="f979d0e74d7c6e5aeb0d26408776a9e1" args="" -->
-typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Return native_handle. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="26a40fae42bf6cd9f3f77ee7482d6164"></a><!-- doxytag: member="tbb::recursive_mutex::native_handle_type" ref="26a40fae42bf6cd9f3f77ee7482d6164" args="" -->
+typedef pthread_mutex_t * </td><td class="memItemRight" valign="bottom"><b>native_handle_type</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1622504886ef265016a5821d61bf7adc"></a><!-- doxytag: member="tbb::tbb_allocator::const_pointer" ref="1622504886ef265016a5821d61bf7adc" args="" -->
-typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b8e58d23c5c98fd65d4432c1e324f4c0"></a><!-- doxytag: member="tbb::tbb_allocator::reference" ref="b8e58d23c5c98fd65d4432c1e324f4c0" args="" -->
-typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="532f36f99650b1c26a2b8899383c5411"></a><!-- doxytag: member="tbb::tbb_allocator::const_reference" ref="532f36f99650b1c26a2b8899383c5411" args="" -->
-typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="639df0fb169cfcb94ba1b12429b736f4"></a><!-- doxytag: member="tbb::tbb_allocator::size_type" ref="639df0fb169cfcb94ba1b12429b736f4" args="" -->
-typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="54828b5d0b937d608f76650a5df0e39f"></a><!-- doxytag: member="tbb::tbb_allocator::difference_type" ref="54828b5d0b937d608f76650a5df0e39f" args="" -->
-typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09a7f81fb2c3055aaecf058b11538544d524c717485b74aa552fb45b45562cb5"></a><!-- doxytag: member="tbb::tbb_allocator::scalable" ref="09a7f81fb2c3055aaecf058b11538544d524c717485b74aa552fb45b45562cb5" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>scalable</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09a7f81fb2c3055aaecf058b11538544e108c3168e3be5de1d98e74723136fbf"></a><!-- doxytag: member="tbb::tbb_allocator::standard" ref="09a7f81fb2c3055aaecf058b11538544e108c3168e3be5de1d98e74723136fbf" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>standard</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> { <b>scalable</b>, 
-<b>standard</b>
- }</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Specifies current allocator. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d85cd071047b52eeb207d458d54098cc"></a><!-- doxytag: member="tbb::tbb_allocator::tbb_allocator" ref="d85cd071047b52eeb207d458d54098cc" args="(const tbb_allocator &)" -->
- </td><td class="memItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00296.html">tbb_allocator</a> &)  throw ()</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="5c3cb04a50d15d38f4c66ca3e5d2f6af"></a><!-- doxytag: member="tbb::tbb_allocator::tbb_allocator" ref="5c3cb04a50d15d38f4c66ca3e5d2f6af" args="(const tbb_allocator< U > &)" -->
-template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00296.html">tbb_allocator</a>< U > &)  throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2fceb7f95c24a8cd1457d4527e4b8c6"></a><!-- doxytag: member="tbb::recursive_mutex::recursive_mutex" ref="d2fceb7f95c24a8cd1457d4527e4b8c6" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="08d3822344271d0a1c2e64e8c9c16b58"></a><!-- doxytag: member="tbb::tbb_allocator::address" ref="08d3822344271d0a1c2e64e8c9c16b58" args="(reference x) const " -->
-pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired <a class="el" href="a00296.html">recursive_mutex</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c342c69d47f4bb0b393535dee4015d6"></a><!-- doxytag: member="tbb::recursive_mutex::lock" ref="4c342c69d47f4bb0b393535dee4015d6" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#4c342c69d47f4bb0b393535dee4015d6">lock</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2b388f25858f783d995d61506de24656"></a><!-- doxytag: member="tbb::tbb_allocator::address" ref="2b388f25858f783d995d61506de24656" args="(const_reference x) const " -->
-const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#86e719b0afee25704af11ab97694d240">try_lock</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f6cb487b1bdce0b581f265a77dca6d53"></a><!-- doxytag: member="tbb::tbb_allocator::allocate" ref="f6cb487b1bdce0b581f265a77dca6d53" args="(size_type n, const void *=0)" -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a> (size_type n, const void *=0)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking).  <a href="#86e719b0afee25704af11ab97694d240"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f0a96e26b7f074588dc31e32524856ae"></a><!-- doxytag: member="tbb::recursive_mutex::unlock" ref="f0a96e26b7f074588dc31e32524856ae" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#f0a96e26b7f074588dc31e32524856ae">unlock</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fdd011fdf2f9ad07006dc7c0a7ec1da2"></a><!-- doxytag: member="tbb::tbb_allocator::deallocate" ref="fdd011fdf2f9ad07006dc7c0a7ec1da2" args="(pointer p, size_type)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a> (pointer p, size_type)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6baa9ce4b394c39622456fd8a68f8bd8"></a><!-- doxytag: member="tbb::recursive_mutex::native_handle" ref="6baa9ce4b394c39622456fd8a68f8bd8" args="()" -->
+<a class="el" href="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> </td><td class="memItemRight" valign="bottom"><b>native_handle</b> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Free previously allocated block of memory. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f059ca2c96243024f0d562ee3a87a3a5"></a><!-- doxytag: member="tbb::tbb_allocator::max_size" ref="f059ca2c96243024f0d562ee3a87a3a5" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a> () const   throw ()</td></tr>
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="718cc53f6b33d8c396ccca0e4ebc5606"></a><!-- doxytag: member="tbb::recursive_mutex::is_rw_mutex" ref="718cc53f6b33d8c396ccca0e4ebc5606" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ab228ab9e324ed041c2226e1d717df5f"></a><!-- doxytag: member="tbb::tbb_allocator::construct" ref="ab228ab9e324ed041c2226e1d717df5f" args="(pointer p, const value_type &value)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">construct</a> (pointer p, const value_type &value)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f6149d7541063d8b35afd98df6f0f89d"></a><!-- doxytag: member="tbb::recursive_mutex::is_recursive_mutex" ref="f6149d7541063d8b35afd98df6f0f89d" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = true</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ef133522bf55f05a605bee0763208281"></a><!-- doxytag: member="tbb::tbb_allocator::destroy" ref="ef133522bf55f05a605bee0763208281" args="(pointer p)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#ef133522bf55f05a605bee0763208281">destroy</a> (pointer p)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f01aacad6b9b9d51573c0803323182fe"></a><!-- doxytag: member="tbb::recursive_mutex::is_fair_mutex" ref="f01aacad6b9b9d51573c0803323182fe" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy value at location pointed to by p. <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="78701e7454ef8e1a25b5acd364367080"></a><!-- doxytag: member="tbb::tbb_allocator::allocator_type" ref="78701e7454ef8e1a25b5acd364367080" args="()" -->
-static <a class="el" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a> ()</td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns current allocator. <br></td></tr>
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00297.html">scoped_lock</a></td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern.  <a href="a00297.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::tbb_allocator< T ></h3>
+Mutex that allows recursive mutex acquisition. 
+<p>
+Mutex that allows recursive mutex acquisition. 
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="86e719b0afee25704af11ab97694d240"></a><!-- doxytag: member="tbb::recursive_mutex::try_lock" ref="86e719b0afee25704af11ab97694d240" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool tbb::recursive_mutex::try_lock           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
 
-Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. 
 <p>
-The class selects the best memory allocation mechanism available from scalable_malloc and standard malloc. The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard. 
+Try acquiring lock (non-blocking). 
 <p>
+Return true if lock acquired; false otherwise. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00588.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00560.html">recursive_mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00297.html b/doc/html/a00297.html
index 3a727da..ab61ed6 100644
--- a/doc/html/a00297.html
+++ b/doc/html/a00297.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::tbb_allocator< void > Class Template Reference</title>
+<title>tbb::recursive_mutex::scoped_lock Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,39 +21,51 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00297.html">tbb_allocator< void ></a></div>
-<h1>tbb::tbb_allocator< void > Class Template Reference<br>
-<small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::tbb_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00296.html">recursive_mutex</a>::<a class="el" href="a00297.html">scoped_lock</a></div>
+<h1>tbb::recursive_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::recursive_mutex::scoped_lock" -->The scoped locking pattern.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00588.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00560.html">recursive_mutex.h</a>></code>
 <p>
-<a href="a00132.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00104.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="05f5ff584890407c8d672e4b4378744d"></a><!-- doxytag: member="tbb::tbb_allocator< void >::pointer" ref="05f5ff584890407c8d672e4b4378744d" args="" -->
-typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d82d4d36fbf9727a493d26ae50855fe7"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::scoped_lock" ref="d82d4d36fbf9727a493d26ae50855fe7" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00297.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="33e64ba71f06ef24a5093415185e66cb"></a><!-- doxytag: member="tbb::tbb_allocator< void >::const_pointer" ref="33e64ba71f06ef24a5093415185e66cb" args="" -->
-typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a <a class="el" href="a00296.html">recursive_mutex</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dec17713c4c1321ac8fec66816d0c602"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::scoped_lock" ref="dec17713c4c1321ac8fec66816d0c602" args="(recursive_mutex &mutex)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00297.html#dec17713c4c1321ac8fec66816d0c602">scoped_lock</a> (<a class="el" href="a00296.html">recursive_mutex</a> &<a class="el" href="a00275.html">mutex</a>)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="81595a776b9d206a92caa526cad9c637"></a><!-- doxytag: member="tbb::tbb_allocator< void >::value_type" ref="81595a776b9d206a92caa526cad9c637" args="" -->
-typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c1197ffb8f3cd9d4fed71d7e06265b7c"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::~scoped_lock" ref="c1197ffb8f3cd9d4fed71d7e06265b7c" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00297.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a> ()</td></tr>
 
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7fb04da37cccf8c99b1f9102d9074f9a"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::acquire" ref="7fb04da37cccf8c99b1f9102d9074f9a" args="(recursive_mutex &mutex)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a> (<a class="el" href="a00296.html">recursive_mutex</a> &<a class="el" href="a00275.html">mutex</a>)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="36bfc3e93e3ef6340abef4901444d340"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::try_acquire" ref="36bfc3e93e3ef6340abef4901444d340" args="(recursive_mutex &mutex)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00297.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a> (<a class="el" href="a00296.html">recursive_mutex</a> &<a class="el" href="a00275.html">mutex</a>)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given <a class="el" href="a00296.html">recursive_mutex</a>. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac480ea0e9d5ea0345a67d57008b6263"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::release" ref="ac480ea0e9d5ea0345a67d57008b6263" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00297.html#ac480ea0e9d5ea0345a67d57008b6263">release</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="459818b78a3e9985dc5a9d5638b6593e"></a><!-- doxytag: member="tbb::recursive_mutex::scoped_lock::recursive_mutex" ref="459818b78a3e9985dc5a9d5638b6593e" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>recursive_mutex</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<><br>
- class tbb::tbb_allocator< void ></h3>
-
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. 
+The scoped locking pattern. 
+<p>
+It helps to avoid the common problem of forgetting to release lock. It also nicely provides the "node" for queuing locks. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00588.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00560.html">recursive_mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00298.html b/doc/html/a00298.html
index 057f3cc..bc032fb 100644
--- a/doc/html/a00298.html
+++ b/doc/html/a00298.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::tbb_exception Class Reference</title>
+<title>tbb::interface6::runtime_loader Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,142 +21,299 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00298.html">tbb_exception</a></div>
-<h1>tbb::tbb_exception Class Reference</h1><!-- doxytag: class="tbb::tbb_exception" -->Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.  
+<a class="el" href="a00383.html">tbb</a>::<b>interface6</b>::<a class="el" href="a00298.html">runtime_loader</a></div>
+<h1>tbb::interface6::runtime_loader Class Reference</h1><!-- doxytag: class="tbb::interface6::runtime_loader" -->Load TBB at runtime.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00561.html">runtime_loader.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::tbb_exception:
-<p><center><img src="a00298.png" usemap="#tbb::tbb_exception_map" border="0" alt=""></center>
-<map name="tbb::tbb_exception_map">
-<area href="a00228.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
-<area href="a00257.html" alt="tbb::movable_exception< ExceptionData >" shape="rect" coords="258,56,506,80">
-</map>
-<a href="a00142.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00105.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual <a class="el" href="a00298.html">tbb_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> ()=0  throw ()</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Save status of operation and continue.  <a href="#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Throw an exception of tbb::runtime_loader::error_code type.  <a href="#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Print message to <code>stderr</code> and call <code>abort()</code>.  <a href="#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object.  <a href="#3e3482bf264d4ca4dde046cd9c02c766"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> ()=0  throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">No errors.  <a href="#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method.  <a href="#66c94938eca8bf88b76f3eccaaf215d8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> ()=0</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Invalid function call (e. g. <a class="el" href="a00298.html#5f3f6f1683386705a6931acae45f0862">load()</a> called when TBB is already loaded).  <a href="#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object.  <a href="#8588e07fa49692f4d734e4f2e4f048f4"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d00f6497e552fee978a02bfcbebf46e2"></a><!-- doxytag: member="tbb::tbb_exception::name" ref="d00f6497e552fee978a02bfcbebf46e2" args="() const =0" -->
-virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#d00f6497e552fee978a02bfcbebf46e2">name</a> () const =0  throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Invalid argument passed.  <a href="#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8157689ecb66bc6c72d3618bf3cc371"></a><!-- doxytag: member="tbb::tbb_exception::what" ref="e8157689ecb66bc6c72d3618bf3cc371" args="() const =0" -->
-virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">what</a> () const =0  throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Invalid library found (e. g. <code>TBB_runtime_version</code> symbol not found).  <a href="#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">what()</a> method. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a> (void *p)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">TBB found but version is not suitable.  <a href="#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">ec_no_lib</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">No suitable TBB library found.  <a href="#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> { <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a>, 
+<a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a>, 
+<a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a>
+ }</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Error mode constants.  <a href="a00298.html#bb0130fe0f596399707e61431231ebcb">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> { <br>
+  <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a>, 
+<a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a>, 
+<a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a>, 
+<a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a>, 
+<br>
+  <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a>, 
+<a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">ec_no_lib</a>
+<br>
+ }</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Error codes.  <a href="a00298.html#6831be91cdc64e57e565ce0dde018789">More...</a><br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7caa4ff6e44c2348e67f601cc5d97c34"></a><!-- doxytag: member="tbb::interface6::runtime_loader::runtime_loader" ref="7caa4ff6e44c2348e67f601cc5d97c34" args="(error_mode mode=em_abort)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#7caa4ff6e44c2348e67f601cc5d97c34">runtime_loader</a> (<a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> mode=em_abort)</td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Initialize object but do not load TBB. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#7ae5330beb48fce0c702c32a5df0094a">runtime_loader</a> (char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX, <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> mode=em_abort)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Initialize object and load TBB.  <a href="#7ae5330beb48fce0c702c32a5df0094a"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c25fec923a751a3e03f5cbe969f1f0c5"></a><!-- doxytag: member="tbb::interface6::runtime_loader::~runtime_loader" ref="c25fec923a751a3e03f5cbe969f1f0c5" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#c25fec923a751a3e03f5cbe969f1f0c5">~runtime_loader</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy object. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#5f3f6f1683386705a6931acae45f0862">load</a> (char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Load TBB.  <a href="#5f3f6f1683386705a6931acae45f0862"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#78d938ed2e54d38dd38d6609e6c60389">status</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Report status.  <a href="#78d938ed2e54d38dd38d6609e6c60389"></a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Interface to be implemented by all exceptions TBB recognizes and propagates across the threads. 
+Load TBB at runtime. 
 <p>
-If an unhandled exception of the type derived from <a class="el" href="a00298.html">tbb::tbb_exception</a> is intercepted by the TBB scheduler in one of the worker threads, it is delivered to and re-thrown in the root thread. The root thread is the thread that has started the outermost algorithm or root task sharing the same <a class="el" href="a00293.html">task_group_context</a> with the guilty algorithm/task (the one that threw the exception first).<p>
-Note: when documentation mentions workers with respect to exception handling, masters are implied as well, because they are completely equivalent in this context. Consequently a root thread can be master or worker thread.<p>
-NOTE: In case of nested algorithms or complex task hierarchies when the nested levels share (explicitly or by means of implicit inheritance) the task group context of the outermost level, the exception may be (re-)thrown multiple times (ultimately - in each worker on each nesting level) before reaching the root thread at the outermost level. IMPORTANT: if you intercept an exception derived from this class on a nested level, you must re-throw it in the catch block by means of the "throw;" [...]
-TBB provides two implementations of this interface: <a class="el" href="a00228.html">tbb::captured_exception</a> and template class <a class="el" href="a00257.html">tbb::movable_exception</a>. See their declarations for more info. 
+<b>Usage:</b> <p>
+In source code:<p>
+<div class="fragment"><pre class="fragment"><span class="preprocessor">#include "tbb/runtime_loader.h"</span>
+
+<span class="keywordtype">char</span> <span class="keyword">const</span> * path[] = { <span class="stringliteral">"<install dir>/lib/ia32"</span>, NULL };
+tbb::runtime_loader loader( path );
+
+<span class="comment">// Now use TBB.</span>
+</pre></div><p>
+Link with <code>tbbproxy.lib</code> (or <code>libtbbproxy.a</code>) instead of <code>tbb.lib</code> (<code>libtbb.dylib</code>, <code>libtbb.so</code>).<p>
+TBB library will be loaded at runtime from <code></code> <install dir>="">/lib/ia32 directory.<p>
+<b>Attention:</b> <p>
+All <code><a class="el" href="a00298.html">runtime_loader</a></code> objects (in the same module, i.e. exe or dll) share some global state. The most noticeable piece of global state is loaded TBB library. There are some implications:<p>
+<ul>
+<li>Only one TBB library can be loaded per module.</li></ul>
 <p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="66c94938eca8bf88b76f3eccaaf215d8"></a><!-- doxytag: member="tbb::tbb_exception::destroy" ref="66c94938eca8bf88b76f3eccaaf215d8" args="()=0" -->
+<ul>
+<li>If one object has already loaded TBB library, another object will not load TBB. If the loaded TBB library is suitable for the second object, both will use TBB cooperatively, otherwise the second object will report an error.</li></ul>
+<p>
+<ul>
+<li><code><a class="el" href="a00298.html">runtime_loader</a></code> objects will not work (correctly) in parallel due to absence of syncronization. </li></ul>
+
+<p>
+<hr><h2>Member Enumeration Documentation</h2>
+<a class="anchor" name="6831be91cdc64e57e565ce0dde018789"></a><!-- doxytag: member="tbb::interface6::runtime_loader::error_code" ref="6831be91cdc64e57e565ce0dde018789" args="" -->
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">virtual void tbb::tbb_exception::destroy           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%">  throw ()<code> [pure virtual]</code></td>
+          <td class="memname">enum <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">tbb::interface6::runtime_loader::error_code</a>          </td>
         </tr>
       </table>
 </div>
 <div class="memdoc">
 
 <p>
-Destroys objects created by the <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method. 
+Error codes. 
+<p>
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27"></a><!-- doxytag: member="ec_ok" ref="6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27" args="" -->ec_ok</em> </td><td>
+No errors. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1"></a><!-- doxytag: member="ec_bad_call" ref="6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1" args="" -->ec_bad_call</em> </td><td>
+Invalid function call (e. g. <a class="el" href="a00298.html#5f3f6f1683386705a6931acae45f0862">load()</a> called when TBB is already loaded). </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703"></a><!-- doxytag: member="ec_bad_arg" ref="6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703" args="" -->ec_bad_arg</em> </td><td>
+Invalid argument passed. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6"></a><!-- doxytag: member="ec_bad_lib" ref="6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6" args="" -->ec_bad_lib</em> </td><td>
+Invalid library found (e. g. <code>TBB_runtime_version</code> symbol not found). </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6"></a><!-- doxytag: member="ec_bad_ver" ref="6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6" args="" -->ec_bad_ver</em> </td><td>
+TBB found but version is not suitable. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb"></a><!-- doxytag: member="ec_no_lib" ref="6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb" args="" -->ec_no_lib</em> </td><td>
+No suitable TBB library found. </td></tr>
+</table>
+</dl>
+
+</div>
+</div><p>
+<a class="anchor" name="bb0130fe0f596399707e61431231ebcb"></a><!-- doxytag: member="tbb::interface6::runtime_loader::error_mode" ref="bb0130fe0f596399707e61431231ebcb" args="" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb">tbb::interface6::runtime_loader::error_mode</a>          </td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
 <p>
-Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method. 
+Error mode constants. 
 <p>
-Implemented in <a class="el" href="a00228.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>.
+<dl compact><dt><b>Enumerator: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em><a class="anchor" name="bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38"></a><!-- doxytag: member="em_status" ref="bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38" args="" -->em_status</em> </td><td>
+Save status of operation and continue. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b"></a><!-- doxytag: member="em_throw" ref="bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b" args="" -->em_throw</em> </td><td>
+Throw an exception of tbb::runtime_loader::error_code type. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94"></a><!-- doxytag: member="em_abort" ref="bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94" args="" -->em_abort</em> </td><td>
+Print message to <code>stderr</code> and call <code>abort()</code>. </td></tr>
+</table>
+</dl>
+
 </div>
 </div><p>
-<a class="anchor" name="3e3482bf264d4ca4dde046cd9c02c766"></a><!-- doxytag: member="tbb::tbb_exception::move" ref="3e3482bf264d4ca4dde046cd9c02c766" args="()=0" -->
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="7ae5330beb48fce0c702c32a5df0094a"></a><!-- doxytag: member="tbb::interface6::runtime_loader::runtime_loader" ref="7ae5330beb48fce0c702c32a5df0094a" args="(char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX, error_mode mode=em_abort)" -->
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">virtual <a class="el" href="a00298.html">tbb_exception</a>* tbb::tbb_exception::move           </td>
+          <td class="memname">tbb::interface6::runtime_loader::runtime_loader           </td>
           <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%">  throw ()<code> [pure virtual]</code></td>
+          <td class="paramtype">char const * </td>
+          <td class="paramname"> <em>path</em>[], </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int </td>
+          <td class="paramname"> <em>min_ver</em> = <code>TBB_INTERFACE_VERSION</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int </td>
+          <td class="paramname"> <em>max_ver</em> = <code>INT_MAX</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> </td>
+          <td class="paramname"> <em>mode</em> = <code>em_abort</code></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
         </tr>
       </table>
 </div>
 <div class="memdoc">
 
 <p>
-Creates and returns pointer to the deep copy of this exception object. 
+Initialize object and load TBB. 
 <p>
-Move semantics is allowed. 
-<p>
-Implemented in <a class="el" href="a00228.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>.
+See <a class="el" href="a00298.html#5f3f6f1683386705a6931acae45f0862">load()</a> for details.<p>
+If error mode is <code>em_status</code>, call <a class="el" href="a00298.html#78d938ed2e54d38dd38d6609e6c60389">status()</a> to check whether TBB was loaded or not. <dl compact><dt><b>Parameters: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em>path</em> </td><td>
+List of directories to search TBB in. </td></tr>
+<tr><td valign="top"><em>min_ver</em> </td><td>
+Minimal suitable version of TBB. </td></tr>
+<tr><td valign="top"><em>max_ver</em> </td><td>
+Maximal suitable version of TBB. </td></tr>
+<tr><td valign="top"><em>mode</em> </td><td>
+Error mode for this object. </td></tr>
+</table>
+</dl>
 </div>
 </div><p>
-<a class="anchor" name="3f2da7f3d8a6e4c1df522af1213afb5a"></a><!-- doxytag: member="tbb::tbb_exception::operator delete" ref="3f2da7f3d8a6e4c1df522af1213afb5a" args="(void *p)" -->
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="5f3f6f1683386705a6931acae45f0862"></a><!-- doxytag: member="tbb::interface6::runtime_loader::load" ref="5f3f6f1683386705a6931acae45f0862" args="(char const *path[], int min_ver=TBB_INTERFACE_VERSION, int max_ver=INT_MAX)" -->
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">void tbb::tbb_exception::operator delete           </td>
+          <td class="memname"><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> tbb::interface6::runtime_loader::load           </td>
           <td>(</td>
-          <td class="paramtype">void * </td>
-          <td class="paramname"> <em>p</em>          </td>
-          <td> ) </td>
-          <td width="100%"><code> [inline]</code></td>
+          <td class="paramtype">char const * </td>
+          <td class="paramname"> <em>path</em>[], </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int </td>
+          <td class="paramname"> <em>min_ver</em> = <code>TBB_INTERFACE_VERSION</code>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">int </td>
+          <td class="paramname"> <em>max_ver</em> = <code>INT_MAX</code></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
         </tr>
       </table>
 </div>
 <div class="memdoc">
 
 <p>
-Operator delete is provided only to allow using existing smart pointers with TBB exception objects obtained as the result of applying <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> operation on an exception thrown out of TBB scheduler.<p>
-When overriding method <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> make sure to override operator delete as well if memory is allocated not by TBB's scalable allocator. 
+Load TBB. 
+<p>
+The method searches the directories specified in <code>path</code>[] array for the TBB library. When the library is found, it is loaded and its version is checked. If the version is not suitable, the library is unloaded, and the search continues.<p>
+<b>Note:</b> <p>
+For security reasons, avoid using relative directory names. For example, never load TBB from current (<code>"."</code>), parent (<code>".."</code>) or any other relative directory (like <code>"lib"</code> ). Use only absolute directory names (e. g. "/usr/local/lib").<p>
+For the same security reasons, avoid using system default directories (<code>""</code>) on Windows. (See <a href="http://www.microsoft.com/technet/security/advisory/2269637.mspx">http://www.microsoft.com/technet/security/advisory/2269637.mspx</a> for details.)<p>
+Neglecting these rules may cause your program to execute 3-rd party malicious code.<p>
+<b>Errors:</b> <ul>
+<li><code>ec_bad_call</code> - TBB already loaded by this object.</li><li><code>ec_bad_arg</code> - <code>min_ver</code> and/or <code>max_ver</code> negative or zero, or <code>min_ver</code> > <code>max_ver</code>.</li><li><code>ec_bad_ver</code> - TBB of unsuitable version already loaded by another object.</li><li><code>ec_no_lib</code> - No suitable library found. </li></ul>
+<dl compact><dt><b>Parameters: </b></dt><dd>
+<table border="0" cellspacing="2" cellpadding="0">
+<tr><td valign="top"><em>path</em> </td><td>
+List of directories to search TBB in. </td></tr>
+<tr><td valign="top"><em>min_ver</em> </td><td>
+Minimal suitable version of TBB. </td></tr>
+<tr><td valign="top"><em>max_ver</em> </td><td>
+Maximal suitable version of TBB. </td></tr>
+</table>
+</dl>
 </div>
 </div><p>
-<a class="anchor" name="8588e07fa49692f4d734e4f2e4f048f4"></a><!-- doxytag: member="tbb::tbb_exception::throw_self" ref="8588e07fa49692f4d734e4f2e4f048f4" args="()=0" -->
+<a class="anchor" name="78d938ed2e54d38dd38d6609e6c60389"></a><!-- doxytag: member="tbb::interface6::runtime_loader::status" ref="78d938ed2e54d38dd38d6609e6c60389" args="()" -->
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">virtual void tbb::tbb_exception::throw_self           </td>
+          <td class="memname"><a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> tbb::interface6::runtime_loader::status           </td>
           <td>(</td>
           <td class="paramname">          </td>
           <td> ) </td>
-          <td width="100%"><code> [pure virtual]</code></td>
+          <td width="100%"></td>
         </tr>
       </table>
 </div>
 <div class="memdoc">
 
 <p>
-Throws this exception object. 
-<p>
-Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown. 
+Report status. 
 <p>
-Implemented in <a class="el" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00257.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
+If error mode is <code>em_status</code>, the function returns status of the last operation. 
 </div>
 </div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00561.html">runtime_loader.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00299.html b/doc/html/a00299.html
index 93956b3..c5ac2f8 100644
--- a/doc/html/a00299.html
+++ b/doc/html/a00299.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::internal::tbb_exception_ptr Class Reference</title>
+<title>tbb::scalable_allocator< T > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,63 +21,86 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00299.html">tbb_exception_ptr</a></div>
-<h1>tbb::internal::tbb_exception_ptr Class Reference</h1><!-- doxytag: class="tbb::internal::tbb_exception_ptr" -->Exception container that preserves the exact copy of the original exception.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00299.html">scalable_allocator</a></div>
+<h1>tbb::scalable_allocator< T > Class Template Reference<br>
+<small>
+[<a class="el" href="a00397.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::scalable_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
+<code>#include <<a class="el" href="a00562.html">scalable_allocator.h</a>></code>
 <p>
-<a href="a00145.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00107.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a1cf13c339ee177a103a7e19bf2710a"></a><!-- doxytag: member="tbb::scalable_allocator::value_type" ref="5a1cf13c339ee177a103a7e19bf2710a" args="" -->
+typedef internal::allocator_type<<br>
+ T >::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a5121ec62bc79faba6a4b674d59e7260"></a><!-- doxytag: member="tbb::scalable_allocator::pointer" ref="a5121ec62bc79faba6a4b674d59e7260" args="" -->
+typedef value_type * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="846a6fcec3bc7fa3839a12266a729a02"></a><!-- doxytag: member="tbb::scalable_allocator::const_pointer" ref="846a6fcec3bc7fa3839a12266a729a02" args="" -->
+typedef const value_type * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="254d7749de9277bb7711470c04d963ea"></a><!-- doxytag: member="tbb::scalable_allocator::reference" ref="254d7749de9277bb7711470c04d963ea" args="" -->
+typedef value_type & </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="acad193a7f6e16253f772ba3e9b2c98f"></a><!-- doxytag: member="tbb::scalable_allocator::const_reference" ref="acad193a7f6e16253f772ba3e9b2c98f" args="" -->
+typedef const value_type & </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4a5cb7482f222a14b513bbdd4ad8507d"></a><!-- doxytag: member="tbb::scalable_allocator::size_type" ref="4a5cb7482f222a14b513bbdd4ad8507d" args="" -->
+typedef size_t </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cb96c23f650cf91a73e2810b54c481bb"></a><!-- doxytag: member="tbb::scalable_allocator::difference_type" ref="cb96c23f650cf91a73e2810b54c481bb" args="" -->
+typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> ()  throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eee1873729ed05c7f92544c3ff0c08bc"></a><!-- doxytag: member="tbb::scalable_allocator::scalable_allocator" ref="eee1873729ed05c7f92544c3ff0c08bc" args="(const scalable_allocator &)" -->
+ </td><td class="memItemRight" valign="bottom"><b>scalable_allocator</b> (const <a class="el" href="a00299.html">scalable_allocator</a> &)  throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys this objects.  <a href="#921875bbacd2c8a5f324c7da7a415262"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="292832fd5c523e3d8081a22247840a1d"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::throw_self" ref="292832fd5c523e3d8081a22247840a1d" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="d56dc9f231c59f912297ac3c3b3b93b6"></a><!-- doxytag: member="tbb::scalable_allocator::scalable_allocator" ref="d56dc9f231c59f912297ac3c3b3b93b6" args="(const scalable_allocator< U > &)" -->
+template<typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>scalable_allocator</b> (const <a class="el" href="a00299.html">scalable_allocator</a>< U > &)  throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Throws the contained exception . <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="65083750bebe799d3fe8143c794523bb"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="65083750bebe799d3fe8143c794523bb" args="()" -->
-static <a class="el" href="a00299.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="78fa13a188b542ea724d45a9dbf5a071"></a><!-- doxytag: member="tbb::scalable_allocator::address" ref="78fa13a188b542ea724d45a9dbf5a071" args="(reference x) const " -->
+pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d1111b00ba54b7fe35e6d3a0f21de287"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="d1111b00ba54b7fe35e6d3a0f21de287" args="(const tbb_exception &tag)" -->
-static <a class="el" href="a00299.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const <a class="el" href="a00298.html">tbb_exception</a> &tag)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14be4ad8eb478c87e240e605221ab455"></a><!-- doxytag: member="tbb::scalable_allocator::address" ref="14be4ad8eb478c87e240e605221ab455" args="(const_reference x) const " -->
+const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c35e5db8e9cdff5d1387db5b0bad2e4a"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="c35e5db8e9cdff5d1387db5b0bad2e4a" args="(captured_exception &src)" -->
-static <a class="el" href="a00299.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00228.html">captured_exception</a> &src)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="726b1586d05d44665a36e1c7b2699bfd"></a><!-- doxytag: member="tbb::scalable_allocator::allocate" ref="726b1586d05d44665a36e1c7b2699bfd" args="(size_type n, const void *=0)" -->
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a> (size_type n, const void *=0)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f806a238c18cbcfb531e1e0a0d2ec59d"></a><!-- doxytag: member="tbb::scalable_allocator::deallocate" ref="f806a238c18cbcfb531e1e0a0d2ec59d" args="(pointer p, size_type)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a> (pointer p, size_type)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Free previously allocated block of memory. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="880e766f1d913988c21973dbdd874fd5"></a><!-- doxytag: member="tbb::scalable_allocator::max_size" ref="880e766f1d913988c21973dbdd874fd5" args="() const " -->
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#880e766f1d913988c21973dbdd874fd5">max_size</a> () const   throw ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ae824c87fcc35467057fd3304c5e97ba"></a><!-- doxytag: member="tbb::scalable_allocator::construct" ref="ae824c87fcc35467057fd3304c5e97ba" args="(pointer p, const value_type &value)" -->
+void </td><td class="memItemRight" valign="bottom"><b>construct</b> (pointer p, const value_type &value)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="743f878b04a492bf7ae0e82a64dc20c8"></a><!-- doxytag: member="tbb::scalable_allocator::destroy" ref="743f878b04a492bf7ae0e82a64dc20c8" args="(pointer p)" -->
+void </td><td class="memItemRight" valign="bottom"><b>destroy</b> (pointer p)</td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">This overload uses move semantics (i.e. it empties src). <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Exception container that preserves the exact copy of the original exception. 
-<p>
-This class can be used only when the appropriate runtime support (mandated by C++0x) is present 
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="921875bbacd2c8a5f324c7da7a415262"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::destroy" ref="921875bbacd2c8a5f324c7da7a415262" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void tbb::internal::tbb_exception_ptr::destroy           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%">  throw ()</td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T><br>
+ class tbb::scalable_allocator< T ></h3>
 
+Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. 
 <p>
-Destroys this objects. 
+The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard. 
 <p>
-Note that objects of this type can be created only by the allocate() method. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00593.html">tbb_exception.h</a></ul>
+<li><a class="el" href="a00562.html">scalable_allocator.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00300.html b/doc/html/a00300.html
index 56b1298..e78bd34 100644
--- a/doc/html/a00300.html
+++ b/doc/html/a00300.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::tbb_hash_compare< Key > Struct Template Reference</title>
+<title>tbb::scalable_allocator< void > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,30 +21,39 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00300.html">tbb_hash_compare</a></div>
-<h1>tbb::tbb_hash_compare< Key > Struct Template Reference</h1><!-- doxytag: class="tbb::tbb_hash_compare" -->hash_compare that is default argument for concurrent_hash_map  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00300.html">scalable_allocator< void ></a></div>
+<h1>tbb::scalable_allocator< void > Class Template Reference<br>
+<small>
+[<a class="el" href="a00397.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::scalable_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00424.html">concurrent_hash_map.h</a>></code>
+<code>#include <<a class="el" href="a00562.html">scalable_allocator.h</a>></code>
 <p>
-<a href="a00014.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00109.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c35d106ad65aa6ca5ba9008c1c86f80d"></a><!-- doxytag: member="tbb::tbb_hash_compare::hash" ref="c35d106ad65aa6ca5ba9008c1c86f80d" args="(const Key &a)" -->
-static size_t </td><td class="memItemRight" valign="bottom"><b>hash</b> (const Key &a)</td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2046816029c2c7856f7684aed2af9cff"></a><!-- doxytag: member="tbb::scalable_allocator< void >::pointer" ref="2046816029c2c7856f7684aed2af9cff" args="" -->
+typedef void * </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b4d302049aabea046e392ddfad8b3f06"></a><!-- doxytag: member="tbb::tbb_hash_compare::equal" ref="b4d302049aabea046e392ddfad8b3f06" args="(const Key &a, const Key &b)" -->
-static bool </td><td class="memItemRight" valign="bottom"><b>equal</b> (const Key &a, const Key &b)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="591c568d23f8aadf6ea8d1dc939c4e75"></a><!-- doxytag: member="tbb::scalable_allocator< void >::const_pointer" ref="591c568d23f8aadf6ea8d1dc939c4e75" args="" -->
+typedef const void * </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="64dbab666af0740c30b77edac9f157ce"></a><!-- doxytag: member="tbb::scalable_allocator< void >::value_type" ref="64dbab666af0740c30b77edac9f157ce" args="" -->
+typedef void </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename Key><br>
- struct tbb::tbb_hash_compare< Key ></h3>
+<h3>template<><br>
+ class tbb::scalable_allocator< void ></h3>
 
-hash_compare that is default argument for concurrent_hash_map 
+Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. 
 <p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00424.html">concurrent_hash_map.h</a></ul>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="a00562.html">scalable_allocator.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00301.html b/doc/html/a00301.html
index bb22869..9600b99 100644
--- a/doc/html/a00301.html
+++ b/doc/html/a00301.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::thread_bound_filter Class Reference</title>
+<title>tbb::flow::interface6::sender< T > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,97 +21,67 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00301.html">thread_bound_filter</a></div>
-<h1>tbb::thread_bound_filter Class Reference<br>
-<small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
-</h1><!-- doxytag: class="tbb::thread_bound_filter" --><!-- doxytag: inherits="tbb::filter" -->A stage in a pipeline served by a user thread.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00301.html">sender</a></div>
+<h1>tbb::flow::interface6::sender< T > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::sender" -->Pure virtual template class that defines a sender of messages of type T.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00546.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::thread_bound_filter:
-<p><center><img src="a00301.png" usemap="#tbb::thread_bound_filter_map" border="0" alt=""></center>
-<map name="tbb::thread_bound_filter_map">
-<area href="a00245.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
+<p>Inheritance diagram for tbb::flow::interface6::sender< T >:
+<p><center><img src="a00301.png" usemap="#tbb::flow::interface6::sender< T >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::sender< T >_map">
+<area href="a00236.html" alt="tbb::flow::interface6::broadcast_node< T >" shape="rect" coords="0,56,352,80">
+<area href="a00237.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="362,56,714,80">
+<area href="a00266.html" alt="tbb::flow::interface6::limiter_node< T >" shape="rect" coords="724,56,1076,80">
+<area href="a00286.html" alt="tbb::flow::interface6::priority_queue_node< T, Compare, A >" shape="rect" coords="181,112,533,136">
+<area href="a00287.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="543,112,895,136">
+<area href="a00302.html" alt="tbb::flow::interface6::sequencer_node< T, A >" shape="rect" coords="543,168,895,192">
 </map>
-<a href="a00094.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00041.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="902c4645e624e8f589b89841df5331de0c135a0274225f59d2b2a682d1103f23"></a><!-- doxytag: member="tbb::thread_bound_filter::success" ref="902c4645e624e8f589b89841df5331de0c135a0274225f59d2b2a682d1103f23" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>success</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="127af99916cc085cd9dbc09c53299928"></a><!-- doxytag: member="tbb::flow::interface6::sender::output_type" ref="127af99916cc085cd9dbc09c53299928" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#127af99916cc085cd9dbc09c53299928">output_type</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="902c4645e624e8f589b89841df5331de5243cf0030982cfa4ac1a8e97acb39f4"></a><!-- doxytag: member="tbb::thread_bound_filter::item_not_available" ref="902c4645e624e8f589b89841df5331de5243cf0030982cfa4ac1a8e97acb39f4" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>item_not_available</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d690e8a54e358968f0ee4fdf9ee73068"></a><!-- doxytag: member="tbb::flow::interface6::sender::successor_type" ref="d690e8a54e358968f0ee4fdf9ee73068" args="" -->
+typedef <a class="el" href="a00295.html">receiver</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="902c4645e624e8f589b89841df5331ded4085a8b251604b51c0f19602eeef09f"></a><!-- doxytag: member="tbb::thread_bound_filter::end_of_stream" ref="902c4645e624e8f589b89841df5331ded4085a8b251604b51c0f19602eeef09f" args="" -->
- </td><td class="memItemRight" valign="bottom"><b>end_of_stream</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="68b8941ad77b9303cf3bcb8cf1f2d28a"></a><!-- doxytag: member="tbb::flow::interface6::sender::register_successor" ref="68b8941ad77b9303cf3bcb8cf1f2d28a" args="(successor_type &r)=0" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a> (<a class="el" href="a00295.html">successor_type</a> &r)=0</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>result_type</b> { <b>success</b>, 
-<b>item_not_available</b>, 
-<b>end_of_stream</b>
- }</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a new successor to this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="82f363bfb1738bb8789e167590b10ef9"></a><!-- doxytag: member="tbb::flow::interface6::sender::remove_successor" ref="82f363bfb1738bb8789e167590b10ef9" args="(successor_type &r)=0" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a> (<a class="el" href="a00295.html">successor_type</a> &r)=0</td></tr>
 
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">result_type __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor from this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="922fb56b0aad090b90a98b7d56b76a59"></a><!-- doxytag: member="tbb::flow::interface6::sender::try_get" ref="922fb56b0aad090b90a98b7d56b76a59" args="(T &)" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a> (T &)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">If a data item is available, invoke operator() on that item.  <a href="#c4f90f2c771bce748beb9be734fa286c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">result_type __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="02c05b472271db1b68a48ea2618fa72f"></a><!-- doxytag: member="tbb::flow::interface6::sender::try_reserve" ref="02c05b472271db1b68a48ea2618fa72f" args="(T &)" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a> (T &)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Wait until a data item becomes available, and invoke operator() on that item.  <a href="#5e726bdc7fbd924c0b07bd558b1d4d5d"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="413fad2ade743d9af5dcabc56aedf4fe"></a><!-- doxytag: member="tbb::thread_bound_filter::thread_bound_filter" ref="413fad2ade743d9af5dcabc56aedf4fe" args="(mode filter_mode)" -->
- </td><td class="memItemRight" valign="bottom"><b>thread_bound_filter</b> (mode filter_mode)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserves an item in the sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="27036b06d6a91e97007e14f400529199"></a><!-- doxytag: member="tbb::flow::interface6::sender::try_release" ref="27036b06d6a91e97007e14f400529199" args="()" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#27036b06d6a91e97007e14f400529199">try_release</a> ()</td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Releases the reserved item. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7b840f50da117a0d6848707c1857ea2e"></a><!-- doxytag: member="tbb::flow::interface6::sender::try_consume" ref="7b840f50da117a0d6848707c1857ea2e" args="()" -->
+virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Consumes the reserved item. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-A stage in a pipeline served by a user thread. 
-<p>
-<hr><h2>Member Function Documentation</h2>
-<a class="anchor" name="5e726bdc7fbd924c0b07bd558b1d4d5d"></a><!-- doxytag: member="tbb::thread_bound_filter::process_item" ref="5e726bdc7fbd924c0b07bd558b1d4d5d" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">result_type __TBB_EXPORTED_METHOD tbb::thread_bound_filter::process_item           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
+<h3>template<typename T><br>
+ class tbb::flow::interface6::sender< T ></h3>
 
+Pure virtual template class that defines a sender of messages of type T. 
 <p>
-Wait until a data item becomes available, and invoke operator() on that item. 
-<p>
-This interface is blocking. Returns 'success' if an item was processed. Returns 'end_of_stream' if there are no more items to process. Never returns 'item_not_available', as it blocks until another return condition applies. 
-</div>
-</div><p>
-<a class="anchor" name="c4f90f2c771bce748beb9be734fa286c"></a><!-- doxytag: member="tbb::thread_bound_filter::try_process_item" ref="c4f90f2c771bce748beb9be734fa286c" args="()" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">result_type __TBB_EXPORTED_METHOD tbb::thread_bound_filter::try_process_item           </td>
-          <td>(</td>
-          <td class="paramname">          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-If a data item is available, invoke operator() on that item. 
-<p>
-This interface is non-blocking. Returns 'success' if an item was processed. Returns 'item_not_available' if no item can be processed now but more may arrive in the future, or if token limit is reached. Returns 'end_of_stream' if there are no more items to process. 
-</div>
-</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00546.html">pipeline.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00301.png b/doc/html/a00301.png
index 3327bd5..64fee8f 100644
Binary files a/doc/html/a00301.png and b/doc/html/a00301.png differ
diff --git a/doc/html/a00302.html b/doc/html/a00302.html
index 82a3020..cf624b9 100644
--- a/doc/html/a00302.html
+++ b/doc/html/a00302.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::tick_count Class Reference</title>
+<title>tbb::flow::interface6::sequencer_node< T, A > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,42 +21,86 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00302.html">tick_count</a></div>
-<h1>tbb::tick_count Class Reference<br>
-<small>
-[<a class="el" href="a00375.html">Timing</a>]</small>
-</h1><!-- doxytag: class="tbb::tick_count" -->Absolute timestamp.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00302.html">sequencer_node</a></div>
+<h1>tbb::flow::interface6::sequencer_node< T, A > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::sequencer_node" --><!-- doxytag: inherits="tbb::flow::interface6::queue_node" -->Forwards messages in sequence order.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00616.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<a href="a00159.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<p>Inheritance diagram for tbb::flow::interface6::sequencer_node< T, A >:
+<p><center><img src="a00302.png" usemap="#tbb::flow::interface6::sequencer_node< T, A >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::sequencer_node< T, A >_map">
+<area href="a00287.html" alt="tbb::flow::interface6::queue_node< T, A >" shape="rect" coords="280,112,550,136">
+<area href="a00237.html" alt="tbb::flow::interface6::buffer_node< T, A >" shape="rect" coords="280,56,550,80">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,270,24">
+<area href="a00295.html" alt="tbb::flow::interface6::receiver< T >" shape="rect" coords="280,0,550,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< T >" shape="rect" coords="560,0,830,24">
+</map>
+<a href="a00061.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="af629f26832ff4e476e240637a78bc0c"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::input_type" ref="af629f26832ff4e476e240637a78bc0c" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#af629f26832ff4e476e240637a78bc0c">input_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ca026eaef70e35791c407323199031a7"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::output_type" ref="ca026eaef70e35791c407323199031a7" args="" -->
+typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#ca026eaef70e35791c407323199031a7">output_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The output type of this sender. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8127e36811832563fe1e9bc3ba391f79"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::predecessor_type" ref="8127e36811832563fe1e9bc3ba391f79" args="" -->
+typedef <a class="el" href="a00301.html">sender</a>< <a class="el" href="a00302.html#af629f26832ff4e476e240637a78bc0c">input_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#8127e36811832563fe1e9bc3ba391f79">predecessor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="795f3ee75f133b9d3b159172fc4a197f"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::successor_type" ref="795f3ee75f133b9d3b159172fc4a197f" args="" -->
+typedef <a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00302.html#ca026eaef70e35791c407323199031a7">output_type</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#795f3ee75f133b9d3b159172fc4a197f">successor_type</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The successor type for this node. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="34593326ae4191e02a13c7cbdab9de4c"></a><!-- doxytag: member="tbb::tick_count::tick_count" ref="34593326ae4191e02a13c7cbdab9de4c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a> ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="7e71cbdf78f989091bc162b89bee7e66"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::sequencer_node" ref="7e71cbdf78f989091bc162b89bee7e66" args="(graph &g, const Sequencer &s)" -->
+template<typename Sequencer> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00302.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a> (<a class="el" href="a00262.html">graph</a> &g, const Sequencer &s)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b38e7a070552960384bcc1d91af13a5c"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::sequencer_node" ref="b38e7a070552960384bcc1d91af13a5c" args="(const sequencer_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#b38e7a070552960384bcc1d91af13a5c">sequencer_node</a> (const <a class="el" href="a00302.html">sequencer_node</a> &src)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct an absolute timestamp initialized to zero. <br></td></tr>
-<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb7f78ca61cf28398645ace66e284473"></a><!-- doxytag: member="tbb::tick_count::now" ref="fb7f78ca61cf28398645ace66e284473" args="()" -->
-static <a class="el" href="a00302.html">tick_count</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#fb7f78ca61cf28398645ace66e284473">now</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="93d3d8f6a72b3e1387047282116ed6ee"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::~sequencer_node" ref="93d3d8f6a72b3e1387047282116ed6ee" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#93d3d8f6a72b3e1387047282116ed6ee">~sequencer_node</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return current time. <br></td></tr>
-<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09dde78a4100800c11bb883d6204b586"></a><!-- doxytag: member="tbb::tick_count::operator-" ref="09dde78a4100800c11bb883d6204b586" args="(const tick_count &t1, const tick_count &t0)" -->
-<a class="el" href="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00302.html">tick_count</a> &t1, const <a class="el" href="a00302.html">tick_count</a> &t0)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
+<tr><td colspan="2"><br><h2>Protected Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6a0608d8fbfa05edde1e1da559f9eb40"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::size_type" ref="6a0608d8fbfa05edde1e1da559f9eb40" args="" -->
+typedef <a class="el" href="a00237.html">buffer_node</a>< T, A <br>
+>::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Subtract two timestamps to get the time interval between. <br></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html">interval_t</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d50b89267bddf58afeb3e784aba0f0d6"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::sequencer_operation" ref="d50b89267bddf58afeb3e784aba0f0d6" args="" -->
+typedef <a class="el" href="a00237.html">buffer_node</a>< T, A <br>
+>::buffer_operation </td><td class="memItemRight" valign="bottom"><b>sequencer_operation</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1372a379c01bc269b36bf3128560879e1cdf6bcff9743d2be54bc70c4300cd28"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::WAIT" ref="1372a379c01bc269b36bf3128560879e1cdf6bcff9743d2be54bc70c4300cd28" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>WAIT</b> = 0</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1372a379c01bc269b36bf3128560879e544c3030ddd97ba489e7d2bf1c612bc8"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::SUCCEEDED" ref="1372a379c01bc269b36bf3128560879e544c3030ddd97ba489e7d2bf1c612bc8" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>SUCCEEDED</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1372a379c01bc269b36bf3128560879ee298eb3257a044e4d0aca8a58f2f62b0"></a><!-- doxytag: member="tbb::flow::interface6::sequencer_node::FAILED" ref="1372a379c01bc269b36bf3128560879ee298eb3257a044e4d0aca8a58f2f62b0" args="" -->
+ </td><td class="memItemRight" valign="bottom"><b>FAILED</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>op_stat</b> { <b>WAIT</b> = 0, 
+<b>SUCCEEDED</b>, 
+<b>FAILED</b>
+ }</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Relative time interval.  <a href="a00303.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Absolute timestamp. 
+<h3>template<typename T, typename A = cache_aligned_allocator<T>><br>
+ class tbb::flow::interface6::sequencer_node< T, A ></h3>
+
+Forwards messages in sequence order. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00616.html">tick_count.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00302.png b/doc/html/a00302.png
new file mode 100644
index 0000000..30266e5
Binary files /dev/null and b/doc/html/a00302.png differ
diff --git a/doc/html/a00303.html b/doc/html/a00303.html
index 6e582ab..6d9e038 100644
--- a/doc/html/a00303.html
+++ b/doc/html/a00303.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::tick_count::interval_t Class Reference</title>
+<title>tbb::simple_partitioner Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,57 +21,41 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00302.html">tick_count</a>::<a class="el" href="a00303.html">interval_t</a></div>
-<h1>tbb::tick_count::interval_t Class Reference</h1><!-- doxytag: class="tbb::tick_count::interval_t" -->Relative time interval.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00303.html">simple_partitioner</a></div>
+<h1>tbb::simple_partitioner Class Reference<br>
+<small>
+[<a class="el" href="a00395.html">Algorithms</a>]</small>
+</h1><!-- doxytag: class="tbb::simple_partitioner" -->A simple partitioner.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00616.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00531.html">partitioner.h</a>></code>
 <p>
-<a href="a00160.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00087.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="75a9a0949f8a8a84d6758835f1b48dad"></a><!-- doxytag: member="tbb::tick_count::interval_t::interval_t" ref="75a9a0949f8a8a84d6758835f1b48dad" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a> ()</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct a time interval representing zero time duration. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1a21a428e00cced2e6a49e0f5f2258bf"></a><!-- doxytag: member="tbb::tick_count::interval_t::interval_t" ref="1a21a428e00cced2e6a49e0f5f2258bf" args="(double sec)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a> (double sec)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct a time interval representing sec seconds time duration. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5d8429c0bc59cf6131b2abc7929fa59"></a><!-- doxytag: member="tbb::tick_count::interval_t::seconds" ref="d5d8429c0bc59cf6131b2abc7929fa59" args="() const " -->
-double </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a> () const </td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Return the length of a time interval in seconds. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd9814947902e26463a69a111530f81b"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator+=" ref="cd9814947902e26463a69a111530f81b" args="(const interval_t &i)" -->
-<a class="el" href="a00303.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#cd9814947902e26463a69a111530f81b">operator+=</a> (const <a class="el" href="a00303.html">interval_t</a> &i)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Accumulation operator. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35ff7eaf7c2031b4a991402ac9ecb940"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator-=" ref="35ff7eaf7c2031b4a991402ac9ecb940" args="(const interval_t &i)" -->
-<a class="el" href="a00303.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a> (const <a class="el" href="a00303.html">interval_t</a> &i)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Subtraction operator. <br></td></tr>
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cc3a7ad7000317951ce61f706163efe8"></a><!-- doxytag: member="tbb::tick_count::interval_t::tbb::tick_count" ref="cc3a7ad7000317951ce61f706163efe8" args="" -->
-class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#cc3a7ad7000317951ce61f706163efe8">tbb::tick_count</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5f730f70d21df405adaebfc2018f59cd"></a><!-- doxytag: member="tbb::simple_partitioner::serial::interface6::start_for" ref="5f730f70d21df405adaebfc2018f59cd" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>serial::interface6::start_for</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8a4cd0ffed4fad0d9af2c5efdaf586a8"></a><!-- doxytag: member="tbb::simple_partitioner::interface6::internal::start_for" ref="8a4cd0ffed4fad0d9af2c5efdaf586a8" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_for</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09dde78a4100800c11bb883d6204b586"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator-" ref="09dde78a4100800c11bb883d6204b586" args="(const tick_count &t1, const tick_count &t0)" -->
-<a class="el" href="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00302.html">tick_count</a> &t1, const <a class="el" href="a00302.html">tick_count</a> &t0)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="86f0750233dd6c83b65fb684338fd09f"></a><!-- doxytag: member="tbb::simple_partitioner::interface6::internal::start_reduce" ref="86f0750233dd6c83b65fb684338fd09f" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>interface6::internal::start_reduce</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Extract the intervals from the tick_counts and subtract them. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5871ead1ca230efbe52a5008470e6428"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator+" ref="5871ead1ca230efbe52a5008470e6428" args="(const interval_t &i, const interval_t &j)" -->
-<a class="el" href="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#5871ead1ca230efbe52a5008470e6428">operator+</a> (const <a class="el" href="a00303.html">interval_t</a> &i, const <a class="el" href="a00303.html">interval_t</a> &j)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="76d97ae6ad98db0acfc8ed8cb7c76705"></a><!-- doxytag: member="tbb::simple_partitioner::internal::start_scan" ref="76d97ae6ad98db0acfc8ed8cb7c76705" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::start_scan</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add two intervals. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa509691e1d689830931e36edd274f76"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator-" ref="fa509691e1d689830931e36edd274f76" args="(const interval_t &i, const interval_t &j)" -->
-<a class="el" href="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#fa509691e1d689830931e36edd274f76">operator-</a> (const <a class="el" href="a00303.html">interval_t</a> &i, const <a class="el" href="a00303.html">interval_t</a> &j)</td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>partition_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Subtract two intervals. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-Relative time interval. 
+A simple partitioner. 
+<p>
+Divides the range until the range is not divisible. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00616.html">tick_count.h</a></ul>
+<li><a class="el" href="a00531.html">partitioner.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00304.html b/doc/html/a00304.html
index e3dfc82..e72f0cc 100644
--- a/doc/html/a00304.html
+++ b/doc/html/a00304.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::internal::two_phase_port< T > Class Template Reference</title>
+<title>tbb::flow::interface6::source_node< Output > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,72 +21,109 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00304.html">two_phase_port</a></div>
-<h1>tbb::internal::two_phase_port< T > Class Template Reference</h1><!-- doxytag: class="tbb::internal::two_phase_port" --><!-- doxytag: inherits="tbb::receiver" -->The two-phase join port.  
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00304.html">source_node</a></div>
+<h1>tbb::flow::interface6::source_node< Output > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::source_node" --><!-- doxytag: inherits="tbb::flow::interface6::graph_node,tbb::flow::interface6::sender< Output >" -->An executable node that acts as a source, i.e. it has no predecessors.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
 <p>
-<p>Inheritance diagram for tbb::internal::two_phase_port< T >:
-<p><center><img src="a00304.png" usemap="#tbb::internal::two_phase_port< T >_map" border="0" alt=""></center>
-<map name="tbb::internal::two_phase_port< T >_map">
-<area href="a00277.html" alt="tbb::receiver< T >" shape="rect" coords="0,0,203,24">
+<p>Inheritance diagram for tbb::flow::interface6::source_node< Output >:
+<p><center><img src="a00304.png" usemap="#tbb::flow::interface6::source_node< Output >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::source_node< Output >_map">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,262,24">
+<area href="a00301.html" alt="tbb::flow::interface6::sender< Output >" shape="rect" coords="272,0,534,24">
 </map>
-<a href="a00065.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00047.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0f464d59e15941d6d625e8c7d634e26b"></a><!-- doxytag: member="tbb::internal::two_phase_port::input_type" ref="0f464d59e15941d6d625e8c7d634e26b" args="" -->
-typedef T </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#0f464d59e15941d6d625e8c7d634e26b">input_type</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="407533487cc3f6032c1072cba19c609c"></a><!-- doxytag: member="tbb::flow::interface6::source_node::output_type" ref="407533487cc3f6032c1072cba19c609c" args="" -->
+typedef Output </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The input type of this receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="37ee9b5320b631c39bccc0b4745d88d1"></a><!-- doxytag: member="tbb::internal::two_phase_port::predecessor_type" ref="37ee9b5320b631c39bccc0b4745d88d1" args="" -->
-typedef <a class="el" href="a00282.html">sender</a>< T > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#37ee9b5320b631c39bccc0b4745d88d1">predecessor_type</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The type of the output message, which is complete. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dd7b8fe78f0bec9d6b70cbf1018a69fe"></a><!-- doxytag: member="tbb::flow::interface6::source_node::successor_type" ref="dd7b8fe78f0bec9d6b70cbf1018a69fe" args="" -->
+typedef <a class="el" href="a00295.html">receiver</a>< Output > </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#dd7b8fe78f0bec9d6b70cbf1018a69fe">successor_type</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The predecessor type for this node. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The type of successors of this node. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="60e17ef935031c86c4a288eafab5c066"></a><!-- doxytag: member="tbb::internal::two_phase_port::two_phase_port" ref="60e17ef935031c86c4a288eafab5c066" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#60e17ef935031c86c4a288eafab5c066">two_phase_port</a> ()</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="503c3b395c629296bf5cccd96d6388c1"></a><!-- doxytag: member="tbb::flow::interface6::source_node::source_node" ref="503c3b395c629296bf5cccd96d6388c1" args="(graph &g, Body body, bool is_active=true)" -->
+template<typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00304.html#503c3b395c629296bf5cccd96d6388c1">source_node</a> (<a class="el" href="a00262.html">graph</a> &g, Body body, bool is_active=true)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3710ccbcc61df9602eaca1a77d9749a7"></a><!-- doxytag: member="tbb::internal::two_phase_port::two_phase_port" ref="3710ccbcc61df9602eaca1a77d9749a7" args="(const two_phase_port &)" -->
- </td><td class="memItemRight" valign="bottom"><b>two_phase_port</b> (const <a class="el" href="a00304.html">two_phase_port</a> &)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Constructor for a node with a successor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="adaac111fbcace95804219a5f2929304"></a><!-- doxytag: member="tbb::flow::interface6::source_node::source_node" ref="adaac111fbcace95804219a5f2929304" args="(const source_node &src)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#adaac111fbcace95804219a5f2929304">source_node</a> (const <a class="el" href="a00304.html">source_node</a> &src)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ebb94d389919a46b6c1b7eb5d38f6d8f"></a><!-- doxytag: member="tbb::internal::two_phase_port::set_join_node_pointer" ref="ebb94d389919a46b6c1b7eb5d38f6d8f" args="(forwarding_base *join)" -->
-void </td><td class="memItemRight" valign="bottom"><b>set_join_node_pointer</b> (forwarding_base *join)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Copy constructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61700b0865fc17188b0abe26bbde65b6"></a><!-- doxytag: member="tbb::flow::interface6::source_node::~source_node" ref="61700b0865fc17188b0abe26bbde65b6" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#61700b0865fc17188b0abe26bbde65b6">~source_node</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f316c0d5ff67068ff23b684accbe87f4"></a><!-- doxytag: member="tbb::internal::two_phase_port::try_put" ref="f316c0d5ff67068ff23b684accbe87f4" args="(T)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#f316c0d5ff67068ff23b684accbe87f4">try_put</a> (T)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The destructor. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="22960d499df9f1569a9d8a544e35afe3"></a><!-- doxytag: member="tbb::flow::interface6::source_node::register_successor" ref="22960d499df9f1569a9d8a544e35afe3" args="(receiver< output_type > &r)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#22960d499df9f1569a9d8a544e35afe3">register_successor</a> (<a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> > &r)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Put an item to the receiver. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6dc1f9bf02109c7f6fe4cc58bc31a00c"></a><!-- doxytag: member="tbb::internal::two_phase_port::register_predecessor" ref="6dc1f9bf02109c7f6fe4cc58bc31a00c" args="(sender< T > &src)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#6dc1f9bf02109c7f6fe4cc58bc31a00c">register_predecessor</a> (<a class="el" href="a00282.html">sender</a>< T > &src)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a new successor to this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="222484bf295f39df36415a29e508e5c9"></a><!-- doxytag: member="tbb::flow::interface6::source_node::remove_successor" ref="222484bf295f39df36415a29e508e5c9" args="(receiver< output_type > &r)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#222484bf295f39df36415a29e508e5c9">remove_successor</a> (<a class="el" href="a00295.html">receiver</a>< <a class="el" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> > &r)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Add a predecessor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a734a55289804ff34ce1c6ac4c5075e4"></a><!-- doxytag: member="tbb::internal::two_phase_port::remove_predecessor" ref="a734a55289804ff34ce1c6ac4c5075e4" args="(sender< T > &src)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#a734a55289804ff34ce1c6ac4c5075e4">remove_predecessor</a> (<a class="el" href="a00282.html">sender</a>< T > &src)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Removes a successor from this node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="41073ad4d3510ed5a8b6bda9c0f58636"></a><!-- doxytag: member="tbb::flow::interface6::source_node::try_get" ref="41073ad4d3510ed5a8b6bda9c0f58636" args="(output_type &v)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#41073ad4d3510ed5a8b6bda9c0f58636">try_get</a> (<a class="el" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Remove a predecessor. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1d7399cfc77fca8878d8d16049ce4e7e"></a><!-- doxytag: member="tbb::internal::two_phase_port::reserve" ref="1d7399cfc77fca8878d8d16049ce4e7e" args="(T &v)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#1d7399cfc77fca8878d8d16049ce4e7e">reserve</a> (T &v)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Request an item from the node. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad459713ff3c1c9ad0f4826daa141f65"></a><!-- doxytag: member="tbb::flow::interface6::source_node::try_reserve" ref="ad459713ff3c1c9ad0f4826daa141f65" args="(output_type &v)" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a> (<a class="el" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserve an item from the port. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="091f6efffaadbbeca6cf23483dabd891"></a><!-- doxytag: member="tbb::internal::two_phase_port::release" ref="091f6efffaadbbeca6cf23483dabd891" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#091f6efffaadbbeca6cf23483dabd891">release</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reserves an item. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#494678baf9096835268736b800824460">try_release</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Release the port. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="684f6bbc3290270ed43cb34ffd273f71"></a><!-- doxytag: member="tbb::internal::two_phase_port::consume" ref="684f6bbc3290270ed43cb34ffd273f71" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#684f6bbc3290270ed43cb34ffd273f71">consume</a> ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release a reserved item.  <a href="#494678baf9096835268736b800824460"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2c7fcc29e2894b29138be3c1edce9bc9"></a><!-- doxytag: member="tbb::flow::interface6::source_node::try_consume" ref="2c7fcc29e2894b29138be3c1edce9bc9" args="()" -->
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Consumes a reserved item. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b647e4a93d08ccdd8d323279e4eaaa6"></a><!-- doxytag: member="tbb::flow::interface6::source_node::activate" ref="4b647e4a93d08ccdd8d323279e4eaaa6" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html#4b647e4a93d08ccdd8d323279e4eaaa6">activate</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Activates a node that was created in the inactive state. <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="15fb463802e1e30f5f836535d490874c"></a><!-- doxytag: member="tbb::flow::interface6::source_node::internal::source_task< source_node< output_type > >" ref="15fb463802e1e30f5f836535d490874c" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>internal::source_task< source_node< output_type > ></b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Complete use of the port. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- class tbb::internal::two_phase_port< T ></h3>
+<h3>template<typename Output><br>
+ class tbb::flow::interface6::source_node< Output ></h3>
+
+An executable node that acts as a source, i.e. it has no predecessors. 
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="494678baf9096835268736b800824460"></a><!-- doxytag: member="tbb::flow::interface6::source_node::try_release" ref="494678baf9096835268736b800824460" args="()" -->
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template<typename Output> </div>
+      <table class="memname">
+        <tr>
+          <td class="memname">bool <a class="el" href="a00304.html">tbb::flow::interface6::source_node</a>< Output >::try_release           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline, virtual]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
 
-The two-phase join port. 
 <p>
+Release a reserved item. 
+<p>
+true = item has been released and so remains in sender, dest must request or reserve future items 
+<p>
+Reimplemented from <a class="el" href="a00301.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< Output ></a>.
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00304.png b/doc/html/a00304.png
index b71488d..14df9ee 100644
Binary files a/doc/html/a00304.png and b/doc/html/a00304.png differ
diff --git a/doc/html/a00305.html b/doc/html/a00305.html
index dc3026d..e213f6a 100644
--- a/doc/html/a00305.html
+++ b/doc/html/a00305.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::internal::work_around_alignment_bug< Size, T > Struct Template Reference</title>
+<title>tbb::spin_mutex Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,29 +21,105 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00305.html">work_around_alignment_bug</a></div>
-<h1>tbb::internal::work_around_alignment_bug< Size, T > Struct Template Reference</h1><!-- doxytag: class="tbb::internal::work_around_alignment_bug" -->Work around for bug in GNU 3.2 and MSVC compilers.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00305.html">spin_mutex</a></div>
+<h1>tbb::spin_mutex Class Reference<br>
+<small>
+[<a class="el" href="a00398.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::spin_mutex" -->A lock that occupies a single byte.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00594.html">tbb_machine.h</a>></code>
+<code>#include <<a class="el" href="a00565.html">spin_mutex.h</a>></code>
 <p>
-<a href="a00153.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00111.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00305.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired lock.  <a href="#3d8fb44644fd8d41ada1fbeba7409be3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4b3fa21632815f8fab2fd6c67ec0d48c"></a><!-- doxytag: member="tbb::spin_mutex::internal_construct" ref="4b3fa21632815f8fab2fd6c67ec0d48c" args="()" -->
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><b>internal_construct</b> ()</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4f748989e19b6045e3a2d2ee73626a28"></a><!-- doxytag: member="tbb::spin_mutex::lock" ref="4f748989e19b6045e3a2d2ee73626a28" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00305.html#4f748989e19b6045e3a2d2ee73626a28">lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00305.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking).  <a href="#8f9a58fb56a2b4c5efe1a7f7c1ae2074"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0e843ee6265f57f27d228ba91e7308ef"></a><!-- doxytag: member="tbb::spin_mutex::unlock" ref="0e843ee6265f57f27d228ba91e7308ef" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00305.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
 <tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="137d1b1dd94016bc52e423dc33c4fd1d"></a><!-- doxytag: member="tbb::internal::work_around_alignment_bug::alignment" ref="137d1b1dd94016bc52e423dc33c4fd1d" args="" -->
-static const size_t </td><td class="memItemRight" valign="bottom"><b>alignment</b> = __alignof(T)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5a7c93ca9e7ab656037a43984f24c051"></a><!-- doxytag: member="tbb::spin_mutex::is_rw_mutex" ref="5a7c93ca9e7ab656037a43984f24c051" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = false</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a967c455d0d80c9bbe030905201391b6"></a><!-- doxytag: member="tbb::spin_mutex::is_recursive_mutex" ref="a967c455d0d80c9bbe030905201391b6" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ec12e4036073fb684b6d2d33493ed0aa"></a><!-- doxytag: member="tbb::spin_mutex::is_fair_mutex" ref="ec12e4036073fb684b6d2d33493ed0aa" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
 
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a36f15b770a1bb0b56e33d7fa75ebd1a"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock" ref="a36f15b770a1bb0b56e33d7fa75ebd1a" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>scoped_lock</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00306.html">scoped_lock</a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Represents acquisition of a mutex.  <a href="a00306.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<size_t Size, typename T><br>
- struct tbb::internal::work_around_alignment_bug< Size, T ></h3>
+A lock that occupies a single byte. 
+<p>
+A <a class="el" href="a00305.html">spin_mutex</a> is a spin mutex that fits in a single byte. It should be used only for locking short critical sections (typically less than 20 instructions) when fairness is not an issue. If zero-initialized, the mutex is considered unheld. 
+<p>
+<hr><h2>Constructor & Destructor Documentation</h2>
+<a class="anchor" name="3d8fb44644fd8d41ada1fbeba7409be3"></a><!-- doxytag: member="tbb::spin_mutex::spin_mutex" ref="3d8fb44644fd8d41ada1fbeba7409be3" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">tbb::spin_mutex::spin_mutex           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Construct unacquired lock. 
+<p>
+Equivalent to zero-initialization of *this. 
+</div>
+</div><p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="8f9a58fb56a2b4c5efe1a7f7c1ae2074"></a><!-- doxytag: member="tbb::spin_mutex::try_lock" ref="8f9a58fb56a2b4c5efe1a7f7c1ae2074" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool tbb::spin_mutex::try_lock           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
 
-Work around for bug in GNU 3.2 and MSVC compilers. 
 <p>
-Bug is that compiler sometimes returns 0 for __alignof(T) when T has not yet been instantiated. The work-around forces instantiation by forcing computation of sizeof(T) before __alignof(T). 
+Try acquiring lock (non-blocking). 
 <p>
-<hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00594.html">tbb_machine.h</a></ul>
+Return true if lock acquired; false otherwise. 
+</div>
+</div><p>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="a00565.html">spin_mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00306.html b/doc/html/a00306.html
index 72aafbc..732ed3e 100644
--- a/doc/html/a00306.html
+++ b/doc/html/a00306.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::zero_allocator< T, Allocator > Class Template Reference</title>
+<title>tbb::spin_mutex::scoped_lock Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,67 +21,71 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00306.html">zero_allocator</a></div>
-<h1>tbb::zero_allocator< T, Allocator > Class Template Reference<br>
-<small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::zero_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00305.html">spin_mutex</a>::<a class="el" href="a00306.html">scoped_lock</a></div>
+<h1>tbb::spin_mutex::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::spin_mutex::scoped_lock" -->Represents acquisition of a mutex.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00588.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00565.html">spin_mutex.h</a>></code>
 <p>
-<a href="a00134.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00112.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="77c87446a645cc3dbeba6fc82cc7eec0"></a><!-- doxytag: member="tbb::zero_allocator::base_allocator_type" ref="77c87446a645cc3dbeba6fc82cc7eec0" args="" -->
-typedef Allocator< T > </td><td class="memItemRight" valign="bottom"><b>base_allocator_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2eb3bf02103f455e0614e0a392388428"></a><!-- doxytag: member="tbb::zero_allocator::value_type" ref="2eb3bf02103f455e0614e0a392388428" args="" -->
-typedef base_allocator_type::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="54d0a81317a90278dc492d44cc7dcdfc"></a><!-- doxytag: member="tbb::zero_allocator::pointer" ref="54d0a81317a90278dc492d44cc7dcdfc" args="" -->
-typedef base_allocator_type::pointer </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="50536b451124814064b0e8ff7b6cea21"></a><!-- doxytag: member="tbb::zero_allocator::const_pointer" ref="50536b451124814064b0e8ff7b6cea21" args="" -->
-typedef base_allocator_type::const_pointer </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2ef488ecc55bf4a619f68b021d5b93e2"></a><!-- doxytag: member="tbb::zero_allocator::reference" ref="2ef488ecc55bf4a619f68b021d5b93e2" args="" -->
-typedef base_allocator_type::reference </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31f0de5db53e4c219e8548078572e1ff"></a><!-- doxytag: member="tbb::zero_allocator::const_reference" ref="31f0de5db53e4c219e8548078572e1ff" args="" -->
-typedef base_allocator_type::const_reference </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="29ae680ae7f5e685c2e15535b9c855b3"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::scoped_lock" ref="29ae680ae7f5e685c2e15535b9c855b3" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00306.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="55acbfec8d7fd904c9b2040816522084"></a><!-- doxytag: member="tbb::zero_allocator::size_type" ref="55acbfec8d7fd904c9b2040816522084" args="" -->
-typedef base_allocator_type::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct without acquiring a mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5ce6807050a9e8f87bcb4a65dccb12ef"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::scoped_lock" ref="5ce6807050a9e8f87bcb4a65dccb12ef" args="(spin_mutex &m)" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00306.html#5ce6807050a9e8f87bcb4a65dccb12ef">scoped_lock</a> (<a class="el" href="a00305.html">spin_mutex</a> &m)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c54d45a74bd3b48ff8db174c266ddede"></a><!-- doxytag: member="tbb::zero_allocator::difference_type" ref="c54d45a74bd3b48ff8db174c266ddede" args="" -->
-typedef base_allocator_type::difference_type </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct and acquire lock on a mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ee3c338732b1f64b0b32a757807a30d"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::acquire" ref="3ee3c338732b1f64b0b32a757807a30d" args="(spin_mutex &m)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00306.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a> (<a class="el" href="a00305.html">spin_mutex</a> &m)</td></tr>
 
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c48c0436e3239be8f07c53c7f6658e4"></a><!-- doxytag: member="tbb::zero_allocator::zero_allocator" ref="8c48c0436e3239be8f07c53c7f6658e4" args="(const zero_allocator &a)" -->
- </td><td class="memItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00306.html">zero_allocator</a> &a)  throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00306.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a> (<a class="el" href="a00305.html">spin_mutex</a> &m)</td></tr>
 
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="67685c1cfcd3b5f81ac8f3c8dd1375b9"></a><!-- doxytag: member="tbb::zero_allocator::zero_allocator" ref="67685c1cfcd3b5f81ac8f3c8dd1375b9" args="(const zero_allocator< U > &a)" -->
-template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00306.html">zero_allocator</a>< U > &a)  throw ()</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring lock (non-blocking).  <a href="#9297ec188534b45dc0ca48f2f39a0501"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="eeb615e68e963e6bf8d9c11402d0ce8e"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::release" ref="eeb615e68e963e6bf8d9c11402d0ce8e" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00306.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b6e7eb50d9faeca418d56a9758357377"></a><!-- doxytag: member="tbb::zero_allocator::allocate" ref="b6e7eb50d9faeca418d56a9758357377" args="(const size_type n, const void *hint=0)" -->
-pointer </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const size_type n, const void *hint=0)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ac6fa425d1f06c56d8b70abc51aac844"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::~scoped_lock" ref="ac6fa425d1f06c56d8b70abc51aac844" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00306.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a> ()</td></tr>
 
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy lock. If holding a lock, releases the lock first. <br></td></tr>
+<tr><td colspan="2"><br><h2>Friends</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6ee2a2cdaf6a2128849e7d7723d9174f"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::spin_mutex" ref="6ee2a2cdaf6a2128849e7d7723d9174f" args="" -->
+class </td><td class="memItemRight" valign="bottom"><b>spin_mutex</b></td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T, template< typename X > class Allocator = tbb_allocator><br>
- class tbb::zero_allocator< T, Allocator ></h3>
+Represents acquisition of a mutex. 
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="9297ec188534b45dc0ca48f2f39a0501"></a><!-- doxytag: member="tbb::spin_mutex::scoped_lock::try_acquire" ref="9297ec188534b45dc0ca48f2f39a0501" args="(spin_mutex &m)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool tbb::spin_mutex::scoped_lock::try_acquire           </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="a00305.html">spin_mutex</a> & </td>
+          <td class="paramname"> <em>m</em>          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
 
-Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. 
 <p>
-The class is an adapter over an actual allocator that fills the allocation using memset function with template argument C as the value. The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard. 
+Try acquiring lock (non-blocking). 
 <p>
+Return true if lock acquired; false otherwise. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00588.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00565.html">spin_mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00307.html b/doc/html/a00307.html
index fdfda97..ed41ffb 100644
--- a/doc/html/a00307.html
+++ b/doc/html/a00307.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::zero_allocator< void, Allocator > Class Template Reference</title>
+<title>tbb::spin_rw_mutex_v3 Class Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,42 +21,107 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00307.html">zero_allocator< void, Allocator ></a></div>
-<h1>tbb::zero_allocator< void, Allocator > Class Template Reference<br>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00307.html">spin_rw_mutex_v3</a></div>
+<h1>tbb::spin_rw_mutex_v3 Class Reference<br>
 <small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
-</h1><!-- doxytag: class="tbb::zero_allocator< void, Allocator >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  
+[<a class="el" href="a00398.html">Synchronization</a>]</small>
+</h1><!-- doxytag: class="tbb::spin_rw_mutex_v3" -->Fast, unfair, spinning reader-writer lock with backoff and writer-preference.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00588.html">tbb_allocator.h</a>></code>
+<code>#include <<a class="el" href="a00566.html">spin_rw_mutex.h</a>></code>
 <p>
-<a href="a00136.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00113.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce4f3bf06e8aaf8020fa443297eff5f7"></a><!-- doxytag: member="tbb::zero_allocator< void, Allocator >::base_allocator_type" ref="ce4f3bf06e8aaf8020fa443297eff5f7" args="" -->
-typedef Allocator< void > </td><td class="memItemRight" valign="bottom"><b>base_allocator_type</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61332b2756de89f3f5f69310cbb6e70c"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::spin_rw_mutex_v3" ref="61332b2756de89f3f5f69310cbb6e70c" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5cd644eeecd6d729c848c8e99ffd4592"></a><!-- doxytag: member="tbb::zero_allocator< void, Allocator >::value_type" ref="5cd644eeecd6d729c848c8e99ffd4592" args="" -->
-typedef base_allocator_type::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Construct unacquired mutex. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9a815fb2759e55072ed413f1b6970cf3"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::~spin_rw_mutex_v3" ref="9a815fb2759e55072ed413f1b6970cf3" args="()" -->
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html#9a815fb2759e55072ed413f1b6970cf3">~spin_rw_mutex_v3</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f68aa346a17c94f8c5c7945a2c50858"></a><!-- doxytag: member="tbb::zero_allocator< void, Allocator >::pointer" ref="8f68aa346a17c94f8c5c7945a2c50858" args="" -->
-typedef base_allocator_type::pointer </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor asserts if the mutex is acquired, i.e. state is zero. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4007d6e1523dbc3c2bb7f889ab789a8a"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::lock" ref="4007d6e1523dbc3c2bb7f889ab789a8a" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html#4007d6e1523dbc3c2bb7f889ab789a8a">lock</a> ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ae95a5761371ee7b61f2c339385684e9"></a><!-- doxytag: member="tbb::zero_allocator< void, Allocator >::const_pointer" ref="ae95a5761371ee7b61f2c339385684e9" args="" -->
-typedef base_allocator_type::const_pointer </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire writer lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html#088bb256be794cc47d3b83791632fdfc">try_lock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring writer lock (non-blocking).  <a href="#088bb256be794cc47d3b83791632fdfc"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f9f52ead2098eb5fb12da59d5ae53b55"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::unlock" ref="f9f52ead2098eb5fb12da59d5ae53b55" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html#f9f52ead2098eb5fb12da59d5ae53b55">unlock</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="13f799708ac4ca437a16be202e263e18"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::lock_read" ref="13f799708ac4ca437a16be202e263e18" args="()" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html#13f799708ac4ca437a16be202e263e18">lock_read</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire reader lock. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html#b8667415869013f840d976aa406d385a">try_lock_read</a> ()</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquiring reader lock (non-blocking).  <a href="#b8667415869013f840d976aa406d385a"></a><br></td></tr>
+<tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c1e60f22c01604ca93c41b8334cc15e"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_rw_mutex" ref="4c1e60f22c01604ca93c41b8334cc15e" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_rw_mutex</b> = true</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="681a816fe76d6ca7752303f9dcc3c4b2"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_recursive_mutex" ref="681a816fe76d6ca7752303f9dcc3c4b2" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_recursive_mutex</b> = false</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4dd66d90df6247da6050e88b2aa3b820"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::is_fair_mutex" ref="4dd66d90df6247da6050e88b2aa3b820" args="" -->
+static const bool </td><td class="memItemRight" valign="bottom"><b>is_fair_mutex</b> = false</td></tr>
 
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html">scoped_lock</a></td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The scoped locking pattern.  <a href="a00308.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<template< typename T > class Allocator><br>
- class tbb::zero_allocator< void, Allocator ></h3>
+Fast, unfair, spinning reader-writer lock with backoff and writer-preference. 
+<p>
+<hr><h2>Member Function Documentation</h2>
+<a class="anchor" name="088bb256be794cc47d3b83791632fdfc"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::try_lock" ref="088bb256be794cc47d3b83791632fdfc" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool tbb::spin_rw_mutex_v3::try_lock           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
 
-Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1. 
 <p>
+Try acquiring writer lock (non-blocking). 
+<p>
+Return true if lock acquired; false otherwise. 
+</div>
+</div><p>
+<a class="anchor" name="b8667415869013f840d976aa406d385a"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::try_lock_read" ref="b8667415869013f840d976aa406d385a" args="()" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">bool tbb::spin_rw_mutex_v3::try_lock_read           </td>
+          <td>(</td>
+          <td class="paramname">          </td>
+          <td> ) </td>
+          <td width="100%"><code> [inline]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+Try acquiring reader lock (non-blocking). 
+<p>
+Return true if reader lock acquired; false otherwise. 
+</div>
+</div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00588.html">tbb_allocator.h</a></ul>
+<li><a class="el" href="a00566.html">spin_rw_mutex.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00289.html b/doc/html/a00308.html
similarity index 88%
copy from doc/html/a00289.html
copy to doc/html/a00308.html
index 335ba2b..6c9c2dd 100644
--- a/doc/html/a00289.html
+++ b/doc/html/a00308.html
@@ -21,7 +21,7 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00288.html">spin_rw_mutex_v3</a>::<a class="el" href="a00289.html">scoped_lock</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00307.html">spin_rw_mutex_v3</a>::<a class="el" href="a00308.html">scoped_lock</a></div>
 <h1>tbb::spin_rw_mutex_v3::scoped_lock Class Reference</h1><!-- doxytag: class="tbb::spin_rw_mutex_v3::scoped_lock" -->The scoped locking pattern.  
 <a href="#_details">More...</a>
 <p>
@@ -30,42 +30,42 @@
 <a href="a00114.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#d6ea60dee5563f702379bf5e51aa8806">scoped_lock</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Construct lock that has not acquired a mutex.  <a href="#d6ea60dee5563f702379bf5e51aa8806"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="42a92d4f8fdde425b111cfa8a9228071"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::scoped_lock" ref="42a92d4f8fdde425b111cfa8a9228071" args="(spin_rw_mutex &m, bool write=true)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a> (<a class="el" href="a00288.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#42a92d4f8fdde425b111cfa8a9228071">scoped_lock</a> (<a class="el" href="a00307.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d7eaaa3f2e2c5dc11e7005811b1bdd04"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::~scoped_lock" ref="d7eaaa3f2e2c5dc11e7005811b1bdd04" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">~scoped_lock</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock (if lock is held). <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b0b646ec5be02a127d159bbb7ca65353"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::acquire" ref="b0b646ec5be02a127d159bbb7ca65353" args="(spin_rw_mutex &m, bool write=true)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a> (<a class="el" href="a00288.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#b0b646ec5be02a127d159bbb7ca65353">acquire</a> (<a class="el" href="a00307.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Acquire lock on given mutex. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#3f0b1e3f2efab63336400348bd070226">upgrade_to_writer</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Upgrade reader to become a writer.  <a href="#3f0b1e3f2efab63336400348bd070226"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="61b14d00a78185c9b2d206ebfc379124"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::release" ref="61b14d00a78185c9b2d206ebfc379124" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#61b14d00a78185c9b2d206ebfc379124">release</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#61b14d00a78185c9b2d206ebfc379124">release</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Release lock. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c2c2c38a08cb9080e87099fac3e5bc94"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::downgrade_to_reader" ref="c2c2c38a08cb9080e87099fac3e5bc94" args="()" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a> ()</td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#c2c2c38a08cb9080e87099fac3e5bc94">downgrade_to_reader</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Downgrade writer to become a reader. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9879626968d9b9a04cd2ec0fb2e84ae1"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::try_acquire" ref="9879626968d9b9a04cd2ec0fb2e84ae1" args="(spin_rw_mutex &m, bool write=true)" -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a> (<a class="el" href="a00288.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#9879626968d9b9a04cd2ec0fb2e84ae1">try_acquire</a> (<a class="el" href="a00307.html">spin_rw_mutex</a> &m, bool write=true)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Try acquire lock on given mutex. <br></td></tr>
 <tr><td colspan="2"><br><h2>Protected Attributes</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d96d1a1fcc3d79ef3e5c06a53b8ffeaa"></a><!-- doxytag: member="tbb::spin_rw_mutex_v3::scoped_lock::mutex" ref="d96d1a1fcc3d79ef3e5c06a53b8ffeaa" args="" -->
-<a class="el" href="a00288.html">spin_rw_mutex</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">mutex</a></td></tr>
+<a class="el" href="a00307.html">spin_rw_mutex</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">mutex</a></td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">The pointer to the current mutex that is held, or NULL if no mutex is held. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">is_writer</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00308.html#6b5a7c3c67a36b05c4df8410d32627d8">is_writer</a></td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">If mutex!=NULL, then is_writer is true if holding a writer lock, false if holding a reader lock.  <a href="#6b5a7c3c67a36b05c4df8410d32627d8"></a><br></td></tr>
 </table>
@@ -124,7 +124,7 @@ Returns true if the upgrade happened without re-acquiring the lock and false if
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">bool <a class="el" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock::is_writer</a><code> [protected]</code>          </td>
+          <td class="memname">bool <a class="el" href="a00308.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock::is_writer</a><code> [protected]</code>          </td>
         </tr>
       </table>
 </div>
diff --git a/doc/html/a00290.html b/doc/html/a00309.html
similarity index 88%
copy from doc/html/a00290.html
copy to doc/html/a00309.html
index e45523b..7cf548e 100644
--- a/doc/html/a00290.html
+++ b/doc/html/a00309.html
@@ -21,14 +21,14 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00290.html">split</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00309.html">split</a></div>
 <h1>tbb::split Class Reference<br>
 <small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
+[<a class="el" href="a00395.html">Algorithms</a>]</small>
 </h1><!-- doxytag: class="tbb::split" -->Dummy type that distinguishes splitting constructor from copy constructor.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00600.html">tbb_stddef.h</a>></code>
+<code>#include <<a class="el" href="a00601.html">tbb_stddef.h</a>></code>
 <p>
 <table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
@@ -39,7 +39,7 @@ Dummy type that distinguishes splitting constructor from copy constructor.
 See description of parallel_for and parallel_reduce for example usages. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00600.html">tbb_stddef.h</a></ul>
+<li><a class="el" href="a00601.html">tbb_stddef.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00310.html b/doc/html/a00310.html
new file mode 100644
index 0000000..6154720
--- /dev/null
+++ b/doc/html/a00310.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>tbb::flow::interface6::split_node< TupleType, Allocator > Class Template Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="annotated.html"><span>Class List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class Members</span></a></li>
+  </ul></div>
+<div class="nav">
+<a class="el" href="a00383.html">tbb</a>::<b>flow</b>::<b>interface6</b>::<a class="el" href="a00310.html">split_node</a></div>
+<h1>tbb::flow::interface6::split_node< TupleType, Allocator > Class Template Reference</h1><!-- doxytag: class="tbb::flow::interface6::split_node" --><!-- doxytag: inherits="tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator >" --><a class="el" href="a00310.html">split_node</a>: accepts a tuple as input, forwards each element of the tuple to its  
+<a href="#_details">More...</a>
+<p>
+<code>#include <<a class="el" href="a00468.html">flow_graph.h</a>></code>
+<p>
+<p>Inheritance diagram for tbb::flow::interface6::split_node< TupleType, Allocator >:
+<p><center><img src="a00310.png" usemap="#tbb::flow::interface6::split_node< TupleType, Allocator >_map" border="0" alt=""></center>
+<map name="tbb::flow::interface6::split_node< TupleType, Allocator >_map">
+<area href="a00274.html" alt="tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator >" shape="rect" coords="474,56,1412,80">
+<area href="a00263.html" alt="tbb::flow::interface6::graph_node" shape="rect" coords="0,0,938,24">
+</map>
+<a href="a00052.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2be7c82940654e1ac75a0027748388a2"></a><!-- doxytag: member="tbb::flow::interface6::split_node::ports_type" ref="2be7c82940654e1ac75a0027748388a2" args="" -->
+typedef base_type::ports_type </td><td class="memItemRight" valign="bottom"><b>ports_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="414872500f7ab2cecd98edc6945dea47"></a><!-- doxytag: member="tbb::flow::interface6::split_node::input_type" ref="414872500f7ab2cecd98edc6945dea47" args="" -->
+typedef TupleType </td><td class="memItemRight" valign="bottom"><b>input_type</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06f32ac2a6bc1043ef6dd9ec40044522"></a><!-- doxytag: member="tbb::flow::interface6::split_node::allocator_type" ref="06f32ac2a6bc1043ef6dd9ec40044522" args="" -->
+typedef Allocator </td><td class="memItemRight" valign="bottom"><b>allocator_type</b></td></tr>
+
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce8ee443d310145fc36e152c608c2e49"></a><!-- doxytag: member="tbb::flow::interface6::split_node::split_node" ref="ce8ee443d310145fc36e152c608c2e49" args="(graph &g)" -->
+ </td><td class="memItemRight" valign="bottom"><b>split_node</b> (<a class="el" href="a00262.html">graph</a> &g)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c16a1c429bb2e3a33f6c56de84e63405"></a><!-- doxytag: member="tbb::flow::interface6::split_node::split_node" ref="c16a1c429bb2e3a33f6c56de84e63405" args="(const split_node &other)" -->
+ </td><td class="memItemRight" valign="bottom"><b>split_node</b> (const <a class="el" href="a00310.html">split_node</a> &other)</td></tr>
+
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>splitting_body</b></td></tr>
+
+</table>
+<hr><a name="_details"></a><h2>Detailed Description</h2>
+<h3>template<typename TupleType, typename Allocator = cache_aligned_allocator<TupleType>><br>
+ class tbb::flow::interface6::split_node< TupleType, Allocator ></h3>
+
+<a class="el" href="a00310.html">split_node</a>: accepts a tuple as input, forwards each element of the tuple to its 
+<p>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="a00468.html">flow_graph.h</a></ul>
+<hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00310.png b/doc/html/a00310.png
new file mode 100644
index 0000000..3645f7a
Binary files /dev/null and b/doc/html/a00310.png differ
diff --git a/doc/html/a00291.html b/doc/html/a00311.html
similarity index 85%
copy from doc/html/a00291.html
copy to doc/html/a00311.html
index 95a1bc4..57ad344 100644
--- a/doc/html/a00291.html
+++ b/doc/html/a00311.html
@@ -21,88 +21,88 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00291.html">task</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00311.html">task</a></div>
 <h1>tbb::task Class Reference<br>
 <small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00400.html">Task Scheduling</a>]</small>
 </h1><!-- doxytag: class="tbb::task" -->Base class for user-defined tasks.  
 <a href="#_details">More...</a>
 <p>
 <code>#include <<a class="el" href="a00567.html">task.h</a>></code>
 <p>
 <p>Inheritance diagram for tbb::task:
-<p><center><img src="a00291.png" usemap="#tbb::task_map" border="0" alt=""></center>
+<p><center><img src="a00311.png" usemap="#tbb::task_map" border="0" alt=""></center>
 <map name="tbb::task_map">
-<area href="a00242.html" alt="tbb::empty_task" shape="rect" coords="0,56,97,80">
+<area href="a00254.html" alt="tbb::empty_task" shape="rect" coords="0,56,97,80">
 </map>
 <a href="a00119.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef internal::affinity_id </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">typedef internal::affinity_id </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a></td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">An id as used for specifying affinity.  <a href="#d61bb32389d3857bf7511d69beaafb76"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task is running, and will be destroyed after method <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> completes.  <a href="#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task is running, and will be destroyed after method <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">execute()</a> completes.  <a href="#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a></td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">task to be rescheduled.  <a href="#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a></td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">task is in ready pool, or is going to be put there, or was just taken off.  <a href="#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a></td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">task object is freshly allocated or recycled.  <a href="#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a></td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">task object is on free list, or is going to be put there, or was just taken off.  <a href="#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a></td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">task to be recycled as continuation  <a href="#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> { <br>
-  <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>, 
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>, 
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>, 
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>, 
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a> { <br>
+  <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">executing</a>, 
+<a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">reexecute</a>, 
+<a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">ready</a>, 
+<a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">allocated</a>, 
 <br>
-  <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>, 
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a>
+  <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">freed</a>, 
+<a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">recycle</a>
 <br>
  }</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Enumeration of task states that the scheduler considers.  <a href="a00291.html#4a3c415562d17905390ea5b49d12293e">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Enumeration of task states that the scheduler considers.  <a href="a00311.html#4a3c415562d17905390ea5b49d12293e">More...</a><br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="98245ee0473f84cb19dbbf8c81134908"></a><!-- doxytag: member="tbb::task::~task" ref="98245ee0473f84cb19dbbf8c81134908" args="()" -->
-virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#98245ee0473f84cb19dbbf8c81134908">~task</a> ()</td></tr>
+virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#98245ee0473f84cb19dbbf8c81134908">~task</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="22c298cd40937a431a06777423f002f6"></a><!-- doxytag: member="tbb::task::execute" ref="22c298cd40937a431a06777423f002f6" args="()=0" -->
-virtual <a class="el" href="a00291.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute</a> ()=0</td></tr>
+virtual <a class="el" href="a00311.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">execute</a> ()=0</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Should be overridden by derived classes. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">internal::allocate_continuation_proxy & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#1434c79a5138993269d034008bff7329">allocate_continuation</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">internal::allocate_continuation_proxy & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#1434c79a5138993269d034008bff7329">allocate_continuation</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a continuation task of *this.  <a href="#1434c79a5138993269d034008bff7329"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1ff794f7053cd9148d5f280fbf07377f"></a><!-- doxytag: member="tbb::task::allocate_child" ref="1ff794f7053cd9148d5f280fbf07377f" args="()" -->
-internal::allocate_child_proxy & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a> ()</td></tr>
+internal::allocate_child_proxy & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a child task of *this. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a> (<a class="el" href="a00291.html">task</a> &t)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a> (<a class="el" href="a00311.html">task</a> &t)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy a task.  <a href="#dfaacf92685e5f86393bf657b2853bf8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#a67a79e18f62b43a623a00cfbd76db4c">recycle_as_continuation</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Change this to be a continuation of its former self.  <a href="#a67a79e18f62b43a623a00cfbd76db4c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#3b290d14109704e2b69dc1ac980a7a76">recycle_as_safe_continuation</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Recommended to use, safe variant of recycle_as_continuation.  <a href="#3b290d14109704e2b69dc1ac980a7a76"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="db399855177438bbc9cc61d508dae8d2"></a><!-- doxytag: member="tbb::task::recycle_as_child_of" ref="db399855177438bbc9cc61d508dae8d2" args="(task &new_parent)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a> (<a class="el" href="a00291.html">task</a> &new_parent)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#db399855177438bbc9cc61d508dae8d2">recycle_as_child_of</a> (<a class="el" href="a00311.html">task</a> &new_parent)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Change this to be a child of new_parent. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#4f1be9bbcdb487830dbe298b68d85144">recycle_to_reexecute</a> ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Schedule this for reexecution after current <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> returns.  <a href="#4f1be9bbcdb487830dbe298b68d85144"></a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Schedule this for reexecution after current <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">execute()</a> returns.  <a href="#4f1be9bbcdb487830dbe298b68d85144"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7653ceef53a188d05b5c779e1104b698"></a><!-- doxytag: member="tbb::task::depth" ref="7653ceef53a188d05b5c779e1104b698" args="() const " -->
 intptr_t </td><td class="memItemRight" valign="bottom"><b>depth</b> () const </td></tr>
 
@@ -113,112 +113,116 @@ void </td><td class="memItemRight" valign="bottom"><b>set_depth</b> (intptr
 void </td><td class="memItemRight" valign="bottom"><b>add_to_depth</b> (int)</td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="06a4206a57e8e12a439b14d6d41cfd92"></a><!-- doxytag: member="tbb::task::set_ref_count" ref="06a4206a57e8e12a439b14d6d41cfd92" args="(int count)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a> (int count)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a> (int count)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Set reference count. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Atomically increment reference count and returns its old value.  <a href="#f5fb43c7ad0de5a4b95703cebc39e345"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Atomically decrement reference count and returns its new value.  <a href="#ef4680f5c148020c5e7e43ddef44cd5d"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3ce28ca9baa771cfc37ecd72e69c4f3c"></a><!-- doxytag: member="tbb::task::spawn_and_wait_for_all" ref="3ce28ca9baa771cfc37ecd72e69c4f3c" args="(task &child)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a> (<a class="el" href="a00291.html">task</a> &child)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a> (<a class="el" href="a00311.html">task</a> &child)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Similar to spawn followed by wait_for_all, but more efficient. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="894ab68378e502776d8220eea7ce9fa1"></a><!-- doxytag: member="tbb::task::spawn_and_wait_for_all" ref="894ab68378e502776d8220eea7ce9fa1" args="(task_list &list)" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a> (<a class="el" href="a00294.html">task_list</a> &list)</td></tr>
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#894ab68378e502776d8220eea7ce9fa1">spawn_and_wait_for_all</a> (<a class="el" href="a00315.html">task_list</a> &list)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Similar to spawn followed by wait_for_all, but more efficient. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Wait for reference count to become one, and set reference count to zero.  <a href="#53d2615ad9c38859b4c8080936600283"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="314e98ee4347ccec83efcb9ee22e8596"></a><!-- doxytag: member="tbb::task::parent" ref="314e98ee4347ccec83efcb9ee22e8596" args="() const " -->
-<a class="el" href="a00291.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#314e98ee4347ccec83efcb9ee22e8596">parent</a> () const </td></tr>
+<a class="el" href="a00311.html">task</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#314e98ee4347ccec83efcb9ee22e8596">parent</a> () const </td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">task on whose behalf this task is working, or NULL if this is a root. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00293.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d2eaf79fcaa3ae473e3bd3f44bd8a464"></a><!-- doxytag: member="tbb::task::set_parent" ref="d2eaf79fcaa3ae473e3bd3f44bd8a464" args="(task *p)" -->
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">set_parent</a> (<a class="el" href="a00311.html">task</a> *p)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">sets parent task pointer to specified value <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="el" href="a00314.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">This method is deprecated and will be removed in the future.  <a href="#d8c36a93f3972590fbb65ff1cef3173b"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5987123486afca36ddebb9e2a8b7779a"></a><!-- doxytag: member="tbb::task::group" ref="5987123486afca36ddebb9e2a8b7779a" args="()" -->
-<a class="el" href="a00293.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">group</a> ()</td></tr>
+<a class="el" href="a00314.html">task_group_context</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#5987123486afca36ddebb9e2a8b7779a">group</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Pointer to the task group descriptor. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f9169402702f56bf519448aaf34450aa"></a><!-- doxytag: member="tbb::task::is_stolen_task" ref="f9169402702f56bf519448aaf34450aa" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a> () const </td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a> () const </td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">True if task was stolen from the task pool of another thread. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="0af7b2d7e6e8b4333b2accfce3dfb374"></a><!-- doxytag: member="tbb::task::state" ref="0af7b2d7e6e8b4333b2accfce3dfb374" args="() const " -->
-<a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a> () const </td></tr>
+<a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#0af7b2d7e6e8b4333b2accfce3dfb374">state</a> () const </td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Current execution state. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad774f55eaec008ae02b236423209ced"></a><!-- doxytag: member="tbb::task::ref_count" ref="ad774f55eaec008ae02b236423209ced" args="() const " -->
-int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#ad774f55eaec008ae02b236423209ced">ref_count</a> () const </td></tr>
+int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#ad774f55eaec008ae02b236423209ced">ref_count</a> () const </td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">The internal reference count. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c26718b3b247cd13deb1a741902e7105"></a><!-- doxytag: member="tbb::task::is_owned_by_current_thread" ref="c26718b3b247cd13deb1a741902e7105" args="() const " -->
-bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a> () const </td></tr>
+bool __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#c26718b3b247cd13deb1a741902e7105">is_owned_by_current_thread</a> () const </td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Obsolete, and only retained for the sake of backward compatibility. Always returns true. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="dca19d7a45487a7d67a0db517e2b57c9"></a><!-- doxytag: member="tbb::task::set_affinity" ref="dca19d7a45487a7d67a0db517e2b57c9" args="(affinity_id id)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a> (<a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#dca19d7a45487a7d67a0db517e2b57c9">set_affinity</a> (<a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Set affinity for this task. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3a920a56b0bcf2801518fb45b2c9d2be"></a><!-- doxytag: member="tbb::task::affinity" ref="3a920a56b0bcf2801518fb45b2c9d2be" args="() const " -->
-<a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a> () const </td></tr>
+<a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#3a920a56b0bcf2801518fb45b2c9d2be">affinity</a> () const </td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Current affinity of this task. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a> (<a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#713c338c8eeaebdc5a6b10a69c039b06">note_affinity</a> (<a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> id)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Invoked by scheduler to notify task that it ran on unexpected thread.  <a href="#713c338c8eeaebdc5a6b10a69c039b06"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a> (<a class="el" href="a00293.html">task_group_context</a> &ctx)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#62247be9a637a814c8e8f4bcfb3a1908">change_group</a> (<a class="el" href="a00314.html">task_group_context</a> &ctx)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Moves this task from its current group into another one.  <a href="#62247be9a637a814c8e8f4bcfb3a1908"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#0f3fb4aac549ab642022450a4bd13326">cancel_group_execution</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Initiates cancellation of all tasks in this cancellation group and its subordinate groups.  <a href="#0f3fb4aac549ab642022450a4bd13326"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="025f18118c057c4c8db87ff2ce8df975"></a><!-- doxytag: member="tbb::task::is_cancelled" ref="025f18118c057c4c8db87ff2ce8df975" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a> () const </td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a> () const </td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if the context has received cancellation request. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="9ac8d1542d67d9d80121ff986801ac26"></a><!-- doxytag: member="tbb::task::set_group_priority" ref="9ac8d1542d67d9d80121ff986801ac26" args="(priority_t p)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a> (priority_t p)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#9ac8d1542d67d9d80121ff986801ac26">set_group_priority</a> (priority_t p)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Changes priority of the task group this task belongs to. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e1d969a1ccab6796e3b8b2c1a5be33d2"></a><!-- doxytag: member="tbb::task::group_priority" ref="e1d969a1ccab6796e3b8b2c1a5be33d2" args="() const " -->
-priority_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a> () const </td></tr>
+priority_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#e1d969a1ccab6796e3b8b2c1a5be33d2">group_priority</a> () const </td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Retrieves current priority of the task group this task belongs to. <br></td></tr>
 <tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="23acb0da0afd690da797f9f882027d34"></a><!-- doxytag: member="tbb::task::allocate_root" ref="23acb0da0afd690da797f9f882027d34" args="()" -->
-static internal::allocate_root_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#23acb0da0afd690da797f9f882027d34">allocate_root</a> ()</td></tr>
+static internal::allocate_root_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#23acb0da0afd690da797f9f882027d34">allocate_root</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a root task. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ccc518caf31075a3e073996d2d240a4"></a><!-- doxytag: member="tbb::task::allocate_root" ref="8ccc518caf31075a3e073996d2d240a4" args="(task_group_context &ctx)" -->
-static internal::allocate_root_with_context_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a> (<a class="el" href="a00293.html">task_group_context</a> &ctx)</td></tr>
+static internal::allocate_root_with_context_proxy </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#8ccc518caf31075a3e073996d2d240a4">allocate_root</a> (<a class="el" href="a00314.html">task_group_context</a> &ctx)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Returns proxy for overloaded new that allocates a root task associated with user supplied context. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ce8ce689c26a4ddf343829bc3c73290a"></a><!-- doxytag: member="tbb::task::spawn_root_and_wait" ref="ce8ce689c26a4ddf343829bc3c73290a" args="(task &root)" -->
-static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a> (<a class="el" href="a00291.html">task</a> &root)</td></tr>
+static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">spawn_root_and_wait</a> (<a class="el" href="a00311.html">task</a> &root)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Spawn task allocated by allocate_root, wait for it to complete, and deallocate it. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a> (<a class="el" href="a00294.html">task_list</a> &root_list)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#c33c7edbaec67aa8a56f48986a9dc69f">spawn_root_and_wait</a> (<a class="el" href="a00315.html">task_list</a> &root_list)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Spawn root tasks on list and wait for all of them to finish.  <a href="#c33c7edbaec67aa8a56f48986a9dc69f"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a> (<a class="el" href="a00291.html">task</a> &t)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">enqueue</a> (<a class="el" href="a00311.html">task</a> &t)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue task for starvation-resistant execution.  <a href="#8365d063c0cc9d7bd616bca47256b93c"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fe6bf6aaf84e664134fabb6c4f409ea9"></a><!-- doxytag: member="tbb::task::enqueue" ref="fe6bf6aaf84e664134fabb6c4f409ea9" args="(task &t, priority_t p)" -->
-static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a> (<a class="el" href="a00291.html">task</a> &t, priority_t p)</td></tr>
+static void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#fe6bf6aaf84e664134fabb6c4f409ea9">enqueue</a> (<a class="el" href="a00311.html">task</a> &t, priority_t p)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Enqueue task for starvation-resistant execution on the specified priority level. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="bd43e8d6249738efafd12d6a4c72c5e3"></a><!-- doxytag: member="tbb::task::self" ref="bd43e8d6249738efafd12d6a4c72c5e3" args="()" -->
-static <a class="el" href="a00291.html">task</a> &__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a> ()</td></tr>
+static <a class="el" href="a00311.html">task</a> &__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#bd43e8d6249738efafd12d6a4c72c5e3">self</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">The innermost task being executed or destroyed by the current thread at the moment. <br></td></tr>
 <tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2bce8ec6e44706e70128f5cf91b76e67"></a><!-- doxytag: member="tbb::task::task" ref="2bce8ec6e44706e70128f5cf91b76e67" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">task</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html#2bce8ec6e44706e70128f5cf91b76e67">task</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Default constructor. <br></td></tr>
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
@@ -256,7 +260,7 @@ Base class for user-defined tasks.
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef internal::affinity_id <a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">tbb::task::affinity_id</a>          </td>
+          <td class="memname">typedef internal::affinity_id <a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">tbb::task::affinity_id</a>          </td>
         </tr>
       </table>
 </div>
@@ -274,7 +278,7 @@ Guaranteed to be integral type. Value of 0 means no affinity.
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">enum <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">tbb::task::state_type</a>          </td>
+          <td class="memname">enum <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">tbb::task::state_type</a>          </td>
         </tr>
       </table>
 </div>
@@ -286,7 +290,7 @@ Enumeration of task states that the scheduler considers.
 <dl compact><dt><b>Enumerator: </b></dt><dd>
 <table border="0" cellspacing="2" cellpadding="0">
 <tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9"></a><!-- doxytag: member="executing" ref="4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9" args="" -->executing</em> </td><td>
-task is running, and will be destroyed after method <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> completes. </td></tr>
+task is running, and will be destroyed after method <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">execute()</a> completes. </td></tr>
 <tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513"></a><!-- doxytag: member="reexecute" ref="4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513" args="" -->reexecute</em> </td><td>
 task to be rescheduled. </td></tr>
 <tr><td valign="top"><em><a class="anchor" name="4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a"></a><!-- doxytag: member="ready" ref="4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a" args="" -->ready</em> </td><td>
@@ -353,7 +357,7 @@ Initiates cancellation of all tasks in this cancellation group and its subordina
         <tr>
           <td class="memname">void __TBB_EXPORTED_METHOD tbb::task::change_group           </td>
           <td>(</td>
-          <td class="paramtype"><a class="el" href="a00293.html">task_group_context</a> & </td>
+          <td class="paramtype"><a class="el" href="a00314.html">task_group_context</a> & </td>
           <td class="paramname"> <em>ctx</em>          </td>
           <td> ) </td>
           <td width="100%"></td>
@@ -366,7 +370,7 @@ Initiates cancellation of all tasks in this cancellation group and its subordina
 Moves this task from its current group into another one. 
 <p>
 Argument ctx specifies the new group.<p>
-The primary purpose of this method is to associate unique task group context with a task allocated for subsequent enqueuing. In contrast to spawned tasks enqueued ones normally outlive the scope where they were created. This makes traditional usage model where task group context are allocated locally on the stack inapplicable. Dynamic allocation of context objects is performance inefficient. Method <a class="el" href="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">change_group()</a> allow [...]
+The primary purpose of this method is to associate unique task group context with a task allocated for subsequent enqueuing. In contrast to spawned tasks enqueued ones normally outlive the scope where they were created. This makes traditional usage model where task group context are allocated locally on the stack inapplicable. Dynamic allocation of context objects is performance inefficient. Method <a class="el" href="a00311.html#62247be9a637a814c8e8f4bcfb3a1908">change_group()</a> allow [...]
 </div>
 </div><p>
 <a class="anchor" name="d8c36a93f3972590fbb65ff1cef3173b"></a><!-- doxytag: member="tbb::task::context" ref="d8c36a93f3972590fbb65ff1cef3173b" args="()" -->
@@ -374,7 +378,7 @@ The primary purpose of this method is to associate unique task group context wit
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname"><a class="el" href="a00293.html">task_group_context</a>* tbb::task::context           </td>
+          <td class="memname"><a class="el" href="a00314.html">task_group_context</a>* tbb::task::context           </td>
           <td>(</td>
           <td class="paramname">          </td>
           <td> ) </td>
@@ -387,7 +391,7 @@ The primary purpose of this method is to associate unique task group context wit
 <p>
 This method is deprecated and will be removed in the future. 
 <p>
-Use method <a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">group()</a> instead. 
+Use method <a class="el" href="a00311.html#5987123486afca36ddebb9e2a8b7779a">group()</a> instead. 
 </div>
 </div><p>
 <a class="anchor" name="ef4680f5c148020c5e7e43ddef44cd5d"></a><!-- doxytag: member="tbb::task::decrement_ref_count" ref="ef4680f5c148020c5e7e43ddef44cd5d" args="()" -->
@@ -418,7 +422,7 @@ Has release semantics.
         <tr>
           <td class="memname">void __TBB_EXPORTED_METHOD tbb::task::destroy           </td>
           <td>(</td>
-          <td class="paramtype"><a class="el" href="a00291.html">task</a> & </td>
+          <td class="paramtype"><a class="el" href="a00311.html">task</a> & </td>
           <td class="paramname"> <em>t</em>          </td>
           <td> ) </td>
           <td width="100%"></td>
@@ -430,7 +434,7 @@ Has release semantics.
 <p>
 Destroy a task. 
 <p>
-Usually, calling this method is unnecessary, because a task is implicitly deleted after its <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> method runs. However, sometimes a task needs to be explicitly deallocated, such as when a root task is used as the parent in spawn_and_wait_for_all. 
+Usually, calling this method is unnecessary, because a task is implicitly deleted after its <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">execute()</a> method runs. However, sometimes a task needs to be explicitly deallocated, such as when a root task is used as the parent in spawn_and_wait_for_all. 
 </div>
 </div><p>
 <a class="anchor" name="8365d063c0cc9d7bd616bca47256b93c"></a><!-- doxytag: member="tbb::task::enqueue" ref="8365d063c0cc9d7bd616bca47256b93c" args="(task &t)" -->
@@ -440,7 +444,7 @@ Usually, calling this method is unnecessary, because a task is implicitly delete
         <tr>
           <td class="memname">static void tbb::task::enqueue           </td>
           <td>(</td>
-          <td class="paramtype"><a class="el" href="a00291.html">task</a> & </td>
+          <td class="paramtype"><a class="el" href="a00311.html">task</a> & </td>
           <td class="paramname"> <em>t</em>          </td>
           <td> ) </td>
           <td width="100%"><code> [inline, static]</code></td>
@@ -454,7 +458,7 @@ Enqueue task for starvation-resistant execution.
 <p>
 The task will be enqueued on the normal priority level disregarding the priority of its task group.<p>
 The rationale of such semantics is that priority of an enqueued task is statically fixed at the moment of its enqueuing, while task group priority is dynamic. Thus automatic priority inheritance would be generally a subject to the race, which may result in unexpected behavior.<p>
-Use <a class="el" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">enqueue()</a> overload with explicit priority value and <a class="el" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">task::group_priority()</a> method to implement such priority inheritance when it is really necessary. 
+Use <a class="el" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">enqueue()</a> overload with explicit priority value and <a class="el" href="a00311.html#e1d969a1ccab6796e3b8b2c1a5be33d2">task::group_priority()</a> method to implement such priority inheritance when it is really necessary. 
 </div>
 </div><p>
 <a class="anchor" name="f5fb43c7ad0de5a4b95703cebc39e345"></a><!-- doxytag: member="tbb::task::increment_ref_count" ref="f5fb43c7ad0de5a4b95703cebc39e345" args="()" -->
@@ -485,7 +489,7 @@ Has acquire semantics
         <tr>
           <td class="memname">virtual void __TBB_EXPORTED_METHOD tbb::task::note_affinity           </td>
           <td>(</td>
-          <td class="paramtype"><a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td>
+          <td class="paramtype"><a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">affinity_id</a> </td>
           <td class="paramname"> <em>id</em>          </td>
           <td> ) </td>
           <td width="100%"><code> [virtual]</code></td>
@@ -497,7 +501,7 @@ Has acquire semantics
 <p>
 Invoked by scheduler to notify task that it ran on unexpected thread. 
 <p>
-Invoked before method <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> runs, if task is stolen, or task has affinity but will be executed on another thread.<p>
+Invoked before method <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">execute()</a> runs, if task is stolen, or task has affinity but will be executed on another thread.<p>
 The default action does nothing. 
 </div>
 </div><p>
@@ -519,7 +523,7 @@ The default action does nothing.
 <p>
 Change this to be a continuation of its former self. 
 <p>
-The caller must guarantee that the task's refcount does not become zero until after the method <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. Typically, this is done by having method <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> return a pointer to a child of the task. If the guarantee cannot be made, use method recycle_as_safe_continuation instead.<p>
+The caller must guarantee that the task's refcount does not become zero until after the method <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. Typically, this is done by having method <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">execute()</a> return a pointer to a child of the task. If the guarantee cannot be made, use method recycle_as_safe_continuation instead.<p>
 Because of the hazard, this method may be deprecated in the future. 
 </div>
 </div><p>
@@ -541,7 +545,7 @@ Because of the hazard, this method may be deprecated in the future.
 <p>
 Recommended to use, safe variant of recycle_as_continuation. 
 <p>
-For safety, it requires additional increment of ref_count. With no decendants and ref_count of 1, it has the semantics of recycle_to_reexecute. 
+For safety, it requires additional increment of ref_count. With no descendants and ref_count of 1, it has the semantics of recycle_to_reexecute. 
 </div>
 </div><p>
 <a class="anchor" name="4f1be9bbcdb487830dbe298b68d85144"></a><!-- doxytag: member="tbb::task::recycle_to_reexecute" ref="4f1be9bbcdb487830dbe298b68d85144" args="()" -->
@@ -560,7 +564,7 @@ For safety, it requires additional increment of ref_count. With no decendants an
 <div class="memdoc">
 
 <p>
-Schedule this for reexecution after current <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. 
+Schedule this for reexecution after current <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">execute()</a> returns. 
 <p>
 Made obsolete by recycle_as_safe_continuation; may become deprecated. 
 </div>
@@ -572,7 +576,7 @@ Made obsolete by recycle_as_safe_continuation; may become deprecated.
         <tr>
           <td class="memname">void tbb::task::spawn_root_and_wait           </td>
           <td>(</td>
-          <td class="paramtype"><a class="el" href="a00294.html">task_list</a> & </td>
+          <td class="paramtype"><a class="el" href="a00315.html">task_list</a> & </td>
           <td class="paramname"> <em>root_list</em>          </td>
           <td> ) </td>
           <td width="100%"><code> [inline, static]</code></td>
diff --git a/doc/html/a00291.png b/doc/html/a00311.png
similarity index 100%
rename from doc/html/a00291.png
rename to doc/html/a00311.png
diff --git a/doc/html/a00292.html b/doc/html/a00312.html
similarity index 95%
copy from doc/html/a00292.html
copy to doc/html/a00312.html
index 7836bb9..ba52a82 100644
--- a/doc/html/a00292.html
+++ b/doc/html/a00312.html
@@ -21,7 +21,7 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>interface5</b>::<b>internal</b>::<a class="el" href="a00292.html">task_base</a></div>
+<a class="el" href="a00383.html">tbb</a>::<b>interface5</b>::<b>internal</b>::<a class="el" href="a00312.html">task_base</a></div>
 <h1>tbb::interface5::internal::task_base Class Reference</h1><!-- doxytag: class="tbb::interface5::internal::task_base" -->Base class for methods that became static in TBB 3.0.  
 <a href="#_details">More...</a>
 <p>
diff --git a/doc/html/a00239.html b/doc/html/a00314.html
similarity index 72%
copy from doc/html/a00239.html
copy to doc/html/a00314.html
index 76b45e0..bfa3bf0 100644
--- a/doc/html/a00239.html
+++ b/doc/html/a00314.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::continue_msg Class Reference</title>
+<title>tbb::task_group_context Struct Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,20 +21,17 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00239.html">continue_msg</a></div>
-<h1>tbb::continue_msg Class Reference</h1><!-- doxytag: class="tbb::continue_msg" -->An empty class used for messages that mean "I'm done".  
-<a href="#_details">More...</a>
-<p>
-<code>#include <<a class="el" href="a00466.html">graph.h</a>></code>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00314.html">task_group_context</a></div>
+<h1>tbb::task_group_context Struct Reference</h1><!-- doxytag: class="tbb::task_group_context" --><code>#include <<a class="el" href="a00506.html">parallel_invoke.h</a>></code>
 <p>
 <table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-An empty class used for messages that mean "I'm done". 
+Dummy to avoid cluttering the bulk of the header with enormous amount of ifdefs. 
 <p>
-<hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00466.html">graph.h</a></ul>
+<hr>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="a00506.html">parallel_invoke.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00294.html b/doc/html/a00315.html
similarity index 88%
copy from doc/html/a00294.html
copy to doc/html/a00315.html
index 4656519..c229fcb 100644
--- a/doc/html/a00294.html
+++ b/doc/html/a00315.html
@@ -21,10 +21,10 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00294.html">task_list</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00315.html">task_list</a></div>
 <h1>tbb::task_list Class Reference<br>
 <small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00400.html">Task Scheduling</a>]</small>
 </h1><!-- doxytag: class="tbb::task_list" -->A list of children.  
 <a href="#_details">More...</a>
 <p>
@@ -34,27 +34,27 @@
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="416341c2047eaef50417b41eaf7e9de6"></a><!-- doxytag: member="tbb::task_list::task_list" ref="416341c2047eaef50417b41eaf7e9de6" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#416341c2047eaef50417b41eaf7e9de6">task_list</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html#416341c2047eaef50417b41eaf7e9de6">task_list</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Construct empty list. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6d438f1499a02db1e59c24ab6043e5ba"></a><!-- doxytag: member="tbb::task_list::~task_list" ref="6d438f1499a02db1e59c24ab6043e5ba" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys the list, but does not destroy the task objects. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f3ac31e092814b90929f81bb30441959"></a><!-- doxytag: member="tbb::task_list::empty" ref="f3ac31e092814b90929f81bb30441959" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#f3ac31e092814b90929f81bb30441959">empty</a> () const </td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html#f3ac31e092814b90929f81bb30441959">empty</a> () const </td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">True if list if empty; false otherwise. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4cd34756bc4763dafb8c84838a0124ff"></a><!-- doxytag: member="tbb::task_list::push_back" ref="4cd34756bc4763dafb8c84838a0124ff" args="(task &task)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a> (<a class="el" href="a00291.html">task</a> &<a class="el" href="a00291.html">task</a>)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a> (<a class="el" href="a00311.html">task</a> &<a class="el" href="a00311.html">task</a>)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Push task onto back of list. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5fe85df5ed524418389d34051750347d"></a><!-- doxytag: member="tbb::task_list::pop_front" ref="5fe85df5ed524418389d34051750347d" args="()" -->
-<a class="el" href="a00291.html">task</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#5fe85df5ed524418389d34051750347d">pop_front</a> ()</td></tr>
+<a class="el" href="a00311.html">task</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html#5fe85df5ed524418389d34051750347d">pop_front</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Pop the front task from the list. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fce446ee13e025969945328f3ff59b95"></a><!-- doxytag: member="tbb::task_list::clear" ref="fce446ee13e025969945328f3ff59b95" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html#fce446ee13e025969945328f3ff59b95">clear</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html#fce446ee13e025969945328f3ff59b95">clear</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Clear the list. <br></td></tr>
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
diff --git a/doc/html/a00295.html b/doc/html/a00316.html
similarity index 90%
copy from doc/html/a00295.html
copy to doc/html/a00316.html
index a485399..cbc055e 100644
--- a/doc/html/a00295.html
+++ b/doc/html/a00316.html
@@ -21,10 +21,10 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00295.html">task_scheduler_init</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00316.html">task_scheduler_init</a></div>
 <h1>tbb::task_scheduler_init Class Reference<br>
 <small>
-[<a class="el" href="a00376.html">Task Scheduling</a>]</small>
+[<a class="el" href="a00400.html">Task Scheduling</a>]</small>
 </h1><!-- doxytag: class="tbb::task_scheduler_init" -->Class delimiting the scope of task scheduler activity.  
 <a href="#_details">More...</a>
 <p>
@@ -33,48 +33,48 @@
 <a href="a00128.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#d476053cc712e572554823492a5229ce">initialize</a> (int number_of_threads=<a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html#d476053cc712e572554823492a5229ce">initialize</a> (int number_of_threads=<a class="el" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Ensure that scheduler exists for this thread.  <a href="#d476053cc712e572554823492a5229ce"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a> (int number_of_threads, stack_size_type thread_stack_size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html#d5ed214a8bb53b0466ed91ff4734b9a3">initialize</a> (int number_of_threads, stack_size_type thread_stack_size)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">The overloaded method with stack size parameter.  <a href="#d5ed214a8bb53b0466ed91ff4734b9a3"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f73257e04cb7fb9bd5be2b635d9016f1"></a><!-- doxytag: member="tbb::task_scheduler_init::terminate" ref="f73257e04cb7fb9bd5be2b635d9016f1" args="()" -->
-void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a> ()</td></tr>
+void __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Inverse of method initialize. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="421600bf9bf9338bcf937063f2ff0e90"></a><!-- doxytag: member="tbb::task_scheduler_init::task_scheduler_init" ref="421600bf9bf9338bcf937063f2ff0e90" args="(int number_of_threads=automatic, stack_size_type thread_stack_size=0)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a> (int number_of_threads=<a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0)</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a> (int number_of_threads=<a class="el" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Shorthand for default constructor followed by call to initialize(number_of_threads). <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4da6c86292d80c703a66c1f6f5299488"></a><!-- doxytag: member="tbb::task_scheduler_init::~task_scheduler_init" ref="4da6c86292d80c703a66c1f6f5299488" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy scheduler for this thread if thread has no other live task_scheduler_inits. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="12752282977029f23416642bc03e8b74"></a><!-- doxytag: member="tbb::task_scheduler_init::is_active" ref="12752282977029f23416642bc03e8b74" args="() const " -->
-bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#12752282977029f23416642bc03e8b74">is_active</a> () const </td></tr>
+bool </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html#12752282977029f23416642bc03e8b74">is_active</a> () const </td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Returns true if scheduler is active (initialized); false otherwise. <br></td></tr>
 <tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">static int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">static int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the number of threads TBB scheduler would create if initialized by default.  <a href="#ba00714c33a41a3c2216f48613971cab"></a><br></td></tr>
 <tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8f5988e2b0fbb2d533fcbb7f2583743f"></a><!-- doxytag: member="tbb::task_scheduler_init::automatic" ref="8f5988e2b0fbb2d533fcbb7f2583743f" args="" -->
-static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1</td></tr>
+static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Typedef for number of threads that is automatic. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e6c860f1e559026ff3ef4599c0d6c514"></a><!-- doxytag: member="tbb::task_scheduler_init::deferred" ref="e6c860f1e559026ff3ef4599c0d6c514" args="" -->
-static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2</td></tr>
+static const int </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Argument to <a class="el" href="a00295.html#d476053cc712e572554823492a5229ce">initialize()</a> or constructor that causes initialization to be deferred. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Argument to <a class="el" href="a00316.html#d476053cc712e572554823492a5229ce">initialize()</a> or constructor that causes initialization to be deferred. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
 Class delimiting the scope of task scheduler activity. 
 <p>
-A thread can construct a <a class="el" href="a00295.html">task_scheduler_init</a> object and keep it alive while it uses TBB's tasking subsystem (including parallel algorithms).<p>
+A thread can construct a <a class="el" href="a00316.html">task_scheduler_init</a> object and keep it alive while it uses TBB's tasking subsystem (including parallel algorithms).<p>
 This class allows to customize properties of the TBB task pool to some extent. For example it can limit concurrency level of parallel work initiated by the given thread. It also can be used to specify stack size of the TBB worker threads, though this setting is not effective if the thread pool has already been created.<p>
-If a parallel construct is used without <a class="el" href="a00295.html">task_scheduler_init</a> object previously created, the scheduler will be initialized automatically with default settings, and will persist until this thread exits. Default concurrency level is defined as described in <a class="el" href="a00295.html#d476053cc712e572554823492a5229ce">task_scheduler_init::initialize()</a>. 
+If a parallel construct is used without <a class="el" href="a00316.html">task_scheduler_init</a> object previously created, the scheduler will be initialized automatically with default settings, and will persist until this thread exits. Default concurrency level is defined as described in <a class="el" href="a00316.html#d476053cc712e572554823492a5229ce">task_scheduler_init::initialize()</a>. 
 <p>
 <hr><h2>Member Function Documentation</h2>
 <a class="anchor" name="ba00714c33a41a3c2216f48613971cab"></a><!-- doxytag: member="tbb::task_scheduler_init::default_num_threads" ref="ba00714c33a41a3c2216f48613971cab" args="()" -->
@@ -140,7 +140,7 @@ Overloading is necessary to preserve ABI compatibility
           <td class="memname">void __TBB_EXPORTED_METHOD tbb::task_scheduler_init::initialize           </td>
           <td>(</td>
           <td class="paramtype">int </td>
-          <td class="paramname"> <em>number_of_threads</em> = <code><a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></code>          </td>
+          <td class="paramname"> <em>number_of_threads</em> = <code><a class="el" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a></code>          </td>
           <td> ) </td>
           <td width="100%"></td>
         </tr>
diff --git a/doc/html/a00296.html b/doc/html/a00317.html
similarity index 92%
copy from doc/html/a00296.html
copy to doc/html/a00317.html
index 6c0662e..afd87d6 100644
--- a/doc/html/a00296.html
+++ b/doc/html/a00317.html
@@ -21,10 +21,10 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00296.html">tbb_allocator</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00317.html">tbb_allocator</a></div>
 <h1>tbb::tbb_allocator< T > Class Template Reference<br>
 <small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00397.html">Memory Allocation</a>]</small>
 </h1><!-- doxytag: class="tbb::tbb_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  
 <a href="#_details">More...</a>
 <p>
@@ -61,18 +61,18 @@ typedef ptrdiff_t </td><td class="memItemRight" valign="bottom"><b>differen
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09a7f81fb2c3055aaecf058b11538544e108c3168e3be5de1d98e74723136fbf"></a><!-- doxytag: member="tbb::tbb_allocator::standard" ref="09a7f81fb2c3055aaecf058b11538544e108c3168e3be5de1d98e74723136fbf" args="" -->
  </td><td class="memItemRight" valign="bottom"><b>standard</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> { <b>scalable</b>, 
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> { <b>scalable</b>, 
 <b>standard</b>
  }</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Specifies current allocator. <br></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d85cd071047b52eeb207d458d54098cc"></a><!-- doxytag: member="tbb::tbb_allocator::tbb_allocator" ref="d85cd071047b52eeb207d458d54098cc" args="(const tbb_allocator &)" -->
- </td><td class="memItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00296.html">tbb_allocator</a> &)  throw ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00317.html">tbb_allocator</a> &)  throw ()</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="5c3cb04a50d15d38f4c66ca3e5d2f6af"></a><!-- doxytag: member="tbb::tbb_allocator::tbb_allocator" ref="5c3cb04a50d15d38f4c66ca3e5d2f6af" args="(const tbb_allocator< U > &)" -->
 template<typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00296.html">tbb_allocator</a>< U > &)  throw ()</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>tbb_allocator</b> (const <a class="el" href="a00317.html">tbb_allocator</a>< U > &)  throw ()</td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="08d3822344271d0a1c2e64e8c9c16b58"></a><!-- doxytag: member="tbb::tbb_allocator::address" ref="08d3822344271d0a1c2e64e8c9c16b58" args="(reference x) const " -->
 pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (reference x) const </td></tr>
@@ -81,28 +81,28 @@ pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (refer
 const_pointer </td><td class="memItemRight" valign="bottom"><b>address</b> (const_reference x) const </td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f6cb487b1bdce0b581f265a77dca6d53"></a><!-- doxytag: member="tbb::tbb_allocator::allocate" ref="f6cb487b1bdce0b581f265a77dca6d53" args="(size_type n, const void *=0)" -->
-pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a> (size_type n, const void *=0)</td></tr>
+pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a> (size_type n, const void *=0)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Allocate space for n objects. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fdd011fdf2f9ad07006dc7c0a7ec1da2"></a><!-- doxytag: member="tbb::tbb_allocator::deallocate" ref="fdd011fdf2f9ad07006dc7c0a7ec1da2" args="(pointer p, size_type)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a> (pointer p, size_type)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a> (pointer p, size_type)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Free previously allocated block of memory. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="f059ca2c96243024f0d562ee3a87a3a5"></a><!-- doxytag: member="tbb::tbb_allocator::max_size" ref="f059ca2c96243024f0d562ee3a87a3a5" args="() const " -->
-size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a> () const   throw ()</td></tr>
+size_type </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a> () const   throw ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Largest value for which method allocate might succeed. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ab228ab9e324ed041c2226e1d717df5f"></a><!-- doxytag: member="tbb::tbb_allocator::construct" ref="ab228ab9e324ed041c2226e1d717df5f" args="(pointer p, const value_type &value)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">construct</a> (pointer p, const value_type &value)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#ab228ab9e324ed041c2226e1d717df5f">construct</a> (pointer p, const value_type &value)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Copy-construct value at location pointed to by p. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ef133522bf55f05a605bee0763208281"></a><!-- doxytag: member="tbb::tbb_allocator::destroy" ref="ef133522bf55f05a605bee0763208281" args="(pointer p)" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#ef133522bf55f05a605bee0763208281">destroy</a> (pointer p)</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#ef133522bf55f05a605bee0763208281">destroy</a> (pointer p)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Destroy value at location pointed to by p. <br></td></tr>
 <tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="78701e7454ef8e1a25b5acd364367080"></a><!-- doxytag: member="tbb::tbb_allocator::allocator_type" ref="78701e7454ef8e1a25b5acd364367080" args="()" -->
-static <a class="el" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a> ()</td></tr>
+static <a class="el" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Returns current allocator. <br></td></tr>
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
diff --git a/doc/html/a00297.html b/doc/html/a00318.html
similarity index 95%
copy from doc/html/a00297.html
copy to doc/html/a00318.html
index 3a727da..cbb4c69 100644
--- a/doc/html/a00297.html
+++ b/doc/html/a00318.html
@@ -21,10 +21,10 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00297.html">tbb_allocator< void ></a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00318.html">tbb_allocator< void ></a></div>
 <h1>tbb::tbb_allocator< void > Class Template Reference<br>
 <small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00397.html">Memory Allocation</a>]</small>
 </h1><!-- doxytag: class="tbb::tbb_allocator< void >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  
 <a href="#_details">More...</a>
 <p>
diff --git a/doc/html/a00298.html b/doc/html/a00319.html
similarity index 84%
copy from doc/html/a00298.html
copy to doc/html/a00319.html
index 057f3cc..2146d84 100644
--- a/doc/html/a00298.html
+++ b/doc/html/a00319.html
@@ -21,48 +21,48 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00298.html">tbb_exception</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00319.html">tbb_exception</a></div>
 <h1>tbb::tbb_exception Class Reference</h1><!-- doxytag: class="tbb::tbb_exception" -->Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.  
 <a href="#_details">More...</a>
 <p>
 <code>#include <<a class="el" href="a00593.html">tbb_exception.h</a>></code>
 <p>
 <p>Inheritance diagram for tbb::tbb_exception:
-<p><center><img src="a00298.png" usemap="#tbb::tbb_exception_map" border="0" alt=""></center>
+<p><center><img src="a00319.png" usemap="#tbb::tbb_exception_map" border="0" alt=""></center>
 <map name="tbb::tbb_exception_map">
-<area href="a00228.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
-<area href="a00257.html" alt="tbb::movable_exception< ExceptionData >" shape="rect" coords="258,56,506,80">
+<area href="a00240.html" alt="tbb::captured_exception" shape="rect" coords="0,56,248,80">
+<area href="a00273.html" alt="tbb::movable_exception< ExceptionData >" shape="rect" coords="258,56,506,80">
 </map>
 <a href="a00142.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual <a class="el" href="a00298.html">tbb_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> ()=0  throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual <a class="el" href="a00319.html">tbb_exception</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> ()=0  throw ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Creates and returns pointer to the deep copy of this exception object.  <a href="#3e3482bf264d4ca4dde046cd9c02c766"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> ()=0  throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> ()=0  throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method.  <a href="#66c94938eca8bf88b76f3eccaaf215d8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> ()=0</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys objects created by the <a class="el" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method.  <a href="#66c94938eca8bf88b76f3eccaaf215d8"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> ()=0</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Throws this exception object.  <a href="#8588e07fa49692f4d734e4f2e4f048f4"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d00f6497e552fee978a02bfcbebf46e2"></a><!-- doxytag: member="tbb::tbb_exception::name" ref="d00f6497e552fee978a02bfcbebf46e2" args="() const =0" -->
-virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#d00f6497e552fee978a02bfcbebf46e2">name</a> () const =0  throw ()</td></tr>
+virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.html#d00f6497e552fee978a02bfcbebf46e2">name</a> () const =0  throw ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Returns RTTI name of the originally intercepted exception. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e8157689ecb66bc6c72d3618bf3cc371"></a><!-- doxytag: member="tbb::tbb_exception::what" ref="e8157689ecb66bc6c72d3618bf3cc371" args="() const =0" -->
-virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">what</a> () const =0  throw ()</td></tr>
+virtual const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.html#e8157689ecb66bc6c72d3618bf3cc371">what</a> () const =0  throw ()</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">what()</a> method. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a> (void *p)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns the result of originally intercepted exception's <a class="el" href="a00319.html#e8157689ecb66bc6c72d3618bf3cc371">what()</a> method. <br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete</a> (void *p)</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
 Interface to be implemented by all exceptions TBB recognizes and propagates across the threads. 
 <p>
-If an unhandled exception of the type derived from <a class="el" href="a00298.html">tbb::tbb_exception</a> is intercepted by the TBB scheduler in one of the worker threads, it is delivered to and re-thrown in the root thread. The root thread is the thread that has started the outermost algorithm or root task sharing the same <a class="el" href="a00293.html">task_group_context</a> with the guilty algorithm/task (the one that threw the exception first).<p>
+If an unhandled exception of the type derived from <a class="el" href="a00319.html">tbb::tbb_exception</a> is intercepted by the TBB scheduler in one of the worker threads, it is delivered to and re-thrown in the root thread. The root thread is the thread that has started the outermost algorithm or root task sharing the same <a class="el" href="a00313.html">task_group_context</a> with the guilty algorithm/task (the one that threw the exception first).<p>
 Note: when documentation mentions workers with respect to exception handling, masters are implied as well, because they are completely equivalent in this context. Consequently a root thread can be master or worker thread.<p>
 NOTE: In case of nested algorithms or complex task hierarchies when the nested levels share (explicitly or by means of implicit inheritance) the task group context of the outermost level, the exception may be (re-)thrown multiple times (ultimately - in each worker on each nesting level) before reaching the root thread at the outermost level. IMPORTANT: if you intercept an exception derived from this class on a nested level, you must re-throw it in the catch block by means of the "throw;" [...]
-TBB provides two implementations of this interface: <a class="el" href="a00228.html">tbb::captured_exception</a> and template class <a class="el" href="a00257.html">tbb::movable_exception</a>. See their declarations for more info. 
+TBB provides two implementations of this interface: <a class="el" href="a00240.html">tbb::captured_exception</a> and template class <a class="el" href="a00273.html">tbb::movable_exception</a>. See their declarations for more info. 
 <p>
 <hr><h2>Member Function Documentation</h2>
 <a class="anchor" name="66c94938eca8bf88b76f3eccaaf215d8"></a><!-- doxytag: member="tbb::tbb_exception::destroy" ref="66c94938eca8bf88b76f3eccaaf215d8" args="()=0" -->
@@ -81,11 +81,11 @@ TBB provides two implementations of this interface: <a class="el" href="a00228.h
 <div class="memdoc">
 
 <p>
-Destroys objects created by the <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method. 
+Destroys objects created by the <a class="el" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> method. 
 <p>
 Frees memory and calls destructor for this exception object. Can and must be used only on objects created by the move method. 
 <p>
-Implemented in <a class="el" href="a00228.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00240.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, and <a class="el" href="a00273.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>.
 </div>
 </div><p>
 <a class="anchor" name="3e3482bf264d4ca4dde046cd9c02c766"></a><!-- doxytag: member="tbb::tbb_exception::move" ref="3e3482bf264d4ca4dde046cd9c02c766" args="()=0" -->
@@ -93,7 +93,7 @@ Implemented in <a class="el" href="a00228.html#93d875d3555502ff6f18513525de204c"
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">virtual <a class="el" href="a00298.html">tbb_exception</a>* tbb::tbb_exception::move           </td>
+          <td class="memname">virtual <a class="el" href="a00319.html">tbb_exception</a>* tbb::tbb_exception::move           </td>
           <td>(</td>
           <td class="paramname">          </td>
           <td> ) </td>
@@ -108,7 +108,7 @@ Creates and returns pointer to the deep copy of this exception object.
 <p>
 Move semantics is allowed. 
 <p>
-Implemented in <a class="el" href="a00228.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00240.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, and <a class="el" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>.
 </div>
 </div><p>
 <a class="anchor" name="3f2da7f3d8a6e4c1df522af1213afb5a"></a><!-- doxytag: member="tbb::tbb_exception::operator delete" ref="3f2da7f3d8a6e4c1df522af1213afb5a" args="(void *p)" -->
@@ -128,8 +128,8 @@ Implemented in <a class="el" href="a00228.html#837a50b8f6a800bda225c39d1699643f"
 <div class="memdoc">
 
 <p>
-Operator delete is provided only to allow using existing smart pointers with TBB exception objects obtained as the result of applying <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> operation on an exception thrown out of TBB scheduler.<p>
-When overriding method <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> make sure to override operator delete as well if memory is allocated not by TBB's scalable allocator. 
+Operator delete is provided only to allow using existing smart pointers with TBB exception objects obtained as the result of applying <a class="el" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> operation on an exception thrown out of TBB scheduler.<p>
+When overriding method <a class="el" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">move()</a> make sure to override operator delete as well if memory is allocated not by TBB's scalable allocator. 
 </div>
 </div><p>
 <a class="anchor" name="8588e07fa49692f4d734e4f2e4f048f4"></a><!-- doxytag: member="tbb::tbb_exception::throw_self" ref="8588e07fa49692f4d734e4f2e4f048f4" args="()=0" -->
@@ -152,7 +152,7 @@ Throws this exception object.
 <p>
 Make sure that if you have several levels of derivation from this interface you implement or override this method on the most derived level. The implementation is as simple as "throw *this;". Failure to do this will result in exception of a base class type being thrown. 
 <p>
-Implemented in <a class="el" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00257.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
+Implemented in <a class="el" href="a00240.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, and <a class="el" href="a00273.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>.
 </div>
 </div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
diff --git a/doc/html/a00298.png b/doc/html/a00319.png
similarity index 100%
rename from doc/html/a00298.png
rename to doc/html/a00319.png
diff --git a/doc/html/a00299.html b/doc/html/a00320.html
similarity index 88%
copy from doc/html/a00299.html
copy to doc/html/a00320.html
index 93956b3..a5f307b 100644
--- a/doc/html/a00299.html
+++ b/doc/html/a00320.html
@@ -21,7 +21,7 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00299.html">tbb_exception_ptr</a></div>
+<a class="el" href="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00320.html">tbb_exception_ptr</a></div>
 <h1>tbb::internal::tbb_exception_ptr Class Reference</h1><!-- doxytag: class="tbb::internal::tbb_exception_ptr" -->Exception container that preserves the exact copy of the original exception.  
 <a href="#_details">More...</a>
 <p>
@@ -30,22 +30,22 @@
 <a href="a00145.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> ()  throw ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> ()  throw ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Destroys this objects.  <a href="#921875bbacd2c8a5f324c7da7a415262"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="292832fd5c523e3d8081a22247840a1d"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::throw_self" ref="292832fd5c523e3d8081a22247840a1d" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Throws the contained exception . <br></td></tr>
 <tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="65083750bebe799d3fe8143c794523bb"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="65083750bebe799d3fe8143c794523bb" args="()" -->
-static <a class="el" href="a00299.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> ()</td></tr>
+static <a class="el" href="a00320.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> ()</td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d1111b00ba54b7fe35e6d3a0f21de287"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="d1111b00ba54b7fe35e6d3a0f21de287" args="(const tbb_exception &tag)" -->
-static <a class="el" href="a00299.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const <a class="el" href="a00298.html">tbb_exception</a> &tag)</td></tr>
+static <a class="el" href="a00320.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const <a class="el" href="a00319.html">tbb_exception</a> &tag)</td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c35e5db8e9cdff5d1387db5b0bad2e4a"></a><!-- doxytag: member="tbb::internal::tbb_exception_ptr::allocate" ref="c35e5db8e9cdff5d1387db5b0bad2e4a" args="(captured_exception &src)" -->
-static <a class="el" href="a00299.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00228.html">captured_exception</a> &src)</td></tr>
+static <a class="el" href="a00320.html">tbb_exception_ptr</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00320.html#c35e5db8e9cdff5d1387db5b0bad2e4a">allocate</a> (<a class="el" href="a00240.html">captured_exception</a> &src)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">This overload uses move semantics (i.e. it empties src). <br></td></tr>
 </table>
diff --git a/doc/html/a00216.html b/doc/html/a00321.html
similarity index 55%
rename from doc/html/a00216.html
rename to doc/html/a00321.html
index c19731e..a8beaa8 100644
--- a/doc/html/a00216.html
+++ b/doc/html/a00321.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::atomic< T > Struct Template Reference</title>
+<title>tbb::tbb_hash_compare< Key > Struct Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -21,35 +21,30 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00216.html">atomic</a></div>
-<h1>tbb::atomic< T > Struct Template Reference<br>
-<small>
-[<a class="el" href="a00374.html">Synchronization</a>]</small>
-</h1><!-- doxytag: class="tbb::atomic" -->Primary template for atomic.  
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00321.html">tbb_hash_compare</a></div>
+<h1>tbb::tbb_hash_compare< Key > Struct Template Reference</h1><!-- doxytag: class="tbb::tbb_hash_compare" -->hash_compare that is default argument for concurrent_hash_map  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00410.html">atomic.h</a>></code>
+<code>#include <<a class="el" href="a00418.html">concurrent_hash_map.h</a>></code>
 <p>
-<a href="a00004.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00012.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1e29e03a31436bad5eb1aa5a9d46a2da"></a><!-- doxytag: member="tbb::atomic::operator=" ref="1e29e03a31436bad5eb1aa5a9d46a2da" args="(T rhs)" -->
-T </td><td class="memItemRight" valign="bottom"><b>operator=</b> (T rhs)</td></tr>
+<tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c35d106ad65aa6ca5ba9008c1c86f80d"></a><!-- doxytag: member="tbb::tbb_hash_compare::hash" ref="c35d106ad65aa6ca5ba9008c1c86f80d" args="(const Key &a)" -->
+static size_t </td><td class="memItemRight" valign="bottom"><b>hash</b> (const Key &a)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="90791297d59b1659cfaf0d93c7cc59ae"></a><!-- doxytag: member="tbb::atomic::operator=" ref="90791297d59b1659cfaf0d93c7cc59ae" args="(const atomic< T > &rhs)" -->
-<a class="el" href="a00216.html">atomic</a>< T > & </td><td class="memItemRight" valign="bottom"><b>operator=</b> (const <a class="el" href="a00216.html">atomic</a>< T > &rhs)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b4d302049aabea046e392ddfad8b3f06"></a><!-- doxytag: member="tbb::tbb_hash_compare::equal" ref="b4d302049aabea046e392ddfad8b3f06" args="(const Key &a, const Key &b)" -->
+static bool </td><td class="memItemRight" valign="bottom"><b>equal</b> (const Key &a, const Key &b)</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-<h3>template<typename T><br>
- struct tbb::atomic< T ></h3>
+<h3>template<typename Key><br>
+ struct tbb::tbb_hash_compare< Key ></h3>
 
-Primary template for atomic. 
-<p>
-See the Reference for details. 
+hash_compare that is default argument for concurrent_hash_map 
 <p>
 <hr>The documentation for this struct was generated from the following file:<ul>
-<li><a class="el" href="a00410.html">atomic.h</a></ul>
+<li><a class="el" href="a00418.html">concurrent_hash_map.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00301.html b/doc/html/a00322.html
similarity index 91%
copy from doc/html/a00301.html
copy to doc/html/a00322.html
index bb22869..38ef4e0 100644
--- a/doc/html/a00301.html
+++ b/doc/html/a00322.html
@@ -21,21 +21,21 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00301.html">thread_bound_filter</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00322.html">thread_bound_filter</a></div>
 <h1>tbb::thread_bound_filter Class Reference<br>
 <small>
-[<a class="el" href="a00371.html">Algorithms</a>]</small>
+[<a class="el" href="a00395.html">Algorithms</a>]</small>
 </h1><!-- doxytag: class="tbb::thread_bound_filter" --><!-- doxytag: inherits="tbb::filter" -->A stage in a pipeline served by a user thread.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00546.html">pipeline.h</a>></code>
+<code>#include <<a class="el" href="a00543.html">pipeline.h</a>></code>
 <p>
 <p>Inheritance diagram for tbb::thread_bound_filter:
-<p><center><img src="a00301.png" usemap="#tbb::thread_bound_filter_map" border="0" alt=""></center>
+<p><center><img src="a00322.png" usemap="#tbb::thread_bound_filter_map" border="0" alt=""></center>
 <map name="tbb::thread_bound_filter_map">
-<area href="a00245.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
+<area href="a00256.html" alt="tbb::filter" shape="rect" coords="0,0,145,24">
 </map>
-<a href="a00094.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00092.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="902c4645e624e8f589b89841df5331de0c135a0274225f59d2b2a682d1103f23"></a><!-- doxytag: member="tbb::thread_bound_filter::success" ref="902c4645e624e8f589b89841df5331de0c135a0274225f59d2b2a682d1103f23" args="" -->
@@ -53,10 +53,10 @@
  }</td></tr>
 
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">result_type __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">result_type __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">If a data item is available, invoke operator() on that item.  <a href="#c4f90f2c771bce748beb9be734fa286c"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">result_type __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">result_type __TBB_EXPORTED_METHOD </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Wait until a data item becomes available, and invoke operator() on that item.  <a href="#5e726bdc7fbd924c0b07bd558b1d4d5d"></a><br></td></tr>
 <tr><td colspan="2"><br><h2>Protected Member Functions</h2></td></tr>
@@ -111,7 +111,7 @@ This interface is non-blocking. Returns 'success' if an item was processed. Retu
 </div>
 </div><p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00546.html">pipeline.h</a></ul>
+<li><a class="el" href="a00543.html">pipeline.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00301.png b/doc/html/a00322.png
similarity index 100%
copy from doc/html/a00301.png
copy to doc/html/a00322.png
diff --git a/doc/html/a00302.html b/doc/html/a00323.html
similarity index 79%
copy from doc/html/a00302.html
copy to doc/html/a00323.html
index 82a3020..30b831a 100644
--- a/doc/html/a00302.html
+++ b/doc/html/a00323.html
@@ -21,42 +21,42 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00302.html">tick_count</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00323.html">tick_count</a></div>
 <h1>tbb::tick_count Class Reference<br>
 <small>
-[<a class="el" href="a00375.html">Timing</a>]</small>
+[<a class="el" href="a00399.html">Timing</a>]</small>
 </h1><!-- doxytag: class="tbb::tick_count" -->Absolute timestamp.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00616.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00618.html">tick_count.h</a>></code>
 <p>
-<a href="a00159.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00168.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="34593326ae4191e02a13c7cbdab9de4c"></a><!-- doxytag: member="tbb::tick_count::tick_count" ref="34593326ae4191e02a13c7cbdab9de4c" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Construct an absolute timestamp initialized to zero. <br></td></tr>
 <tr><td colspan="2"><br><h2>Static Public Member Functions</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fb7f78ca61cf28398645ace66e284473"></a><!-- doxytag: member="tbb::tick_count::now" ref="fb7f78ca61cf28398645ace66e284473" args="()" -->
-static <a class="el" href="a00302.html">tick_count</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#fb7f78ca61cf28398645ace66e284473">now</a> ()</td></tr>
+static <a class="el" href="a00323.html">tick_count</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html#fb7f78ca61cf28398645ace66e284473">now</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Return current time. <br></td></tr>
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09dde78a4100800c11bb883d6204b586"></a><!-- doxytag: member="tbb::tick_count::operator-" ref="09dde78a4100800c11bb883d6204b586" args="(const tick_count &t1, const tick_count &t0)" -->
-<a class="el" href="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00302.html">tick_count</a> &t1, const <a class="el" href="a00302.html">tick_count</a> &t0)</td></tr>
+<a class="el" href="a00324.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00323.html">tick_count</a> &t1, const <a class="el" href="a00323.html">tick_count</a> &t0)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Subtract two timestamps to get the time interval between. <br></td></tr>
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html">interval_t</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html">interval_t</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Relative time interval.  <a href="a00303.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Relative time interval.  <a href="a00324.html#_details">More...</a><br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
 Absolute timestamp. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00616.html">tick_count.h</a></ul>
+<li><a class="el" href="a00618.html">tick_count.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00303.html b/doc/html/a00324.html
similarity index 77%
copy from doc/html/a00303.html
copy to doc/html/a00324.html
index 6e582ab..7b213ca 100644
--- a/doc/html/a00303.html
+++ b/doc/html/a00324.html
@@ -21,49 +21,49 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00302.html">tick_count</a>::<a class="el" href="a00303.html">interval_t</a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00323.html">tick_count</a>::<a class="el" href="a00324.html">interval_t</a></div>
 <h1>tbb::tick_count::interval_t Class Reference</h1><!-- doxytag: class="tbb::tick_count::interval_t" -->Relative time interval.  
 <a href="#_details">More...</a>
 <p>
-<code>#include <<a class="el" href="a00616.html">tick_count.h</a>></code>
+<code>#include <<a class="el" href="a00618.html">tick_count.h</a>></code>
 <p>
-<a href="a00160.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00169.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="75a9a0949f8a8a84d6758835f1b48dad"></a><!-- doxytag: member="tbb::tick_count::interval_t::interval_t" ref="75a9a0949f8a8a84d6758835f1b48dad" args="()" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a> ()</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Construct a time interval representing zero time duration. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1a21a428e00cced2e6a49e0f5f2258bf"></a><!-- doxytag: member="tbb::tick_count::interval_t::interval_t" ref="1a21a428e00cced2e6a49e0f5f2258bf" args="(double sec)" -->
- </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a> (double sec)</td></tr>
+ </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#1a21a428e00cced2e6a49e0f5f2258bf">interval_t</a> (double sec)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Construct a time interval representing sec seconds time duration. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="d5d8429c0bc59cf6131b2abc7929fa59"></a><!-- doxytag: member="tbb::tick_count::interval_t::seconds" ref="d5d8429c0bc59cf6131b2abc7929fa59" args="() const " -->
-double </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a> () const </td></tr>
+double </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a> () const </td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Return the length of a time interval in seconds. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cd9814947902e26463a69a111530f81b"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator+=" ref="cd9814947902e26463a69a111530f81b" args="(const interval_t &i)" -->
-<a class="el" href="a00303.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#cd9814947902e26463a69a111530f81b">operator+=</a> (const <a class="el" href="a00303.html">interval_t</a> &i)</td></tr>
+<a class="el" href="a00324.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#cd9814947902e26463a69a111530f81b">operator+=</a> (const <a class="el" href="a00324.html">interval_t</a> &i)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Accumulation operator. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="35ff7eaf7c2031b4a991402ac9ecb940"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator-=" ref="35ff7eaf7c2031b4a991402ac9ecb940" args="(const interval_t &i)" -->
-<a class="el" href="a00303.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a> (const <a class="el" href="a00303.html">interval_t</a> &i)</td></tr>
+<a class="el" href="a00324.html">interval_t</a> & </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a> (const <a class="el" href="a00324.html">interval_t</a> &i)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Subtraction operator. <br></td></tr>
 <tr><td colspan="2"><br><h2>Friends</h2></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="cc3a7ad7000317951ce61f706163efe8"></a><!-- doxytag: member="tbb::tick_count::interval_t::tbb::tick_count" ref="cc3a7ad7000317951ce61f706163efe8" args="" -->
-class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#cc3a7ad7000317951ce61f706163efe8">tbb::tick_count</a></td></tr>
+class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#cc3a7ad7000317951ce61f706163efe8">tbb::tick_count</a></td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="09dde78a4100800c11bb883d6204b586"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator-" ref="09dde78a4100800c11bb883d6204b586" args="(const tick_count &t1, const tick_count &t0)" -->
-<a class="el" href="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00302.html">tick_count</a> &t1, const <a class="el" href="a00302.html">tick_count</a> &t0)</td></tr>
+<a class="el" href="a00324.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#09dde78a4100800c11bb883d6204b586">operator-</a> (const <a class="el" href="a00323.html">tick_count</a> &t1, const <a class="el" href="a00323.html">tick_count</a> &t0)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Extract the intervals from the tick_counts and subtract them. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5871ead1ca230efbe52a5008470e6428"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator+" ref="5871ead1ca230efbe52a5008470e6428" args="(const interval_t &i, const interval_t &j)" -->
-<a class="el" href="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#5871ead1ca230efbe52a5008470e6428">operator+</a> (const <a class="el" href="a00303.html">interval_t</a> &i, const <a class="el" href="a00303.html">interval_t</a> &j)</td></tr>
+<a class="el" href="a00324.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#5871ead1ca230efbe52a5008470e6428">operator+</a> (const <a class="el" href="a00324.html">interval_t</a> &i, const <a class="el" href="a00324.html">interval_t</a> &j)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Add two intervals. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="fa509691e1d689830931e36edd274f76"></a><!-- doxytag: member="tbb::tick_count::interval_t::operator-" ref="fa509691e1d689830931e36edd274f76" args="(const interval_t &i, const interval_t &j)" -->
-<a class="el" href="a00303.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html#fa509691e1d689830931e36edd274f76">operator-</a> (const <a class="el" href="a00303.html">interval_t</a> &i, const <a class="el" href="a00303.html">interval_t</a> &j)</td></tr>
+<a class="el" href="a00324.html">interval_t</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00324.html#fa509691e1d689830931e36edd274f76">operator-</a> (const <a class="el" href="a00324.html">interval_t</a> &i, const <a class="el" href="a00324.html">interval_t</a> &j)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Subtract two intervals. <br></td></tr>
 </table>
@@ -71,7 +71,7 @@ class </td><td class="memItemRight" valign="bottom"><a class="el" href="a00
 Relative time interval. 
 <p>
 <hr>The documentation for this class was generated from the following file:<ul>
-<li><a class="el" href="a00616.html">tick_count.h</a></ul>
+<li><a class="el" href="a00618.html">tick_count.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00305.html b/doc/html/a00325.html
similarity index 88%
copy from doc/html/a00305.html
copy to doc/html/a00325.html
index dc3026d..5f12ffe 100644
--- a/doc/html/a00305.html
+++ b/doc/html/a00325.html
@@ -21,17 +21,17 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<b>internal</b>::<a class="el" href="a00305.html">work_around_alignment_bug</a></div>
+<a class="el" href="a00383.html">tbb</a>::<b>internal</b>::<a class="el" href="a00325.html">work_around_alignment_bug</a></div>
 <h1>tbb::internal::work_around_alignment_bug< Size, T > Struct Template Reference</h1><!-- doxytag: class="tbb::internal::work_around_alignment_bug" -->Work around for bug in GNU 3.2 and MSVC compilers.  
 <a href="#_details">More...</a>
 <p>
 <code>#include <<a class="el" href="a00594.html">tbb_machine.h</a>></code>
 <p>
-<a href="a00153.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00164.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Static Public Attributes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="137d1b1dd94016bc52e423dc33c4fd1d"></a><!-- doxytag: member="tbb::internal::work_around_alignment_bug::alignment" ref="137d1b1dd94016bc52e423dc33c4fd1d" args="" -->
-static const size_t </td><td class="memItemRight" valign="bottom"><b>alignment</b> = __alignof(T)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="14283941aefd819871be2f5e24f5cb37"></a><!-- doxytag: member="tbb::internal::work_around_alignment_bug::alignment" ref="14283941aefd819871be2f5e24f5cb37" args="" -->
+static const size_t </td><td class="memItemRight" valign="bottom"><b>alignment</b> = __TBB_alignof(T)</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
diff --git a/doc/html/a00326.html b/doc/html/a00326.html
index e13b006..84281d3 100644
--- a/doc/html/a00326.html
+++ b/doc/html/a00326.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>graph.h File Reference</title>
+<title>tbb::zero_allocator< T, Allocator > Class Template Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -10,148 +10,79 @@
     <li><a href="index.html"><span>Main Page</span></a></li>
     <li><a href="modules.html"><span>Modules</span></a></li>
     <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
+    <li id="current"><a href="annotated.html"><span>Classes</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
     <li><a href="pages.html"><span>Related Pages</span></a></li>
   </ul></div>
 <div class="tabs">
   <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
+    <li><a href="annotated.html"><span>Class List</span></a></li>
+    <li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
+    <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
-<h1>graph.h File Reference</h1>The graph related classes and functions. <a href="#_details">More...</a>
+<div class="nav">
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00326.html">zero_allocator</a></div>
+<h1>tbb::zero_allocator< T, Allocator > Class Template Reference<br>
+<small>
+[<a class="el" href="a00397.html">Memory Allocation</a>]</small>
+</h1><!-- doxytag: class="tbb::zero_allocator" -->Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  
+<a href="#_details">More...</a>
 <p>
-
+<code>#include <<a class="el" href="a00588.html">tbb_allocator.h</a>></code>
 <p>
-<a href="a00466.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00134.html">List of all members.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Namespaces</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html">tbb</a></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><b>tbb::internal</b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::join_policy_namespace</b></td></tr>
-
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00251.html">tbb::graph_node</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The base of all graph nodes. Allows them to be stored in a collection for deletion.  <a href="a00251.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00239.html">tbb::continue_msg</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An empty class used for messages that mean "I'm done".  <a href="a00239.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html">tbb::sender< T ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pure virtual template class that defines a sender of messages of type T.  <a href="a00282.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html">tbb::receiver< T ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pure virtual template class that defines a receiver of messages of type T.  <a href="a00277.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html">tbb::continue_receiver</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for receivers of completion messages.  <a href="a00241.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html">tbb::graph</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The graph class.  <a href="a00250.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::graph::run_task< Body ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::graph::run_and_put_task< Receiver, Body ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html">tbb::source_node< Output ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An executable node that acts as a source, i.e. it has no predecessors.  <a href="a00285.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output.  <a href="a00249.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements an executable node that supports <a class="el" href="a00239.html">continue_msg</a> -> Output.  <a href="a00244.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::overwrite_node< T ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::write_once_node< T ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00240.html">tbb::continue_node</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Broadcasts completion message when it receives completion messages from all predecessors. Then resets.  <a href="a00240.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td></tr>
+<tr><td colspan="2"><br><h2>Public Types</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="77c87446a645cc3dbeba6fc82cc7eec0"></a><!-- doxytag: member="tbb::zero_allocator::base_allocator_type" ref="77c87446a645cc3dbeba6fc82cc7eec0" args="" -->
+typedef Allocator< T > </td><td class="memItemRight" valign="bottom"><b>base_allocator_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages of type T to all successors.  <a href="a00224.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2eb3bf02103f455e0614e0a392388428"></a><!-- doxytag: member="tbb::zero_allocator::value_type" ref="2eb3bf02103f455e0614e0a392388428" args="" -->
+typedef base_allocator_type::value_type </td><td class="memItemRight" valign="bottom"><b>value_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in arbitrary order.  <a href="a00225.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::buffer_node< T >::buffer_operation</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="54d0a81317a90278dc492d44cc7dcdfc"></a><!-- doxytag: member="tbb::zero_allocator::pointer" ref="54d0a81317a90278dc492d44cc7dcdfc" args="" -->
+typedef base_allocator_type::pointer </td><td class="memItemRight" valign="bottom"><b>pointer</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::buffer_node< T >::my_functor_t</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="50536b451124814064b0e8ff7b6cea21"></a><!-- doxytag: member="tbb::zero_allocator::const_pointer" ref="50536b451124814064b0e8ff7b6cea21" args="" -->
+typedef base_allocator_type::const_pointer </td><td class="memItemRight" valign="bottom"><b>const_pointer</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html">tbb::queue_node< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="2ef488ecc55bf4a619f68b021d5b93e2"></a><!-- doxytag: member="tbb::zero_allocator::reference" ref="2ef488ecc55bf4a619f68b021d5b93e2" args="" -->
+typedef base_allocator_type::reference </td><td class="memItemRight" valign="bottom"><b>reference</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in FIFO order.  <a href="a00269.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="31f0de5db53e4c219e8548078572e1ff"></a><!-- doxytag: member="tbb::zero_allocator::const_reference" ref="31f0de5db53e4c219e8548078572e1ff" args="" -->
+typedef base_allocator_type::const_reference </td><td class="memItemRight" valign="bottom"><b>const_reference</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in sequence order.  <a href="a00283.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="55acbfec8d7fd904c9b2040816522084"></a><!-- doxytag: member="tbb::zero_allocator::size_type" ref="55acbfec8d7fd904c9b2040816522084" args="" -->
+typedef base_allocator_type::size_type </td><td class="memItemRight" valign="bottom"><b>size_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in priority order.  <a href="a00268.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="c54d45a74bd3b48ff8db174c266ddede"></a><!-- doxytag: member="tbb::zero_allocator::difference_type" ref="c54d45a74bd3b48ff8db174c266ddede" args="" -->
+typedef base_allocator_type::difference_type </td><td class="memItemRight" valign="bottom"><b>difference_type</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages only if the threshold has not been reached.  <a href="a00255.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::forwarding_base</b></td></tr>
+<tr><td colspan="2"><br><h2>Public Member Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8c48c0436e3239be8f07c53c7f6658e4"></a><!-- doxytag: member="tbb::zero_allocator::zero_allocator" ref="8c48c0436e3239be8f07c53c7f6658e4" args="(const zero_allocator &a)" -->
+ </td><td class="memItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00326.html">zero_allocator</a> &a)  throw ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::join_helper< N ></b></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="67685c1cfcd3b5f81ac8f3c8dd1375b9"></a><!-- doxytag: member="tbb::zero_allocator::zero_allocator" ref="67685c1cfcd3b5f81ac8f3c8dd1375b9" args="(const zero_allocator< U > &a)" -->
+template<typename U> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top"> </td><td class="memTemplItemRight" valign="bottom"><b>zero_allocator</b> (const <a class="el" href="a00326.html">zero_allocator</a>< U > &a)  throw ()</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::join_helper< 1 ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="b6e7eb50d9faeca418d56a9758357377"></a><!-- doxytag: member="tbb::zero_allocator::allocate" ref="b6e7eb50d9faeca418d56a9758357377" args="(const size_type n, const void *hint=0)" -->
+pointer </td><td class="memItemRight" valign="bottom"><b>allocate</b> (const size_type n, const void *hint=0)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The two-phase join port.  <a href="a00304.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::join_node_FE< two_phase, InputTuple, OutputTuple ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="a00254.html">join_node_base</a>  <a href="a00254.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 2, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 3, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 4, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 5, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 6, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 7, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 8, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 9, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 10, OutputTuple, two_phase ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::join_node< OutputTuple, JP ></b></td></tr>
-
-<tr><td colspan="2"><br><h2>Enumerations</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>join_policy</b> { <b>two_phase</b>
- }</td></tr>
-
-<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0a5a2559e7d28a9bf8f9e5e60d745e86"></a><!-- doxytag: member="graph.h::make_edge" ref="0a5a2559e7d28a9bf8f9e5e60d745e86" args="(sender< T > &p, receiver< T > &s)" -->
-template<typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">tbb::make_edge</a> (sender< T > &p, receiver< T > &s)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes an edge between a single predecessor and a single successor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ac6def751039959ab7ab1e52c8535fd3"></a><!-- doxytag: member="graph.h::make_edges" ref="ac6def751039959ab7ab1e52c8535fd3" args="(sender< T > &p, SIterator s_begin, SIterator s_end)" -->
-template<typename T, typename SIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#ac6def751039959ab7ab1e52c8535fd3">tbb::make_edges</a> (sender< T > &p, SIterator s_begin, SIterator s_end)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes edges between a single predecessor and multiple successors. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9368d2f689961f790bf7aa4a8cc1135e"></a><!-- doxytag: member="graph.h::make_edges" ref="9368d2f689961f790bf7aa4a8cc1135e" args="(PIterator p_begin, PIterator p_end, receiver< T > &s)" -->
-template<typename T, typename PIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">tbb::make_edges</a> (PIterator p_begin, PIterator p_end, receiver< T > &s)</td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rebind</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes edges between a set of predecessors and a single successor. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-The graph related classes and functions. 
+<h3>template<typename T, template< typename X > class Allocator = tbb_allocator><br>
+ class tbb::zero_allocator< T, Allocator ></h3>
+
+Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5. 
+<p>
+The class is an adapter over an actual allocator that fills the allocation using memset function with template argument C as the value. The members are ordered the same way they are in section 20.4.1 of the ISO C++ standard. 
 <p>
-There are some applications that best express dependencies as messages passed between nodes in a graph. These messages may contain data or simply act as signals that a predecessors has completed. The graph class and its associated node classes can be used to express such applcations. <hr>
+<hr>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="a00588.html">tbb_allocator.h</a></ul>
+<hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
 <p></p>
diff --git a/doc/html/a00307.html b/doc/html/a00327.html
similarity index 95%
copy from doc/html/a00307.html
copy to doc/html/a00327.html
index fdfda97..598c711 100644
--- a/doc/html/a00307.html
+++ b/doc/html/a00327.html
@@ -21,10 +21,10 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00307.html">zero_allocator< void, Allocator ></a></div>
+<a class="el" href="a00383.html">tbb</a>::<a class="el" href="a00327.html">zero_allocator< void, Allocator ></a></div>
 <h1>tbb::zero_allocator< void, Allocator > Class Template Reference<br>
 <small>
-[<a class="el" href="a00373.html">Memory Allocation</a>]</small>
+[<a class="el" href="a00397.html">Memory Allocation</a>]</small>
 </h1><!-- doxytag: class="tbb::zero_allocator< void, Allocator >" -->Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  
 <a href="#_details">More...</a>
 <p>
diff --git a/doc/html/a00326.html b/doc/html/a00343.html
similarity index 56%
copy from doc/html/a00326.html
copy to doc/html/a00343.html
index e13b006..e693a50 100644
--- a/doc/html/a00326.html
+++ b/doc/html/a00343.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>graph.h File Reference</title>
+<title>flow_graph.h File Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -19,134 +19,122 @@
     <li><a href="files.html"><span>File List</span></a></li>
     <li><a href="globals.html"><span>File Members</span></a></li>
   </ul></div>
-<h1>graph.h File Reference</h1>The graph related classes and functions. <a href="#_details">More...</a>
+<h1>flow_graph.h File Reference</h1>The graph related classes and functions. <a href="#_details">More...</a>
 <p>
 
 <p>
-<a href="a00466.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00468.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Namespaces</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html">tbb</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html">tbb</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><b>tbb::internal</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><b>tbb::flow</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::join_policy_namespace</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6</b></td></tr>
 
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00251.html">tbb::graph_node</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The base of all graph nodes. Allows them to be stored in a collection for deletion.  <a href="a00251.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00239.html">tbb::continue_msg</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An empty class used for messages that mean "I'm done".  <a href="a00239.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html">tbb::sender< T ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pure virtual template class that defines a sender of messages of type T.  <a href="a00282.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html">tbb::receiver< T ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pure virtual template class that defines a receiver of messages of type T.  <a href="a00277.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html">tbb::continue_receiver</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for receivers of completion messages.  <a href="a00241.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html">tbb::graph</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><b>internal::graph_policy_namespace</b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The graph class.  <a href="a00250.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::graph::run_task< Body ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><b>interface6::internal::graph_policy_namespace</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::graph::run_and_put_task< Receiver, Body ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html">tbb::source_node< Output ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An executable node that acts as a source, i.e. it has no predecessors.  <a href="a00285.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output.  <a href="a00249.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The base of all graph nodes. Allows them to be stored in a collection for deletion.  <a href="a00263.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00251.html">tbb::flow::interface6::continue_msg</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements an executable node that supports <a class="el" href="a00239.html">continue_msg</a> -> Output.  <a href="a00244.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::overwrite_node< T ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An empty class used for messages that mean "I'm done".  <a href="a00251.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::write_once_node< T ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pure virtual template class that defines a sender of messages of type T.  <a href="a00301.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00240.html">tbb::continue_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Pure virtual template class that defines a receiver of messages of type T.  <a href="a00295.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Broadcasts completion message when it receives completion messages from all predecessors. Then resets.  <a href="a00240.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for receivers of completion messages.  <a href="a00253.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages of type T to all successors.  <a href="a00224.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The graph class.  <a href="a00262.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::graph::run_task< Body ></b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in arbitrary order.  <a href="a00225.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::buffer_node< T >::buffer_operation</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::graph::run_and_put_task< Receiver, Body ></b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::buffer_node< T >::my_functor_t</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html">tbb::queue_node< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An executable node that acts as a source, i.e. it has no predecessors.  <a href="a00304.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in FIFO order.  <a href="a00269.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output.  <a href="a00260.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in sequence order.  <a href="a00283.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output.  <a href="a00261.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in priority order.  <a href="a00268.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">implements a function node that supports Input -> (set of outputs)  <a href="a00274.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::multioutput_function_node< Input, Output, queueing, Allocator ></b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages only if the threshold has not been reached.  <a href="a00255.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::forwarding_base</b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::join_helper< N ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="a00310.html">split_node</a>: accepts a tuple as input, forwards each element of the tuple to its  <a href="a00310.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::split_node< TupleType, Allocator >::splitting_body</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::join_helper< 1 ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements an executable node that supports <a class="el" href="a00251.html">continue_msg</a> -> Output.  <a href="a00252.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::overwrite_node< T ></b></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The two-phase join port.  <a href="a00304.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::join_node_FE< two_phase, InputTuple, OutputTuple ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::write_once_node< T ></b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight"><a class="el" href="a00254.html">join_node_base</a>  <a href="a00254.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 2, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages of type T to all successors.  <a href="a00236.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 3, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in arbitrary order.  <a href="a00237.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::buffer_node< T, A >::buffer_operation</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 4, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 5, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in FIFO order.  <a href="a00287.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 6, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in sequence order.  <a href="a00302.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 7, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in priority order.  <a href="a00286.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 8, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages only if the threshold has not been reached.  <a href="a00266.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::join_node< OutputTuple, reserving ></b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 9, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::join_node< OutputTuple, queueing ></b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::internal::unfolded_join_node< 10, OutputTuple, two_phase ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::join_node< OutputTuple, tag_matching ></b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::join_node< OutputTuple, JP ></b></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::flow::interface6::or_node< InputTuple ></b></td></tr>
 
 <tr><td colspan="2"><br><h2>Enumerations</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>join_policy</b> { <b>two_phase</b>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><b>concurrency</b> { <b>unlimited</b> =  0, 
+<b>serial</b> =  1
  }</td></tr>
 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An enumeration the provides the two most common concurrency levels: unlimited and serial. <br></td></tr>
 <tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0a5a2559e7d28a9bf8f9e5e60d745e86"></a><!-- doxytag: member="graph.h::make_edge" ref="0a5a2559e7d28a9bf8f9e5e60d745e86" args="(sender< T > &p, receiver< T > &s)" -->
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="511941e0793451ab18c6ccf489a67e47"></a><!-- doxytag: member="flow_graph.h::make_edge" ref="511941e0793451ab18c6ccf489a67e47" args="(sender< T > &p, receiver< T > &s)" -->
 template<typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">tbb::make_edge</a> (sender< T > &p, receiver< T > &s)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00386.html#511941e0793451ab18c6ccf489a67e47">tbb::flow::interface6::make_edge</a> (sender< T > &p, receiver< T > &s)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Makes an edge between a single predecessor and a single successor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ac6def751039959ab7ab1e52c8535fd3"></a><!-- doxytag: member="graph.h::make_edges" ref="ac6def751039959ab7ab1e52c8535fd3" args="(sender< T > &p, SIterator s_begin, SIterator s_end)" -->
-template<typename T, typename SIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#ac6def751039959ab7ab1e52c8535fd3">tbb::make_edges</a> (sender< T > &p, SIterator s_begin, SIterator s_end)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="15f0356fd7bcade4868d3b083ea671c2"></a><!-- doxytag: member="flow_graph.h::remove_edge" ref="15f0356fd7bcade4868d3b083ea671c2" args="(sender< T > &p, receiver< T > &s)" -->
+template<typename T> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00386.html#15f0356fd7bcade4868d3b083ea671c2">tbb::flow::interface6::remove_edge</a> (sender< T > &p, receiver< T > &s)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes edges between a single predecessor and multiple successors. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9368d2f689961f790bf7aa4a8cc1135e"></a><!-- doxytag: member="graph.h::make_edges" ref="9368d2f689961f790bf7aa4a8cc1135e" args="(PIterator p_begin, PIterator p_end, receiver< T > &s)" -->
-template<typename T, typename PIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">tbb::make_edges</a> (PIterator p_begin, PIterator p_end, receiver< T > &s)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes an edge between a single predecessor and a single successor. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="c8a3ee78426f0aa4df0c5a5e4bcd53e1"></a><!-- doxytag: member="flow_graph.h::copy_body" ref="c8a3ee78426f0aa4df0c5a5e4bcd53e1" args="(Node &n)" -->
+template<typename Body, typename Node> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Body </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00386.html#c8a3ee78426f0aa4df0c5a5e4bcd53e1">tbb::flow::interface6::copy_body</a> (Node &n)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes edges between a set of predecessors and a single successor. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Returns a copy of the body from a function or continue node. <br></td></tr>
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
 The graph related classes and functions. 
diff --git a/doc/html/a00344.html b/doc/html/a00344.html
index 78dbf54..1b3c8b5 100644
--- a/doc/html/a00344.html
+++ b/doc/html/a00344.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>scalable_allocator.h File Reference</title>
+<title>memory_pool.h File Reference</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -19,50 +19,39 @@
     <li><a href="files.html"><span>File List</span></a></li>
     <li><a href="globals.html"><span>File Members</span></a></li>
   </ul></div>
-<h1>scalable_allocator.h File Reference</h1>
+<h1>memory_pool.h File Reference</h1>
 <p>
-<a href="a00564.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00480.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Namespaces</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html">tbb</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html">tbb</a></td></tr>
 
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00280.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>tbb::scalable_allocator< T >::rebind< U ></b></td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html">tbb::scalable_allocator< void ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00281.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>tbb::scalable_allocator< void >::rebind< U ></b></td></tr>
-
-<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><b>tbb::interface6</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00270.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>tbb::interface6::memory_pool_allocator< T, P >::rebind< U ></b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00271.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>tbb::interface6::memory_pool_allocator< void, P >::rebind< U ></b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html">tbb::interface6::memory_pool< Alloc ></a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-safe growable pool allocator for variable-size requests.  <a href="a00269.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb::interface6::fixed_pool</b></td></tr>
 
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="906ebb461ecb0446989739fd0399e4b8"></a><!-- doxytag: member="scalable_allocator.h::operator==" ref="906ebb461ecb0446989739fd0399e4b8" args="(const scalable_allocator< T > &, const scalable_allocator< U > &)" -->
-template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>tbb::operator==</b> (const scalable_allocator< T > &, const scalable_allocator< U > &)</td></tr>
+<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="157d737026f35a661bbb784af7e16cd4"></a><!-- doxytag: member="memory_pool.h::operator==" ref="157d737026f35a661bbb784af7e16cd4" args="(const memory_pool_allocator< T, P > &a, const memory_pool_allocator< U, P > &b)" -->
+template<typename T, typename U, typename P> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>tbb::interface6::operator==</b> (const memory_pool_allocator< T, P > &a, const memory_pool_allocator< U, P > &b)</td></tr>
 
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="a92757aca0a69082eb8dc223eb257433"></a><!-- doxytag: member="scalable_allocator.h::operator!=" ref="a92757aca0a69082eb8dc223eb257433" args="(const scalable_allocator< T > &, const scalable_allocator< U > &)" -->
-template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>tbb::operator!=</b> (const scalable_allocator< T > &, const scalable_allocator< U > &)</td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4665e8f86e3bc274708bf7994beec895"></a><!-- doxytag: member="memory_pool.h::operator!=" ref="4665e8f86e3bc274708bf7994beec895" args="(const memory_pool_allocator< T, P > &a, const memory_pool_allocator< U, P > &b)" -->
+template<typename T, typename U, typename P> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>tbb::interface6::operator!=</b> (const memory_pool_allocator< T, P > &a, const memory_pool_allocator< U, P > &b)</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
diff --git a/doc/html/a00344.html b/doc/html/a00363.html
similarity index 55%
copy from doc/html/a00344.html
copy to doc/html/a00363.html
index 78dbf54..7edb342 100644
--- a/doc/html/a00344.html
+++ b/doc/html/a00363.html
@@ -21,40 +21,69 @@
   </ul></div>
 <h1>scalable_allocator.h File Reference</h1>
 <p>
-<a href="a00564.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
+<a href="a00562.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Namespaces</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html">tbb</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><b>rml</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html">tbb</a></td></tr>
 
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>rml::MemPoolPolicy</b></td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00280.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00299.html#_details">More...</a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>tbb::scalable_allocator< T >::rebind< U ></b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html">tbb::scalable_allocator< void ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html">tbb::scalable_allocator< void ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00281.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00300.html#_details">More...</a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><b>tbb::scalable_allocator< void >::rebind< U ></b></td></tr>
 
+<tr><td colspan="2"><br><h2>Typedefs</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="5af06ad025ac20cff3a1c13aa5bded5c"></a><!-- doxytag: member="scalable_allocator.h::rawAllocType" ref="5af06ad025ac20cff3a1c13aa5bded5c" args="(intptr_t pool_id, size_t &bytes)" -->
+typedef void *(*) </td><td class="memItemRight" valign="bottom"><b>rml::rawAllocType</b> (intptr_t pool_id, size_t &bytes)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="49f1efbc1496ae2c1492093bb222051b"></a><!-- doxytag: member="scalable_allocator.h::rawFreeType" ref="49f1efbc1496ae2c1492093bb222051b" args="(intptr_t pool_id, void *raw_ptr, size_t raw_bytes)" -->
+typedef int(*) </td><td class="memItemRight" valign="bottom"><b>rml::rawFreeType</b> (intptr_t pool_id, void *raw_ptr, size_t raw_bytes)</td></tr>
+
 <tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="8ed52400cba22b7c02913eca8135f782"></a><!-- doxytag: member="scalable_allocator.h::pool_create" ref="8ed52400cba22b7c02913eca8135f782" args="(intptr_t pool_id, const MemPoolPolicy *memPoolPolicy)" -->
+MemoryPool * </td><td class="memItemRight" valign="bottom"><b>rml::pool_create</b> (intptr_t pool_id, const MemPoolPolicy *memPoolPolicy)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="66dafd186fef3ce07c5acfa57309671d"></a><!-- doxytag: member="scalable_allocator.h::pool_destroy" ref="66dafd186fef3ce07c5acfa57309671d" args="(MemoryPool *memPool)" -->
+bool </td><td class="memItemRight" valign="bottom"><b>rml::pool_destroy</b> (MemoryPool *memPool)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="1f68622d83e291b152ba9bdb5eb54c4c"></a><!-- doxytag: member="scalable_allocator.h::pool_malloc" ref="1f68622d83e291b152ba9bdb5eb54c4c" args="(MemoryPool *memPool, size_t size)" -->
+void * </td><td class="memItemRight" valign="bottom"><b>rml::pool_malloc</b> (MemoryPool *memPool, size_t size)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="4c46ef1c26429df31030d3278e5479fc"></a><!-- doxytag: member="scalable_allocator.h::pool_realloc" ref="4c46ef1c26429df31030d3278e5479fc" args="(MemoryPool *memPool, void *object, size_t size)" -->
+void * </td><td class="memItemRight" valign="bottom"><b>rml::pool_realloc</b> (MemoryPool *memPool, void *object, size_t size)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="3eab1c7294baade9d21fad92f979890a"></a><!-- doxytag: member="scalable_allocator.h::pool_reset" ref="3eab1c7294baade9d21fad92f979890a" args="(MemoryPool *memPool)" -->
+bool </td><td class="memItemRight" valign="bottom"><b>rml::pool_reset</b> (MemoryPool *memPool)</td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="e43a04a5b9e84bb26345945b1a15ed28"></a><!-- doxytag: member="scalable_allocator.h::pool_free" ref="e43a04a5b9e84bb26345945b1a15ed28" args="(MemoryPool *memPool, void *object)" -->
+bool </td><td class="memItemRight" valign="bottom"><b>rml::pool_free</b> (MemoryPool *memPool, void *object)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="906ebb461ecb0446989739fd0399e4b8"></a><!-- doxytag: member="scalable_allocator.h::operator==" ref="906ebb461ecb0446989739fd0399e4b8" args="(const scalable_allocator< T > &, const scalable_allocator< U > &)" -->
 template<typename T, typename U> </td></tr>
diff --git a/doc/html/a00370.html b/doc/html/a00370.html
deleted file mode 100644
index e113fb8..0000000
--- a/doc/html/a00370.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb::strict_ppl Namespace Reference</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li id="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="namespaces.html"><span>Namespace List</span></a></li>
-    <li><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
-  </ul></div>
-<div class="nav">
-<a class="el" href="a00362.html">tbb</a>::<a class="el" href="a00370.html">strict_ppl</a></div>
-<h1>tbb::strict_ppl Namespace Reference</h1>For internal use only.  
-<a href="#_details">More...</a>
-<p>
-<table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html">concurrent_queue</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe non-blocking concurrent queue.  <a href="a00236.html#_details">More...</a><br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="15c764c70c8a32e7a4b8c291d0cc8dde"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="15c764c70c8a32e7a4b8c291d0cc8dde" args="(Index first, Index last, Index step, const Function &f)" -->
-template<typename Index, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00370.html#15c764c70c8a32e7a4b8c291d0cc8dde">parallel_for</a> (Index first, Index last, Index step, const Function &f)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range of integers with a step provided. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="fb5925ad98ec9608139661cfd2b9b88f"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="fb5925ad98ec9608139661cfd2b9b88f" args="(Index first, Index last, Index step, const Function &f, tbb::task_group_context &context)" -->
-template<typename Index, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_for</b> (Index first, Index last, Index step, const Function &f, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="490399525b1e690ec31d6db964c6b272"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="490399525b1e690ec31d6db964c6b272" args="(Index first, Index last, const Function &f)" -->
-template<typename Index, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00370.html#490399525b1e690ec31d6db964c6b272">parallel_for</a> (Index first, Index last, const Function &f)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range of integers with a default step value. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="bda0b331c88a836cb756fff0f661d609"></a><!-- doxytag: member="tbb::strict_ppl::parallel_for" ref="bda0b331c88a836cb756fff0f661d609" args="(Index first, Index last, const Function &f, tbb::task_group_context &context)" -->
-template<typename Index, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_for</b> (Index first, Index last, const Function &f, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
-
-</table>
-<hr><a name="_details"></a><h2>Detailed Description</h2>
-For internal use only. <hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00373.html b/doc/html/a00373.html
deleted file mode 100644
index 5eb792c..0000000
--- a/doc/html/a00373.html
+++ /dev/null
@@ -1,313 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>Memory Allocation</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<h1>Memory Allocation</h1><table border="0" cellpadding="0" cellspacing="0">
-<tr><td></td></tr>
-<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00215.html">tbb::aligned_space< T, N ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Block of space aligned sufficiently to construct an array T with N elements.  <a href="a00215.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00226.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00227.html">tbb::cache_aligned_allocator< void ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00227.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00280.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html">tbb::scalable_allocator< void ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00281.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00296.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00297.html">tbb::tbb_allocator< void ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00297.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00306.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00307.html#_details">More...</a><br></td></tr>
-<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
-
-<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00373.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
-
-</table>
-<hr><h2>Function Documentation</h2>
-<a class="anchor" name="g65a20e812012f15ec7442d5b45d0cba5"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_free" ref="g65a20e812012f15ec7442d5b45d0cba5" args="(void *ptr)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void __TBB_EXPORTED_FUNC scalable_aligned_free           </td>
-          <td>(</td>
-          <td class="paramtype">void * </td>
-          <td class="paramname"> <em>ptr</em>          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "_aligned_free" analogue. 
-</div>
-</div><p>
-<a class="anchor" name="gc1c7aaa1fe85c17ba5a3a96f7e8d89e7"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_malloc" ref="gc1c7aaa1fe85c17ba5a3a96f7e8d89e7" args="(size_t size, size_t alignment)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void* __TBB_EXPORTED_FUNC scalable_aligned_malloc           </td>
-          <td>(</td>
-          <td class="paramtype">size_t </td>
-          <td class="paramname"> <em>size</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">size_t </td>
-          <td class="paramname"> <em>alignment</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "_aligned_malloc" analogue. 
-</div>
-</div><p>
-<a class="anchor" name="gbaea91376be80dfabd7c93eaffd9abaa"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_realloc" ref="gbaea91376be80dfabd7c93eaffd9abaa" args="(void *ptr, size_t size, size_t alignment)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void* __TBB_EXPORTED_FUNC scalable_aligned_realloc           </td>
-          <td>(</td>
-          <td class="paramtype">void * </td>
-          <td class="paramname"> <em>ptr</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">size_t </td>
-          <td class="paramname"> <em>size</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">size_t </td>
-          <td class="paramname"> <em>alignment</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "_aligned_realloc" analogue. 
-</div>
-</div><p>
-<a class="anchor" name="g3f5a2fde0bcaa3eda35be32c8658f444"></a><!-- doxytag: member="scalable_allocator.h::scalable_calloc" ref="g3f5a2fde0bcaa3eda35be32c8658f444" args="(size_t nobj, size_t size)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void* __TBB_EXPORTED_FUNC scalable_calloc           </td>
-          <td>(</td>
-          <td class="paramtype">size_t </td>
-          <td class="paramname"> <em>nobj</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">size_t </td>
-          <td class="paramname"> <em>size</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "calloc" analogue complementing scalable_malloc. 
-</div>
-</div><p>
-<a class="anchor" name="gca3579c21244dba9f0c351e5984d4565"></a><!-- doxytag: member="scalable_allocator.h::scalable_free" ref="gca3579c21244dba9f0c351e5984d4565" args="(void *ptr)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void __TBB_EXPORTED_FUNC scalable_free           </td>
-          <td>(</td>
-          <td class="paramtype">void * </td>
-          <td class="paramname"> <em>ptr</em>          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "free" analogue to discard a previously allocated piece of memory. 
-</div>
-</div><p>
-<a class="anchor" name="gc25b8e6c76db0b346a8249796a7a2475"></a><!-- doxytag: member="scalable_allocator.h::scalable_malloc" ref="gc25b8e6c76db0b346a8249796a7a2475" args="(size_t size)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void* __TBB_EXPORTED_FUNC scalable_malloc           </td>
-          <td>(</td>
-          <td class="paramtype">size_t </td>
-          <td class="paramname"> <em>size</em>          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "malloc" analogue to allocate block of memory of size bytes. 
-</div>
-</div><p>
-<a class="anchor" name="g0965ce1b4b7835f92869c7fd867265f7"></a><!-- doxytag: member="scalable_allocator.h::scalable_msize" ref="g0965ce1b4b7835f92869c7fd867265f7" args="(void *ptr)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">size_t __TBB_EXPORTED_FUNC scalable_msize           </td>
-          <td>(</td>
-          <td class="paramtype">void * </td>
-          <td class="paramname"> <em>ptr</em>          </td>
-          <td> ) </td>
-          <td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-The analogue of _msize/malloc_size/malloc_usable_size. Returns the usable size of a memory block previously allocated by scalable_*, or 0 (zero) if ptr does not point to such a block. 
-</div>
-</div><p>
-<a class="anchor" name="g05dcec987480bb2c82ecdead6a085899"></a><!-- doxytag: member="scalable_allocator.h::scalable_posix_memalign" ref="g05dcec987480bb2c82ecdead6a085899" args="(void **memptr, size_t alignment, size_t size)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">int __TBB_EXPORTED_FUNC scalable_posix_memalign           </td>
-          <td>(</td>
-          <td class="paramtype">void ** </td>
-          <td class="paramname"> <em>memptr</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">size_t </td>
-          <td class="paramname"> <em>alignment</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">size_t </td>
-          <td class="paramname"> <em>size</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "posix_memalign" analogue. 
-</div>
-</div><p>
-<a class="anchor" name="g951bbbbd2d041acb59ba5fa910b52543"></a><!-- doxytag: member="scalable_allocator.h::scalable_realloc" ref="g951bbbbd2d041acb59ba5fa910b52543" args="(void *ptr, size_t size)" -->
-<div class="memitem">
-<div class="memproto">
-      <table class="memname">
-        <tr>
-          <td class="memname">void* __TBB_EXPORTED_FUNC scalable_realloc           </td>
-          <td>(</td>
-          <td class="paramtype">void * </td>
-          <td class="paramname"> <em>ptr</em>, </td>
-        </tr>
-        <tr>
-          <td class="paramkey"></td>
-          <td></td>
-          <td class="paramtype">size_t </td>
-          <td class="paramname"> <em>size</em></td><td> </td>
-        </tr>
-        <tr>
-          <td></td>
-          <td>)</td>
-          <td></td><td></td><td width="100%"></td>
-        </tr>
-      </table>
-</div>
-<div class="memdoc">
-
-<p>
-The "realloc" analogue complementing scalable_malloc. 
-</div>
-</div><p>
-<hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00377.html b/doc/html/a00377.html
deleted file mode 100644
index 1c71169..0000000
--- a/doc/html/a00377.html
+++ /dev/null
@@ -1,159 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>_aggregator_internal.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>_aggregator_internal.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_aggregator_internal_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_aggregator_internal_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00026"></a>00026 
-<a name="l00027"></a><a class="code" href="a00362.html">00027</a> <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>interface6 {
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>internal {
-<a name="l00030"></a>00030 
-<a name="l00031"></a>00031 <span class="keyword">using namespace </span>tbb::internal;
-<a name="l00032"></a>00032 
-<a name="l00034"></a>00034 <span class="keyword">template</span> <<span class="keyword">typename</span> Derived>
-<a name="l00035"></a><a class="code" href="a00213.html">00035</a> <span class="keyword">class </span><a class="code" href="a00213.html">aggregated_operation</a> {
-<a name="l00036"></a>00036  <span class="keyword">public</span>:
-<a name="l00037"></a>00037     uintptr_t status;
-<a name="l00038"></a>00038     Derived *next;
-<a name="l00039"></a>00039     <a class="code" href="a00213.html">aggregated_operation</a>() : status(0), next(NULL) {}
-<a name="l00040"></a>00040 };
-<a name="l00041"></a>00041 
-<a name="l00043"></a>00043 
-<a name="l00048"></a>00048  <span class="keyword">template</span> < <span class="keyword">typename</span> handler_type, <span class="keyword">typename</span> operation_type >
-<a name="l00049"></a><a class="code" href="a00214.html">00049</a> <span class="keyword">class </span><a class="code" href="a00214.html">aggregator</a> {
-<a name="l00050"></a>00050  <span class="keyword">public</span>:
-<a name="l00051"></a>00051     <a class="code" href="a00214.html">aggregator</a>() : handler_busy(<span class="keyword">false</span>) { pending_operations = NULL; }
-<a name="l00052"></a>00052     ~<a class="code" href="a00214.html">aggregator</a>() {}
-<a name="l00053"></a>00053 
-<a name="l00054"></a>00054     <span class="keywordtype">void</span> initialize_handler(handler_type h) { handle_operations = h; }
-<a name="l00055"></a>00055 
-<a name="l00057"></a>00057 
-<a name="l00059"></a><a class="code" href="a00214.html#282d5a2f1216b185c91ed23d00119481">00059</a>     <span class="keywordtype">void</span> <a class="code" href="a00214.html#282d5a2f1216b185c91ed23d00119481">execute</a>(operation_type *op) {
-<a name="l00060"></a>00060         operation_type *res;
-<a name="l00061"></a>00061 
-<a name="l00062"></a>00062         <span class="comment">// ITT note: &(op->status) tag is used to cover accesses to this op node. This</span>
-<a name="l00063"></a>00063         <span class="comment">// thread has created the operation, and now releases it so that the handler</span>
-<a name="l00064"></a>00064         <span class="comment">// thread may handle the associated operation w/o triggering a race condition;</span>
-<a name="l00065"></a>00065         <span class="comment">// thus this tag will be acquired just before the operation is handled in the</span>
-<a name="l00066"></a>00066         <span class="comment">// handle_operations functor.</span>
-<a name="l00067"></a>00067         call_itt_notify(releasing, &(op->status));
-<a name="l00068"></a>00068         <span class="comment">// insert the operation in the queue</span>
-<a name="l00069"></a>00069         <span class="keywordflow">do</span> {
-<a name="l00070"></a>00070             <span class="comment">// ITT may flag the following line as a race; it is a false positive:</span>
-<a name="l00071"></a>00071             <span class="comment">// This is an atomic read; we don't provide itt_hide_load_word for atomics</span>
-<a name="l00072"></a>00072             op->next = res = pending_operations; <span class="comment">// NOT A RACE </span>
-<a name="l00073"></a>00073         } <span class="keywordflow">while</span> (pending_operations.compare_and_swap(op, res) != res);
-<a name="l00074"></a>00074         <span class="keywordflow">if</span> (!res) { <span class="comment">// first in the list; handle the operations</span>
-<a name="l00075"></a>00075             <span class="comment">// ITT note: &pending_operations tag covers access to the handler_busy flag,</span>
-<a name="l00076"></a>00076             <span class="comment">// which this waiting handler thread will try to set before entering</span>
-<a name="l00077"></a>00077             <span class="comment">// handle_operations.</span>
-<a name="l00078"></a>00078             call_itt_notify(acquired, &pending_operations);
-<a name="l00079"></a>00079             start_handle_operations();
-<a name="l00080"></a>00080             __TBB_ASSERT(op->status, NULL);
-<a name="l00081"></a>00081         }
-<a name="l00082"></a>00082         <span class="keywordflow">else</span> { <span class="comment">// not first; wait for op to be ready</span>
-<a name="l00083"></a>00083             call_itt_notify(prepare, &(op->status));
-<a name="l00084"></a>00084             spin_wait_while_eq(op->status, uintptr_t(0));
-<a name="l00085"></a>00085             itt_load_word_with_acquire(op->status);
-<a name="l00086"></a>00086         }
-<a name="l00087"></a>00087     }
-<a name="l00088"></a>00088 
-<a name="l00089"></a>00089  <span class="keyword">private</span>:
-<a name="l00091"></a>00091     <a class="code" href="a00216.html">atomic<operation_type *></a> pending_operations;
-<a name="l00093"></a>00093     uintptr_t handler_busy;
-<a name="l00094"></a>00094     handler_type handle_operations;
-<a name="l00095"></a>00095 
-<a name="l00097"></a>00097     <span class="keywordtype">void</span> start_handle_operations() {
-<a name="l00098"></a>00098         operation_type *op_list;
-<a name="l00099"></a>00099 
-<a name="l00100"></a>00100         <span class="comment">// ITT note: &handler_busy tag covers access to pending_operations as it is passed</span>
-<a name="l00101"></a>00101         <span class="comment">// between active and waiting handlers.  Below, the waiting handler waits until</span>
-<a name="l00102"></a>00102         <span class="comment">// the active handler releases, and the waiting handler acquires &handler_busy as</span>
-<a name="l00103"></a>00103         <span class="comment">// it becomes the active_handler. The release point is at the end of this</span>
-<a name="l00104"></a>00104         <span class="comment">// function, when all operations in pending_operations have been handled by the</span>
-<a name="l00105"></a>00105         <span class="comment">// owner of this aggregator.</span>
-<a name="l00106"></a>00106         call_itt_notify(prepare, &handler_busy);
-<a name="l00107"></a>00107         <span class="comment">// get the handler_busy:</span>
-<a name="l00108"></a>00108         <span class="comment">// only one thread can possibly spin here at a time</span>
-<a name="l00109"></a>00109         spin_wait_until_eq(handler_busy, uintptr_t(0));
-<a name="l00110"></a>00110         call_itt_notify(acquired, &handler_busy);
-<a name="l00111"></a>00111         <span class="comment">// acquire fence not necessary here due to causality rule and surrounding atomics</span>
-<a name="l00112"></a>00112         __TBB_store_with_release(handler_busy, uintptr_t(1));
-<a name="l00113"></a>00113 
-<a name="l00114"></a>00114         <span class="comment">// ITT note: &pending_operations tag covers access to the handler_busy flag</span>
-<a name="l00115"></a>00115         <span class="comment">// itself. Capturing the state of the pending_operations signifies that</span>
-<a name="l00116"></a>00116         <span class="comment">// handler_busy has been set and a new active handler will now process that list's</span>
-<a name="l00117"></a>00117         <span class="comment">// operations.</span>
-<a name="l00118"></a>00118         call_itt_notify(releasing, &pending_operations);
-<a name="l00119"></a>00119         <span class="comment">// grab pending_operations</span>
-<a name="l00120"></a>00120         op_list = pending_operations.fetch_and_store(NULL);
-<a name="l00121"></a>00121 
-<a name="l00122"></a>00122         <span class="comment">// handle all the operations</span>
-<a name="l00123"></a>00123         handle_operations(op_list);
-<a name="l00124"></a>00124 
-<a name="l00125"></a>00125         <span class="comment">// release the handler</span>
-<a name="l00126"></a>00126         itt_store_word_with_release(handler_busy, uintptr_t(0));
-<a name="l00127"></a>00127     }
-<a name="l00128"></a>00128 };
-<a name="l00129"></a>00129 
-<a name="l00130"></a>00130 } <span class="comment">// namespace internal</span>
-<a name="l00131"></a>00131 } <span class="comment">// namespace interface6</span>
-<a name="l00132"></a>00132 
-<a name="l00133"></a>00133 <span class="keyword">namespace </span>internal {
-<a name="l00134"></a>00134     <span class="keyword">using</span> interface6::internal::aggregated_operation;
-<a name="l00135"></a>00135     <span class="keyword">using</span> interface6::internal::aggregator;
-<a name="l00136"></a>00136 } <span class="comment">// namespace internal</span>
-<a name="l00137"></a>00137 
-<a name="l00138"></a>00138 } <span class="comment">// namespace tbb</span>
-<a name="l00139"></a>00139 
-<a name="l00140"></a>00140 <span class="preprocessor">#endif</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00381.html b/doc/html/a00381.html
deleted file mode 100644
index 5f6bb29..0000000
--- a/doc/html/a00381.html
+++ /dev/null
@@ -1,942 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>_concurrent_queue_internal.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>_concurrent_queue_internal.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_queue_internal_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_queue_internal_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "spin_mutex.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include <new></span>
-<a name="l00032"></a>00032 
-<a name="l00033"></a>00033 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span>    <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00035"></a>00035 <span class="preprocessor">    #pragma warning (push)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4530)</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span>
-<a name="l00039"></a>00039 <span class="preprocessor">#include <iterator></span>
-<a name="l00040"></a>00040 
-<a name="l00041"></a>00041 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span>
-<a name="l00045"></a>00045 <span class="keyword">namespace </span>tbb {
-<a name="l00046"></a>00046 
-<a name="l00047"></a>00047 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span>
-<a name="l00049"></a>00049 <span class="comment">// forward declaration</span>
-<a name="l00050"></a><a class="code" href="a00370.html">00050</a> <span class="keyword">namespace </span>strict_ppl {
-<a name="l00051"></a>00051 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00236.html">concurrent_queue</a>;
-<a name="l00052"></a>00052 }
-<a name="l00053"></a>00053 
-<a name="l00054"></a>00054 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00230.html">concurrent_bounded_queue</a>;
-<a name="l00055"></a>00055 
-<a name="l00056"></a>00056 <span class="keyword">namespace </span>deprecated {
-<a name="l00057"></a>00057 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A> <span class="keyword">class </span><a class="code" href="a00236.html">concurrent_queue</a>;
-<a name="l00058"></a>00058 }
-<a name="l00059"></a>00059 <span class="preprocessor">#endif</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span>
-<a name="l00062"></a>00062 <span class="keyword">namespace </span>strict_ppl {
-<a name="l00063"></a>00063 
-<a name="l00065"></a>00065 <span class="keyword">namespace </span>internal {
-<a name="l00066"></a>00066 
-<a name="l00067"></a>00067 <span class="keyword">using namespace </span>tbb::internal;
-<a name="l00068"></a>00068 
-<a name="l00069"></a>00069 <span class="keyword">typedef</span> size_t ticket;
-<a name="l00070"></a>00070 
-<a name="l00071"></a>00071 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>micro_queue ;
-<a name="l00072"></a>00072 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>micro_queue_pop_finalizer ;
-<a name="l00073"></a>00073 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_base_v3;
-<a name="l00074"></a>00074 
-<a name="l00076"></a>00076 
-<a name="l00079"></a>00079 <span class="keyword">struct </span>concurrent_queue_rep_base : no_copy {
-<a name="l00080"></a>00080     <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue;
-<a name="l00081"></a>00081     <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_base_v3;
-<a name="l00082"></a>00082 
-<a name="l00083"></a>00083 <span class="keyword">protected</span>:
-<a name="l00085"></a>00085     <span class="keyword">static</span> <span class="keyword">const</span> size_t phi = 3;
-<a name="l00086"></a>00086 
-<a name="l00087"></a>00087 <span class="keyword">public</span>:
-<a name="l00088"></a>00088     <span class="comment">// must be power of 2</span>
-<a name="l00089"></a>00089     <span class="keyword">static</span> <span class="keyword">const</span> size_t n_queue = 8;
-<a name="l00090"></a>00090 
-<a name="l00092"></a>00092     <span class="keyword">struct </span>page {
-<a name="l00093"></a>00093         page* next;
-<a name="l00094"></a>00094         uintptr_t mask; 
-<a name="l00095"></a>00095     };
-<a name="l00096"></a>00096 
-<a name="l00097"></a>00097     atomic<ticket> head_counter;
-<a name="l00098"></a>00098     <span class="keywordtype">char</span> pad1[NFS_MaxLineSize-<span class="keyword">sizeof</span>(atomic<ticket>)];
-<a name="l00099"></a>00099     atomic<ticket> tail_counter;
-<a name="l00100"></a>00100     <span class="keywordtype">char</span> pad2[NFS_MaxLineSize-<span class="keyword">sizeof</span>(atomic<ticket>)];
-<a name="l00101"></a>00101 
-<a name="l00103"></a>00103     size_t items_per_page;
-<a name="l00104"></a>00104 
-<a name="l00106"></a>00106     size_t item_size;
-<a name="l00107"></a>00107 
-<a name="l00109"></a>00109     atomic<size_t> n_invalid_entries;
-<a name="l00110"></a>00110 
-<a name="l00111"></a>00111     <span class="keywordtype">char</span> pad3[NFS_MaxLineSize-<span class="keyword">sizeof</span>(size_t)-<span class="keyword">sizeof</span>(size_t)-<span class="keyword">sizeof</span>(atomic<size_t>)];
-<a name="l00112"></a>00112 } ;
-<a name="l00113"></a>00113 
-<a name="l00114"></a>00114 <span class="keyword">inline</span> <span class="keywordtype">bool</span> is_valid_page(<span class="keyword">const</span> concurrent_queue_rep_base::page* p) {
-<a name="l00115"></a>00115     <span class="keywordflow">return</span> uintptr_t(p)>1;
-<a name="l00116"></a>00116 }
-<a name="l00117"></a>00117 
-<a name="l00119"></a>00119 
-<a name="l00122"></a>00122 <span class="keyword">class </span>concurrent_queue_page_allocator
-<a name="l00123"></a>00123 {
-<a name="l00124"></a>00124     <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue ;
-<a name="l00125"></a>00125     <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue_pop_finalizer ;
-<a name="l00126"></a>00126 <span class="keyword">protected</span>:
-<a name="l00127"></a>00127     <span class="keyword">virtual</span> ~concurrent_queue_page_allocator() {}
-<a name="l00128"></a>00128 <span class="keyword">private</span>:
-<a name="l00129"></a>00129     <span class="keyword">virtual</span> concurrent_queue_rep_base::page* allocate_page() = 0;
-<a name="l00130"></a>00130     <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( concurrent_queue_rep_base::page* p ) = 0;
-<a name="l00131"></a>00131 } ;
-<a name="l00132"></a>00132 
-<a name="l00133"></a>00133 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00134"></a>00134 <span class="preprocessor"></span><span class="comment">// unary minus operator applied to unsigned type, result still unsigned</span>
-<a name="l00135"></a>00135 <span class="preprocessor">#pragma warning( push )</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">#pragma warning( disable: 4146 )</span>
-<a name="l00137"></a>00137 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00138"></a>00138 <span class="preprocessor"></span>
-<a name="l00140"></a>00140 
-<a name="l00142"></a>00142 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00143"></a>00143 <span class="keyword">class </span>micro_queue : no_copy {
-<a name="l00144"></a>00144     <span class="keyword">typedef</span> concurrent_queue_rep_base::page page;
-<a name="l00145"></a>00145 
-<a name="l00147"></a>00147     <span class="keyword">class </span>destroyer: no_copy {
-<a name="l00148"></a>00148         T& my_value;
-<a name="l00149"></a>00149     <span class="keyword">public</span>:
-<a name="l00150"></a>00150         destroyer( T& value ) : my_value(value) {}
-<a name="l00151"></a>00151         ~destroyer() {my_value.~T();}          
-<a name="l00152"></a>00152     };
-<a name="l00153"></a>00153 
-<a name="l00154"></a>00154     <span class="keywordtype">void</span> copy_item( page& dst, size_t index, <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) {
-<a name="l00155"></a>00155         <span class="keyword">new</span>( &get_ref(dst,index) ) T(*static_cast<const T*>(src)); 
-<a name="l00156"></a>00156     }
-<a name="l00157"></a>00157 
-<a name="l00158"></a>00158     <span class="keywordtype">void</span> copy_item( page& dst, size_t dindex, <span class="keyword">const</span> page& src, size_t sindex ) {
-<a name="l00159"></a>00159         <span class="keyword">new</span>( &get_ref(dst,dindex) ) T( get_ref(const_cast<page&>(src),sindex) );
-<a name="l00160"></a>00160     }
-<a name="l00161"></a>00161 
-<a name="l00162"></a>00162     <span class="keywordtype">void</span> assign_and_destroy_item( <span class="keywordtype">void</span>* dst, page& src, size_t index ) {
-<a name="l00163"></a>00163         T& from = get_ref(src,index);
-<a name="l00164"></a>00164         destroyer d(from);
-<a name="l00165"></a>00165         *static_cast<T*>(dst) = from;
-<a name="l00166"></a>00166     }
-<a name="l00167"></a>00167 
-<a name="l00168"></a>00168     <span class="keywordtype">void</span> spin_wait_until_my_turn( atomic<ticket>& counter, ticket k, concurrent_queue_rep_base& rb ) <span class="keyword">const </span>;
-<a name="l00169"></a>00169 
-<a name="l00170"></a>00170 <span class="keyword">public</span>:
-<a name="l00171"></a>00171     <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue_pop_finalizer<T>;
-<a name="l00172"></a>00172 
-<a name="l00173"></a>00173     <span class="keyword">struct </span>padded_page: page {
-<a name="l00175"></a>00175         padded_page(); 
-<a name="l00177"></a>00177         <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> padded_page& );
-<a name="l00179"></a>00179         T last;
-<a name="l00180"></a>00180     };
-<a name="l00181"></a>00181 
-<a name="l00182"></a>00182     <span class="keyword">static</span> T& get_ref( page& p, size_t index ) {
-<a name="l00183"></a>00183         <span class="keywordflow">return</span> (&static_cast<padded_page*>(static_cast<void*>(&p))->last)[index];
-<a name="l00184"></a>00184     }
-<a name="l00185"></a>00185 
-<a name="l00186"></a>00186     atomic<page*> head_page;
-<a name="l00187"></a>00187     atomic<ticket> head_counter;
-<a name="l00188"></a>00188 
-<a name="l00189"></a>00189     atomic<page*> tail_page;
-<a name="l00190"></a>00190     atomic<ticket> tail_counter;
-<a name="l00191"></a>00191 
-<a name="l00192"></a>00192     spin_mutex page_mutex;
-<a name="l00193"></a>00193     
-<a name="l00194"></a>00194     <span class="keywordtype">void</span> push( <span class="keyword">const</span> <span class="keywordtype">void</span>* item, ticket k, concurrent_queue_base_v3<T>& base ) ;
-<a name="l00195"></a>00195 
-<a name="l00196"></a>00196     <span class="keywordtype">bool</span> pop( <span class="keywordtype">void</span>* dst, ticket k, concurrent_queue_base_v3<T>& base ) ;
-<a name="l00197"></a>00197 
-<a name="l00198"></a>00198     micro_queue& assign( <span class="keyword">const</span> micro_queue& src, concurrent_queue_base_v3<T>& base ) ;
-<a name="l00199"></a>00199 
-<a name="l00200"></a>00200     page* make_copy( concurrent_queue_base_v3<T>& base, <span class="keyword">const</span> page* src_page, size_t begin_in_page, size_t end_in_page, ticket& g_index ) ;
-<a name="l00201"></a>00201 
-<a name="l00202"></a>00202     <span class="keywordtype">void</span> invalidate_page_and_rethrow( ticket k ) ;
-<a name="l00203"></a>00203 };
-<a name="l00204"></a>00204 
-<a name="l00205"></a>00205 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00206"></a>00206 <span class="keywordtype">void</span> micro_queue<T>::spin_wait_until_my_turn( atomic<ticket>& counter, ticket k, concurrent_queue_rep_base& rb )<span class="keyword"> const </span>{
-<a name="l00207"></a>00207     atomic_backoff backoff;
-<a name="l00208"></a>00208     <span class="keywordflow">do</span> {
-<a name="l00209"></a>00209         backoff.pause();
-<a name="l00210"></a>00210         <span class="keywordflow">if</span>( counter&1 ) {
-<a name="l00211"></a>00211             ++rb.n_invalid_entries;
-<a name="l00212"></a>00212             throw_exception( eid_bad_last_alloc );
-<a name="l00213"></a>00213         }
-<a name="l00214"></a>00214     } <span class="keywordflow">while</span>( counter!=k ) ;
-<a name="l00215"></a>00215 }
-<a name="l00216"></a>00216 
-<a name="l00217"></a>00217 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00218"></a>00218 <span class="keywordtype">void</span> micro_queue<T>::push( <span class="keyword">const</span> <span class="keywordtype">void</span>* item, ticket k, concurrent_queue_base_v3<T>& base ) {
-<a name="l00219"></a>00219     k &= -concurrent_queue_rep_base::n_queue;
-<a name="l00220"></a>00220     page* p = NULL;
-<a name="l00221"></a>00221     size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00222"></a>00222     <span class="keywordflow">if</span>( !index ) {
-<a name="l00223"></a>00223         __TBB_TRY {
-<a name="l00224"></a>00224             concurrent_queue_page_allocator& pa = base;
-<a name="l00225"></a>00225             p = pa.allocate_page();
-<a name="l00226"></a>00226         } __TBB_CATCH (...) {
-<a name="l00227"></a>00227             ++base.my_rep->n_invalid_entries;
-<a name="l00228"></a>00228             invalidate_page_and_rethrow( k );
-<a name="l00229"></a>00229         }
-<a name="l00230"></a>00230         p->mask = 0;
-<a name="l00231"></a>00231         p->next = NULL;
-<a name="l00232"></a>00232     }
-<a name="l00233"></a>00233 
-<a name="l00234"></a>00234     <span class="keywordflow">if</span>( tail_counter!=k ) spin_wait_until_my_turn( tail_counter, k, *base.my_rep );
-<a name="l00235"></a>00235     call_itt_notify(acquired, &tail_counter);
-<a name="l00236"></a>00236         
-<a name="l00237"></a>00237     <span class="keywordflow">if</span>( p ) {
-<a name="l00238"></a>00238         spin_mutex::scoped_lock lock( page_mutex );
-<a name="l00239"></a>00239         page* q = tail_page;
-<a name="l00240"></a>00240         <span class="keywordflow">if</span>( is_valid_page(q) )
-<a name="l00241"></a>00241             q->next = p;
-<a name="l00242"></a>00242         <span class="keywordflow">else</span>
-<a name="l00243"></a>00243             head_page = p; 
-<a name="l00244"></a>00244         tail_page = p;
-<a name="l00245"></a>00245     } <span class="keywordflow">else</span> {
-<a name="l00246"></a>00246         p = tail_page;
-<a name="l00247"></a>00247     }
-<a name="l00248"></a>00248     __TBB_TRY {
-<a name="l00249"></a>00249         copy_item( *p, index, item );
-<a name="l00250"></a>00250         <span class="comment">// If no exception was thrown, mark item as present.</span>
-<a name="l00251"></a>00251         itt_hide_store_word(p->mask,  p->mask | uintptr_t(1)<<index);
-<a name="l00252"></a>00252         call_itt_notify(releasing, &tail_counter);
-<a name="l00253"></a>00253         tail_counter += concurrent_queue_rep_base::n_queue; 
-<a name="l00254"></a>00254     } __TBB_CATCH (...) {
-<a name="l00255"></a>00255         ++base.my_rep->n_invalid_entries;
-<a name="l00256"></a>00256         call_itt_notify(releasing, &tail_counter);
-<a name="l00257"></a>00257         tail_counter += concurrent_queue_rep_base::n_queue; 
-<a name="l00258"></a>00258         __TBB_RETHROW();
-<a name="l00259"></a>00259     }
-<a name="l00260"></a>00260 }
-<a name="l00261"></a>00261 
-<a name="l00262"></a>00262 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00263"></a>00263 <span class="keywordtype">bool</span> micro_queue<T>::pop( <span class="keywordtype">void</span>* dst, ticket k, concurrent_queue_base_v3<T>& base ) {
-<a name="l00264"></a>00264     k &= -concurrent_queue_rep_base::n_queue;
-<a name="l00265"></a>00265     <span class="keywordflow">if</span>( head_counter!=k ) spin_wait_until_eq( head_counter, k );
-<a name="l00266"></a>00266     call_itt_notify(acquired, &head_counter);
-<a name="l00267"></a>00267     <span class="keywordflow">if</span>( tail_counter==k ) spin_wait_while_eq( tail_counter, k );
-<a name="l00268"></a>00268     call_itt_notify(acquired, &tail_counter);
-<a name="l00269"></a>00269     page& p = *head_page;
-<a name="l00270"></a>00270     __TBB_ASSERT( &p, NULL );
-<a name="l00271"></a>00271     size_t index = k/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00272"></a>00272     <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; 
-<a name="l00273"></a>00273     {
-<a name="l00274"></a>00274         micro_queue_pop_finalizer<T> finalizer( *<span class="keyword">this</span>, base, k+concurrent_queue_rep_base::n_queue, index==base.my_rep->items_per_page-1 ? &p : NULL ); 
-<a name="l00275"></a>00275         <span class="keywordflow">if</span>( p.mask & uintptr_t(1)<<index ) {
-<a name="l00276"></a>00276             success = <span class="keyword">true</span>;
-<a name="l00277"></a>00277             assign_and_destroy_item( dst, p, index );
-<a name="l00278"></a>00278         } <span class="keywordflow">else</span> {
-<a name="l00279"></a>00279             --base.my_rep->n_invalid_entries;
-<a name="l00280"></a>00280         }
-<a name="l00281"></a>00281     }
-<a name="l00282"></a>00282     <span class="keywordflow">return</span> success;
-<a name="l00283"></a>00283 }
-<a name="l00284"></a>00284 
-<a name="l00285"></a>00285 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00286"></a>00286 micro_queue<T>& micro_queue<T>::assign( <span class="keyword">const</span> micro_queue<T>& src, concurrent_queue_base_v3<T>& base ) {
-<a name="l00287"></a>00287     head_counter = src.head_counter;
-<a name="l00288"></a>00288     tail_counter = src.tail_counter;
-<a name="l00289"></a>00289     page_mutex   = src.page_mutex;
-<a name="l00290"></a>00290 
-<a name="l00291"></a>00291     <span class="keyword">const</span> page* srcp = src.head_page;
-<a name="l00292"></a>00292     <span class="keywordflow">if</span>( is_valid_page(srcp) ) {
-<a name="l00293"></a>00293         ticket g_index = head_counter;
-<a name="l00294"></a>00294         __TBB_TRY {
-<a name="l00295"></a>00295             size_t n_items  = (tail_counter-head_counter)/concurrent_queue_rep_base::n_queue;
-<a name="l00296"></a>00296             size_t index = head_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00297"></a>00297             size_t end_in_first_page = (index+n_items<base.my_rep->items_per_page)?(index+n_items):base.my_rep->items_per_page;
-<a name="l00298"></a>00298 
-<a name="l00299"></a>00299             head_page = make_copy( base, srcp, index, end_in_first_page, g_index );
-<a name="l00300"></a>00300             page* cur_page = head_page;
-<a name="l00301"></a>00301 
-<a name="l00302"></a>00302             <span class="keywordflow">if</span>( srcp != src.tail_page ) {
-<a name="l00303"></a>00303                 <span class="keywordflow">for</span>( srcp = srcp->next; srcp!=src.tail_page; srcp=srcp->next ) {
-<a name="l00304"></a>00304                     cur_page->next = make_copy( base, srcp, 0, base.my_rep->items_per_page, g_index );
-<a name="l00305"></a>00305                     cur_page = cur_page->next;
-<a name="l00306"></a>00306                 }
-<a name="l00307"></a>00307 
-<a name="l00308"></a>00308                 __TBB_ASSERT( srcp==src.tail_page, NULL );
-<a name="l00309"></a>00309                 size_t last_index = tail_counter/concurrent_queue_rep_base::n_queue & (base.my_rep->items_per_page-1);
-<a name="l00310"></a>00310                 <span class="keywordflow">if</span>( last_index==0 ) last_index = base.my_rep->items_per_page;
-<a name="l00311"></a>00311 
-<a name="l00312"></a>00312                 cur_page->next = make_copy( base, srcp, 0, last_index, g_index );
-<a name="l00313"></a>00313                 cur_page = cur_page->next;
-<a name="l00314"></a>00314             }
-<a name="l00315"></a>00315             tail_page = cur_page;
-<a name="l00316"></a>00316         } __TBB_CATCH (...) {
-<a name="l00317"></a>00317             invalidate_page_and_rethrow( g_index );
-<a name="l00318"></a>00318         }
-<a name="l00319"></a>00319     } <span class="keywordflow">else</span> {
-<a name="l00320"></a>00320         head_page = tail_page = NULL;
-<a name="l00321"></a>00321     }
-<a name="l00322"></a>00322     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00323"></a>00323 }
-<a name="l00324"></a>00324 
-<a name="l00325"></a>00325 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00326"></a>00326 <span class="keywordtype">void</span> micro_queue<T>::invalidate_page_and_rethrow( ticket k ) {
-<a name="l00327"></a>00327     <span class="comment">// Append an invalid page at address 1 so that no more pushes are allowed.</span>
-<a name="l00328"></a>00328     page* invalid_page = (page*)uintptr_t(1);
-<a name="l00329"></a>00329     {
-<a name="l00330"></a>00330         spin_mutex::scoped_lock lock( page_mutex );
-<a name="l00331"></a>00331         itt_store_word_with_release(tail_counter, k+concurrent_queue_rep_base::n_queue+1);
-<a name="l00332"></a>00332         page* q = tail_page;
-<a name="l00333"></a>00333         <span class="keywordflow">if</span>( is_valid_page(q) )
-<a name="l00334"></a>00334             q->next = invalid_page;
-<a name="l00335"></a>00335         <span class="keywordflow">else</span>
-<a name="l00336"></a>00336             head_page = invalid_page;
-<a name="l00337"></a>00337         tail_page = invalid_page;
-<a name="l00338"></a>00338     }
-<a name="l00339"></a>00339     __TBB_RETHROW();
-<a name="l00340"></a>00340 }
-<a name="l00341"></a>00341 
-<a name="l00342"></a>00342 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00343"></a>00343 concurrent_queue_rep_base::page* micro_queue<T>::make_copy( concurrent_queue_base_v3<T>& base, <span class="keyword">const</span> concurrent_queue_rep_base::page* src_page, size_t begin_in_page, size_t end_in_page, ticket& g_index ) {
-<a name="l00344"></a>00344     concurrent_queue_page_allocator& pa = base;
-<a name="l00345"></a>00345     page* new_page = pa.allocate_page();
-<a name="l00346"></a>00346     new_page->next = NULL;
-<a name="l00347"></a>00347     new_page->mask = src_page->mask;
-<a name="l00348"></a>00348     <span class="keywordflow">for</span>( ; begin_in_page!=end_in_page; ++begin_in_page, ++g_index )
-<a name="l00349"></a>00349         <span class="keywordflow">if</span>( new_page->mask & uintptr_t(1)<<begin_in_page )
-<a name="l00350"></a>00350             copy_item( *new_page, begin_in_page, *src_page, begin_in_page );
-<a name="l00351"></a>00351     <span class="keywordflow">return</span> new_page;
-<a name="l00352"></a>00352 }
-<a name="l00353"></a>00353 
-<a name="l00354"></a>00354 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00355"></a>00355 <span class="keyword">class </span>micro_queue_pop_finalizer: no_copy {
-<a name="l00356"></a>00356     <span class="keyword">typedef</span> concurrent_queue_rep_base::page page;
-<a name="l00357"></a>00357     ticket my_ticket;
-<a name="l00358"></a>00358     micro_queue<T>& my_queue;
-<a name="l00359"></a>00359     page* my_page; 
-<a name="l00360"></a>00360     concurrent_queue_page_allocator& allocator;
-<a name="l00361"></a>00361 <span class="keyword">public</span>:
-<a name="l00362"></a>00362     micro_queue_pop_finalizer( micro_queue<T>& queue, concurrent_queue_base_v3<T>& b, ticket k, page* p ) :
-<a name="l00363"></a>00363         my_ticket(k), my_queue(queue), my_page(p), allocator(b)
-<a name="l00364"></a>00364     {}
-<a name="l00365"></a>00365     ~micro_queue_pop_finalizer() ;
-<a name="l00366"></a>00366 };
-<a name="l00367"></a>00367 
-<a name="l00368"></a>00368 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00369"></a>00369 micro_queue_pop_finalizer<T>::~micro_queue_pop_finalizer() {
-<a name="l00370"></a>00370     page* p = my_page;
-<a name="l00371"></a>00371     <span class="keywordflow">if</span>( is_valid_page(p) ) {
-<a name="l00372"></a>00372         spin_mutex::scoped_lock lock( my_queue.page_mutex );
-<a name="l00373"></a>00373         page* q = p->next;
-<a name="l00374"></a>00374         my_queue.head_page = q;
-<a name="l00375"></a>00375         <span class="keywordflow">if</span>( !is_valid_page(q) ) {
-<a name="l00376"></a>00376             my_queue.tail_page = NULL;
-<a name="l00377"></a>00377         }
-<a name="l00378"></a>00378     }
-<a name="l00379"></a>00379     itt_store_word_with_release(my_queue.head_counter, my_ticket);
-<a name="l00380"></a>00380     <span class="keywordflow">if</span>( is_valid_page(p) ) {
-<a name="l00381"></a>00381         allocator.deallocate_page( p );
-<a name="l00382"></a>00382     }
-<a name="l00383"></a>00383 }
-<a name="l00384"></a>00384 
-<a name="l00385"></a>00385 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00386"></a>00386 <span class="preprocessor"></span><span class="preprocessor">#pragma warning( pop )</span>
-<a name="l00387"></a>00387 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4146 is back</span>
-<a name="l00388"></a>00388 <span class="preprocessor"></span>
-<a name="l00389"></a>00389 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_iterator_rep ;
-<a name="l00390"></a>00390 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
-<a name="l00391"></a>00391 
-<a name="l00393"></a>00393 
-<a name="l00396"></a>00396 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00397"></a>00397 <span class="keyword">struct </span>concurrent_queue_rep : <span class="keyword">public</span> concurrent_queue_rep_base {
-<a name="l00398"></a>00398     micro_queue<T> array[n_queue];
-<a name="l00399"></a>00399 
-<a name="l00401"></a>00401     <span class="keyword">static</span> size_t index( ticket k ) {
-<a name="l00402"></a>00402         <span class="keywordflow">return</span> k*phi%n_queue;
-<a name="l00403"></a>00403     }
-<a name="l00404"></a>00404 
-<a name="l00405"></a>00405     micro_queue<T>& choose( ticket k ) {
-<a name="l00406"></a>00406         <span class="comment">// The formula here approximates LRU in a cache-oblivious way.</span>
-<a name="l00407"></a>00407         <span class="keywordflow">return</span> array[index(k)];
-<a name="l00408"></a>00408     }
-<a name="l00409"></a>00409 };
-<a name="l00410"></a>00410 
-<a name="l00412"></a>00412 
-<a name="l00416"></a>00416 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00417"></a>00417 <span class="keyword">class </span>concurrent_queue_base_v3: <span class="keyword">public</span> concurrent_queue_page_allocator {
-<a name="l00419"></a>00419     concurrent_queue_rep<T>* my_rep;
-<a name="l00420"></a>00420 
-<a name="l00421"></a>00421     <span class="keyword">friend</span> <span class="keyword">struct </span>concurrent_queue_rep<T>;
-<a name="l00422"></a>00422     <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue<T>;
-<a name="l00423"></a>00423     <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_rep<T>;
-<a name="l00424"></a>00424     <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_base_v3<T>;
-<a name="l00425"></a>00425 
-<a name="l00426"></a>00426 <span class="keyword">protected</span>:
-<a name="l00427"></a>00427     <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_queue_rep<T>::page page;
-<a name="l00428"></a>00428 
-<a name="l00429"></a>00429 <span class="keyword">private</span>:
-<a name="l00430"></a>00430     <span class="keyword">typedef</span> <span class="keyword">typename</span> micro_queue<T>::padded_page padded_page;
-<a name="l00431"></a>00431 
-<a name="l00432"></a>00432     <span class="comment">/* override */</span> <span class="keyword">virtual</span> page *allocate_page() {
-<a name="l00433"></a>00433         concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00434"></a>00434         size_t n = <span class="keyword">sizeof</span>(padded_page) + (r.items_per_page-1)*<span class="keyword">sizeof</span>(T);
-<a name="l00435"></a>00435         <span class="keywordflow">return</span> reinterpret_cast<page*>(allocate_block ( n ));
-<a name="l00436"></a>00436     }
-<a name="l00437"></a>00437 
-<a name="l00438"></a>00438     <span class="comment">/* override */</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( concurrent_queue_rep_base::page *p ) {
-<a name="l00439"></a>00439         concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00440"></a>00440         size_t n = <span class="keyword">sizeof</span>(padded_page) + (r.items_per_page-1)*<span class="keyword">sizeof</span>(T);
-<a name="l00441"></a>00441         deallocate_block( reinterpret_cast<void*>(p), n );
-<a name="l00442"></a>00442     }
-<a name="l00443"></a>00443 
-<a name="l00445"></a>00445     <span class="keyword">virtual</span> <span class="keywordtype">void</span> *allocate_block( size_t n ) = 0;
-<a name="l00446"></a>00446 
-<a name="l00448"></a>00448     <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_block( <span class="keywordtype">void</span> *p, size_t n ) = 0;
-<a name="l00449"></a>00449 
-<a name="l00450"></a>00450 <span class="keyword">protected</span>:
-<a name="l00451"></a>00451     concurrent_queue_base_v3();
-<a name="l00452"></a>00452 
-<a name="l00453"></a>00453     <span class="comment">/* override */</span> <span class="keyword">virtual</span> ~concurrent_queue_base_v3() {
-<a name="l00454"></a>00454 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00455"></a>00455 <span class="preprocessor"></span>        size_t nq = my_rep->n_queue;
-<a name="l00456"></a>00456         <span class="keywordflow">for</span>( size_t i=0; i<nq; i++ )
-<a name="l00457"></a>00457             __TBB_ASSERT( my_rep->array[i].tail_page==NULL, <span class="stringliteral">"pages were not freed properly"</span> );
-<a name="l00458"></a>00458 #endif <span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00459"></a>00459         cache_aligned_allocator<concurrent_queue_rep<T> >().deallocate(my_rep,1);
-<a name="l00460"></a>00460     }
-<a name="l00461"></a>00461 
-<a name="l00463"></a>00463     <span class="keywordtype">void</span> internal_push( <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) {
-<a name="l00464"></a>00464         concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00465"></a>00465         ticket k = r.tail_counter++;
-<a name="l00466"></a>00466         r.choose(k).push( src, k, *<span class="keyword">this</span> );
-<a name="l00467"></a>00467     }
-<a name="l00468"></a>00468 
-<a name="l00470"></a>00470 
-<a name="l00471"></a>00471     <span class="keywordtype">bool</span> internal_try_pop( <span class="keywordtype">void</span>* dst ) ;
-<a name="l00472"></a>00472 
-<a name="l00474"></a>00474     size_t internal_size() <span class="keyword">const </span>;
-<a name="l00475"></a>00475 
-<a name="l00477"></a>00477     <span class="keywordtype">bool</span> internal_empty() <span class="keyword">const </span>;
-<a name="l00478"></a>00478 
-<a name="l00480"></a>00480     <span class="comment">/* note that the name may be misleading, but it remains so due to a historical accident. */</span>
-<a name="l00481"></a>00481     <span class="keywordtype">void</span> internal_finish_clear() ;
-<a name="l00482"></a>00482 
-<a name="l00484"></a>00484     <span class="keywordtype">void</span> internal_throw_exception()<span class="keyword"> const </span>{
-<a name="l00485"></a>00485         throw_exception( eid_bad_alloc );
-<a name="l00486"></a>00486     }
-<a name="l00487"></a>00487 
-<a name="l00489"></a>00489     <span class="keywordtype">void</span> assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) ;
-<a name="l00490"></a>00490 };
-<a name="l00491"></a>00491 
-<a name="l00492"></a>00492 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00493"></a>00493 concurrent_queue_base_v3<T>::concurrent_queue_base_v3() {
-<a name="l00494"></a>00494     <span class="keyword">const</span> size_t item_size = <span class="keyword">sizeof</span>(T);
-<a name="l00495"></a>00495     my_rep = cache_aligned_allocator<concurrent_queue_rep<T> >().allocate(1);
-<a name="l00496"></a>00496     __TBB_ASSERT( (size_t)my_rep % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00497"></a>00497     __TBB_ASSERT( (size_t)&my_rep->head_counter % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00498"></a>00498     __TBB_ASSERT( (size_t)&my_rep->tail_counter % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00499"></a>00499     __TBB_ASSERT( (size_t)&my_rep->array % NFS_GetLineSize()==0, <span class="stringliteral">"alignment error"</span> );
-<a name="l00500"></a>00500     memset(my_rep,0,<span class="keyword">sizeof</span>(concurrent_queue_rep<T>));
-<a name="l00501"></a>00501     my_rep->item_size = item_size;
-<a name="l00502"></a>00502     my_rep->items_per_page = item_size<=8 ? 32 :
-<a name="l00503"></a>00503                              item_size<=16 ? 16 : 
-<a name="l00504"></a>00504                              item_size<=32 ? 8 :
-<a name="l00505"></a>00505                              item_size<=64 ? 4 :
-<a name="l00506"></a>00506                              item_size<=128 ? 2 :
-<a name="l00507"></a>00507                              1;
-<a name="l00508"></a>00508 }
-<a name="l00509"></a>00509 
-<a name="l00510"></a>00510 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00511"></a>00511 <span class="keywordtype">bool</span> concurrent_queue_base_v3<T>::internal_try_pop( <span class="keywordtype">void</span>* dst ) {
-<a name="l00512"></a>00512     concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00513"></a>00513     ticket k;
-<a name="l00514"></a>00514     <span class="keywordflow">do</span> {
-<a name="l00515"></a>00515         k = r.head_counter;
-<a name="l00516"></a>00516         <span class="keywordflow">for</span>(;;) {
-<a name="l00517"></a>00517             <span class="keywordflow">if</span>( r.tail_counter<=k ) {
-<a name="l00518"></a>00518                 <span class="comment">// Queue is empty </span>
-<a name="l00519"></a>00519                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00520"></a>00520             }
-<a name="l00521"></a>00521             <span class="comment">// Queue had item with ticket k when we looked.  Attempt to get that item.</span>
-<a name="l00522"></a>00522             ticket tk=k;
-<a name="l00523"></a>00523 <span class="preprocessor">#if defined(_MSC_VER) && defined(_Wp64)</span>
-<a name="l00524"></a>00524 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (push)</span>
-<a name="l00525"></a>00525 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4267)</span>
-<a name="l00526"></a>00526 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00527"></a>00527 <span class="preprocessor"></span>            k = r.head_counter.compare_and_swap( tk+1, tk );
-<a name="l00528"></a>00528 <span class="preprocessor">#if defined(_MSC_VER) && defined(_Wp64)</span>
-<a name="l00529"></a>00529 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
-<a name="l00530"></a>00530 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00531"></a>00531 <span class="preprocessor"></span>            <span class="keywordflow">if</span>( k==tk )
-<a name="l00532"></a>00532                 <span class="keywordflow">break</span>;
-<a name="l00533"></a>00533             <span class="comment">// Another thread snatched the item, retry.</span>
-<a name="l00534"></a>00534         }
-<a name="l00535"></a>00535     } <span class="keywordflow">while</span>( !r.choose( k ).pop( dst, k, *<span class="keyword">this</span> ) );
-<a name="l00536"></a>00536     <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00537"></a>00537 }
-<a name="l00538"></a>00538 
-<a name="l00539"></a>00539 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00540"></a>00540 size_t concurrent_queue_base_v3<T>::internal_size()<span class="keyword"> const </span>{
-<a name="l00541"></a>00541     concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00542"></a>00542     __TBB_ASSERT( <span class="keyword">sizeof</span>(ptrdiff_t)<=<span class="keyword">sizeof</span>(size_t), NULL );
-<a name="l00543"></a>00543     ticket hc = r.head_counter;
-<a name="l00544"></a>00544     size_t nie = r.n_invalid_entries;
-<a name="l00545"></a>00545     ticket tc = r.tail_counter;
-<a name="l00546"></a>00546     __TBB_ASSERT( hc!=tc || !nie, NULL );
-<a name="l00547"></a>00547     ptrdiff_t sz = tc-hc-nie;
-<a name="l00548"></a>00548     <span class="keywordflow">return</span> sz<0 ? 0 :  size_t(sz);
-<a name="l00549"></a>00549 }
-<a name="l00550"></a>00550 
-<a name="l00551"></a>00551 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00552"></a>00552 <span class="keywordtype">bool</span> concurrent_queue_base_v3<T>::internal_empty()<span class="keyword"> const </span>{
-<a name="l00553"></a>00553     concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00554"></a>00554     ticket tc = r.tail_counter;
-<a name="l00555"></a>00555     ticket hc = r.head_counter;
-<a name="l00556"></a>00556     <span class="comment">// if tc!=r.tail_counter, the queue was not empty at some point between the two reads.</span>
-<a name="l00557"></a>00557     <span class="keywordflow">return</span> tc==r.tail_counter && tc==hc+r.n_invalid_entries ;
-<a name="l00558"></a>00558 }
-<a name="l00559"></a>00559 
-<a name="l00560"></a>00560 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00561"></a>00561 <span class="keywordtype">void</span> concurrent_queue_base_v3<T>::internal_finish_clear() {
-<a name="l00562"></a>00562     concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00563"></a>00563     size_t nq = r.n_queue;
-<a name="l00564"></a>00564     <span class="keywordflow">for</span>( size_t i=0; i<nq; ++i ) {
-<a name="l00565"></a>00565         page* tp = r.array[i].tail_page;
-<a name="l00566"></a>00566         <span class="keywordflow">if</span>( is_valid_page(tp) ) {
-<a name="l00567"></a>00567             __TBB_ASSERT( r.array[i].head_page==tp, <span class="stringliteral">"at most one page should remain"</span> );
-<a name="l00568"></a>00568             deallocate_page( tp );
-<a name="l00569"></a>00569             r.array[i].tail_page = NULL;
-<a name="l00570"></a>00570         } <span class="keywordflow">else</span> 
-<a name="l00571"></a>00571             __TBB_ASSERT( !is_valid_page(r.array[i].head_page), <span class="stringliteral">"head page pointer corrupt?"</span> );
-<a name="l00572"></a>00572     }
-<a name="l00573"></a>00573 }
-<a name="l00574"></a>00574 
-<a name="l00575"></a>00575 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00576"></a>00576 <span class="keywordtype">void</span> concurrent_queue_base_v3<T>::assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) {
-<a name="l00577"></a>00577     concurrent_queue_rep<T>& r = *my_rep;
-<a name="l00578"></a>00578     r.items_per_page = src.my_rep->items_per_page;
-<a name="l00579"></a>00579 
-<a name="l00580"></a>00580     <span class="comment">// copy concurrent_queue_rep.</span>
-<a name="l00581"></a>00581     r.head_counter = src.my_rep->head_counter;
-<a name="l00582"></a>00582     r.tail_counter = src.my_rep->tail_counter;
-<a name="l00583"></a>00583     r.n_invalid_entries = src.my_rep->n_invalid_entries;
-<a name="l00584"></a>00584 
-<a name="l00585"></a>00585     <span class="comment">// copy micro_queues</span>
-<a name="l00586"></a>00586     <span class="keywordflow">for</span>( size_t i = 0; i<r.n_queue; ++i )
-<a name="l00587"></a>00587         r.array[i].assign( src.my_rep->array[i], *<span class="keyword">this</span>);
-<a name="l00588"></a>00588 
-<a name="l00589"></a>00589     __TBB_ASSERT( r.head_counter==src.my_rep->head_counter && r.tail_counter==src.my_rep->tail_counter, 
-<a name="l00590"></a>00590             <span class="stringliteral">"the source concurrent queue should not be concurrently modified."</span> );
-<a name="l00591"></a>00591 }
-<a name="l00592"></a>00592 
-<a name="l00593"></a>00593 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">class </span>concurrent_queue_iterator;
-<a name="l00594"></a>00594 
-<a name="l00595"></a>00595 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00596"></a>00596 <span class="keyword">class </span>concurrent_queue_iterator_rep: no_assign {
-<a name="l00597"></a>00597     <span class="keyword">typedef</span> <span class="keyword">typename</span> micro_queue<T>::padded_page padded_page;
-<a name="l00598"></a>00598 <span class="keyword">public</span>:
-<a name="l00599"></a>00599     ticket head_counter;
-<a name="l00600"></a>00600     <span class="keyword">const</span> concurrent_queue_base_v3<T>& my_queue;
-<a name="l00601"></a>00601     <span class="keyword">typename</span> concurrent_queue_base_v3<T>::page* array[concurrent_queue_rep<T>::n_queue];
-<a name="l00602"></a>00602     concurrent_queue_iterator_rep( <span class="keyword">const</span> concurrent_queue_base_v3<T>& queue ) :
-<a name="l00603"></a>00603         head_counter(queue.my_rep->head_counter),
-<a name="l00604"></a>00604         my_queue(queue)
-<a name="l00605"></a>00605     {
-<a name="l00606"></a>00606         <span class="keywordflow">for</span>( size_t k=0; k<concurrent_queue_rep<T>::n_queue; ++k )
-<a name="l00607"></a>00607             array[k] = queue.my_rep->array[k].head_page;
-<a name="l00608"></a>00608     }
-<a name="l00609"></a>00609 
-<a name="l00611"></a>00611     <span class="keywordtype">bool</span> get_item( T*& item, size_t k ) ;
-<a name="l00612"></a>00612 };
-<a name="l00613"></a>00613 
-<a name="l00614"></a>00614 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00615"></a>00615 <span class="keywordtype">bool</span> concurrent_queue_iterator_rep<T>::get_item( T*& item, size_t k ) {
-<a name="l00616"></a>00616     <span class="keywordflow">if</span>( k==my_queue.my_rep->tail_counter ) {
-<a name="l00617"></a>00617         item = NULL;
-<a name="l00618"></a>00618         <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00619"></a>00619     } <span class="keywordflow">else</span> {
-<a name="l00620"></a>00620         <span class="keyword">typename</span> concurrent_queue_base_v3<T>::page* p = array[concurrent_queue_rep<T>::index(k)];
-<a name="l00621"></a>00621         __TBB_ASSERT(p,NULL);
-<a name="l00622"></a>00622         size_t i = k/concurrent_queue_rep<T>::n_queue & (my_queue.my_rep->items_per_page-1);
-<a name="l00623"></a>00623         item = &micro_queue<T>::get_ref(*p,i);
-<a name="l00624"></a>00624         <span class="keywordflow">return</span> (p->mask & uintptr_t(1)<<i)!=0;
-<a name="l00625"></a>00625     }
-<a name="l00626"></a>00626 }
-<a name="l00627"></a>00627 
-<a name="l00629"></a>00629 
-<a name="l00630"></a>00630 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00631"></a>00631 <span class="keyword">class </span>concurrent_queue_iterator_base_v3 : no_assign {
-<a name="l00633"></a>00633 
-<a name="l00634"></a>00634     concurrent_queue_iterator_rep<Value>* my_rep;
-<a name="l00635"></a>00635 
-<a name="l00636"></a>00636     <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00637"></a>00637     <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j );
-<a name="l00638"></a>00638 
-<a name="l00639"></a>00639     <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00640"></a>00640     <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j );
-<a name="l00641"></a>00641 <span class="keyword">protected</span>:
-<a name="l00643"></a>00643     Value* my_item;
-<a name="l00644"></a>00644 
-<a name="l00646"></a>00646     concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {
-<a name="l00647"></a>00647 <span class="preprocessor">#if __TBB_GCC_OPTIMIZER_ORDERING_BROKEN</span>
-<a name="l00648"></a>00648 <span class="preprocessor"></span>        __asm__ __volatile__(<span class="stringliteral">""</span>: : :<span class="stringliteral">"memory"</span>);
-<a name="l00649"></a>00649 <span class="preprocessor">#endif</span>
-<a name="l00650"></a>00650 <span class="preprocessor"></span>    }
-<a name="l00651"></a>00651 
-<a name="l00653"></a>00653     concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i )
-<a name="l00654"></a>00654     : no_assign(), my_rep(NULL), my_item(NULL) {
-<a name="l00655"></a>00655         assign(i);
-<a name="l00656"></a>00656     }
-<a name="l00657"></a>00657 
-<a name="l00659"></a>00659     concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue ) ;
-<a name="l00660"></a>00660 
-<a name="l00662"></a>00662     <span class="keywordtype">void</span> assign( <span class="keyword">const</span> concurrent_queue_iterator_base_v3<Value>& other ) ;
-<a name="l00663"></a>00663 
-<a name="l00665"></a>00665     <span class="keywordtype">void</span> advance() ;
-<a name="l00666"></a>00666 
-<a name="l00668"></a>00668     ~concurrent_queue_iterator_base_v3() {
-<a name="l00669"></a>00669         cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);
-<a name="l00670"></a>00670         my_rep = NULL;
-<a name="l00671"></a>00671     }
-<a name="l00672"></a>00672 };
-<a name="l00673"></a>00673 
-<a name="l00674"></a>00674 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00675"></a>00675 concurrent_queue_iterator_base_v3<Value>::concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue ) {
-<a name="l00676"></a>00676     my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);
-<a name="l00677"></a>00677     <span class="keyword">new</span>( my_rep ) concurrent_queue_iterator_rep<Value>(queue);
-<a name="l00678"></a>00678     size_t k = my_rep->head_counter;
-<a name="l00679"></a>00679     <span class="keywordflow">if</span>( !my_rep->get_item(my_item, k) ) advance();
-<a name="l00680"></a>00680 }
-<a name="l00681"></a>00681 
-<a name="l00682"></a>00682 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00683"></a>00683 <span class="keywordtype">void</span> concurrent_queue_iterator_base_v3<Value>::assign( <span class="keyword">const</span> concurrent_queue_iterator_base_v3<Value>& other ) {
-<a name="l00684"></a>00684     <span class="keywordflow">if</span>( my_rep!=other.my_rep ) {
-<a name="l00685"></a>00685         <span class="keywordflow">if</span>( my_rep ) {
-<a name="l00686"></a>00686             cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);
-<a name="l00687"></a>00687             my_rep = NULL;
-<a name="l00688"></a>00688         }
-<a name="l00689"></a>00689         <span class="keywordflow">if</span>( other.my_rep ) {
-<a name="l00690"></a>00690             my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);
-<a name="l00691"></a>00691             <span class="keyword">new</span>( my_rep ) concurrent_queue_iterator_rep<Value>( *other.my_rep );
-<a name="l00692"></a>00692         }
-<a name="l00693"></a>00693     }
-<a name="l00694"></a>00694     my_item = other.my_item;
-<a name="l00695"></a>00695 }
-<a name="l00696"></a>00696 
-<a name="l00697"></a>00697 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00698"></a>00698 <span class="keywordtype">void</span> concurrent_queue_iterator_base_v3<Value>::advance() {
-<a name="l00699"></a>00699     __TBB_ASSERT( my_item, <span class="stringliteral">"attempt to increment iterator past end of queue"</span> );  
-<a name="l00700"></a>00700     size_t k = my_rep->head_counter;
-<a name="l00701"></a>00701     <span class="keyword">const</span> concurrent_queue_base_v3<Value>& queue = my_rep->my_queue;
-<a name="l00702"></a>00702 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00703"></a>00703 <span class="preprocessor"></span>    Value* tmp;
-<a name="l00704"></a>00704     my_rep->get_item(tmp,k);
-<a name="l00705"></a>00705     __TBB_ASSERT( my_item==tmp, NULL );
-<a name="l00706"></a>00706 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00707"></a>00707     size_t i = k/concurrent_queue_rep<Value>::n_queue & (queue.my_rep->items_per_page-1);
-<a name="l00708"></a>00708     <span class="keywordflow">if</span>( i==queue.my_rep->items_per_page-1 ) {
-<a name="l00709"></a>00709         <span class="keyword">typename</span> concurrent_queue_base_v3<Value>::page*& root = my_rep->array[concurrent_queue_rep<Value>::index(k)];
-<a name="l00710"></a>00710         root = root->next;
-<a name="l00711"></a>00711     }
-<a name="l00712"></a>00712     <span class="comment">// advance k</span>
-<a name="l00713"></a>00713     my_rep->head_counter = ++k;
-<a name="l00714"></a>00714     <span class="keywordflow">if</span>( !my_rep->get_item(my_item, k) ) advance();
-<a name="l00715"></a>00715 }
-<a name="l00716"></a>00716 
-<a name="l00718"></a>00718 
-<a name="l00719"></a>00719 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_remove_cv {<span class="keyword">typedef</span> T type;};
-<a name="l00720"></a>00720 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_remove_cv<const T> {<span class="keyword">typedef</span> T type;};
-<a name="l00721"></a>00721 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_remove_cv<volatile T> {<span class="keyword">typedef</span> T type;};
-<a name="l00722"></a>00722 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span>tbb_remove_cv<const volatile T> {<span class="keyword">typedef</span> T type;};
-<a name="l00723"></a>00723 
-<a name="l00725"></a>00725 
-<a name="l00727"></a>00727 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00728"></a>00728 <span class="keyword">class </span>concurrent_queue_iterator: <span class="keyword">public</span> concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>,
-<a name="l00729"></a>00729         <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value> {
-<a name="l00730"></a>00730 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
-<a name="l00731"></a>00731 <span class="preprocessor"></span>    <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00732"></a>00732     <span class="keyword">friend</span> class ::tbb::strict_ppl::concurrent_queue;
-<a name="l00733"></a>00733 <span class="preprocessor">#else</span>
-<a name="l00734"></a>00734 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
-<a name="l00735"></a>00735 <span class="preprocessor">#endif </span>
-<a name="l00737"></a>00737 <span class="preprocessor">    concurrent_queue_iterator( const concurrent_queue_base_v3<Value>& queue ) :</span>
-<a name="l00738"></a>00738 <span class="preprocessor"></span>        concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(queue)
-<a name="l00739"></a>00739     {
-<a name="l00740"></a>00740     }
-<a name="l00741"></a>00741 
-<a name="l00742"></a>00742 <span class="keyword">public</span>:
-<a name="l00743"></a>00743     concurrent_queue_iterator() {}
-<a name="l00744"></a>00744 
-<a name="l00745"></a>00745     concurrent_queue_iterator( <span class="keyword">const</span> concurrent_queue_iterator<Container,typename Container::value_type>& other ) :
-<a name="l00746"></a>00746         concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(other)
-<a name="l00747"></a>00747     {}
-<a name="l00748"></a>00748 
-<a name="l00750"></a>00750     concurrent_queue_iterator& operator=( <span class="keyword">const</span> concurrent_queue_iterator& other ) {
-<a name="l00751"></a>00751         this->assign(other);
-<a name="l00752"></a>00752         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00753"></a>00753     }
-<a name="l00754"></a>00754 
-<a name="l00756"></a>00756     Value& operator*()<span class="keyword"> const </span>{
-<a name="l00757"></a>00757         <span class="keywordflow">return</span> *static_cast<Value*>(this->my_item);
-<a name="l00758"></a>00758     }
-<a name="l00759"></a>00759 
-<a name="l00760"></a>00760     Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00761"></a>00761 
-<a name="l00763"></a>00763     concurrent_queue_iterator& operator++() {
-<a name="l00764"></a>00764         this->advance();
-<a name="l00765"></a>00765         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00766"></a>00766     }
-<a name="l00767"></a>00767 
-<a name="l00769"></a>00769     Value* operator++(<span class="keywordtype">int</span>) {
-<a name="l00770"></a>00770         Value* result = &operator*();
-<a name="l00771"></a>00771         operator++();
-<a name="l00772"></a>00772         <span class="keywordflow">return</span> result;
-<a name="l00773"></a>00773     }
-<a name="l00774"></a>00774 }; <span class="comment">// concurrent_queue_iterator</span>
-<a name="l00775"></a>00775 
-<a name="l00776"></a>00776 
-<a name="l00777"></a>00777 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00778"></a>00778 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j ) {
-<a name="l00779"></a>00779     <span class="keywordflow">return</span> i.my_item==j.my_item;
-<a name="l00780"></a>00780 }
-<a name="l00781"></a>00781 
-<a name="l00782"></a>00782 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00783"></a>00783 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j ) {
-<a name="l00784"></a>00784     <span class="keywordflow">return</span> i.my_item!=j.my_item;
-<a name="l00785"></a>00785 }
-<a name="l00786"></a>00786 
-<a name="l00787"></a>00787 } <span class="comment">// namespace internal</span>
-<a name="l00788"></a>00788 
-<a name="l00790"></a>00790 
-<a name="l00791"></a>00791 } <span class="comment">// namespace strict_ppl</span>
-<a name="l00792"></a>00792 
-<a name="l00794"></a>00794 <span class="keyword">namespace </span>internal {
-<a name="l00795"></a>00795 
-<a name="l00796"></a>00796 <span class="keyword">class </span>concurrent_queue_rep;
-<a name="l00797"></a>00797 <span class="keyword">class </span>concurrent_queue_iterator_rep;
-<a name="l00798"></a>00798 <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
-<a name="l00799"></a>00799 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">class </span>concurrent_queue_iterator;
-<a name="l00800"></a>00800 
-<a name="l00802"></a>00802 
-<a name="l00804"></a>00804 <span class="keyword">class </span>concurrent_queue_base_v3: no_copy {
-<a name="l00806"></a>00806     concurrent_queue_rep* my_rep;
-<a name="l00807"></a>00807 
-<a name="l00808"></a>00808     <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_rep;
-<a name="l00809"></a>00809     <span class="keyword">friend</span> <span class="keyword">struct </span>micro_queue;
-<a name="l00810"></a>00810     <span class="keyword">friend</span> <span class="keyword">class </span>micro_queue_pop_finalizer;
-<a name="l00811"></a>00811     <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_rep;
-<a name="l00812"></a>00812     <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_queue_iterator_base_v3;
-<a name="l00813"></a>00813 <span class="keyword">protected</span>:
-<a name="l00815"></a>00815     <span class="keyword">struct </span>page {
-<a name="l00816"></a>00816         page* next;
-<a name="l00817"></a>00817         uintptr_t mask; 
-<a name="l00818"></a>00818     };
-<a name="l00819"></a>00819 
-<a name="l00821"></a>00821     ptrdiff_t my_capacity;
-<a name="l00822"></a>00822    
-<a name="l00824"></a>00824     size_t items_per_page;
-<a name="l00825"></a>00825 
-<a name="l00827"></a>00827     size_t item_size;
-<a name="l00828"></a>00828 
-<a name="l00829"></a>00829 <span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
-<a name="l00830"></a>00830 <span class="preprocessor"></span><span class="keyword">public</span>:
-<a name="l00831"></a>00831 <span class="preprocessor">#endif</span>
-<a name="l00832"></a>00832 <span class="preprocessor"></span>    <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00833"></a>00833     <span class="keyword">struct </span>padded_page: page {
-<a name="l00835"></a>00835         padded_page(); 
-<a name="l00837"></a>00837         <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> padded_page& );
-<a name="l00839"></a>00839         T last;
-<a name="l00840"></a>00840     };
-<a name="l00841"></a>00841 
-<a name="l00842"></a>00842 <span class="keyword">private</span>:
-<a name="l00843"></a>00843     <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_item( page& dst, size_t index, <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) = 0;
-<a name="l00844"></a>00844     <span class="keyword">virtual</span> <span class="keywordtype">void</span> assign_and_destroy_item( <span class="keywordtype">void</span>* dst, page& src, size_t index ) = 0;
-<a name="l00845"></a>00845 <span class="keyword">protected</span>:
-<a name="l00846"></a>00846     __TBB_EXPORTED_METHOD concurrent_queue_base_v3( size_t item_size );
-<a name="l00847"></a>00847     <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD ~concurrent_queue_base_v3();
-<a name="l00848"></a>00848 
-<a name="l00850"></a>00850     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_push( <span class="keyword">const</span> <span class="keywordtype">void</span>* src );
-<a name="l00851"></a>00851 
-<a name="l00853"></a>00853     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_pop( <span class="keywordtype">void</span>* dst );
-<a name="l00854"></a>00854 
-<a name="l00856"></a>00856     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_push_if_not_full( <span class="keyword">const</span> <span class="keywordtype">void</span>* src );
-<a name="l00857"></a>00857 
-<a name="l00859"></a>00859 
-<a name="l00860"></a>00860     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_pop_if_present( <span class="keywordtype">void</span>* dst );
-<a name="l00861"></a>00861 
-<a name="l00863"></a>00863     ptrdiff_t __TBB_EXPORTED_METHOD internal_size() <span class="keyword">const</span>;
-<a name="l00864"></a>00864 
-<a name="l00866"></a>00866     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_empty() <span class="keyword">const</span>;
-<a name="l00867"></a>00867 
-<a name="l00869"></a>00869     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_set_capacity( ptrdiff_t capacity, size_t element_size );
-<a name="l00870"></a>00870 
-<a name="l00872"></a>00872     <span class="keyword">virtual</span> page *allocate_page() = 0;
-<a name="l00873"></a>00873 
-<a name="l00875"></a>00875     <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( page *p ) = 0;
-<a name="l00876"></a>00876 
-<a name="l00878"></a>00878     <span class="comment">/* note that the name may be misleading, but it remains so due to a historical accident. */</span>
-<a name="l00879"></a>00879     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_finish_clear() ;
-<a name="l00880"></a>00880 
-<a name="l00882"></a>00882     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_throw_exception() <span class="keyword">const</span>;
-<a name="l00883"></a>00883 
-<a name="l00885"></a>00885     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD assign( <span class="keyword">const</span> concurrent_queue_base_v3& src ) ;
-<a name="l00886"></a>00886 
-<a name="l00887"></a>00887 <span class="keyword">private</span>:
-<a name="l00888"></a>00888     <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_page_item( page& dst, size_t dindex, <span class="keyword">const</span> page& src, size_t sindex ) = 0;
-<a name="l00889"></a>00889 };
-<a name="l00890"></a>00890 
-<a name="l00892"></a>00892 
-<a name="l00893"></a>00893 <span class="keyword">class </span>concurrent_queue_iterator_base_v3 {
-<a name="l00895"></a>00895 
-<a name="l00896"></a>00896     concurrent_queue_iterator_rep* my_rep;
-<a name="l00897"></a>00897 
-<a name="l00898"></a>00898     <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00899"></a>00899     <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j );
-<a name="l00900"></a>00900 
-<a name="l00901"></a>00901     <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00902"></a>00902     <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j );
-<a name="l00903"></a>00903 
-<a name="l00904"></a>00904     <span class="keywordtype">void</span> initialize( <span class="keyword">const</span> concurrent_queue_base_v3& queue, size_t offset_of_data );
-<a name="l00905"></a>00905 <span class="keyword">protected</span>:
-<a name="l00907"></a>00907     <span class="keywordtype">void</span>* my_item;
-<a name="l00908"></a>00908 
-<a name="l00910"></a>00910     concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {}
-<a name="l00911"></a>00911 
-<a name="l00913"></a>00913     concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i ) : my_rep(NULL), my_item(NULL) {
-<a name="l00914"></a>00914         assign(i);
-<a name="l00915"></a>00915     }
-<a name="l00916"></a>00916 
-<a name="l00918"></a>00918 
-<a name="l00919"></a>00919     __TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3& queue );
-<a name="l00920"></a>00920 
-<a name="l00922"></a>00922     __TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( <span class="keyword">const</span> concurrent_queue_base_v3& queue, size_t offset_of_data );
-<a name="l00923"></a>00923 
-<a name="l00925"></a>00925     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD assign( <span class="keyword">const</span> concurrent_queue_iterator_base_v3& i );
-<a name="l00926"></a>00926 
-<a name="l00928"></a>00928     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD advance();
-<a name="l00929"></a>00929 
-<a name="l00931"></a>00931     __TBB_EXPORTED_METHOD ~concurrent_queue_iterator_base_v3();
-<a name="l00932"></a>00932 };
-<a name="l00933"></a>00933 
-<a name="l00934"></a>00934 <span class="keyword">typedef</span> concurrent_queue_iterator_base_v3 concurrent_queue_iterator_base;
-<a name="l00935"></a>00935 
-<a name="l00937"></a>00937 
-<a name="l00939"></a>00939 <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00940"></a>00940 <span class="keyword">class </span>concurrent_queue_iterator: <span class="keyword">public</span> concurrent_queue_iterator_base,
-<a name="l00941"></a>00941         <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value> {
-<a name="l00942"></a>00942 
-<a name="l00943"></a>00943 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
-<a name="l00944"></a>00944 <span class="preprocessor"></span>    <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00945"></a>00945     <span class="keyword">friend</span> class ::tbb::concurrent_bounded_queue;
-<a name="l00946"></a>00946 
-<a name="l00947"></a>00947     <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00948"></a>00948     <span class="keyword">friend</span> class ::tbb::deprecated::concurrent_queue;
-<a name="l00949"></a>00949 <span class="preprocessor">#else</span>
-<a name="l00950"></a>00950 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
-<a name="l00951"></a>00951 <span class="preprocessor">#endif </span>
-<a name="l00953"></a>00953 <span class="preprocessor">    concurrent_queue_iterator( const concurrent_queue_base_v3& queue ) :</span>
-<a name="l00954"></a>00954 <span class="preprocessor"></span>        concurrent_queue_iterator_base_v3(queue,__TBB_offsetof(concurrent_queue_base_v3::padded_page<Value>,last))
-<a name="l00955"></a>00955     {
-<a name="l00956"></a>00956     }
-<a name="l00957"></a>00957 
-<a name="l00958"></a>00958 <span class="keyword">public</span>:
-<a name="l00959"></a>00959     concurrent_queue_iterator() {}
-<a name="l00960"></a>00960 
-<a name="l00963"></a>00963     concurrent_queue_iterator( <span class="keyword">const</span> concurrent_queue_iterator<Container,typename Container::value_type>& other ) :
-<a name="l00964"></a>00964         concurrent_queue_iterator_base_v3(other)
-<a name="l00965"></a>00965     {}
-<a name="l00966"></a>00966 
-<a name="l00968"></a>00968     concurrent_queue_iterator& operator=( <span class="keyword">const</span> concurrent_queue_iterator& other ) {
-<a name="l00969"></a>00969         assign(other);
-<a name="l00970"></a>00970         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00971"></a>00971     }
-<a name="l00972"></a>00972 
-<a name="l00974"></a>00974     Value& operator*()<span class="keyword"> const </span>{
-<a name="l00975"></a>00975         <span class="keywordflow">return</span> *static_cast<Value*>(my_item);
-<a name="l00976"></a>00976     }
-<a name="l00977"></a>00977 
-<a name="l00978"></a>00978     Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00979"></a>00979 
-<a name="l00981"></a>00981     concurrent_queue_iterator& operator++() {
-<a name="l00982"></a>00982         advance();
-<a name="l00983"></a>00983         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00984"></a>00984     }
-<a name="l00985"></a>00985 
-<a name="l00987"></a>00987     Value* operator++(<span class="keywordtype">int</span>) {
-<a name="l00988"></a>00988         Value* result = &operator*();
-<a name="l00989"></a>00989         operator++();
-<a name="l00990"></a>00990         <span class="keywordflow">return</span> result;
-<a name="l00991"></a>00991     }
-<a name="l00992"></a>00992 }; <span class="comment">// concurrent_queue_iterator</span>
-<a name="l00993"></a>00993 
-<a name="l00994"></a>00994 
-<a name="l00995"></a>00995 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00996"></a>00996 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j ) {
-<a name="l00997"></a>00997     <span class="keywordflow">return</span> i.my_item==j.my_item;
-<a name="l00998"></a>00998 }
-<a name="l00999"></a>00999 
-<a name="l01000"></a>01000 <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l01001"></a>01001 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> concurrent_queue_iterator<C,T>& i, <span class="keyword">const</span> concurrent_queue_iterator<C,U>& j ) {
-<a name="l01002"></a>01002     <span class="keywordflow">return</span> i.my_item!=j.my_item;
-<a name="l01003"></a>01003 }
-<a name="l01004"></a>01004 
-<a name="l01005"></a>01005 } <span class="comment">// namespace internal;</span>
-<a name="l01006"></a>01006 
-<a name="l01008"></a>01008 
-<a name="l01009"></a>01009 } <span class="comment">// namespace tbb</span>
-<a name="l01010"></a>01010 
-<a name="l01011"></a>01011 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_queue_internal_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00362.html b/doc/html/a00383.html
similarity index 75%
rename from doc/html/a00362.html
rename to doc/html/a00383.html
index e86456d..1f46da7 100644
--- a/doc/html/a00362.html
+++ b/doc/html/a00383.html
@@ -25,321 +25,258 @@
 <table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00215.html">aligned_space</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00227.html">aligned_space</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Block of space aligned sufficiently to construct an array T with N elements.  <a href="a00215.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00216.html">atomic</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Block of space aligned sufficiently to construct an array T with N elements.  <a href="a00227.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00228.html">atomic</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic.  <a href="a00216.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00217.html">atomic< void * ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic.  <a href="a00228.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00229.html">atomic< void * ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for <a class="el" href="a00217.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.  <a href="a00217.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.html">blocked_range</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for <a class="el" href="a00229.html">atomic<void*></a>, for sake of not allowing arithmetic or operator->.  <a href="a00229.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html">blocked_range</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate.  <a href="a00221.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00222.html">blocked_range2d</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate.  <a href="a00233.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html">blocked_range2d</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept.  <a href="a00222.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00223.html">blocked_range3d</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept.  <a href="a00234.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html">blocked_range3d</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept.  <a href="a00223.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00226.html">cache_aligned_allocator</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept.  <a href="a00235.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html">cache_aligned_allocator</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00226.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00227.html">cache_aligned_allocator< void ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00238.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00239.html">cache_aligned_allocator< void ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00227.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00229.html">combinable</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00239.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html">combinable</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction.  <a href="a00229.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html">tbb_hash_compare</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction.  <a href="a00241.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00321.html">tbb_hash_compare</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">hash_compare that is default argument for concurrent_hash_map  <a href="a00300.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html">concurrent_bounded_queue</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">hash_compare that is default argument for concurrent_hash_map  <a href="a00321.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html">concurrent_bounded_queue</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue.  <a href="a00230.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>tbb_hash</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue.  <a href="a00242.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html">concurrent_vector</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html">concurrent_vector</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container.  <a href="a00250.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html">mutex</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container.  <a href="a00238.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00251.html">graph_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock.  <a href="a00275.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html">null_mutex</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The base of all graph nodes. Allows them to be stored in a collection for deletion.  <a href="a00251.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00239.html">continue_msg</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing.  <a href="a00277.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html">null_rw_mutex</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An empty class used for messages that mean "I'm done".  <a href="a00239.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html">sender</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing.  <a href="a00279.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html">parallel_do_feeder</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pure virtual template class that defines a sender of messages of type T.  <a href="a00282.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html">receiver</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class the user supplied algorithm body uses to add new tasks.  <a href="a00281.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00314.html">task_group_context</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Pure virtual template class that defines a receiver of messages of type T.  <a href="a00277.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html">continue_receiver</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html">pre_scan_tag</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for receivers of completion messages.  <a href="a00241.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html">graph</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the initial scan is being performed.  <a href="a00285.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00258.html">final_scan_tag</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The graph class.  <a href="a00250.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html">source_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed.  <a href="a00258.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html">parallel_while</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An executable node that acts as a source, i.e. it has no predecessors.  <a href="a00285.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00249.html">function_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a stream, with optional addition of more work.  <a href="a00282.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html">simple_partitioner</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements a function node that supports Input -> Output.  <a href="a00249.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00244.html">executable_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner.  <a href="a00303.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html">auto_partitioner</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Implements an executable node that supports <a class="el" href="a00239.html">continue_msg</a> -> Output.  <a href="a00244.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>overwrite_node</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner.  <a href="a00231.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html">affinity_partitioner</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>write_once_node</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An affinity partitioner.  <a href="a00225.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html">filter</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00240.html">continue_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline.  <a href="a00256.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html">thread_bound_filter</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Broadcasts completion message when it receives completion messages from all predecessors. Then resets.  <a href="a00240.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00224.html">broadcast_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread.  <a href="a00322.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html">pipeline</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages of type T to all successors.  <a href="a00224.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00225.html">buffer_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items.  <a href="a00284.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html">queuing_mutex</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in arbitrary order.  <a href="a00225.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00269.html">queue_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning.  <a href="a00288.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00290.html">queuing_rw_mutex</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in FIFO order.  <a href="a00269.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00283.html">sequencer_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reader-writer lock with local-only spinning.  <a href="a00290.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html">recursive_mutex</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in sequence order.  <a href="a00283.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00268.html">priority_queue_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition.  <a href="a00296.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html">scalable_allocator</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages in priority order.  <a href="a00268.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html">limiter_node</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00299.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html">scalable_allocator< void ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Forwards messages only if the threshold has not been reached.  <a href="a00255.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>join_node</b></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00300.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00305.html">spin_mutex</a></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00258.html">mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte.  <a href="a00305.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html">spin_rw_mutex_v3</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock.  <a href="a00258.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00260.html">null_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast, unfair, spinning reader-writer lock with backoff and writer-preference.  <a href="a00307.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html">task</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing.  <a href="a00260.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html">null_rw_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks.  <a href="a00311.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00254.html">empty_task</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing.  <a href="a00262.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00264.html">parallel_do_feeder</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization.  <a href="a00254.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html">task_list</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class the user supplied algorithm body uses to add new tasks.  <a href="a00264.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00267.html">pre_scan_tag</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the initial scan is being performed.  <a href="a00267.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html">final_scan_tag</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed.  <a href="a00247.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html">parallel_while</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a stream, with optional addition of more work.  <a href="a00265.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html">simple_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner.  <a href="a00284.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00219.html">auto_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner.  <a href="a00219.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00212.html">affinity_partitioner</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An affinity partitioner.  <a href="a00212.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html">filter</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline.  <a href="a00245.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html">thread_bound_filter</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread.  <a href="a00301.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html">pipeline</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items.  <a href="a00266.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html">queuing_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning.  <a href="a00270.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html">queuing_rw_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reader-writer lock with local-only spinning.  <a href="a00272.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html">recursive_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition.  <a href="a00278.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00280.html">scalable_allocator</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00280.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00281.html">scalable_allocator< void ></a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00281.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html">spin_mutex</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte.  <a href="a00286.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html">spin_rw_mutex_v3</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast, unfair, spinning reader-writer lock with backoff and writer-preference.  <a href="a00288.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html">task_group_context</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks.  <a href="a00293.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html">task</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks.  <a href="a00291.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html">empty_task</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization.  <a href="a00242.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html">task_list</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children.  <a href="a00294.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children.  <a href="a00315.html#_details">More...</a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>task_handle</b></td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>task_group</b></td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><b>structured_task_group</b></td></tr>
 
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html">task_scheduler_init</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html">task_scheduler_init</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class delimiting the scope of task scheduler activity.  <a href="a00295.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html">tbb_allocator</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class delimiting the scope of task scheduler activity.  <a href="a00316.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html">tbb_allocator</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00296.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00297.html">tbb_allocator< void ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00317.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00318.html">tbb_allocator< void ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00297.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00306.html">zero_allocator</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00318.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00326.html">zero_allocator</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00306.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html">zero_allocator< void, Allocator ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00326.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html">zero_allocator< void, Allocator ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00307.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00220.html">bad_last_alloc</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00327.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00232.html">bad_last_alloc</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for concurrent containers.  <a href="a00220.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00252.html">improper_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for concurrent containers.  <a href="a00232.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00264.html">improper_lock</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for PPL locks.  <a href="a00252.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html">missing_wait</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for PPL locks.  <a href="a00264.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html">missing_wait</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for missing wait on structured_task_group.  <a href="a00256.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00253.html">invalid_multiple_scheduling</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for missing wait on structured_task_group.  <a href="a00272.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html">invalid_multiple_scheduling</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for repeated scheduling of the same task_handle.  <a href="a00253.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00298.html">tbb_exception</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Exception for repeated scheduling of the same task_handle.  <a href="a00265.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00319.html">tbb_exception</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.  <a href="a00298.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00228.html">captured_exception</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.  <a href="a00319.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00240.html">captured_exception</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">This class is used by TBB to propagate information about unhandled exceptions into the root thread.  <a href="a00228.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00257.html">movable_exception</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">This class is used by TBB to propagate information about unhandled exceptions into the root thread.  <a href="a00240.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00273.html">movable_exception</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread.  <a href="a00257.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00290.html">split</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread.  <a href="a00273.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00309.html">split</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor.  <a href="a00290.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html">tick_count</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor.  <a href="a00309.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html">tick_count</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp.  <a href="a00302.html#_details">More...</a><br></td></tr>
-<tr><td colspan="2"><br><h2>Namespaces</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00370.html">strict_ppl</a></td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">For internal use only. <br></td></tr>
-
-<p>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp.  <a href="a00323.html#_details">More...</a><br></td></tr>
 <tr><td colspan="2"><br><h2>parallel_do</h2></td></tr>
 <tr><td colspan="2">See also requirements on <a class="el" href="parallel_do_body_req.html">parallel_do Body</a>. <br><br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3383e2703977012b6f384d673410f1f7"></a><!-- doxytag: member="tbb::parallel_do" ref="g3383e2703977012b6f384d673410f1f7" args="(Iterator first, Iterator last, const Body &body)" -->
 template<typename Iterator, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2617dc9b88b3285a7212599d49f74228"></a><!-- doxytag: member="tbb::parallel_do" ref="g2617dc9b88b3285a7212599d49f74228" args="(Iterator first, Iterator last, const Body &body, task_group_context &context)" -->
 template<typename Iterator, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g2617dc9b88b3285a7212599d49f74228">parallel_do</a> (Iterator first, Iterator last, const Body &body, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g2617dc9b88b3285a7212599d49f74228">parallel_do</a> (Iterator first, Iterator last, const Body &body, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work and user-supplied context. <br></td></tr>
 <tr><td colspan="2"><br><h2>parallel_for</h2></td></tr>
 <tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_for_body_req.html">parallel_for Body</a>. <br><br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g68cc046ef72c42ce205fccbc435a0d81"></a><!-- doxytag: member="tbb::parallel_for" ref="g68cc046ef72c42ce205fccbc435a0d81" args="(const Range &range, const Body &body)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a> (const Range &range, const Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a> (const Range &range, const Body &body)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with default partitioner. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g13cac5dd55c7533bccea43a51c33d0e5"></a><!-- doxytag: member="tbb::parallel_for" ref="g13cac5dd55c7533bccea43a51c33d0e5" args="(const Range &range, const Body &body, const simple_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g13cac5dd55c7533bccea43a51c33d0e5">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g13cac5dd55c7533bccea43a51c33d0e5">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00303.html">simple_partitioner</a> &partitioner)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ga7ac75d532389b55b9247f3fdb0b00d1"></a><!-- doxytag: member="tbb::parallel_for" ref="ga7ac75d532389b55b9247f3fdb0b00d1" args="(const Range &range, const Body &body, const auto_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#ga7ac75d532389b55b9247f3fdb0b00d1">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#ga7ac75d532389b55b9247f3fdb0b00d1">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00231.html">auto_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g9cd1b210ceb1c040f30e390b4a21bde8"></a><!-- doxytag: member="tbb::parallel_for" ref="g9cd1b210ceb1c040f30e390b4a21bde8" args="(const Range &range, const Body &body, affinity_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g9cd1b210ceb1c040f30e390b4a21bde8">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00212.html">affinity_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g9cd1b210ceb1c040f30e390b4a21bde8">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00225.html">affinity_partitioner</a> &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00212.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00225.html">affinity_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2d317a5e0078cd193125439fed60dfdc"></a><!-- doxytag: member="tbb::parallel_for" ref="g2d317a5e0078cd193125439fed60dfdc" args="(const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g2d317a5e0078cd193125439fed60dfdc">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g2d317a5e0078cd193125439fed60dfdc">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00303.html">simple_partitioner</a> &partitioner, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c0700e3f85e83a788ff3ede88ebb7e9"></a><!-- doxytag: member="tbb::parallel_for" ref="g1c0700e3f85e83a788ff3ede88ebb7e9" args="(const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g1c0700e3f85e83a788ff3ede88ebb7e9">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g1c0700e3f85e83a788ff3ede88ebb7e9">parallel_for</a> (const Range &range, const Body &body, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00219.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00231.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g04b4696b67370c01353ff5974c8f1196"></a><!-- doxytag: member="tbb::parallel_for" ref="g04b4696b67370c01353ff5974c8f1196" args="(const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g04b4696b67370c01353ff5974c8f1196">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00212.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g04b4696b67370c01353ff5974c8f1196">parallel_for</a> (const Range &range, const Body &body, <a class="el" href="a00225.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00212.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00225.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
 <tr><td colspan="2"><br><h2>parallel_for_each</h2></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gcd40c32f319747e61a8f73fcfc452001"></a><!-- doxytag: member="tbb::parallel_for_each" ref="gcd40c32f319747e61a8f73fcfc452001" args="(InputIterator first, InputIterator last, const Function &f, task_group_context &context)" -->
 template<typename InputIterator, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Calls function f for all items from [first, last) interval using user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc2d710ca573f0a9bd94379cba3772def"></a><!-- doxytag: member="tbb::parallel_for_each" ref="gc2d710ca573f0a9bd94379cba3772def" args="(InputIterator first, InputIterator last, const Function &f)" -->
 template<typename InputIterator, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gc2d710ca573f0a9bd94379cba3772def">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gc2d710ca573f0a9bd94379cba3772def">parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Uses default context. <br></td></tr>
 <tr><td colspan="2"><br><h2>parallel_invoke</h2></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd3e2998f171494f94c2103f4eb924084"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gd3e2998f171494f94c2103f4eb924084" args="(const F0 &f0, const F1 &f1, tbb::task_group_context &context)" -->
 template<typename F0, typename F1> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Executes a list of tasks in parallel and waits for all tasks to complete. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g4eb73562e4145c8343ed9f996267f039"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g4eb73562e4145c8343ed9f996267f039" args="(const F0 &f0, const F1 &f1, const F2 &f2, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd1335c4b54fbf8d3f5be6a5c255c8c60"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gd1335c4b54fbf8d3f5be6a5c255c8c60" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g40b88e3db7ecb09cbfe0230ea1c24030"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g40b88e3db7ecb09cbfe0230ea1c24030" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g98a8b388f7e0b7621a964a8c23752d1d"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g98a8b388f7e0b7621a964a8c23752d1d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb95f31638bdde9d909361ad2e96a93eb"></a><!-- doxytag: member="tbb::parallel_invoke" ref="gb95f31638bdde9d909361ad2e96a93eb" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1655b24786f010ee0a008907a07bb61d"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g1655b24786f010ee0a008907a07bb61d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g105220f1c95f9888b696a3e47027527b"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g105220f1c95f9888b696a3e47027527b" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1ef1774e0fcc4f632fe0af2591781c4c"></a><!-- doxytag: member="tbb::parallel_invoke" ref="g1ef1774e0fcc4f632fe0af2591781c4c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ge832d8ad8b246c884e3c897ed63f8216"></a><!-- doxytag: member="tbb::parallel_invoke" ref="ge832d8ad8b246c884e3c897ed63f8216" args="(const F0 &f0, const F1 &f1)" -->
 template<typename F0, typename F1> </td></tr>
@@ -381,105 +318,125 @@ template<typename F0, typename F1, typename F2, typename F3, typename F4, typ
 <tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_reduce_body_req.html">parallel_reduce Body</a>. <br><br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1b3d59c5eb62683c5754db6970392fa3"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g1b3d59c5eb62683c5754db6970392fa3" args="(const Range &range, Body &body)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a> (const Range &range, Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a> (const Range &range, Body &body)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gec1b7c03f9da909bef5db12e3d41bed3"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gec1b7c03f9da909bef5db12e3d41bed3" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gec1b7c03f9da909bef5db12e3d41bed3">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gec1b7c03f9da909bef5db12e3d41bed3">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00303.html">simple_partitioner</a> &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00284.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00303.html">simple_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g18a19157e6245992fc00ca0adeb7dd37"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g18a19157e6245992fc00ca0adeb7dd37" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g18a19157e6245992fc00ca0adeb7dd37">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g18a19157e6245992fc00ca0adeb7dd37">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00231.html">auto_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc61e73fcc36c92d79a217fc355ff4a6b"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gc61e73fcc36c92d79a217fc355ff4a6b" args="(const Range &range, Body &body, affinity_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gc61e73fcc36c92d79a217fc355ff4a6b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00212.html">affinity_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gc61e73fcc36c92d79a217fc355ff4a6b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00225.html">affinity_partitioner</a> &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00212.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00225.html">affinity_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g45cb00c42a18e334bbde8b7535afe460"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g45cb00c42a18e334bbde8b7535afe460" args="(const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g45cb00c42a18e334bbde8b7535afe460">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g45cb00c42a18e334bbde8b7535afe460">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00303.html">simple_partitioner</a> &partitioner, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c1ea1d7c61b3c225e92c70d669a53a5"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g1c1ea1d7c61b3c225e92c70d669a53a5" args="(const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g1c1ea1d7c61b3c225e92c70d669a53a5">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g1c1ea1d7c61b3c225e92c70d669a53a5">parallel_reduce</a> (const Range &range, Body &body, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00219.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00231.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd9ac3a3811060314695f33b703c6e11b"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gd9ac3a3811060314695f33b703c6e11b" args="(const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gd9ac3a3811060314695f33b703c6e11b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00212.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gd9ac3a3811060314695f33b703c6e11b">parallel_reduce</a> (const Range &range, Body &body, <a class="el" href="a00225.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00212.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00225.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9412e09fb01fcad8c018ea9cffb28ef"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gc9412e09fb01fcad8c018ea9cffb28ef" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gc9412e09fb01fcad8c018ea9cffb28ef">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gc9412e09fb01fcad8c018ea9cffb28ef">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gaddffeec0e892ac3d6fc7fc2053e1eca"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gaddffeec0e892ac3d6fc7fc2053e1eca" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gaddffeec0e892ac3d6fc7fc2053e1eca">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gaddffeec0e892ac3d6fc7fc2053e1eca">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00303.html">simple_partitioner</a> &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00284.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00303.html">simple_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb175401f0729e40dd2c5860a17c14385"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gb175401f0729e40dd2c5860a17c14385" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gb175401f0729e40dd2c5860a17c14385">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gb175401f0729e40dd2c5860a17c14385">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00231.html">auto_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb7f1f1828ae2b330ce05b8513a495154"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gb7f1f1828ae2b330ce05b8513a495154" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gb7f1f1828ae2b330ce05b8513a495154">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00212.html">affinity_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gb7f1f1828ae2b330ce05b8513a495154">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00225.html">affinity_partitioner</a> &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00212.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00225.html">affinity_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfbc0cc2026d87f11a96bcd62788f5bb5"></a><!-- doxytag: member="tbb::parallel_reduce" ref="gfbc0cc2026d87f11a96bcd62788f5bb5" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gfbc0cc2026d87f11a96bcd62788f5bb5">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gfbc0cc2026d87f11a96bcd62788f5bb5">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00303.html">simple_partitioner</a> &partitioner, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g630c90a399937d9d4ae70ff883186dfd"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g630c90a399937d9d4ae70ff883186dfd" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g630c90a399937d9d4ae70ff883186dfd">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g630c90a399937d9d4ae70ff883186dfd">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00219.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00231.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g496bd7eadb3b97495ccb5655ef90319e"></a><!-- doxytag: member="tbb::parallel_reduce" ref="g496bd7eadb3b97495ccb5655ef90319e" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g496bd7eadb3b97495ccb5655ef90319e">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00212.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00293.html">task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g496bd7eadb3b97495ccb5655ef90319e">parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00225.html">affinity_partitioner</a> &partitioner, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00225.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g873006cc80868b5b4604822bf100ddeb"></a><!-- doxytag: member="tbb::parallel_deterministic_reduce" ref="g873006cc80868b5b4604822bf100ddeb" args="(const Range &range, Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g873006cc80868b5b4604822bf100ddeb">parallel_deterministic_reduce</a> (const Range &range, Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfd08c56b3a98d4437dadc5365326928a"></a><!-- doxytag: member="tbb::parallel_deterministic_reduce" ref="gfd08c56b3a98d4437dadc5365326928a" args="(const Range &range, Body &body, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gfd08c56b3a98d4437dadc5365326928a">parallel_deterministic_reduce</a> (const Range &range, Body &body, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction, simple partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3edb17bb1967c291d227556e0e47e507"></a><!-- doxytag: member="tbb::parallel_deterministic_reduce" ref="g3edb17bb1967c291d227556e0e47e507" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g3edb17bb1967c291d227556e0e47e507">parallel_deterministic_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00212.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g0a66bc67567b2d01d709b59b9bddf84a"></a><!-- doxytag: member="tbb::parallel_deterministic_reduce" ref="g0a66bc67567b2d01d709b59b9bddf84a" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, task_group_context &context)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g0a66bc67567b2d01d709b59b9bddf84a">parallel_deterministic_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, <a class="el" href="a00314.html">task_group_context</a> &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction, simple partitioner and user-supplied context. <br></td></tr>
 <tr><td colspan="2"><br><h2>parallel_scan</h2></td></tr>
 <tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_scan_body_req.html">parallel_scan Body</a>. <br><br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ged143f31dd3d96ded02ab3db915b91c7"></a><!-- doxytag: member="tbb::parallel_scan" ref="ged143f31dd3d96ded02ab3db915b91c7" args="(const Range &range, Body &body)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a> (const Range &range, Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a> (const Range &range, Body &body)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with default partitioner. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9fac8870b2e6365fb337014404529df"></a><!-- doxytag: member="tbb::parallel_scan" ref="gc9fac8870b2e6365fb337014404529df" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gc9fac8870b2e6365fb337014404529df">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00284.html">simple_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gc9fac8870b2e6365fb337014404529df">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00303.html">simple_partitioner</a> &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00284.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00303.html">simple_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g62fde400a37bbca1a2fddc8e3d22f556"></a><!-- doxytag: member="tbb::parallel_scan" ref="g62fde400a37bbca1a2fddc8e3d22f556" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g62fde400a37bbca1a2fddc8e3d22f556">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00219.html">auto_partitioner</a> &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g62fde400a37bbca1a2fddc8e3d22f556">parallel_scan</a> (const Range &range, Body &body, const <a class="el" href="a00231.html">auto_partitioner</a> &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00231.html">auto_partitioner</a>. <br></td></tr>
 <tr><td colspan="2"><br><h2>parallel_sort</h2></td></tr>
 <tr><td colspan="2">See also requirements on <a class="el" href="parallel_sort_iter_req.html">iterators for parallel_sort</a>. <br><br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2">template<typename RandomAccessIterator, typename Compare> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) using the given comparator.  <a href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa"></a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) using the given comparator.  <a href="a00395.html#g49edcf9447cd91a9527a3f8e8512b7aa"></a><br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g16c3eb77d0e530834c51ce3857f01012"></a><!-- doxytag: member="tbb::parallel_sort" ref="g16c3eb77d0e530834c51ce3857f01012" args="(RandomAccessIterator begin, RandomAccessIterator end)" -->
 template<typename RandomAccessIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g16c3eb77d0e530834c51ce3857f01012">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g16c3eb77d0e530834c51ce3857f01012">parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) with a default comparator <code>std::less<RandomAccessIterator></code>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc7576f82fdedc8a701a6c17ad9415926"></a><!-- doxytag: member="tbb::parallel_sort" ref="gc7576f82fdedc8a701a6c17ad9415926" args="(T *begin, T *end)" -->
 template<typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gc7576f82fdedc8a701a6c17ad9415926">parallel_sort</a> (T *begin, T *end)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gc7576f82fdedc8a701a6c17ad9415926">parallel_sort</a> (T *begin, T *end)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in the range <code></code>[begin,end) with a default comparator <code>std::less<T></code>. <br></td></tr>
 <tr><td colspan="2"><br><h2>Typedefs</h2></td></tr>
@@ -487,7 +444,7 @@ template<typename T> </td></tr>
 typedef internal::critical_section_v4 </td><td class="memItemRight" valign="bottom"><b>critical_section</b></td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7fdc2b067a243747d4c3dfe6f3d28476"></a><!-- doxytag: member="tbb::spin_rw_mutex" ref="7fdc2b067a243747d4c3dfe6f3d28476" args="" -->
-typedef <a class="el" href="a00288.html">spin_rw_mutex_v3</a> </td><td class="memItemRight" valign="bottom"><b>spin_rw_mutex</b></td></tr>
+typedef <a class="el" href="a00307.html">spin_rw_mutex_v3</a> </td><td class="memItemRight" valign="bottom"><b>spin_rw_mutex</b></td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="a3d457eb737199125df5ab0cf2f44094"></a><!-- doxytag: member="tbb::stack_size_type" ref="a3d457eb737199125df5ab0cf2f44094" args="" -->
 typedef std::size_t </td><td class="memItemRight" valign="bottom"><b>stack_size_type</b></td></tr>
@@ -496,17 +453,18 @@ typedef std::size_t </td><td class="memItemRight" valign="bottom"><b>stack_
 typedef internal::task_scheduler_observer_v3 </td><td class="memItemRight" valign="bottom"><b>task_scheduler_observer</b></td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ed375248ff6019a70ca0f9da528e5d0b"></a><!-- doxytag: member="tbb::assertion_handler_type" ref="ed375248ff6019a70ca0f9da528e5d0b" args="(const char *filename, int line, const char *expression, const char *comment)" -->
-typedef void(*) </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> (const char *filename, int line, const char *expression, const char *comment)</td></tr>
+typedef void(*) </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> (const char *filename, int line, const char *expression, const char *comment)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Type for an assertion handler. <br></td></tr>
 <tr><td colspan="2"><br><h2>Enumerations</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> { <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>, 
-<a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>, 
-<a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> { <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>, 
+<a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>, 
+<a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>, 
+<a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>
  }</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Specifies memory fencing.  <a href="a00362.html#a8686246bb5d3664bd07563749970fef">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { <b>ets_key_per_instance</b>, 
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Specifies memory fencing.  <a href="a00383.html#a8686246bb5d3664bd07563749970fef">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { <b>ets_key_per_instance</b>, 
 <b>ets_no_key</b>
  }</td></tr>
 
@@ -526,79 +484,72 @@ typedef void(*) </td><td class="memItemRight" valign="bottom"><a class="el"
  </td><td class="memItemRight" valign="bottom"><b>__TBB_DECL_ATOMIC</b> (__TBB_LONG_LONG) __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG) __TBB_DECL_ATOMIC(long) __TBB_DECL_ATOMIC(unsigned long) __TBB_DECL_ATOMIC_ALT(unsigned</td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ad165cf61abbe349d413df2589679add"></a><!-- doxytag: member="tbb::__TBB_DECL_ATOMIC_ALT" ref="ad165cf61abbe349d413df2589679add" args="(int, ptrdiff_t) __TBB_DECL_ATOMIC(unsigned) __TBB_DECL_ATOMIC(int) __TBB_DECL_ATOMIC(unsigned short) __TBB_DECL_ATOMIC(short) __TBB_DECL_ATOMIC(char) __TBB_DECL_ATOMIC(signed char) __TBB_DECL_ATOMIC(unsigned char) __TBB_DECL_ATOMIC(wchar_t) template< typename T > st [...]
-size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a> (int, ptrdiff_t) __TBB_DECL_ATOMIC(unsigned) __TBB_DECL_ATOMIC(int) __TBB_DECL_ATOMIC(unsigned short) __TBB_DECL_ATOMIC(short) __TBB_DECL_ATOMIC(char) __TBB_DECL_ATOMIC(signed char) __TBB_DECL_ATOMIC(unsigned char) __TBB_DECL_ATOMIC(wchar_t) template< typename T > struct <a class="el" href="a00216.html">atomic</a>< T * ></td></tr>
+size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a> (int, ptrdiff_t) __TBB_DECL_ATOMIC(unsigned) __TBB_DECL_ATOMIC(int) __TBB_DECL_ATOMIC(unsigned short) __TBB_DECL_ATOMIC(short) __TBB_DECL_ATOMIC(char) __TBB_DECL_ATOMIC(signed char) __TBB_DECL_ATOMIC(unsigned char) __TBB_DECL_ATOMIC(wchar_t) template< typename T > struct <a class="el" href="a00228.html">atomic</a>< T * ></td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Specialization for atomic<T*> with arithmetic and operator->. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="1ef5059a6b85fad2e4d510a5a095f2a1"></a><!-- doxytag: member="tbb::load" ref="1ef5059a6b85fad2e4d510a5a095f2a1" args="(const atomic< T > &a)" -->
+template<memory_semantics M, typename T> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">T </td><td class="memTemplItemRight" valign="bottom"><b>load</b> (const <a class="el" href="a00228.html">atomic</a>< T > &a)</td></tr>
+
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0fc5e34a898372157343886babe84045"></a><!-- doxytag: member="tbb::store" ref="0fc5e34a898372157343886babe84045" args="(atomic< T > &a, T value)" -->
+template<memory_semantics M, typename T> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>store</b> (<a class="el" href="a00228.html">atomic</a>< T > &a, T value)</td></tr>
+
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="7af9509624a62ea848afe775f892ed12"></a><!-- doxytag: member="tbb::operator==" ref="7af9509624a62ea848afe775f892ed12" args="(const cache_aligned_allocator< T > &, const cache_aligned_allocator< U > &)" -->
 template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00226.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00226.html">cache_aligned_allocator</a>< U > &)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00238.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00238.html">cache_aligned_allocator</a>< U > &)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="426abbf5243087148f5e3767e68c286b"></a><!-- doxytag: member="tbb::operator!=" ref="426abbf5243087148f5e3767e68c286b" args="(const cache_aligned_allocator< T > &, const cache_aligned_allocator< U > &)" -->
 template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00226.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00226.html">cache_aligned_allocator</a>< U > &)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00238.html">cache_aligned_allocator</a>< T > &, const <a class="el" href="a00238.html">cache_aligned_allocator</a>< U > &)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f3609fc523a99c101572fdc68f918d66"></a><!-- doxytag: member="tbb::operator==" ref="f3609fc523a99c101572fdc68f918d66" args="(const concurrent_hash_map< Key, T, HashCompare, A1 > &a, const concurrent_hash_map< Key, T, HashCompare, A2 > &b)" -->
 template<typename Key, typename T, typename HashCompare, typename A1, typename A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00231.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00231.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00243.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00243.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="2da30ff86b9a39722f45bc35e1c6934d"></a><!-- doxytag: member="tbb::operator!=" ref="2da30ff86b9a39722f45bc35e1c6934d" args="(const concurrent_hash_map< Key, T, HashCompare, A1 > &a, const concurrent_hash_map< Key, T, HashCompare, A2 > &b)" -->
 template<typename Key, typename T, typename HashCompare, typename A1, typename A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00231.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00231.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00243.html">concurrent_hash_map</a>< Key, T, HashCompare, A1 > &a, const <a class="el" href="a00243.html">concurrent_hash_map</a>< Key, T, HashCompare, A2 > &b)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="817c20df80fe1a933a8557eb76113e24"></a><!-- doxytag: member="tbb::swap" ref="817c20df80fe1a933a8557eb76113e24" args="(concurrent_hash_map< Key, T, HashCompare, A > &a, concurrent_hash_map< Key, T, HashCompare, A > &b)" -->
 template<typename Key, typename T, typename HashCompare, typename A> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>swap</b> (<a class="el" href="a00231.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &a, <a class="el" href="a00231.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>swap</b> (<a class="el" href="a00243.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &a, <a class="el" href="a00243.html">concurrent_hash_map</a>< Key, T, HashCompare, A > &b)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="11419db87ac98110907dda08a24f0949"></a><!-- doxytag: member="tbb::operator==" ref="11419db87ac98110907dda08a24f0949" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
 template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00238.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00238.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00250.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00250.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="aa9e09f2e9154ffd6658fad8355fb491"></a><!-- doxytag: member="tbb::operator!=" ref="aa9e09f2e9154ffd6658fad8355fb491" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
 template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00238.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00238.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00250.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00250.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="33267dd805415351956d45b4b5347190"></a><!-- doxytag: member="tbb::operator<" ref="33267dd805415351956d45b4b5347190" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
 template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator<</b> (const <a class="el" href="a00238.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00238.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator<</b> (const <a class="el" href="a00250.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00250.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="14e2968ab20cb714bef1f0352fc152f0"></a><!-- doxytag: member="tbb::operator>" ref="14e2968ab20cb714bef1f0352fc152f0" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
 template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator></b> (const <a class="el" href="a00238.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00238.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator></b> (const <a class="el" href="a00250.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00250.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0042a36a670a397fb52e713edbaecd0e"></a><!-- doxytag: member="tbb::operator<=" ref="0042a36a670a397fb52e713edbaecd0e" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
 template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator<=</b> (const <a class="el" href="a00238.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00238.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator<=</b> (const <a class="el" href="a00250.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00250.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="f70eb1d931473b69ba4bcf93af8baa33"></a><!-- doxytag: member="tbb::operator>=" ref="f70eb1d931473b69ba4bcf93af8baa33" args="(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)" -->
 template<typename T, class A1, class A2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator>=</b> (const <a class="el" href="a00238.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00238.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator>=</b> (const <a class="el" href="a00250.html">concurrent_vector</a>< T, A1 > &a, const <a class="el" href="a00250.html">concurrent_vector</a>< T, A2 > &b)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="4a3897ea8d8a48e885d764bd7d370d50"></a><!-- doxytag: member="tbb::swap" ref="4a3897ea8d8a48e885d764bd7d370d50" args="(concurrent_vector< T, A > &a, concurrent_vector< T, A > &b)" -->
 template<typename T, class A> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>swap</b> (<a class="el" href="a00238.html">concurrent_vector</a>< T, A > &a, <a class="el" href="a00238.html">concurrent_vector</a>< T, A > &b)</td></tr>
-
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="0a5a2559e7d28a9bf8f9e5e60d745e86"></a><!-- doxytag: member="tbb::make_edge" ref="0a5a2559e7d28a9bf8f9e5e60d745e86" args="(sender< T > &p, receiver< T > &s)" -->
-template<typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">make_edge</a> (<a class="el" href="a00282.html">sender</a>< T > &p, <a class="el" href="a00277.html">receiver</a>< T > &s)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>swap</b> (<a class="el" href="a00250.html">concurrent_vector</a>< T, A > &a, <a class="el" href="a00250.html">concurrent_vector</a>< T, A > &b)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes an edge between a single predecessor and a single successor. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ac6def751039959ab7ab1e52c8535fd3"></a><!-- doxytag: member="tbb::make_edges" ref="ac6def751039959ab7ab1e52c8535fd3" args="(sender< T > &p, SIterator s_begin, SIterator s_end)" -->
-template<typename T, typename SIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#ac6def751039959ab7ab1e52c8535fd3">make_edges</a> (<a class="el" href="a00282.html">sender</a>< T > &p, SIterator s_begin, SIterator s_end)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes edges between a single predecessor and multiple successors. <br></td></tr>
-<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="9368d2f689961f790bf7aa4a8cc1135e"></a><!-- doxytag: member="tbb::make_edges" ref="9368d2f689961f790bf7aa4a8cc1135e" args="(PIterator p_begin, PIterator p_end, receiver< T > &s)" -->
-template<typename T, typename PIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">make_edges</a> (PIterator p_begin, PIterator p_end, <a class="el" href="a00277.html">receiver</a>< T > &s)</td></tr>
-
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Makes edges between a set of predecessors and a single successor. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="906ebb461ecb0446989739fd0399e4b8"></a><!-- doxytag: member="tbb::operator==" ref="906ebb461ecb0446989739fd0399e4b8" args="(const scalable_allocator< T > &, const scalable_allocator< U > &)" -->
 template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00280.html">scalable_allocator</a>< T > &, const <a class="el" href="a00280.html">scalable_allocator</a>< U > &)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00299.html">scalable_allocator</a>< T > &, const <a class="el" href="a00299.html">scalable_allocator</a>< U > &)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="a92757aca0a69082eb8dc223eb257433"></a><!-- doxytag: member="tbb::operator!=" ref="a92757aca0a69082eb8dc223eb257433" args="(const scalable_allocator< T > &, const scalable_allocator< U > &)" -->
 template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00280.html">scalable_allocator</a>< T > &, const <a class="el" href="a00280.html">scalable_allocator</a>< U > &)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00299.html">scalable_allocator</a>< T > &, const <a class="el" href="a00299.html">scalable_allocator</a>< U > &)</td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="7e2f5baabe173fbf48e94fb9058f1b41"></a><!-- doxytag: member="tbb::is_current_task_group_canceling" ref="7e2f5baabe173fbf48e94fb9058f1b41" args="()" -->
 bool </td><td class="memItemRight" valign="bottom"><b>is_current_task_group_canceling</b> ()</td></tr>
@@ -609,46 +560,61 @@ template<class F> </td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="c8a46d6c0fe474eb399d0d09c27a4685"></a><!-- doxytag: member="tbb::operator==" ref="c8a46d6c0fe474eb399d0d09c27a4685" args="(const tbb_allocator< T > &, const tbb_allocator< U > &)" -->
 template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00296.html">tbb_allocator</a>< T > &, const <a class="el" href="a00296.html">tbb_allocator</a>< U > &)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00317.html">tbb_allocator</a>< T > &, const <a class="el" href="a00317.html">tbb_allocator</a>< U > &)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="3d9665c21c894f06f1614947103dc9d6"></a><!-- doxytag: member="tbb::operator!=" ref="3d9665c21c894f06f1614947103dc9d6" args="(const tbb_allocator< T > &, const tbb_allocator< U > &)" -->
 template<typename T, typename U> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00296.html">tbb_allocator</a>< T > &, const <a class="el" href="a00296.html">tbb_allocator</a>< U > &)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00317.html">tbb_allocator</a>< T > &, const <a class="el" href="a00317.html">tbb_allocator</a>< U > &)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="b64fb7e52f0049b5a103cbb6fb5814f0"></a><!-- doxytag: member="tbb::operator==" ref="b64fb7e52f0049b5a103cbb6fb5814f0" args="(const zero_allocator< T1, B1 > &a, const zero_allocator< T2, B2 > &b)" -->
 template<typename T1, template< typename X1 > class B1, typename T2, template< typename X2 > class B2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00306.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00306.html">zero_allocator</a>< T2, B2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator==</b> (const <a class="el" href="a00326.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00326.html">zero_allocator</a>< T2, B2 > &b)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ae43b5151d0220fe3ade0b447cd64f0d"></a><!-- doxytag: member="tbb::operator!=" ref="ae43b5151d0220fe3ade0b447cd64f0d" args="(const zero_allocator< T1, B1 > &a, const zero_allocator< T2, B2 > &b)" -->
 template<typename T1, template< typename X1 > class B1, typename T2, template< typename X2 > class B2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00306.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00306.html">zero_allocator</a>< T2, B2 > &b)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">bool </td><td class="memTemplItemRight" valign="bottom"><b>operator!=</b> (const <a class="el" href="a00326.html">zero_allocator</a>< T1, B1 > &a, const <a class="el" href="a00326.html">zero_allocator</a>< T2, B2 > &b)</td></tr>
 
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="250275615f10d5b5de6ad466ae2f54de"></a><!-- doxytag: member="tbb::atomic_fence" ref="250275615f10d5b5de6ad466ae2f54de" args="()" -->
-void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#250275615f10d5b5de6ad466ae2f54de">atomic_fence</a> ()</td></tr>
+void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html#250275615f10d5b5de6ad466ae2f54de">atomic_fence</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Sequentially consistent full memory fence. <br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="823fa1c15dd829d1d9167157450ddcd9"></a><!-- doxytag: member="tbb::set_assertion_handler" ref="823fa1c15dd829d1d9167157450ddcd9" args="(assertion_handler_type new_handler)" -->
-<a class="el" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a> (<a class="el" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler)</td></tr>
+<a class="el" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a> (<a class="el" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Set assertion handler and return previous value of it. <br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#3d1252787be39b4aef311f1cadaff9e8">assertion_failure</a> (const char *filename, int line, const char *expression, const char *comment)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html#3d1252787be39b4aef311f1cadaff9e8">assertion_failure</a> (const char *filename, int line, const char *expression, const char *comment)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Process an assertion failure.  <a href="#3d1252787be39b4aef311f1cadaff9e8"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00362.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a> ()</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00383.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a> ()</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">The function returns the interface version of the TBB shared library being used.  <a href="#a6858b22e90041c9c4669674ff39b056"></a><br></td></tr>
 <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="6a42aa5dbcf06ba86c71efb73d8311c3"></a><!-- doxytag: member="tbb::operator-" ref="6a42aa5dbcf06ba86c71efb73d8311c3" args="(const tick_count &t1, const tick_count &t0)" -->
-<a class="el" href="a00303.html">tick_count::interval_t</a> </td><td class="memItemRight" valign="bottom"><b>operator-</b> (const <a class="el" href="a00302.html">tick_count</a> &t1, const <a class="el" href="a00302.html">tick_count</a> &t0)</td></tr>
+<a class="el" href="a00324.html">tick_count::interval_t</a> </td><td class="memItemRight" valign="bottom"><b>operator-</b> (const <a class="el" href="a00323.html">tick_count</a> &t1, const <a class="el" href="a00323.html">tick_count</a> &t0)</td></tr>
 
 </table>
 <hr><a name="_details"></a><h2>Detailed Description</h2>
-The namespace tbb contains all components of the library. <hr><h2>Enumeration Type Documentation</h2>
+The namespace tbb contains all components of the library. 
+<p>
+This header provides basic platform abstraction layer by hooking up appropriate architecture/OS/compiler specific headers from the /include/tbb/machine directory. If a plug-in header does not implement all the required APIs, it must specify the missing ones by setting one or more of the following macros:<p>
+__TBB_USE_GENERIC_PART_WORD_CAS __TBB_USE_GENERIC_PART_WORD_FETCH_ADD __TBB_USE_GENERIC_PART_WORD_FETCH_STORE __TBB_USE_GENERIC_FETCH_ADD __TBB_USE_GENERIC_FETCH_STORE __TBB_USE_GENERIC_DWORD_FETCH_ADD __TBB_USE_GENERIC_DWORD_FETCH_STORE __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE __TBB_USE_GENERIC_FULL_FENCED_LOAD_STORE __TBB_USE_GENERIC_RELAXED_LOAD_STORE __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE<p>
+In this case <a class="el" href="a00594.html">tbb_machine.h</a> will add missing functionality based on a minimal set of APIs that are required to be implemented by all plug-n headers as described futher. Note that these generic implementations may be sub-optimal for a particular architecture, and thus should be relied upon only after careful evaluation or as the last resort.<p>
+Additionally __TBB_64BIT_ATOMICS can be set to 0 on a 32-bit architecture to indicate that the port is not going to support double word atomics. It may also be set to 1 explicitly, though normally this is not necessary as <a class="el" href="a00594.html">tbb_machine.h</a> will set it automatically.<p>
+Prerequisites for each architecture port ---------------------------------------- The following functions have no generic implementation. Therefore they must be implemented in each machine architecture specific header either as a conventional function or as a functional macro.<p>
+__TBB_Yield() Signals OS that the current thread is willing to relinquish the remainder of its time quantum.<p>
+__TBB_full_memory_fence() Must prevent all memory operations from being reordered across it (both by hardware and compiler). All such fences must be totally ordered (or sequentially consistent).<p>
+__TBB_machine_cmpswp4( volatile void *ptr, int32_t value, int32_t comparand ) Must be provided if __TBB_USE_FENCED_ATOMICS is not set.<p>
+__TBB_machine_cmpswp8( volatile void *ptr, int32_t value, int64_t comparand ) Must be provided for 64-bit architectures if __TBB_USE_FENCED_ATOMICS is not set, and for 32-bit architectures if __TBB_64BIT_ATOMICS is set<p>
+__TBB_machine_<op><S><fence>(...), where <op> = {cmpswp, fetchadd, fetchstore} <S> = {1, 2, 4, 8} <fence> = {full_fence, acquire, release, relaxed} Must be provided if __TBB_USE_FENCED_ATOMICS is set.<p>
+__TBB_control_consistency_helper() Bridges the memory-semantics gap between architectures providing only implicit C++0x "consume" semantics (like Power Architecture) and those also implicitly obeying control dependencies (like Itanium). It must be used only in conditional code where the condition is itself data-dependent, and will then make subsequent code behave as if the original data dependency were acquired. It needs only an empty definition where implied by the architecture either s [...]
+__TBB_acquire_consistency_helper(), __TBB_release_consistency_helper() Must be provided if __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE is set. Enforce acquire and release semantics in generic implementations of fenced store and load operations. Depending on the particular architecture/compiler combination they may be a hardware fence, a compiler fence, both or nothing. 
+<p>
+<hr><h2>Enumeration Type Documentation</h2>
 <a class="anchor" name="a8686246bb5d3664bd07563749970fef"></a><!-- doxytag: member="tbb::memory_semantics" ref="a8686246bb5d3664bd07563749970fef" args="" -->
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">enum <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fef">tbb::memory_semantics</a>          </td>
+          <td class="memname">enum <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef">tbb::memory_semantics</a>          </td>
         </tr>
       </table>
 </div>
@@ -659,12 +625,14 @@ Specifies memory fencing.
 <p>
 <dl compact><dt><b>Enumerator: </b></dt><dd>
 <table border="0" cellspacing="2" cellpadding="0">
-<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c"></a><!-- doxytag: member="__TBB_full_fence" ref="a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c" args="" -->__TBB_full_fence</em> </td><td>
-For internal use only. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff"></a><!-- doxytag: member="full_fence" ref="a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff" args="" -->full_fence</em> </td><td>
+Sequentially consistent fence. </td></tr>
 <tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7"></a><!-- doxytag: member="acquire" ref="a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7" args="" -->acquire</em> </td><td>
 Acquire fence. </td></tr>
 <tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70"></a><!-- doxytag: member="release" ref="a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70" args="" -->release</em> </td><td>
 Release fence. </td></tr>
+<tr><td valign="top"><em><a class="anchor" name="a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900"></a><!-- doxytag: member="relaxed" ref="a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900" args="" -->relaxed</em> </td><td>
+No ordering. </td></tr>
 </table>
 </dl>
 
diff --git a/doc/html/a00371.html b/doc/html/a00395.html
similarity index 83%
rename from doc/html/a00371.html
rename to doc/html/a00395.html
index 286e5b1..6640b97 100644
--- a/doc/html/a00371.html
+++ b/doc/html/a00395.html
@@ -17,139 +17,139 @@
 <h1>Algorithms</h1><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate.  <a href="a00221.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A range over which to iterate.  <a href="a00233.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept.  <a href="a00222.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 2-dimensional range that models the Range concept.  <a href="a00234.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept.  <a href="a00223.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00267.html">tbb::pre_scan_tag</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A 3-dimensional range that models the Range concept.  <a href="a00235.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00285.html">tbb::pre_scan_tag</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the initial scan is being performed.  <a href="a00267.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00247.html">tbb::final_scan_tag</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the initial scan is being performed.  <a href="a00285.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00258.html">tbb::final_scan_tag</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed.  <a href="a00247.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00265.html">tbb::parallel_while< Body ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to indicate that the final scan is being performed.  <a href="a00258.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00282.html">tbb::parallel_while< Body ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a stream, with optional addition of more work.  <a href="a00265.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html">tbb::simple_partitioner</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a stream, with optional addition of more work.  <a href="a00282.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00303.html">tbb::simple_partitioner</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner.  <a href="a00284.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00219.html">tbb::auto_partitioner</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A simple partitioner.  <a href="a00303.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html">tbb::auto_partitioner</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner.  <a href="a00219.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00245.html">tbb::filter</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">An auto partitioner.  <a href="a00231.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00256.html">tbb::filter</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline.  <a href="a00245.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00301.html">tbb::thread_bound_filter</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline.  <a href="a00256.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00322.html">tbb::thread_bound_filter</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread.  <a href="a00301.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00266.html">tbb::pipeline</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A stage in a pipeline served by a user thread.  <a href="a00322.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00284.html">tbb::pipeline</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items.  <a href="a00266.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00290.html">tbb::split</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A processing pipeline that applies filters to items.  <a href="a00284.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00309.html">tbb::split</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor.  <a href="a00290.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Dummy type that distinguishes splitting constructor from copy constructor.  <a href="a00309.html#_details">More...</a><br></td></tr>
 <tr><td colspan="2"><br><h2>parallel_do</h2></td></tr>
 <tr><td colspan="2">See also requirements on <a class="el" href="parallel_do_body_req.html">parallel_do Body</a>. <br><br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3383e2703977012b6f384d673410f1f7"></a><!-- doxytag: member="algorithms::parallel_do" ref="g3383e2703977012b6f384d673410f1f7" args="(Iterator first, Iterator last, const Body &body)" -->
 template<typename Iterator, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2617dc9b88b3285a7212599d49f74228"></a><!-- doxytag: member="algorithms::parallel_do" ref="g2617dc9b88b3285a7212599d49f74228" args="(Iterator first, Iterator last, const Body &body, task_group_context &context)" -->
 template<typename Iterator, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g2617dc9b88b3285a7212599d49f74228">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g2617dc9b88b3285a7212599d49f74228">tbb::parallel_do</a> (Iterator first, Iterator last, const Body &body, task_group_context &context)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over a range, with optional addition of more work and user-supplied context. <br></td></tr>
 <tr><td colspan="2"><br><h2>parallel_for</h2></td></tr>
 <tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_for_body_req.html">parallel_for Body</a>. <br><br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g68cc046ef72c42ce205fccbc435a0d81"></a><!-- doxytag: member="algorithms::parallel_for" ref="g68cc046ef72c42ce205fccbc435a0d81" args="(const Range &range, const Body &body)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a> (const Range &range, const Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a> (const Range &range, const Body &body)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with default partitioner. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g13cac5dd55c7533bccea43a51c33d0e5"></a><!-- doxytag: member="algorithms::parallel_for" ref="g13cac5dd55c7533bccea43a51c33d0e5" args="(const Range &range, const Body &body, const simple_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g13cac5dd55c7533bccea43a51c33d0e5">tbb::parallel_for</a> (const Range &range, const Body &body, const simple_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g13cac5dd55c7533bccea43a51c33d0e5">tbb::parallel_for</a> (const Range &range, const Body &body, const simple_partitioner &partitioner)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ga7ac75d532389b55b9247f3fdb0b00d1"></a><!-- doxytag: member="algorithms::parallel_for" ref="ga7ac75d532389b55b9247f3fdb0b00d1" args="(const Range &range, const Body &body, const auto_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#ga7ac75d532389b55b9247f3fdb0b00d1">tbb::parallel_for</a> (const Range &range, const Body &body, const auto_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#ga7ac75d532389b55b9247f3fdb0b00d1">tbb::parallel_for</a> (const Range &range, const Body &body, const auto_partitioner &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00231.html">auto_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g9cd1b210ceb1c040f30e390b4a21bde8"></a><!-- doxytag: member="algorithms::parallel_for" ref="g9cd1b210ceb1c040f30e390b4a21bde8" args="(const Range &range, const Body &body, affinity_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g9cd1b210ceb1c040f30e390b4a21bde8">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g9cd1b210ceb1c040f30e390b4a21bde8">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00212.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00225.html">affinity_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g2d317a5e0078cd193125439fed60dfdc"></a><!-- doxytag: member="algorithms::parallel_for" ref="g2d317a5e0078cd193125439fed60dfdc" args="(const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g2d317a5e0078cd193125439fed60dfdc">tbb::parallel_for</a> (const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g2d317a5e0078cd193125439fed60dfdc">tbb::parallel_for</a> (const Range &range, const Body &body, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with simple partitioner and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c0700e3f85e83a788ff3ede88ebb7e9"></a><!-- doxytag: member="algorithms::parallel_for" ref="g1c0700e3f85e83a788ff3ede88ebb7e9" args="(const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g1c0700e3f85e83a788ff3ede88ebb7e9">tbb::parallel_for</a> (const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g1c0700e3f85e83a788ff3ede88ebb7e9">tbb::parallel_for</a> (const Range &range, const Body &body, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00219.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00231.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g04b4696b67370c01353ff5974c8f1196"></a><!-- doxytag: member="algorithms::parallel_for" ref="g04b4696b67370c01353ff5974c8f1196" args="(const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g04b4696b67370c01353ff5974c8f1196">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g04b4696b67370c01353ff5974c8f1196">tbb::parallel_for</a> (const Range &range, const Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00212.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration over range with <a class="el" href="a00225.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
 <tr><td colspan="2"><br><h2>parallel_for_each</h2></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gcd40c32f319747e61a8f73fcfc452001"></a><!-- doxytag: member="algorithms::parallel_for_each" ref="gcd40c32f319747e61a8f73fcfc452001" args="(InputIterator first, InputIterator last, const Function &f, task_group_context &context)" -->
 template<typename InputIterator, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gcd40c32f319747e61a8f73fcfc452001">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gcd40c32f319747e61a8f73fcfc452001">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f, task_group_context &context)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Calls function f for all items from [first, last) interval using user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc2d710ca573f0a9bd94379cba3772def"></a><!-- doxytag: member="algorithms::parallel_for_each" ref="gc2d710ca573f0a9bd94379cba3772def" args="(InputIterator first, InputIterator last, const Function &f)" -->
 template<typename InputIterator, typename Function> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gc2d710ca573f0a9bd94379cba3772def">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gc2d710ca573f0a9bd94379cba3772def">tbb::parallel_for_each</a> (InputIterator first, InputIterator last, const Function &f)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Uses default context. <br></td></tr>
 <tr><td colspan="2"><br><h2>parallel_invoke</h2></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd3e2998f171494f94c2103f4eb924084"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gd3e2998f171494f94c2103f4eb924084" args="(const F0 &f0, const F1 &f1, tbb::task_group_context &context)" -->
 template<typename F0, typename F1> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">tbb::parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">tbb::parallel_invoke</a> (const F0 &f0, const F1 &f1, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Executes a list of tasks in parallel and waits for all tasks to complete. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g4eb73562e4145c8343ed9f996267f039"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g4eb73562e4145c8343ed9f996267f039" args="(const F0 &f0, const F1 &f1, const F2 &f2, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd1335c4b54fbf8d3f5be6a5c255c8c60"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gd1335c4b54fbf8d3f5be6a5c255c8c60" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g40b88e3db7ecb09cbfe0230ea1c24030"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g40b88e3db7ecb09cbfe0230ea1c24030" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3, typename F4> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g98a8b388f7e0b7621a964a8c23752d1d"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g98a8b388f7e0b7621a964a8c23752d1d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb95f31638bdde9d909361ad2e96a93eb"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="gb95f31638bdde9d909361ad2e96a93eb" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1655b24786f010ee0a008907a07bb61d"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g1655b24786f010ee0a008907a07bb61d" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g105220f1c95f9888b696a3e47027527b"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g105220f1c95f9888b696a3e47027527b" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1ef1774e0fcc4f632fe0af2591781c4c"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="g1ef1774e0fcc4f632fe0af2591781c4c" args="(const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, tbb::task_group_context &context)" -->
 template<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6, typename F7, typename F8, typename F9> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, <a class="el" href="a00293.html">tbb::task_group_context</a> &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><b>tbb::parallel_invoke</b> (const F0 &f0, const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5, const F6 &f6, const F7 &f7, const F8 &f8, const F9 &f9, <a class="el" href="a00314.html">tbb::task_group_context</a> &context)</td></tr>
 
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ge832d8ad8b246c884e3c897ed63f8216"></a><!-- doxytag: member="algorithms::parallel_invoke" ref="ge832d8ad8b246c884e3c897ed63f8216" args="(const F0 &f0, const F1 &f1)" -->
 template<typename F0, typename F1> </td></tr>
@@ -191,105 +191,125 @@ template<typename F0, typename F1, typename F2, typename F3, typename F4, typ
 <tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_reduce_body_req.html">parallel_reduce Body</a>. <br><br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1b3d59c5eb62683c5754db6970392fa3"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g1b3d59c5eb62683c5754db6970392fa3" args="(const Range &range, Body &body)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">tbb::parallel_reduce</a> (const Range &range, Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">tbb::parallel_reduce</a> (const Range &range, Body &body)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gec1b7c03f9da909bef5db12e3d41bed3"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gec1b7c03f9da909bef5db12e3d41bed3" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gec1b7c03f9da909bef5db12e3d41bed3">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gec1b7c03f9da909bef5db12e3d41bed3">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00284.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00303.html">simple_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g18a19157e6245992fc00ca0adeb7dd37"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g18a19157e6245992fc00ca0adeb7dd37" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g18a19157e6245992fc00ca0adeb7dd37">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g18a19157e6245992fc00ca0adeb7dd37">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00231.html">auto_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc61e73fcc36c92d79a217fc355ff4a6b"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gc61e73fcc36c92d79a217fc355ff4a6b" args="(const Range &range, Body &body, affinity_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gc61e73fcc36c92d79a217fc355ff4a6b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gc61e73fcc36c92d79a217fc355ff4a6b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00212.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00225.html">affinity_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g45cb00c42a18e334bbde8b7535afe460"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g45cb00c42a18e334bbde8b7535afe460" args="(const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g45cb00c42a18e334bbde8b7535afe460">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g45cb00c42a18e334bbde8b7535afe460">tbb::parallel_reduce</a> (const Range &range, Body &body, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g1c1ea1d7c61b3c225e92c70d669a53a5"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g1c1ea1d7c61b3c225e92c70d669a53a5" args="(const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g1c1ea1d7c61b3c225e92c70d669a53a5">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g1c1ea1d7c61b3c225e92c70d669a53a5">tbb::parallel_reduce</a> (const Range &range, Body &body, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00219.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00231.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gd9ac3a3811060314695f33b703c6e11b"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gd9ac3a3811060314695f33b703c6e11b" args="(const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gd9ac3a3811060314695f33b703c6e11b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gd9ac3a3811060314695f33b703c6e11b">tbb::parallel_reduce</a> (const Range &range, Body &body, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00212.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00225.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9412e09fb01fcad8c018ea9cffb28ef"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gc9412e09fb01fcad8c018ea9cffb28ef" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gc9412e09fb01fcad8c018ea9cffb28ef">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gc9412e09fb01fcad8c018ea9cffb28ef">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and default partitioner. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gaddffeec0e892ac3d6fc7fc2053e1eca"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gaddffeec0e892ac3d6fc7fc2053e1eca" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gaddffeec0e892ac3d6fc7fc2053e1eca">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gaddffeec0e892ac3d6fc7fc2053e1eca">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00284.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00303.html">simple_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb175401f0729e40dd2c5860a17c14385"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gb175401f0729e40dd2c5860a17c14385" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gb175401f0729e40dd2c5860a17c14385">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gb175401f0729e40dd2c5860a17c14385">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00231.html">auto_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gb7f1f1828ae2b330ce05b8513a495154"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gb7f1f1828ae2b330ce05b8513a495154" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gb7f1f1828ae2b330ce05b8513a495154">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gb7f1f1828ae2b330ce05b8513a495154">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00212.html">affinity_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction and <a class="el" href="a00225.html">affinity_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfbc0cc2026d87f11a96bcd62788f5bb5"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="gfbc0cc2026d87f11a96bcd62788f5bb5" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gfbc0cc2026d87f11a96bcd62788f5bb5">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gfbc0cc2026d87f11a96bcd62788f5bb5">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const simple_partitioner &partitioner, task_group_context &context)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, simple partitioner and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g630c90a399937d9d4ae70ff883186dfd"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g630c90a399937d9d4ae70ff883186dfd" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g630c90a399937d9d4ae70ff883186dfd">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g630c90a399937d9d4ae70ff883186dfd">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, const auto_partitioner &partitioner, task_group_context &context)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00219.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00231.html">auto_partitioner</a> and user-supplied context. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g496bd7eadb3b97495ccb5655ef90319e"></a><!-- doxytag: member="algorithms::parallel_reduce" ref="g496bd7eadb3b97495ccb5655ef90319e" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)" -->
 template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g496bd7eadb3b97495ccb5655ef90319e">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g496bd7eadb3b97495ccb5655ef90319e">tbb::parallel_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, affinity_partitioner &partitioner, task_group_context &context)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00212.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with reduction, <a class="el" href="a00225.html">affinity_partitioner</a> and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g873006cc80868b5b4604822bf100ddeb"></a><!-- doxytag: member="algorithms::parallel_deterministic_reduce" ref="g873006cc80868b5b4604822bf100ddeb" args="(const Range &range, Body &body)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g873006cc80868b5b4604822bf100ddeb">tbb::parallel_deterministic_reduce</a> (const Range &range, Body &body)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gfd08c56b3a98d4437dadc5365326928a"></a><!-- doxytag: member="algorithms::parallel_deterministic_reduce" ref="gfd08c56b3a98d4437dadc5365326928a" args="(const Range &range, Body &body, task_group_context &context)" -->
+template<typename Range, typename Body> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gfd08c56b3a98d4437dadc5365326928a">tbb::parallel_deterministic_reduce</a> (const Range &range, Body &body, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction, simple partitioner and user-supplied context. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g3edb17bb1967c291d227556e0e47e507"></a><!-- doxytag: member="algorithms::parallel_deterministic_reduce" ref="g3edb17bb1967c291d227556e0e47e507" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g3edb17bb1967c291d227556e0e47e507">tbb::parallel_deterministic_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction and default partitioner. <br></td></tr>
+<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g0a66bc67567b2d01d709b59b9bddf84a"></a><!-- doxytag: member="algorithms::parallel_deterministic_reduce" ref="g0a66bc67567b2d01d709b59b9bddf84a" args="(const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, task_group_context &context)" -->
+template<typename Range, typename Value, typename RealBody, typename Reduction> </td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">Value </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g0a66bc67567b2d01d709b59b9bddf84a">tbb::parallel_deterministic_reduce</a> (const Range &range, const Value &identity, const RealBody &real_body, const Reduction &reduction, task_group_context &context)</td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel iteration with deterministic reduction, simple partitioner and user-supplied context. <br></td></tr>
 <tr><td colspan="2"><br><h2>parallel_scan</h2></td></tr>
 <tr><td colspan="2">See also requirements on <a class="el" href="range_req.html">Range</a> and <a class="el" href="parallel_scan_body_req.html">parallel_scan Body</a>. <br><br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="ged143f31dd3d96ded02ab3db915b91c7"></a><!-- doxytag: member="algorithms::parallel_scan" ref="ged143f31dd3d96ded02ab3db915b91c7" args="(const Range &range, Body &body)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#ged143f31dd3d96ded02ab3db915b91c7">tbb::parallel_scan</a> (const Range &range, Body &body)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#ged143f31dd3d96ded02ab3db915b91c7">tbb::parallel_scan</a> (const Range &range, Body &body)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with default partitioner. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc9fac8870b2e6365fb337014404529df"></a><!-- doxytag: member="algorithms::parallel_scan" ref="gc9fac8870b2e6365fb337014404529df" args="(const Range &range, Body &body, const simple_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gc9fac8870b2e6365fb337014404529df">tbb::parallel_scan</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gc9fac8870b2e6365fb337014404529df">tbb::parallel_scan</a> (const Range &range, Body &body, const simple_partitioner &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00284.html">simple_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00303.html">simple_partitioner</a>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g62fde400a37bbca1a2fddc8e3d22f556"></a><!-- doxytag: member="algorithms::parallel_scan" ref="g62fde400a37bbca1a2fddc8e3d22f556" args="(const Range &range, Body &body, const auto_partitioner &partitioner)" -->
 template<typename Range, typename Body> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb::parallel_scan</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb::parallel_scan</a> (const Range &range, Body &body, const auto_partitioner &partitioner)</td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00219.html">auto_partitioner</a>. <br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Parallel prefix with <a class="el" href="a00231.html">auto_partitioner</a>. <br></td></tr>
 <tr><td colspan="2"><br><h2>parallel_sort</h2></td></tr>
 <tr><td colspan="2">See also requirements on <a class="el" href="parallel_sort_iter_req.html">iterators for parallel_sort</a>. <br><br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2">template<typename RandomAccessIterator, typename Compare> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g49edcf9447cd91a9527a3f8e8512b7aa">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end, const Compare &comp)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) using the given comparator.  <a href="#g49edcf9447cd91a9527a3f8e8512b7aa"></a><br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g16c3eb77d0e530834c51ce3857f01012"></a><!-- doxytag: member="algorithms::parallel_sort" ref="g16c3eb77d0e530834c51ce3857f01012" args="(RandomAccessIterator begin, RandomAccessIterator end)" -->
 template<typename RandomAccessIterator> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#g16c3eb77d0e530834c51ce3857f01012">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#g16c3eb77d0e530834c51ce3857f01012">tbb::parallel_sort</a> (RandomAccessIterator begin, RandomAccessIterator end)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in [begin,end) with a default comparator <code>std::less<RandomAccessIterator></code>. <br></td></tr>
 <tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gc7576f82fdedc8a701a6c17ad9415926"></a><!-- doxytag: member="algorithms::parallel_sort" ref="gc7576f82fdedc8a701a6c17ad9415926" args="(T *begin, T *end)" -->
 template<typename T> </td></tr>
-<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00371.html#gc7576f82fdedc8a701a6c17ad9415926">tbb::parallel_sort</a> (T *begin, T *end)</td></tr>
+<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="a00395.html#gc7576f82fdedc8a701a6c17ad9415926">tbb::parallel_sort</a> (T *begin, T *end)</td></tr>
 
 <tr><td class="mdescLeft"> </td><td class="mdescRight">Sorts the data in the range <code></code>[begin,end) with a default comparator <code>std::less<T></code>. <br></td></tr>
 </table>
diff --git a/doc/html/a00372.html b/doc/html/a00396.html
similarity index 76%
rename from doc/html/a00372.html
rename to doc/html/a00396.html
index a7e1e0d..f6ebde6 100644
--- a/doc/html/a00372.html
+++ b/doc/html/a00396.html
@@ -17,27 +17,27 @@
 <h1>Containers</h1><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00229.html">tbb::combinable< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00241.html">tbb::combinable< T ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction.  <a href="a00229.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Thread-local storage with optional reduction.  <a href="a00241.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Unordered map from Key to T.  <a href="a00231.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Unordered map from Key to T.  <a href="a00243.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe non-blocking concurrent queue.  <a href="a00236.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe non-blocking concurrent queue.  <a href="a00248.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue.  <a href="a00230.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue.  <a href="a00242.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue.  <a href="a00237.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A high-performance thread-safe blocking concurrent bounded queue.  <a href="a00249.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container.  <a href="a00238.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Concurrent vector container.  <a href="a00250.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">The <a class="el" href="a00243.html">enumerable_thread_specific</a> container.  <a href="a00243.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">The <a class="el" href="a00255.html">enumerable_thread_specific</a> container.  <a href="a00255.html#_details">More...</a><br></td></tr>
 </table>
 <hr>
 <p></p>
diff --git a/doc/html/a00397.html b/doc/html/a00397.html
index 9f13e4f..6346401 100644
--- a/doc/html/a00397.html
+++ b/doc/html/a00397.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>_concurrent_unordered_internal.h Source File</title>
+<title>Memory Allocation</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -11,1402 +11,304 @@
     <li><a href="modules.html"><span>Modules</span></a></li>
     <li><a href="namespaces.html"><span>Namespaces</span></a></li>
     <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
+    <li><a href="files.html"><span>Files</span></a></li>
     <li><a href="pages.html"><span>Related Pages</span></a></li>
   </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>_concurrent_unordered_internal.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="comment">/* Container implementations in this header are based on PPL implementations </span>
-<a name="l00022"></a>00022 <span class="comment">   provided by Microsoft. */</span>
-<a name="l00023"></a>00023 
-<a name="l00024"></a>00024 <span class="preprocessor">#ifndef __TBB_concurrent_unordered_internal_H</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_unordered_internal_H</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00028"></a>00028 
-<a name="l00029"></a>00029 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span>    <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00031"></a>00031 <span class="preprocessor">    #pragma warning (push)</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4530)</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span>
-<a name="l00035"></a>00035 <span class="preprocessor">#include <iterator></span>
-<a name="l00036"></a>00036 <span class="preprocessor">#include <utility></span>      <span class="comment">// Need std::pair</span>
-<a name="l00037"></a>00037 <span class="preprocessor">#include <functional></span>
-<a name="l00038"></a>00038 <span class="preprocessor">#include <string></span>       <span class="comment">// For tbb_hasher</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#include <cstring></span>      <span class="comment">// Need std::memset</span>
-<a name="l00040"></a>00040 
-<a name="l00041"></a>00041 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span>
-<a name="l00045"></a>00045 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00047"></a>00047 <span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00048"></a>00048 
-<a name="l00049"></a>00049 <span class="keyword">namespace </span>tbb {
-<a name="l00050"></a>00050 <span class="keyword">namespace </span>interface5 {
-<a name="l00052"></a>00052 <span class="keyword">namespace </span>internal {
-<a name="l00053"></a>00053 
-<a name="l00054"></a>00054 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Allocator>
-<a name="l00055"></a>00055 <span class="keyword">class </span>split_ordered_list;
-<a name="l00056"></a>00056 <span class="keyword">template</span> <<span class="keyword">typename</span> Traits>
-<a name="l00057"></a>00057 <span class="keyword">class </span>concurrent_unordered_base;
-<a name="l00058"></a>00058 
-<a name="l00059"></a>00059 <span class="comment">// Forward list iterators (without skipping dummy elements)</span>
-<a name="l00060"></a>00060 <span class="keyword">template</span><<span class="keyword">class</span> Solist, <span class="keyword">typename</span> Value>
-<a name="l00061"></a>00061 <span class="keyword">class </span>flist_iterator : <span class="keyword">public</span> std::iterator<std::forward_iterator_tag, Value>
-<a name="l00062"></a>00062 {
-<a name="l00063"></a>00063     <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Allocator>
-<a name="l00064"></a>00064     <span class="keyword">friend</span> <span class="keyword">class </span>split_ordered_list;
-<a name="l00065"></a>00065     <span class="keyword">template</span> <<span class="keyword">typename</span> Traits>
-<a name="l00066"></a>00066     <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_unordered_base;
-<a name="l00067"></a>00067     <span class="keyword">template</span><<span class="keyword">class</span> M, <span class="keyword">typename</span> V>
-<a name="l00068"></a>00068     <span class="keyword">friend</span> <span class="keyword">class </span>flist_iterator;
-<a name="l00069"></a>00069 
-<a name="l00070"></a>00070     <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::nodeptr_t nodeptr_t;
-<a name="l00071"></a>00071 <span class="keyword">public</span>:
-<a name="l00072"></a>00072     <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::value_type value_type;
-<a name="l00073"></a>00073     <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::difference_type difference_type;
-<a name="l00074"></a>00074     <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::pointer pointer;
-<a name="l00075"></a>00075     <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::reference reference;
-<a name="l00076"></a>00076 
-<a name="l00077"></a>00077     flist_iterator() : my_node_ptr(0) {}
-<a name="l00078"></a>00078     flist_iterator( <span class="keyword">const</span> flist_iterator<Solist, typename Solist::value_type> &other )
-<a name="l00079"></a>00079         : my_node_ptr(other.my_node_ptr) {}
-<a name="l00080"></a>00080 
-<a name="l00081"></a>00081     reference operator*()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_node_ptr->my_element; }
-<a name="l00082"></a>00082     pointer operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &**<span class="keyword">this</span>; }
-<a name="l00083"></a>00083 
-<a name="l00084"></a>00084     flist_iterator& operator++() {
-<a name="l00085"></a>00085         my_node_ptr = my_node_ptr->my_next;
-<a name="l00086"></a>00086         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00087"></a>00087     }
-<a name="l00088"></a>00088 
-<a name="l00089"></a>00089     flist_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00090"></a>00090         flist_iterator tmp = *<span class="keyword">this</span>;
-<a name="l00091"></a>00091         ++*<span class="keyword">this</span>;
-<a name="l00092"></a>00092         <span class="keywordflow">return</span> tmp;
-<a name="l00093"></a>00093     }
-<a name="l00094"></a>00094 
-<a name="l00095"></a>00095 <span class="keyword">protected</span>:
-<a name="l00096"></a>00096     flist_iterator(nodeptr_t pnode) : my_node_ptr(pnode) {}
-<a name="l00097"></a>00097     nodeptr_t get_node_ptr()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_node_ptr; }
-<a name="l00098"></a>00098 
-<a name="l00099"></a>00099     nodeptr_t my_node_ptr;
-<a name="l00100"></a>00100 
-<a name="l00101"></a>00101     <span class="keyword">template</span><<span class="keyword">typename</span> M, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00102"></a>00102     <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> flist_iterator<M,T> &i, <span class="keyword">const</span> flist_iterator<M,U> &j );
-<a name="l00103"></a>00103     <span class="keyword">template</span><<span class="keyword">typename</span> M, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00104"></a>00104     <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> flist_iterator<M,T>& i, <span class="keyword">const</span> flist_iterator<M,U>& j );
-<a name="l00105"></a>00105 };
-<a name="l00106"></a>00106 
-<a name="l00107"></a>00107 <span class="keyword">template</span><<span class="keyword">typename</span> Solist, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00108"></a>00108 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> flist_iterator<Solist,T> &i, <span class="keyword">const</span> flist_iterator<Solist,U> &j ) {
-<a name="l00109"></a>00109     <span class="keywordflow">return</span> i.my_node_ptr == j.my_node_ptr;
-<a name="l00110"></a>00110 }
-<a name="l00111"></a>00111 <span class="keyword">template</span><<span class="keyword">typename</span> Solist, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00112"></a>00112 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> flist_iterator<Solist,T>& i, <span class="keyword">const</span> flist_iterator<Solist,U>& j ) {
-<a name="l00113"></a>00113     <span class="keywordflow">return</span> i.my_node_ptr != j.my_node_ptr;
-<a name="l00114"></a>00114 }
-<a name="l00115"></a>00115 
-<a name="l00116"></a>00116 <span class="comment">// Split-order list iterators, needed to skip dummy elements</span>
-<a name="l00117"></a>00117 <span class="keyword">template</span><<span class="keyword">class</span> Solist, <span class="keyword">typename</span> Value>
-<a name="l00118"></a>00118 <span class="keyword">class </span>solist_iterator : <span class="keyword">public</span> flist_iterator<Solist, Value>
-<a name="l00119"></a>00119 {
-<a name="l00120"></a>00120     <span class="keyword">typedef</span> flist_iterator<Solist, Value> base_type;
-<a name="l00121"></a>00121     <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::nodeptr_t nodeptr_t;
-<a name="l00122"></a>00122     <span class="keyword">using</span> base_type::get_node_ptr;
-<a name="l00123"></a>00123     <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Allocator>
-<a name="l00124"></a>00124     <span class="keyword">friend</span> <span class="keyword">class </span>split_ordered_list;
-<a name="l00125"></a>00125     <span class="keyword">template</span><<span class="keyword">class</span> M, <span class="keyword">typename</span> V>
-<a name="l00126"></a>00126     <span class="keyword">friend</span> <span class="keyword">class </span>solist_iterator;
-<a name="l00127"></a>00127     <span class="keyword">template</span><<span class="keyword">typename</span> M, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00128"></a>00128     <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> solist_iterator<M,T> &i, <span class="keyword">const</span> solist_iterator<M,U> &j );
-<a name="l00129"></a>00129     <span class="keyword">template</span><<span class="keyword">typename</span> M, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00130"></a>00130     <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> solist_iterator<M,T>& i, <span class="keyword">const</span> solist_iterator<M,U>& j );
-<a name="l00131"></a>00131 
-<a name="l00132"></a>00132     <span class="keyword">const</span> Solist *my_list_ptr;
-<a name="l00133"></a>00133     solist_iterator(nodeptr_t pnode, <span class="keyword">const</span> Solist *plist) : base_type(pnode), my_list_ptr(plist) {}
-<a name="l00134"></a>00134 
-<a name="l00135"></a>00135 <span class="keyword">public</span>:
-<a name="l00136"></a>00136     <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::value_type value_type;
-<a name="l00137"></a>00137     <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::difference_type difference_type;
-<a name="l00138"></a>00138     <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::pointer pointer;
-<a name="l00139"></a>00139     <span class="keyword">typedef</span> <span class="keyword">typename</span> Solist::reference reference;
-<a name="l00140"></a>00140 
-<a name="l00141"></a>00141     solist_iterator() {}
-<a name="l00142"></a>00142     solist_iterator(<span class="keyword">const</span> solist_iterator<Solist, typename Solist::value_type> &other )
-<a name="l00143"></a>00143         : base_type(other), my_list_ptr(other.my_list_ptr) {}
-<a name="l00144"></a>00144 
-<a name="l00145"></a>00145     reference operator*()<span class="keyword"> const </span>{
-<a name="l00146"></a>00146         <span class="keywordflow">return</span> this->base_type::operator*();
-<a name="l00147"></a>00147     }
-<a name="l00148"></a>00148 
-<a name="l00149"></a>00149     pointer operator->()<span class="keyword"> const </span>{
-<a name="l00150"></a>00150         <span class="keywordflow">return</span> (&**<span class="keyword">this</span>);
-<a name="l00151"></a>00151     }
-<a name="l00152"></a>00152 
-<a name="l00153"></a>00153     solist_iterator& operator++() {
-<a name="l00154"></a>00154         <span class="keywordflow">do</span> ++(*(base_type *)<span class="keyword">this</span>);
-<a name="l00155"></a>00155         <span class="keywordflow">while</span> (get_node_ptr() != NULL && get_node_ptr()->is_dummy());
-<a name="l00156"></a>00156 
-<a name="l00157"></a>00157         <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00158"></a>00158     }
-<a name="l00159"></a>00159 
-<a name="l00160"></a>00160     solist_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00161"></a>00161         solist_iterator tmp = *<span class="keyword">this</span>;
-<a name="l00162"></a>00162         <span class="keywordflow">do</span> ++*<span class="keyword">this</span>;
-<a name="l00163"></a>00163         <span class="keywordflow">while</span> (get_node_ptr() != NULL && get_node_ptr()->is_dummy());
-<a name="l00164"></a>00164 
-<a name="l00165"></a>00165         <span class="keywordflow">return</span> (tmp);
-<a name="l00166"></a>00166     }
-<a name="l00167"></a>00167 };
-<a name="l00168"></a>00168 
-<a name="l00169"></a>00169 <span class="keyword">template</span><<span class="keyword">typename</span> Solist, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00170"></a>00170 <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> solist_iterator<Solist,T> &i, <span class="keyword">const</span> solist_iterator<Solist,U> &j ) {
-<a name="l00171"></a>00171     <span class="keywordflow">return</span> i.my_node_ptr == j.my_node_ptr && i.my_list_ptr == j.my_list_ptr;
-<a name="l00172"></a>00172 }
-<a name="l00173"></a>00173 <span class="keyword">template</span><<span class="keyword">typename</span> Solist, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00174"></a>00174 <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> solist_iterator<Solist,T>& i, <span class="keyword">const</span> solist_iterator<Solist,U>& j ) {
-<a name="l00175"></a>00175     <span class="keywordflow">return</span> i.my_node_ptr != j.my_node_ptr || i.my_list_ptr != j.my_list_ptr;
-<a name="l00176"></a>00176 }
-<a name="l00177"></a>00177 
-<a name="l00178"></a>00178 <span class="comment">// Forward type and class definitions</span>
-<a name="l00179"></a>00179 <span class="keyword">typedef</span> size_t sokey_t;
-<a name="l00180"></a>00180 
-<a name="l00181"></a>00181 <span class="comment">// Forward list in which elements are sorted in a split-order</span>
-<a name="l00182"></a>00182 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Allocator>
-<a name="l00183"></a>00183 <span class="keyword">class </span>split_ordered_list
-<a name="l00184"></a>00184 {
-<a name="l00185"></a>00185 <span class="keyword">public</span>:
-<a name="l00186"></a>00186     <span class="keyword">typedef</span> split_ordered_list<T, Allocator> self_type;
-<a name="l00187"></a>00187     <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<T>::other allocator_type;
-<a name="l00188"></a>00188     <span class="keyword">struct </span>node;
-<a name="l00189"></a>00189     <span class="keyword">typedef</span> node *nodeptr_t;
-<a name="l00190"></a>00190 
-<a name="l00191"></a>00191     <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::size_type size_type;
-<a name="l00192"></a>00192     <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::difference_type difference_type;
-<a name="l00193"></a>00193     <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::pointer pointer;
-<a name="l00194"></a>00194     <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::const_pointer const_pointer;
-<a name="l00195"></a>00195     <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::reference reference;
-<a name="l00196"></a>00196     <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::const_reference const_reference;
-<a name="l00197"></a>00197     <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::value_type value_type;
-<a name="l00198"></a>00198 
-<a name="l00199"></a>00199     <span class="keyword">typedef</span> solist_iterator<self_type, const value_type> const_iterator;
-<a name="l00200"></a>00200     <span class="keyword">typedef</span> solist_iterator<self_type, value_type> iterator;
-<a name="l00201"></a>00201     <span class="keyword">typedef</span> flist_iterator<self_type, const value_type> raw_const_iterator;
-<a name="l00202"></a>00202     <span class="keyword">typedef</span> flist_iterator<self_type, value_type> raw_iterator;
-<a name="l00203"></a>00203 
-<a name="l00204"></a>00204     <span class="comment">// Node that holds the element in a split-ordered list</span>
-<a name="l00205"></a>00205     <span class="keyword">struct </span>node : tbb::internal::no_assign
-<a name="l00206"></a>00206     {
-<a name="l00207"></a>00207         <span class="comment">// Initialize the node with the given order key</span>
-<a name="l00208"></a>00208         <span class="keywordtype">void</span> init(sokey_t order_key) {
-<a name="l00209"></a>00209             my_order_key = order_key;
-<a name="l00210"></a>00210             my_next = NULL;
-<a name="l00211"></a>00211         }
-<a name="l00212"></a>00212 
-<a name="l00213"></a>00213         <span class="comment">// Return the order key (needed for hashing)</span>
-<a name="l00214"></a>00214         sokey_t get_order_key()<span class="keyword"> const </span>{ <span class="comment">// TODO: remove</span>
-<a name="l00215"></a>00215             <span class="keywordflow">return</span> my_order_key;
-<a name="l00216"></a>00216         }
-<a name="l00217"></a>00217 
-<a name="l00218"></a>00218         <span class="comment">// Inserts the new element in the list in an atomic fashion</span>
-<a name="l00219"></a>00219         nodeptr_t atomic_set_next(nodeptr_t new_node, nodeptr_t current_node)
-<a name="l00220"></a>00220         {
-<a name="l00221"></a>00221             <span class="comment">// Try to change the next pointer on the current element to a new element, only if it still points to the cached next</span>
-<a name="l00222"></a>00222             nodeptr_t exchange_node = (nodeptr_t) __TBB_CompareAndSwapW((<span class="keywordtype">void</span> *) &my_next, (uintptr_t)new_node, (uintptr_t)current_node);
-<a name="l00223"></a>00223 
-<a name="l00224"></a>00224             <span class="keywordflow">if</span> (exchange_node == current_node) <span class="comment">// TODO: why this branch?</span>
-<a name="l00225"></a>00225             {
-<a name="l00226"></a>00226                 <span class="comment">// Operation succeeded, return the new node</span>
-<a name="l00227"></a>00227                 <span class="keywordflow">return</span> new_node;
-<a name="l00228"></a>00228             }
-<a name="l00229"></a>00229             <span class="keywordflow">else</span>
-<a name="l00230"></a>00230             {
-<a name="l00231"></a>00231                 <span class="comment">// Operation failed, return the "interfering" node</span>
-<a name="l00232"></a>00232                 <span class="keywordflow">return</span> exchange_node;
-<a name="l00233"></a>00233             }
-<a name="l00234"></a>00234         }
-<a name="l00235"></a>00235 
-<a name="l00236"></a>00236         <span class="comment">// Checks if this element in the list is a dummy, order enforcing node. Dummy nodes are used by buckets</span>
-<a name="l00237"></a>00237         <span class="comment">// in the hash table to quickly index into the right subsection of the split-ordered list.</span>
-<a name="l00238"></a>00238         <span class="keywordtype">bool</span> is_dummy()<span class="keyword"> const </span>{
-<a name="l00239"></a>00239             <span class="keywordflow">return</span> (my_order_key & 0x1) == 0;
-<a name="l00240"></a>00240         }
-<a name="l00241"></a>00241 
-<a name="l00242"></a>00242 
-<a name="l00243"></a>00243         nodeptr_t  my_next;      <span class="comment">// Next element in the list</span>
-<a name="l00244"></a>00244         value_type my_element;   <span class="comment">// Element storage</span>
-<a name="l00245"></a>00245         sokey_t    my_order_key; <span class="comment">// Order key for this element</span>
-<a name="l00246"></a>00246     };
-<a name="l00247"></a>00247 
-<a name="l00248"></a>00248     <span class="comment">// Allocate a new node with the given order key and value</span>
-<a name="l00249"></a>00249     nodeptr_t create_node(sokey_t order_key, <span class="keyword">const</span> T &value) {
-<a name="l00250"></a>00250         nodeptr_t pnode = my_node_allocator.allocate(1);
-<a name="l00251"></a>00251 
-<a name="l00252"></a>00252         __TBB_TRY {
-<a name="l00253"></a>00253             <span class="keyword">new</span>(static_cast<void*>(&pnode->my_element)) T(value);
-<a name="l00254"></a>00254             pnode->init(order_key);
-<a name="l00255"></a>00255         } __TBB_CATCH(...) {
-<a name="l00256"></a>00256             my_node_allocator.deallocate(pnode, 1);
-<a name="l00257"></a>00257             __TBB_RETHROW();
-<a name="l00258"></a>00258         }
-<a name="l00259"></a>00259 
-<a name="l00260"></a>00260         <span class="keywordflow">return</span> (pnode);
-<a name="l00261"></a>00261     }
-<a name="l00262"></a>00262 
-<a name="l00263"></a>00263     <span class="comment">// Allocate a new node with the given order key; used to allocate dummy nodes</span>
-<a name="l00264"></a>00264     nodeptr_t create_node(sokey_t order_key) {
-<a name="l00265"></a>00265         nodeptr_t pnode = my_node_allocator.allocate(1);
-<a name="l00266"></a>00266 
-<a name="l00267"></a>00267         __TBB_TRY {
-<a name="l00268"></a>00268             <span class="keyword">new</span>(static_cast<void*>(&pnode->my_element)) T();
-<a name="l00269"></a>00269             pnode->init(order_key);
-<a name="l00270"></a>00270         } __TBB_CATCH(...) {
-<a name="l00271"></a>00271             my_node_allocator.deallocate(pnode, 1);
-<a name="l00272"></a>00272             __TBB_RETHROW();
-<a name="l00273"></a>00273         }
-<a name="l00274"></a>00274 
-<a name="l00275"></a>00275         <span class="keywordflow">return</span> (pnode);
-<a name="l00276"></a>00276     }
-<a name="l00277"></a>00277 
-<a name="l00278"></a>00278    split_ordered_list(allocator_type a = allocator_type())
-<a name="l00279"></a>00279        : my_node_allocator(a), my_element_count(0)
-<a name="l00280"></a>00280     {
-<a name="l00281"></a>00281         <span class="comment">// Immediately allocate a dummy node with order key of 0. This node</span>
-<a name="l00282"></a>00282         <span class="comment">// will always be the head of the list.</span>
-<a name="l00283"></a>00283         my_head = create_node(0);
-<a name="l00284"></a>00284     }
-<a name="l00285"></a>00285 
-<a name="l00286"></a>00286     ~split_ordered_list()
-<a name="l00287"></a>00287     {
-<a name="l00288"></a>00288         <span class="comment">// Clear the list</span>
-<a name="l00289"></a>00289         clear();
-<a name="l00290"></a>00290 
-<a name="l00291"></a>00291         <span class="comment">// Remove the head element which is not cleared by clear()</span>
-<a name="l00292"></a>00292         nodeptr_t pnode = my_head;
-<a name="l00293"></a>00293         my_head = NULL;
-<a name="l00294"></a>00294 
-<a name="l00295"></a>00295         __TBB_ASSERT(pnode != NULL && pnode->my_next == NULL, <span class="stringliteral">"Invalid head list node"</span>);
-<a name="l00296"></a>00296 
-<a name="l00297"></a>00297         destroy_node(pnode);
-<a name="l00298"></a>00298     }
-<a name="l00299"></a>00299 
-<a name="l00300"></a>00300     <span class="comment">// Common forward list functions</span>
-<a name="l00301"></a>00301 
-<a name="l00302"></a>00302     allocator_type get_allocator()<span class="keyword"> const </span>{
-<a name="l00303"></a>00303         <span class="keywordflow">return</span> (my_node_allocator);
-<a name="l00304"></a>00304     }
-<a name="l00305"></a>00305 
-<a name="l00306"></a>00306     <span class="keywordtype">void</span> clear() {
-<a name="l00307"></a>00307         nodeptr_t pnext;
-<a name="l00308"></a>00308         nodeptr_t pnode = my_head;
-<a name="l00309"></a>00309 
-<a name="l00310"></a>00310         __TBB_ASSERT(my_head != NULL, <span class="stringliteral">"Invalid head list node"</span>);
-<a name="l00311"></a>00311         pnext = pnode->my_next;
-<a name="l00312"></a>00312         pnode->my_next = NULL;
-<a name="l00313"></a>00313         pnode = pnext;
-<a name="l00314"></a>00314 
-<a name="l00315"></a>00315         <span class="keywordflow">while</span> (pnode != NULL)
-<a name="l00316"></a>00316         {
-<a name="l00317"></a>00317             pnext = pnode->my_next;
-<a name="l00318"></a>00318             destroy_node(pnode);
-<a name="l00319"></a>00319             pnode = pnext;
-<a name="l00320"></a>00320         }
-<a name="l00321"></a>00321 
-<a name="l00322"></a>00322         my_element_count = 0;
-<a name="l00323"></a>00323     }
-<a name="l00324"></a>00324 
-<a name="l00325"></a>00325     <span class="comment">// Returns a first non-dummy element in the SOL</span>
-<a name="l00326"></a>00326     iterator begin() {
-<a name="l00327"></a>00327         <span class="keywordflow">return</span> first_real_iterator(raw_begin());
-<a name="l00328"></a>00328     }
-<a name="l00329"></a>00329 
-<a name="l00330"></a>00330     <span class="comment">// Returns a first non-dummy element in the SOL</span>
-<a name="l00331"></a>00331     const_iterator begin()<span class="keyword"> const </span>{
-<a name="l00332"></a>00332         <span class="keywordflow">return</span> first_real_iterator(raw_begin());
-<a name="l00333"></a>00333     }
-<a name="l00334"></a>00334 
-<a name="l00335"></a>00335     iterator end() {
-<a name="l00336"></a>00336         <span class="keywordflow">return</span> (iterator(0, <span class="keyword">this</span>));
-<a name="l00337"></a>00337     }
-<a name="l00338"></a>00338 
-<a name="l00339"></a>00339     const_iterator end()<span class="keyword"> const </span>{
-<a name="l00340"></a>00340         <span class="keywordflow">return</span> (const_iterator(0, <span class="keyword">this</span>));
-<a name="l00341"></a>00341     }
-<a name="l00342"></a>00342 
-<a name="l00343"></a>00343     const_iterator cbegin()<span class="keyword"> const </span>{
-<a name="l00344"></a>00344         <span class="keywordflow">return</span> (((<span class="keyword">const</span> self_type *)<span class="keyword">this</span>)->begin());
-<a name="l00345"></a>00345     }
-<a name="l00346"></a>00346 
-<a name="l00347"></a>00347     const_iterator cend()<span class="keyword"> const </span>{
-<a name="l00348"></a>00348         <span class="keywordflow">return</span> (((<span class="keyword">const</span> self_type *)<span class="keyword">this</span>)->end());
-<a name="l00349"></a>00349     }
-<a name="l00350"></a>00350 
-<a name="l00351"></a>00351     <span class="comment">// Checks if the number of elements (non-dummy) is 0</span>
-<a name="l00352"></a>00352     <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{
-<a name="l00353"></a>00353         <span class="keywordflow">return</span> (my_element_count == 0);
-<a name="l00354"></a>00354     }
-<a name="l00355"></a>00355 
-<a name="l00356"></a>00356     <span class="comment">// Returns the number of non-dummy elements in the list</span>
-<a name="l00357"></a>00357     size_type size()<span class="keyword"> const </span>{
-<a name="l00358"></a>00358         <span class="keywordflow">return</span> my_element_count;
-<a name="l00359"></a>00359     }
-<a name="l00360"></a>00360 
-<a name="l00361"></a>00361     <span class="comment">// Returns the maximum size of the list, determined by the allocator</span>
-<a name="l00362"></a>00362     size_type max_size()<span class="keyword"> const </span>{
-<a name="l00363"></a>00363         <span class="keywordflow">return</span> my_node_allocator.max_size();
-<a name="l00364"></a>00364     }
-<a name="l00365"></a>00365 
-<a name="l00366"></a>00366     <span class="comment">// Swaps 'this' list with the passed in one</span>
-<a name="l00367"></a>00367     <span class="keywordtype">void</span> swap(self_type& other)
-<a name="l00368"></a>00368     {
-<a name="l00369"></a>00369         <span class="keywordflow">if</span> (<span class="keyword">this</span> == &other)
-<a name="l00370"></a>00370         {
-<a name="l00371"></a>00371             <span class="comment">// Nothing to do</span>
-<a name="l00372"></a>00372             <span class="keywordflow">return</span>;
-<a name="l00373"></a>00373         }
-<a name="l00374"></a>00374 
-<a name="l00375"></a>00375         std::swap(my_element_count, other.my_element_count);
-<a name="l00376"></a>00376         std::swap(my_head, other.my_head);
-<a name="l00377"></a>00377     }
-<a name="l00378"></a>00378 
-<a name="l00379"></a>00379     <span class="comment">// Split-order list functions</span>
-<a name="l00380"></a>00380 
-<a name="l00381"></a>00381     <span class="comment">// Returns a first element in the SOL, which is always a dummy</span>
-<a name="l00382"></a>00382     raw_iterator raw_begin() {
-<a name="l00383"></a>00383         <span class="keywordflow">return</span> raw_iterator(my_head);
-<a name="l00384"></a>00384     }
-<a name="l00385"></a>00385 
-<a name="l00386"></a>00386     <span class="comment">// Returns a first element in the SOL, which is always a dummy</span>
-<a name="l00387"></a>00387     raw_const_iterator raw_begin()<span class="keyword"> const </span>{
-<a name="l00388"></a>00388         <span class="keywordflow">return</span> raw_const_iterator(my_head);
-<a name="l00389"></a>00389     }
-<a name="l00390"></a>00390 
-<a name="l00391"></a>00391     raw_iterator raw_end() {
-<a name="l00392"></a>00392         <span class="keywordflow">return</span> raw_iterator(0);
-<a name="l00393"></a>00393     }
-<a name="l00394"></a>00394 
-<a name="l00395"></a>00395     raw_const_iterator raw_end()<span class="keyword"> const </span>{
-<a name="l00396"></a>00396         <span class="keywordflow">return</span> raw_const_iterator(0);
-<a name="l00397"></a>00397     }
-<a name="l00398"></a>00398 
-<a name="l00399"></a>00399     <span class="keyword">static</span> sokey_t get_order_key(<span class="keyword">const</span> raw_const_iterator& it) {
-<a name="l00400"></a>00400         <span class="keywordflow">return</span> it.get_node_ptr()->get_order_key();
-<a name="l00401"></a>00401     }
-<a name="l00402"></a>00402 
-<a name="l00403"></a>00403     <span class="keyword">static</span> sokey_t get_safe_order_key(<span class="keyword">const</span> raw_const_iterator& it) {
-<a name="l00404"></a>00404         <span class="keywordflow">if</span>( !it.get_node_ptr() ) <span class="keywordflow">return</span> sokey_t(~0U);
-<a name="l00405"></a>00405         <span class="keywordflow">return</span> it.get_node_ptr()->get_order_key();
-<a name="l00406"></a>00406     }
-<a name="l00407"></a>00407 
-<a name="l00408"></a>00408     <span class="comment">// Returns a public iterator version of the internal iterator. Public iterator must not</span>
-<a name="l00409"></a>00409     <span class="comment">// be a dummy private iterator.</span>
-<a name="l00410"></a>00410     iterator get_iterator(raw_iterator it) {
-<a name="l00411"></a>00411         __TBB_ASSERT(it.get_node_ptr() == NULL || !it.get_node_ptr()->is_dummy(), <span class="stringliteral">"Invalid user node (dummy)"</span>);
-<a name="l00412"></a>00412         <span class="keywordflow">return</span> iterator(it.get_node_ptr(), <span class="keyword">this</span>);
-<a name="l00413"></a>00413     }
-<a name="l00414"></a>00414 
-<a name="l00415"></a>00415     <span class="comment">// Returns a public iterator version of the internal iterator. Public iterator must not</span>
-<a name="l00416"></a>00416     <span class="comment">// be a dummy private iterator.</span>
-<a name="l00417"></a>00417     const_iterator get_iterator(raw_const_iterator it)<span class="keyword"> const </span>{
-<a name="l00418"></a>00418         __TBB_ASSERT(it.get_node_ptr() == NULL || !it.get_node_ptr()->is_dummy(), <span class="stringliteral">"Invalid user node (dummy)"</span>);
-<a name="l00419"></a>00419         <span class="keywordflow">return</span> const_iterator(it.get_node_ptr(), <span class="keyword">this</span>);
-<a name="l00420"></a>00420     }
-<a name="l00421"></a>00421 
-<a name="l00422"></a>00422     <span class="comment">// Returns a non-const version of the raw_iterator</span>
-<a name="l00423"></a>00423     raw_iterator get_iterator(raw_const_iterator it) {
-<a name="l00424"></a>00424         <span class="keywordflow">return</span> raw_iterator(it.get_node_ptr());
-<a name="l00425"></a>00425     }
-<a name="l00426"></a>00426 
-<a name="l00427"></a>00427     <span class="comment">// Returns a non-const version of the iterator</span>
-<a name="l00428"></a>00428     <span class="keyword">static</span> iterator get_iterator(const_iterator it) {
-<a name="l00429"></a>00429         <span class="keywordflow">return</span> iterator(it.my_node_ptr, it.my_list_ptr);
-<a name="l00430"></a>00430     }
-<a name="l00431"></a>00431 
-<a name="l00432"></a>00432     <span class="comment">// Returns a public iterator version of a first non-dummy internal iterator at or after</span>
-<a name="l00433"></a>00433     <span class="comment">// the passed in internal iterator.</span>
-<a name="l00434"></a>00434     iterator first_real_iterator(raw_iterator it)
-<a name="l00435"></a>00435     {
-<a name="l00436"></a>00436         <span class="comment">// Skip all dummy, internal only iterators</span>
-<a name="l00437"></a>00437         <span class="keywordflow">while</span> (it != raw_end() && it.get_node_ptr()->is_dummy())
-<a name="l00438"></a>00438             ++it;
-<a name="l00439"></a>00439 
-<a name="l00440"></a>00440         <span class="keywordflow">return</span> iterator(it.get_node_ptr(), <span class="keyword">this</span>);
-<a name="l00441"></a>00441     }
-<a name="l00442"></a>00442 
-<a name="l00443"></a>00443     <span class="comment">// Returns a public iterator version of a first non-dummy internal iterator at or after</span>
-<a name="l00444"></a>00444     <span class="comment">// the passed in internal iterator.</span>
-<a name="l00445"></a>00445     const_iterator first_real_iterator(raw_const_iterator it)<span class="keyword"> const</span>
-<a name="l00446"></a>00446 <span class="keyword">    </span>{
-<a name="l00447"></a>00447         <span class="comment">// Skip all dummy, internal only iterators</span>
-<a name="l00448"></a>00448         <span class="keywordflow">while</span> (it != raw_end() && it.get_node_ptr()->is_dummy())
-<a name="l00449"></a>00449             ++it;
-<a name="l00450"></a>00450 
-<a name="l00451"></a>00451         <span class="keywordflow">return</span> const_iterator(it.get_node_ptr(), <span class="keyword">this</span>);
-<a name="l00452"></a>00452     }
-<a name="l00453"></a>00453 
-<a name="l00454"></a>00454     <span class="comment">// Erase an element using the allocator</span>
-<a name="l00455"></a>00455     <span class="keywordtype">void</span> destroy_node(nodeptr_t pnode) {
-<a name="l00456"></a>00456         my_node_allocator.destroy(pnode);
-<a name="l00457"></a>00457         my_node_allocator.deallocate(pnode, 1);
-<a name="l00458"></a>00458     }
-<a name="l00459"></a>00459 
-<a name="l00460"></a>00460     <span class="comment">// Try to insert a new element in the list. If insert fails, return the node that</span>
-<a name="l00461"></a>00461     <span class="comment">// was inserted instead.</span>
-<a name="l00462"></a>00462     nodeptr_t try_insert(nodeptr_t previous, nodeptr_t new_node, nodeptr_t current_node) {
-<a name="l00463"></a>00463         new_node->my_next = current_node;
-<a name="l00464"></a>00464         <span class="keywordflow">return</span> previous->atomic_set_next(new_node, current_node);
-<a name="l00465"></a>00465     }
-<a name="l00466"></a>00466 
-<a name="l00467"></a>00467     <span class="comment">// Insert a new element between passed in iterators</span>
-<a name="l00468"></a>00468     std::pair<iterator, bool> try_insert(raw_iterator it, raw_iterator next, <span class="keyword">const</span> value_type &value, sokey_t order_key, size_type *new_count)
-<a name="l00469"></a>00469     {
-<a name="l00470"></a>00470         nodeptr_t pnode = create_node(order_key, value);
-<a name="l00471"></a>00471         nodeptr_t inserted_node = try_insert(it.get_node_ptr(), pnode, next.get_node_ptr());
-<a name="l00472"></a>00472 
-<a name="l00473"></a>00473         <span class="keywordflow">if</span> (inserted_node == pnode)
-<a name="l00474"></a>00474         {
-<a name="l00475"></a>00475             <span class="comment">// If the insert succeeded, check that the order is correct and increment the element count</span>
-<a name="l00476"></a>00476             check_range();
-<a name="l00477"></a>00477             *new_count = __TBB_FetchAndAddW((uintptr_t*)&my_element_count, uintptr_t(1));
-<a name="l00478"></a>00478             <span class="keywordflow">return</span> std::pair<iterator, bool>(iterator(pnode, <span class="keyword">this</span>), <span class="keyword">true</span>);
-<a name="l00479"></a>00479         }
-<a name="l00480"></a>00480         <span class="keywordflow">else</span>
-<a name="l00481"></a>00481         {
-<a name="l00482"></a>00482             <span class="comment">// If the insert failed (element already there), then delete the new one</span>
-<a name="l00483"></a>00483             destroy_node(pnode);
-<a name="l00484"></a>00484             <span class="keywordflow">return</span> std::pair<iterator, bool>(end(), <span class="keyword">false</span>);
-<a name="l00485"></a>00485         }
-<a name="l00486"></a>00486     }
-<a name="l00487"></a>00487 
-<a name="l00488"></a>00488     <span class="comment">// Insert a new dummy element, starting search at a parent dummy element</span>
-<a name="l00489"></a>00489     raw_iterator insert_dummy(raw_iterator it, sokey_t order_key)
-<a name="l00490"></a>00490     {
-<a name="l00491"></a>00491         raw_iterator last = raw_end();
-<a name="l00492"></a>00492         raw_iterator where = it;
-<a name="l00493"></a>00493 
-<a name="l00494"></a>00494         __TBB_ASSERT(where != last, <span class="stringliteral">"Invalid head node"</span>);
-<a name="l00495"></a>00495 
-<a name="l00496"></a>00496         ++where;
-<a name="l00497"></a>00497 
-<a name="l00498"></a>00498         <span class="comment">// Create a dummy element up front, even though it may be discarded (due to concurrent insertion)</span>
-<a name="l00499"></a>00499         nodeptr_t dummy_node = create_node(order_key);
-<a name="l00500"></a>00500 
-<a name="l00501"></a>00501         <span class="keywordflow">for</span> (;;)
-<a name="l00502"></a>00502         {
-<a name="l00503"></a>00503             __TBB_ASSERT(it != last, <span class="stringliteral">"Invalid head list node"</span>);
-<a name="l00504"></a>00504 
-<a name="l00505"></a>00505             <span class="comment">// If the head iterator is at the end of the list, or past the point where this dummy</span>
-<a name="l00506"></a>00506             <span class="comment">// node needs to be inserted, then try to insert it.</span>
-<a name="l00507"></a>00507             <span class="keywordflow">if</span> (where == last || get_order_key(where) > order_key)
-<a name="l00508"></a>00508             {
-<a name="l00509"></a>00509                 __TBB_ASSERT(get_order_key(it) < order_key, <span class="stringliteral">"Invalid node order in the list"</span>);
-<a name="l00510"></a>00510 
-<a name="l00511"></a>00511                 <span class="comment">// Try to insert it in the right place</span>
-<a name="l00512"></a>00512                 nodeptr_t inserted_node = try_insert(it.get_node_ptr(), dummy_node, where.get_node_ptr());
-<a name="l00513"></a>00513 
-<a name="l00514"></a>00514                 <span class="keywordflow">if</span> (inserted_node == dummy_node)
-<a name="l00515"></a>00515                 {
-<a name="l00516"></a>00516                     <span class="comment">// Insertion succeeded, check the list for order violations</span>
-<a name="l00517"></a>00517                     check_range();
-<a name="l00518"></a>00518                     <span class="keywordflow">return</span> raw_iterator(dummy_node);
-<a name="l00519"></a>00519                 }
-<a name="l00520"></a>00520                 <span class="keywordflow">else</span>
-<a name="l00521"></a>00521                 {
-<a name="l00522"></a>00522                     <span class="comment">// Insertion failed: either dummy node was inserted by another thread, or</span>
-<a name="l00523"></a>00523                     <span class="comment">// a real element was inserted at exactly the same place as dummy node.</span>
-<a name="l00524"></a>00524                     <span class="comment">// Proceed with the search from the previous location where order key was</span>
-<a name="l00525"></a>00525                     <span class="comment">// known to be larger (note: this is legal only because there is no safe</span>
-<a name="l00526"></a>00526                     <span class="comment">// concurrent erase operation supported).</span>
-<a name="l00527"></a>00527                     where = it;
-<a name="l00528"></a>00528                     ++where;
-<a name="l00529"></a>00529                     <span class="keywordflow">continue</span>;
-<a name="l00530"></a>00530                 }
-<a name="l00531"></a>00531             }
-<a name="l00532"></a>00532             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (get_order_key(where) == order_key)
-<a name="l00533"></a>00533             {
-<a name="l00534"></a>00534                 <span class="comment">// Another dummy node with the same value found, discard the new one.</span>
-<a name="l00535"></a>00535                 destroy_node(dummy_node);
-<a name="l00536"></a>00536                 <span class="keywordflow">return</span> where;
-<a name="l00537"></a>00537             }
-<a name="l00538"></a>00538 
-<a name="l00539"></a>00539             <span class="comment">// Move the iterator forward</span>
-<a name="l00540"></a>00540             it = where;
-<a name="l00541"></a>00541             ++where;
-<a name="l00542"></a>00542         }
-<a name="l00543"></a>00543 
-<a name="l00544"></a>00544     }
-<a name="l00545"></a>00545 
-<a name="l00546"></a>00546     <span class="comment">// This erase function can handle both real and dummy nodes</span>
-<a name="l00547"></a>00547     <span class="keywordtype">void</span> erase_node(raw_iterator previous, raw_const_iterator& where)
-<a name="l00548"></a>00548     {
-<a name="l00549"></a>00549         nodeptr_t pnode = (where++).get_node_ptr();
-<a name="l00550"></a>00550         nodeptr_t prevnode = previous.get_node_ptr();
-<a name="l00551"></a>00551         __TBB_ASSERT(prevnode->my_next == pnode, <span class="stringliteral">"Erase must take consecutive iterators"</span>);
-<a name="l00552"></a>00552         prevnode->my_next = pnode->my_next;
-<a name="l00553"></a>00553 
-<a name="l00554"></a>00554         destroy_node(pnode);
-<a name="l00555"></a>00555     }
-<a name="l00556"></a>00556 
-<a name="l00557"></a>00557     <span class="comment">// Erase the element (previous node needs to be passed because this is a forward only list)</span>
-<a name="l00558"></a>00558     iterator erase_node(raw_iterator previous, const_iterator where)
-<a name="l00559"></a>00559     {
-<a name="l00560"></a>00560         raw_const_iterator it = where;
-<a name="l00561"></a>00561         erase_node(previous, it);
-<a name="l00562"></a>00562         my_element_count--;
-<a name="l00563"></a>00563 
-<a name="l00564"></a>00564         <span class="keywordflow">return</span> get_iterator(first_real_iterator(it));
-<a name="l00565"></a>00565     }
-<a name="l00566"></a>00566 
-<a name="l00567"></a>00567     <span class="comment">// Move all elements from the passed in split-ordered list to this one</span>
-<a name="l00568"></a>00568     <span class="keywordtype">void</span> move_all(self_type& source)
-<a name="l00569"></a>00569     {
-<a name="l00570"></a>00570         raw_const_iterator first = source.raw_begin();
-<a name="l00571"></a>00571         raw_const_iterator last = source.raw_end();
-<a name="l00572"></a>00572 
-<a name="l00573"></a>00573         <span class="keywordflow">if</span> (first == last)
-<a name="l00574"></a>00574             <span class="keywordflow">return</span>;
-<a name="l00575"></a>00575 
-<a name="l00576"></a>00576         nodeptr_t previous_node = my_head;
-<a name="l00577"></a>00577         raw_const_iterator begin_iterator = first++;
-<a name="l00578"></a>00578 
-<a name="l00579"></a>00579         <span class="comment">// Move all elements one by one, including dummy ones</span>
-<a name="l00580"></a>00580         <span class="keywordflow">for</span> (raw_const_iterator it = first; it != last;)
-<a name="l00581"></a>00581         {
-<a name="l00582"></a>00582             nodeptr_t pnode = it.get_node_ptr();
-<a name="l00583"></a>00583 
-<a name="l00584"></a>00584             nodeptr_t dummy_node = pnode->is_dummy() ? create_node(pnode->get_order_key()) : create_node(pnode->get_order_key(), pnode->my_element);
-<a name="l00585"></a>00585             previous_node = try_insert(previous_node, dummy_node, NULL);
-<a name="l00586"></a>00586             __TBB_ASSERT(previous_node != NULL, <span class="stringliteral">"Insertion must succeed"</span>);
-<a name="l00587"></a>00587             raw_const_iterator where = it++;
-<a name="l00588"></a>00588             source.erase_node(get_iterator(begin_iterator), where);
-<a name="l00589"></a>00589         }
-<a name="l00590"></a>00590         check_range();
-<a name="l00591"></a>00591     }
-<a name="l00592"></a>00592 
-<a name="l00593"></a>00593 
-<a name="l00594"></a>00594 <span class="keyword">private</span>:
-<a name="l00595"></a>00595 
-<a name="l00596"></a>00596     <span class="comment">// Check the list for order violations</span>
-<a name="l00597"></a>00597     <span class="keywordtype">void</span> check_range()
-<a name="l00598"></a>00598     {
-<a name="l00599"></a>00599 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00600"></a>00600 <span class="preprocessor"></span>        <span class="keywordflow">for</span> (raw_iterator it = raw_begin(); it != raw_end(); ++it)
-<a name="l00601"></a>00601         {
-<a name="l00602"></a>00602             raw_iterator next_iterator = it;
-<a name="l00603"></a>00603             ++next_iterator;
-<a name="l00604"></a>00604 
-<a name="l00605"></a>00605             __TBB_ASSERT(next_iterator == end() || next_iterator.get_node_ptr()->get_order_key() >= it.get_node_ptr()->get_order_key(), <span class="stringliteral">"!!! List order inconsistency !!!"</span>);
-<a name="l00606"></a>00606         }
-<a name="l00607"></a>00607 <span class="preprocessor">#endif</span>
-<a name="l00608"></a>00608 <span class="preprocessor"></span>    }
-<a name="l00609"></a>00609 
-<a name="l00610"></a>00610     <span class="keyword">typename</span> allocator_type::template rebind<node>::other my_node_allocator;  <span class="comment">// allocator object for nodes</span>
-<a name="l00611"></a>00611     size_type                                             my_element_count;   <span class="comment">// Total item count, not counting dummy nodes</span>
-<a name="l00612"></a>00612     nodeptr_t                                             my_head;            <span class="comment">// pointer to head node</span>
-<a name="l00613"></a>00613 };
-<a name="l00614"></a>00614 
-<a name="l00615"></a>00615 <span class="comment">// Template class for hash compare</span>
-<a name="l00616"></a>00616 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> Hasher, <span class="keyword">typename</span> Key_equality>
-<a name="l00617"></a>00617 <span class="keyword">class </span>hash_compare
-<a name="l00618"></a>00618 {
-<a name="l00619"></a>00619 <span class="keyword">public</span>:
-<a name="l00620"></a>00620     hash_compare() {}
-<a name="l00621"></a>00621 
-<a name="l00622"></a>00622     hash_compare(Hasher a_hasher) : my_hash_object(a_hasher) {}
-<a name="l00623"></a>00623 
-<a name="l00624"></a>00624     hash_compare(Hasher a_hasher, Key_equality a_keyeq) : my_hash_object(a_hasher), my_key_compare_object(a_keyeq) {}
-<a name="l00625"></a>00625 
-<a name="l00626"></a>00626     size_t operator()(<span class="keyword">const</span> Key& key)<span class="keyword"> const </span>{
-<a name="l00627"></a>00627         <span class="keywordflow">return</span> ((size_t)my_hash_object(key));
-<a name="l00628"></a>00628     }
-<a name="l00629"></a>00629 
-<a name="l00630"></a>00630     <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> Key& key1, <span class="keyword">const</span> Key& key2)<span class="keyword"> const </span>{
-<a name="l00631"></a>00631         <span class="keywordflow">return</span> (!my_key_compare_object(key1, key2));
-<a name="l00632"></a>00632     }
-<a name="l00633"></a>00633 
-<a name="l00634"></a>00634     Hasher       my_hash_object;        <span class="comment">// The hash object</span>
-<a name="l00635"></a>00635     Key_equality my_key_compare_object; <span class="comment">// The equality comparator object</span>
-<a name="l00636"></a>00636 };
-<a name="l00637"></a>00637 
-<a name="l00638"></a>00638 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00639"></a>00639 <span class="preprocessor"></span><span class="preprocessor">#pragma warning(push)</span>
-<a name="l00640"></a>00640 <span class="preprocessor"></span><span class="preprocessor">#pragma warning(disable: 4127) // warning 4127 -- while (true) has a constant expression in it (for allow_multimapping)</span>
-<a name="l00641"></a>00641 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00642"></a>00642 <span class="preprocessor"></span>
-<a name="l00643"></a>00643 <span class="keyword">template</span> <<span class="keyword">typename</span> Traits>
-<a name="l00644"></a>00644 <span class="keyword">class </span>concurrent_unordered_base : <span class="keyword">public</span> Traits
-<a name="l00645"></a>00645 {
-<a name="l00646"></a>00646 <span class="keyword">protected</span>:
-<a name="l00647"></a>00647     <span class="comment">// Type definitions</span>
-<a name="l00648"></a>00648     <span class="keyword">typedef</span> concurrent_unordered_base<Traits> self_type;
-<a name="l00649"></a>00649     <span class="keyword">typedef</span> <span class="keyword">typename</span> Traits::value_type value_type;
-<a name="l00650"></a>00650     <span class="keyword">typedef</span> <span class="keyword">typename</span> Traits::key_type key_type;
-<a name="l00651"></a>00651     <span class="keyword">typedef</span> <span class="keyword">typename</span> Traits::hash_compare hash_compare;
-<a name="l00652"></a>00652     <span class="keyword">typedef</span> <span class="keyword">typename</span> Traits::value_compare value_compare;
-<a name="l00653"></a>00653     <span class="keyword">typedef</span> <span class="keyword">typename</span> Traits::allocator_type allocator_type;
-<a name="l00654"></a>00654     <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::pointer pointer;
-<a name="l00655"></a>00655     <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::const_pointer const_pointer;
-<a name="l00656"></a>00656     <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::reference reference;
-<a name="l00657"></a>00657     <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::const_reference const_reference;
-<a name="l00658"></a>00658     <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::size_type size_type;
-<a name="l00659"></a>00659     <span class="keyword">typedef</span> <span class="keyword">typename</span> allocator_type::difference_type difference_type;
-<a name="l00660"></a>00660     <span class="keyword">typedef</span> split_ordered_list<value_type, typename Traits::allocator_type> solist_t;
-<a name="l00661"></a>00661     <span class="keyword">typedef</span> <span class="keyword">typename</span> solist_t::nodeptr_t nodeptr_t;
-<a name="l00662"></a>00662     <span class="comment">// Iterators that walk the entire split-order list, including dummy nodes</span>
-<a name="l00663"></a>00663     <span class="keyword">typedef</span> <span class="keyword">typename</span> solist_t::raw_iterator raw_iterator;
-<a name="l00664"></a>00664     <span class="keyword">typedef</span> <span class="keyword">typename</span> solist_t::raw_const_iterator raw_const_iterator;
-<a name="l00665"></a>00665     <span class="keyword">typedef</span> <span class="keyword">typename</span> solist_t::iterator iterator; <span class="comment">// TODO: restore const iterator for unordered_sets</span>
-<a name="l00666"></a>00666     <span class="keyword">typedef</span> <span class="keyword">typename</span> solist_t::const_iterator const_iterator;
-<a name="l00667"></a>00667     <span class="keyword">typedef</span> iterator local_iterator;
-<a name="l00668"></a>00668     <span class="keyword">typedef</span> const_iterator const_local_iterator;
-<a name="l00669"></a>00669     <span class="keyword">using</span> Traits::my_hash_compare;
-<a name="l00670"></a>00670     <span class="keyword">using</span> Traits::get_key;
-<a name="l00671"></a>00671     <span class="keyword">using</span> Traits::allow_multimapping;
-<a name="l00672"></a>00672 
-<a name="l00673"></a>00673 <span class="keyword">private</span>:
-<a name="l00674"></a>00674     <span class="keyword">typedef</span> std::pair<iterator, iterator> pairii_t;
-<a name="l00675"></a>00675     <span class="keyword">typedef</span> std::pair<const_iterator, const_iterator> paircc_t;
-<a name="l00676"></a>00676 
-<a name="l00677"></a>00677     <span class="keyword">static</span> size_type <span class="keyword">const</span> pointers_per_table = <span class="keyword">sizeof</span>(size_type) * 8;              <span class="comment">// One bucket segment per bit</span>
-<a name="l00678"></a>00678     <span class="keyword">static</span> <span class="keyword">const</span> size_type initial_bucket_number = 8;                               <span class="comment">// Initial number of buckets</span>
-<a name="l00679"></a>00679     <span class="keyword">static</span> <span class="keyword">const</span> size_type initial_bucket_load = 4;                                <span class="comment">// Initial maximum number of elements per bucket</span>
-<a name="l00680"></a>00680 
-<a name="l00681"></a>00681 <span class="keyword">protected</span>:
-<a name="l00682"></a>00682     <span class="comment">// Constructors/Destructors</span>
-<a name="l00683"></a>00683     concurrent_unordered_base(size_type n_of_buckets = initial_bucket_number,
-<a name="l00684"></a>00684         <span class="keyword">const</span> hash_compare& hc = hash_compare(), <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00685"></a>00685         : Traits(hc), my_solist(a),
-<a name="l00686"></a>00686           my_allocator(a), my_maximum_bucket_size((float) initial_bucket_load)
-<a name="l00687"></a>00687     {
-<a name="l00688"></a>00688         <span class="keywordflow">if</span>( n_of_buckets == 0) ++n_of_buckets;
-<a name="l00689"></a>00689         my_number_of_buckets = 1<<__TBB_Log2((uintptr_t)n_of_buckets*2-1); <span class="comment">// round up to power of 2</span>
-<a name="l00690"></a>00690         internal_init();
-<a name="l00691"></a>00691     }
-<a name="l00692"></a>00692 
-<a name="l00693"></a>00693     concurrent_unordered_base(<span class="keyword">const</span> concurrent_unordered_base& right, <span class="keyword">const</span> allocator_type& a)
-<a name="l00694"></a>00694         : Traits(right.my_hash_compare), my_solist(a), my_allocator(a)
-<a name="l00695"></a>00695     {
-<a name="l00696"></a>00696         internal_init();
-<a name="l00697"></a>00697         internal_copy(right);
-<a name="l00698"></a>00698     }
-<a name="l00699"></a>00699 
-<a name="l00700"></a>00700     concurrent_unordered_base(<span class="keyword">const</span> concurrent_unordered_base& right)
-<a name="l00701"></a>00701         : Traits(right.my_hash_compare), my_solist(right.get_allocator()), my_allocator(right.get_allocator())
-<a name="l00702"></a>00702     {
-<a name="l00703"></a>00703         internal_init();
-<a name="l00704"></a>00704         internal_copy(right);
-<a name="l00705"></a>00705     }
-<a name="l00706"></a>00706 
-<a name="l00707"></a>00707     concurrent_unordered_base& operator=(<span class="keyword">const</span> concurrent_unordered_base& right) {
-<a name="l00708"></a>00708         <span class="keywordflow">if</span> (<span class="keyword">this</span> != &right)
-<a name="l00709"></a>00709             internal_copy(right);
-<a name="l00710"></a>00710         <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00711"></a>00711     }
-<a name="l00712"></a>00712 
-<a name="l00713"></a>00713     ~concurrent_unordered_base() {
-<a name="l00714"></a>00714         <span class="comment">// Delete all node segments</span>
-<a name="l00715"></a>00715         internal_clear();
-<a name="l00716"></a>00716     }
-<a name="l00717"></a>00717 
-<a name="l00718"></a>00718 <span class="keyword">public</span>:
-<a name="l00719"></a>00719     allocator_type get_allocator()<span class="keyword"> const </span>{
-<a name="l00720"></a>00720         <span class="keywordflow">return</span> my_solist.get_allocator();
-<a name="l00721"></a>00721     }
-<a name="l00722"></a>00722 
-<a name="l00723"></a>00723     <span class="comment">// Size and capacity function</span>
-<a name="l00724"></a>00724     <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{
-<a name="l00725"></a>00725         <span class="keywordflow">return</span> my_solist.empty();
-<a name="l00726"></a>00726     }
-<a name="l00727"></a>00727 
-<a name="l00728"></a>00728     size_type size()<span class="keyword"> const </span>{
-<a name="l00729"></a>00729         <span class="keywordflow">return</span> my_solist.size();
-<a name="l00730"></a>00730     }
-<a name="l00731"></a>00731 
-<a name="l00732"></a>00732     size_type max_size()<span class="keyword"> const </span>{
-<a name="l00733"></a>00733         <span class="keywordflow">return</span> my_solist.max_size();
-<a name="l00734"></a>00734     }
-<a name="l00735"></a>00735 
-<a name="l00736"></a>00736     <span class="comment">// Iterators </span>
-<a name="l00737"></a>00737     iterator begin() {
-<a name="l00738"></a>00738         <span class="keywordflow">return</span> my_solist.begin();
-<a name="l00739"></a>00739     }
-<a name="l00740"></a>00740 
-<a name="l00741"></a>00741     const_iterator begin()<span class="keyword"> const </span>{
-<a name="l00742"></a>00742         <span class="keywordflow">return</span> my_solist.begin();
-<a name="l00743"></a>00743     }
-<a name="l00744"></a>00744 
-<a name="l00745"></a>00745     iterator end() {
-<a name="l00746"></a>00746         <span class="keywordflow">return</span> my_solist.end();
-<a name="l00747"></a>00747     }
-<a name="l00748"></a>00748 
-<a name="l00749"></a>00749     const_iterator end()<span class="keyword"> const </span>{
-<a name="l00750"></a>00750         <span class="keywordflow">return</span> my_solist.end();
-<a name="l00751"></a>00751     }
-<a name="l00752"></a>00752 
-<a name="l00753"></a>00753     const_iterator cbegin()<span class="keyword"> const </span>{
-<a name="l00754"></a>00754         <span class="keywordflow">return</span> my_solist.cbegin();
-<a name="l00755"></a>00755     }
-<a name="l00756"></a>00756 
-<a name="l00757"></a>00757     const_iterator cend()<span class="keyword"> const </span>{
-<a name="l00758"></a>00758         <span class="keywordflow">return</span> my_solist.cend();
-<a name="l00759"></a>00759     }
-<a name="l00760"></a>00760 
-<a name="l00761"></a>00761     <span class="comment">// Parallel traversal support</span>
-<a name="l00762"></a>00762     <span class="keyword">class </span>const_range_type : tbb::internal::no_assign {
-<a name="l00763"></a>00763         <span class="keyword">const</span> concurrent_unordered_base &my_table;
-<a name="l00764"></a>00764         raw_const_iterator my_begin_node;
-<a name="l00765"></a>00765         raw_const_iterator my_end_node;
-<a name="l00766"></a>00766         <span class="keyword">mutable</span> raw_const_iterator my_midpoint_node;
-<a name="l00767"></a>00767     <span class="keyword">public</span>:
-<a name="l00769"></a>00769         <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::size_type size_type;
-<a name="l00770"></a>00770         <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::value_type value_type;
-<a name="l00771"></a>00771         <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::reference reference;
-<a name="l00772"></a>00772         <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::difference_type difference_type;
-<a name="l00773"></a>00773         <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::const_iterator iterator;
-<a name="l00774"></a>00774 
-<a name="l00776"></a>00776         <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin_node == my_end_node;}
-<a name="l00777"></a>00777 
-<a name="l00779"></a>00779         <span class="keywordtype">bool</span> is_divisible()<span class="keyword"> const </span>{
-<a name="l00780"></a>00780             <span class="keywordflow">return</span> my_midpoint_node != my_end_node;
-<a name="l00781"></a>00781         }
-<a name="l00783"></a>00783         const_range_type( const_range_type &r, split ) : 
-<a name="l00784"></a>00784             my_table(r.my_table), my_end_node(r.my_end_node)
-<a name="l00785"></a>00785         {
-<a name="l00786"></a>00786             r.my_end_node = my_begin_node = r.my_midpoint_node;
-<a name="l00787"></a>00787             __TBB_ASSERT( !empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00788"></a>00788             __TBB_ASSERT( !r.empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00789"></a>00789             set_midpoint();
-<a name="l00790"></a>00790             r.set_midpoint();
-<a name="l00791"></a>00791         }
-<a name="l00793"></a>00793         const_range_type( <span class="keyword">const</span> concurrent_unordered_base &a_table ) : 
-<a name="l00794"></a>00794             my_table(a_table), my_begin_node(a_table.my_solist.begin()),
-<a name="l00795"></a>00795             my_end_node(a_table.my_solist.end())
-<a name="l00796"></a>00796         {
-<a name="l00797"></a>00797             set_midpoint();
-<a name="l00798"></a>00798         }
-<a name="l00799"></a>00799         iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_table.my_solist.get_iterator(my_begin_node); }
-<a name="l00800"></a>00800         iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_table.my_solist.get_iterator(my_end_node); }
-<a name="l00802"></a>00802         size_type grainsize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> 1; }
-<a name="l00803"></a>00803 
-<a name="l00805"></a>00805         <span class="keywordtype">void</span> set_midpoint()<span class="keyword"> const </span>{
-<a name="l00806"></a>00806             <span class="keywordflow">if</span>( my_begin_node == my_end_node ) <span class="comment">// not divisible</span>
-<a name="l00807"></a>00807                 my_midpoint_node = my_end_node;
-<a name="l00808"></a>00808             <span class="keywordflow">else</span> {
-<a name="l00809"></a>00809                 sokey_t begin_key = solist_t::get_safe_order_key(my_begin_node);
-<a name="l00810"></a>00810                 sokey_t end_key = solist_t::get_safe_order_key(my_end_node);
-<a name="l00811"></a>00811                 size_t mid_bucket = __TBB_ReverseBits( begin_key + (end_key-begin_key)/2 ) % my_table.my_number_of_buckets;
-<a name="l00812"></a>00812                 <span class="keywordflow">while</span> ( !my_table.is_initialized(mid_bucket) ) mid_bucket = my_table.get_parent(mid_bucket);
-<a name="l00813"></a>00813                 my_midpoint_node = my_table.my_solist.first_real_iterator(my_table.get_bucket( mid_bucket ));
-<a name="l00814"></a>00814                 <span class="keywordflow">if</span>( my_midpoint_node == my_begin_node )
-<a name="l00815"></a>00815                     my_midpoint_node = my_end_node;
-<a name="l00816"></a>00816 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00817"></a>00817 <span class="preprocessor"></span>                <span class="keywordflow">else</span> {
-<a name="l00818"></a>00818                     sokey_t mid_key = solist_t::get_safe_order_key(my_midpoint_node);
-<a name="l00819"></a>00819                     __TBB_ASSERT( begin_key < mid_key, <span class="stringliteral">"my_begin_node is after my_midpoint_node"</span> );
-<a name="l00820"></a>00820                     __TBB_ASSERT( mid_key <= end_key, <span class="stringliteral">"my_midpoint_node is after my_end_node"</span> );
-<a name="l00821"></a>00821                 }
-<a name="l00822"></a>00822 <span class="preprocessor">#endif // TBB_USE_ASSERT</span>
-<a name="l00823"></a>00823 <span class="preprocessor"></span>            }
-<a name="l00824"></a>00824         }
-<a name="l00825"></a>00825     };
-<a name="l00826"></a>00826 
-<a name="l00827"></a>00827     <span class="keyword">class </span>range_type : <span class="keyword">public</span> const_range_type {
-<a name="l00828"></a>00828     <span class="keyword">public</span>:
-<a name="l00829"></a>00829         <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_unordered_base::iterator iterator;
-<a name="l00831"></a>00831         range_type( range_type &r, split ) : const_range_type( r, split() ) {}
-<a name="l00833"></a>00833         range_type( <span class="keyword">const</span> concurrent_unordered_base &a_table ) : const_range_type(a_table) {}
-<a name="l00834"></a>00834 
-<a name="l00835"></a>00835         iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> solist_t::get_iterator( const_range_type::begin() ); }
-<a name="l00836"></a>00836         iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> solist_t::get_iterator( const_range_type::end() ); }
-<a name="l00837"></a>00837     };
-<a name="l00838"></a>00838 
-<a name="l00839"></a>00839     range_type range() {
-<a name="l00840"></a>00840         <span class="keywordflow">return</span> range_type( *<span class="keyword">this</span> );
-<a name="l00841"></a>00841     }
-<a name="l00842"></a>00842 
-<a name="l00843"></a>00843     const_range_type range()<span class="keyword"> const </span>{
-<a name="l00844"></a>00844         <span class="keywordflow">return</span> const_range_type( *<span class="keyword">this</span> );
-<a name="l00845"></a>00845     }
-<a name="l00846"></a>00846 
-<a name="l00847"></a>00847     <span class="comment">// Modifiers</span>
-<a name="l00848"></a>00848     std::pair<iterator, bool> insert(<span class="keyword">const</span> value_type& value) {
-<a name="l00849"></a>00849         <span class="keywordflow">return</span> internal_insert(value);
-<a name="l00850"></a>00850     }
-<a name="l00851"></a>00851 
-<a name="l00852"></a>00852     iterator insert(const_iterator, <span class="keyword">const</span> value_type& value) {
-<a name="l00853"></a>00853         <span class="comment">// Ignore hint</span>
-<a name="l00854"></a>00854         <span class="keywordflow">return</span> insert(value).first;
-<a name="l00855"></a>00855     }
-<a name="l00856"></a>00856 
-<a name="l00857"></a>00857     <span class="keyword">template</span><<span class="keyword">class</span> Iterator>
-<a name="l00858"></a>00858     <span class="keywordtype">void</span> insert(Iterator first, Iterator last) {
-<a name="l00859"></a>00859         <span class="keywordflow">for</span> (Iterator it = first; it != last; ++it)
-<a name="l00860"></a>00860             insert(*it);
-<a name="l00861"></a>00861     }
-<a name="l00862"></a>00862 
-<a name="l00863"></a>00863     iterator unsafe_erase(const_iterator where) {
-<a name="l00864"></a>00864         <span class="keywordflow">return</span> internal_erase(where);
-<a name="l00865"></a>00865     }
-<a name="l00866"></a>00866 
-<a name="l00867"></a>00867     iterator unsafe_erase(const_iterator first, const_iterator last) {
-<a name="l00868"></a>00868         <span class="keywordflow">while</span> (first != last)
-<a name="l00869"></a>00869             unsafe_erase(first++);
-<a name="l00870"></a>00870         <span class="keywordflow">return</span> my_solist.get_iterator(first);
-<a name="l00871"></a>00871     }
-<a name="l00872"></a>00872 
-<a name="l00873"></a>00873     size_type unsafe_erase(<span class="keyword">const</span> key_type& key) {
-<a name="l00874"></a>00874         pairii_t where = equal_range(key);
-<a name="l00875"></a>00875         size_type item_count = internal_distance(where.first, where.second);
-<a name="l00876"></a>00876         unsafe_erase(where.first, where.second);
-<a name="l00877"></a>00877         <span class="keywordflow">return</span> item_count;
-<a name="l00878"></a>00878     }
-<a name="l00879"></a>00879 
-<a name="l00880"></a>00880     <span class="keywordtype">void</span> swap(concurrent_unordered_base& right) {
-<a name="l00881"></a>00881         <span class="keywordflow">if</span> (<span class="keyword">this</span> != &right) {
-<a name="l00882"></a>00882             std::swap(my_hash_compare, right.my_hash_compare); <span class="comment">// TODO: check what ADL meant here</span>
-<a name="l00883"></a>00883             my_solist.swap(right.my_solist);
-<a name="l00884"></a>00884             internal_swap_buckets(right);
-<a name="l00885"></a>00885             std::swap(my_number_of_buckets, right.my_number_of_buckets);
-<a name="l00886"></a>00886             std::swap(my_maximum_bucket_size, right.my_maximum_bucket_size);
-<a name="l00887"></a>00887         }
-<a name="l00888"></a>00888     }
-<a name="l00889"></a>00889 
-<a name="l00890"></a>00890     <span class="comment">// Observers</span>
-<a name="l00891"></a>00891     <span class="keywordtype">void</span> clear() {
-<a name="l00892"></a>00892         <span class="comment">// Clear list</span>
-<a name="l00893"></a>00893         my_solist.clear();
-<a name="l00894"></a>00894 
-<a name="l00895"></a>00895         <span class="comment">// Clear buckets</span>
-<a name="l00896"></a>00896         internal_clear();
-<a name="l00897"></a>00897 
-<a name="l00898"></a>00898         <span class="comment">// Initialize bucket 0</span>
-<a name="l00899"></a>00899         __TBB_ASSERT(my_buckets[0] == NULL, NULL);
-<a name="l00900"></a>00900         raw_iterator dummy_node = my_solist.raw_begin();
-<a name="l00901"></a>00901         set_bucket(0, dummy_node);
-<a name="l00902"></a>00902     }
-<a name="l00903"></a>00903 
-<a name="l00904"></a>00904     <span class="comment">// Lookup</span>
-<a name="l00905"></a>00905     iterator find(<span class="keyword">const</span> key_type& key) {
-<a name="l00906"></a>00906         <span class="keywordflow">return</span> internal_find(key);
-<a name="l00907"></a>00907     }
-<a name="l00908"></a>00908 
-<a name="l00909"></a>00909     const_iterator find(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
-<a name="l00910"></a>00910         <span class="keywordflow">return</span> const_cast<self_type*>(<span class="keyword">this</span>)->internal_find(key);
-<a name="l00911"></a>00911     }
-<a name="l00912"></a>00912 
-<a name="l00913"></a>00913     size_type count(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
-<a name="l00914"></a>00914         <span class="keywordflow">if</span>(allow_multimapping) {
-<a name="l00915"></a>00915             paircc_t answer = equal_range(key);
-<a name="l00916"></a>00916             size_type item_count = internal_distance(answer.first, answer.second);
-<a name="l00917"></a>00917             <span class="keywordflow">return</span> item_count;
-<a name="l00918"></a>00918         } <span class="keywordflow">else</span> {
-<a name="l00919"></a>00919             <span class="keywordflow">return</span> const_cast<self_type*>(<span class="keyword">this</span>)->internal_find(key) == end()?0:1;
-<a name="l00920"></a>00920         }
-<a name="l00921"></a>00921     }
-<a name="l00922"></a>00922 
-<a name="l00923"></a>00923     std::pair<iterator, iterator> equal_range(<span class="keyword">const</span> key_type& key) {
-<a name="l00924"></a>00924         <span class="keywordflow">return</span> internal_equal_range(key);
-<a name="l00925"></a>00925     }
-<a name="l00926"></a>00926 
-<a name="l00927"></a>00927     std::pair<const_iterator, const_iterator> equal_range(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
-<a name="l00928"></a>00928         <span class="keywordflow">return</span> const_cast<self_type*>(<span class="keyword">this</span>)->internal_equal_range(key);
-<a name="l00929"></a>00929     }
-<a name="l00930"></a>00930 
-<a name="l00931"></a>00931     <span class="comment">// Bucket interface - for debugging </span>
-<a name="l00932"></a>00932     size_type unsafe_bucket_count()<span class="keyword"> const </span>{
-<a name="l00933"></a>00933         <span class="keywordflow">return</span> my_number_of_buckets;
-<a name="l00934"></a>00934     }
-<a name="l00935"></a>00935 
-<a name="l00936"></a>00936     size_type unsafe_max_bucket_count()<span class="keyword"> const </span>{
-<a name="l00937"></a>00937         <span class="keywordflow">return</span> segment_size(pointers_per_table-1);
-<a name="l00938"></a>00938     }
-<a name="l00939"></a>00939 
-<a name="l00940"></a>00940     size_type unsafe_bucket_size(size_type bucket) {
-<a name="l00941"></a>00941         size_type item_count = 0;
-<a name="l00942"></a>00942         <span class="keywordflow">if</span> (is_initialized(bucket)) {
-<a name="l00943"></a>00943             raw_iterator it = get_bucket(bucket);
-<a name="l00944"></a>00944             ++it;
-<a name="l00945"></a>00945             <span class="keywordflow">for</span> (; it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy(); ++it)
-<a name="l00946"></a>00946                 ++item_count;
-<a name="l00947"></a>00947         }
-<a name="l00948"></a>00948         <span class="keywordflow">return</span> item_count;
-<a name="l00949"></a>00949     }
-<a name="l00950"></a>00950 
-<a name="l00951"></a>00951     size_type unsafe_bucket(<span class="keyword">const</span> key_type& key)<span class="keyword"> const </span>{
-<a name="l00952"></a>00952         sokey_t order_key = (sokey_t) my_hash_compare(key);
-<a name="l00953"></a>00953         size_type bucket = order_key % my_number_of_buckets;
-<a name="l00954"></a>00954         <span class="keywordflow">return</span> bucket;
-<a name="l00955"></a>00955     }
-<a name="l00956"></a>00956 
-<a name="l00957"></a>00957     <span class="comment">// If the bucket is initialized, return a first non-dummy element in it</span>
-<a name="l00958"></a>00958     local_iterator unsafe_begin(size_type bucket) {
-<a name="l00959"></a>00959         <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l00960"></a>00960             <span class="keywordflow">return</span> end();
-<a name="l00961"></a>00961 
-<a name="l00962"></a>00962         raw_iterator it = get_bucket(bucket);
-<a name="l00963"></a>00963         <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
-<a name="l00964"></a>00964     }
-<a name="l00965"></a>00965 
-<a name="l00966"></a>00966     <span class="comment">// If the bucket is initialized, return a first non-dummy element in it</span>
-<a name="l00967"></a>00967     const_local_iterator unsafe_begin(size_type bucket)<span class="keyword"> const</span>
-<a name="l00968"></a>00968 <span class="keyword">    </span>{
-<a name="l00969"></a>00969         <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l00970"></a>00970             <span class="keywordflow">return</span> end();
-<a name="l00971"></a>00971 
-<a name="l00972"></a>00972         raw_const_iterator it = get_bucket(bucket);
-<a name="l00973"></a>00973         <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
-<a name="l00974"></a>00974     }
-<a name="l00975"></a>00975 
-<a name="l00976"></a>00976     <span class="comment">// @REVIEW: Takes O(n)</span>
-<a name="l00977"></a>00977     <span class="comment">// Returns the iterator after the last non-dummy element in the bucket</span>
-<a name="l00978"></a>00978     local_iterator unsafe_end(size_type bucket)
-<a name="l00979"></a>00979     {
-<a name="l00980"></a>00980         <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l00981"></a>00981             <span class="keywordflow">return</span> end();
-<a name="l00982"></a>00982 
-<a name="l00983"></a>00983         raw_iterator it = get_bucket(bucket);
-<a name="l00984"></a>00984     
-<a name="l00985"></a>00985         <span class="comment">// Find the end of the bucket, denoted by the dummy element</span>
-<a name="l00986"></a>00986         <span class="keywordflow">do</span> ++it;
-<a name="l00987"></a>00987         <span class="keywordflow">while</span>(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
-<a name="l00988"></a>00988 
-<a name="l00989"></a>00989         <span class="comment">// Return the first real element past the end of the bucket</span>
-<a name="l00990"></a>00990         <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
-<a name="l00991"></a>00991     }
-<a name="l00992"></a>00992 
-<a name="l00993"></a>00993     <span class="comment">// @REVIEW: Takes O(n)</span>
-<a name="l00994"></a>00994     <span class="comment">// Returns the iterator after the last non-dummy element in the bucket</span>
-<a name="l00995"></a>00995     const_local_iterator unsafe_end(size_type bucket)<span class="keyword"> const</span>
-<a name="l00996"></a>00996 <span class="keyword">    </span>{
-<a name="l00997"></a>00997         <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l00998"></a>00998             <span class="keywordflow">return</span> end();
-<a name="l00999"></a>00999 
-<a name="l01000"></a>01000         raw_const_iterator it = get_bucket(bucket);
-<a name="l01001"></a>01001     
-<a name="l01002"></a>01002         <span class="comment">// Find the end of the bucket, denoted by the dummy element</span>
-<a name="l01003"></a>01003         <span class="keywordflow">do</span> ++it;
-<a name="l01004"></a>01004         <span class="keywordflow">while</span>(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());
-<a name="l01005"></a>01005 
-<a name="l01006"></a>01006         <span class="comment">// Return the first real element past the end of the bucket</span>
-<a name="l01007"></a>01007         <span class="keywordflow">return</span> my_solist.first_real_iterator(it);
-<a name="l01008"></a>01008     }
-<a name="l01009"></a>01009 
-<a name="l01010"></a>01010     const_local_iterator unsafe_cbegin(size_type bucket)<span class="keyword"> const </span>{
-<a name="l01011"></a>01011         <span class="keywordflow">return</span> ((<span class="keyword">const</span> self_type *) <span class="keyword">this</span>)->begin();
-<a name="l01012"></a>01012     }
-<a name="l01013"></a>01013 
-<a name="l01014"></a>01014     const_local_iterator unsafe_cend(size_type bucket)<span class="keyword"> const </span>{
-<a name="l01015"></a>01015         <span class="keywordflow">return</span> ((<span class="keyword">const</span> self_type *) <span class="keyword">this</span>)->end();
-<a name="l01016"></a>01016     }
-<a name="l01017"></a>01017 
-<a name="l01018"></a>01018     <span class="comment">// Hash policy</span>
-<a name="l01019"></a>01019     <span class="keywordtype">float</span> load_factor()<span class="keyword"> const </span>{
-<a name="l01020"></a>01020         <span class="keywordflow">return</span> (<span class="keywordtype">float</span>) size() / (float) unsafe_bucket_count();
-<a name="l01021"></a>01021     }
-<a name="l01022"></a>01022 
-<a name="l01023"></a>01023     <span class="keywordtype">float</span> max_load_factor()<span class="keyword"> const </span>{
-<a name="l01024"></a>01024         <span class="keywordflow">return</span> my_maximum_bucket_size;
-<a name="l01025"></a>01025     }
-<a name="l01026"></a>01026 
-<a name="l01027"></a>01027     <span class="keywordtype">void</span> max_load_factor(<span class="keywordtype">float</span> newmax) {
-<a name="l01028"></a>01028         <span class="keywordflow">if</span> (newmax != newmax || newmax < 0)
-<a name="l01029"></a>01029             tbb::internal::throw_exception(tbb::internal::eid_invalid_load_factor);
-<a name="l01030"></a>01030         my_maximum_bucket_size = newmax;
-<a name="l01031"></a>01031     }
-<a name="l01032"></a>01032 
-<a name="l01033"></a>01033     <span class="comment">// This function is a noop, because the underlying split-ordered list</span>
-<a name="l01034"></a>01034     <span class="comment">// is already sorted, so an increase in the bucket number will be</span>
-<a name="l01035"></a>01035     <span class="comment">// reflected next time this bucket is touched.</span>
-<a name="l01036"></a>01036     <span class="keywordtype">void</span> rehash(size_type buckets) {
-<a name="l01037"></a>01037         size_type current_buckets = my_number_of_buckets;
-<a name="l01038"></a>01038         <span class="keywordflow">if</span> (current_buckets >= buckets)
-<a name="l01039"></a>01039             <span class="keywordflow">return</span>;
-<a name="l01040"></a>01040         my_number_of_buckets = 1<<__TBB_Log2((uintptr_t)buckets*2-1); <span class="comment">// round up to power of 2</span>
-<a name="l01041"></a>01041     }
-<a name="l01042"></a>01042 
-<a name="l01043"></a>01043 <span class="keyword">private</span>:
-<a name="l01044"></a>01044 
-<a name="l01045"></a>01045     <span class="comment">// Initialize the hash and keep the first bucket open</span>
-<a name="l01046"></a>01046     <span class="keywordtype">void</span> internal_init() {
-<a name="l01047"></a>01047         <span class="comment">// Allocate an array of segment pointers</span>
-<a name="l01048"></a>01048         memset(my_buckets, 0, pointers_per_table * <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *));
-<a name="l01049"></a>01049 
-<a name="l01050"></a>01050         <span class="comment">// Initialize bucket 0</span>
-<a name="l01051"></a>01051         raw_iterator dummy_node = my_solist.raw_begin();
-<a name="l01052"></a>01052         set_bucket(0, dummy_node);
-<a name="l01053"></a>01053     }
-<a name="l01054"></a>01054 
-<a name="l01055"></a>01055     <span class="keywordtype">void</span> internal_clear() {
-<a name="l01056"></a>01056         <span class="keywordflow">for</span> (size_type index = 0; index < pointers_per_table; ++index) {
-<a name="l01057"></a>01057             <span class="keywordflow">if</span> (my_buckets[index] != NULL) {
-<a name="l01058"></a>01058                 size_type sz = segment_size(index);
-<a name="l01059"></a>01059                 <span class="keywordflow">for</span> (size_type index2 = 0; index2 < sz; ++index2)
-<a name="l01060"></a>01060                     my_allocator.destroy(&my_buckets[index][index2]);
-<a name="l01061"></a>01061                 my_allocator.deallocate(my_buckets[index], sz);
-<a name="l01062"></a>01062                 my_buckets[index] = 0;
-<a name="l01063"></a>01063             }
-<a name="l01064"></a>01064         }
-<a name="l01065"></a>01065     }
-<a name="l01066"></a>01066 
-<a name="l01067"></a>01067     <span class="keywordtype">void</span> internal_copy(<span class="keyword">const</span> self_type& right) {
-<a name="l01068"></a>01068         clear();
-<a name="l01069"></a>01069 
-<a name="l01070"></a>01070         my_maximum_bucket_size = right.my_maximum_bucket_size;
-<a name="l01071"></a>01071         my_number_of_buckets = right.my_number_of_buckets;
-<a name="l01072"></a>01072 
-<a name="l01073"></a>01073         __TBB_TRY {
-<a name="l01074"></a>01074             insert(right.begin(), right.end());
-<a name="l01075"></a>01075             my_hash_compare = right.my_hash_compare;
-<a name="l01076"></a>01076         } __TBB_CATCH(...) {
-<a name="l01077"></a>01077             my_solist.clear();
-<a name="l01078"></a>01078             __TBB_RETHROW();
-<a name="l01079"></a>01079         }
-<a name="l01080"></a>01080     }
-<a name="l01081"></a>01081 
-<a name="l01082"></a>01082     <span class="keywordtype">void</span> internal_swap_buckets(concurrent_unordered_base& right)
-<a name="l01083"></a>01083     {
-<a name="l01084"></a>01084         <span class="comment">// Swap all node segments</span>
-<a name="l01085"></a>01085         <span class="keywordflow">for</span> (size_type index = 0; index < pointers_per_table; ++index)
-<a name="l01086"></a>01086         {
-<a name="l01087"></a>01087             raw_iterator * iterator_pointer = my_buckets[index];
-<a name="l01088"></a>01088             my_buckets[index] = right.my_buckets[index];
-<a name="l01089"></a>01089             right.my_buckets[index] = iterator_pointer;
-<a name="l01090"></a>01090         }
-<a name="l01091"></a>01091     }
-<a name="l01092"></a>01092 
-<a name="l01093"></a>01093     <span class="comment">// Hash APIs</span>
-<a name="l01094"></a>01094     size_type internal_distance(const_iterator first, const_iterator last)<span class="keyword"> const</span>
-<a name="l01095"></a>01095 <span class="keyword">    </span>{
-<a name="l01096"></a>01096         size_type num = 0;
-<a name="l01097"></a>01097 
-<a name="l01098"></a>01098         <span class="keywordflow">for</span> (const_iterator it = first; it != last; ++it)
-<a name="l01099"></a>01099             ++num;
-<a name="l01100"></a>01100 
-<a name="l01101"></a>01101         <span class="keywordflow">return</span> num;
-<a name="l01102"></a>01102     }
-<a name="l01103"></a>01103 
-<a name="l01104"></a>01104     <span class="comment">// Insert an element in the hash given its value</span>
-<a name="l01105"></a>01105     std::pair<iterator, bool> internal_insert(<span class="keyword">const</span> value_type& value)
-<a name="l01106"></a>01106     {
-<a name="l01107"></a>01107         sokey_t order_key = (sokey_t) my_hash_compare(get_key(value));
-<a name="l01108"></a>01108         size_type bucket = order_key % my_number_of_buckets;
-<a name="l01109"></a>01109 
-<a name="l01110"></a>01110         <span class="comment">// If bucket is empty, initialize it first</span>
-<a name="l01111"></a>01111         <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l01112"></a>01112             init_bucket(bucket);
-<a name="l01113"></a>01113 
-<a name="l01114"></a>01114         size_type new_count;
-<a name="l01115"></a>01115         order_key = split_order_key_regular(order_key);
-<a name="l01116"></a>01116         raw_iterator it = get_bucket(bucket);
-<a name="l01117"></a>01117         raw_iterator last = my_solist.raw_end();
-<a name="l01118"></a>01118         raw_iterator where = it;
-<a name="l01119"></a>01119 
-<a name="l01120"></a>01120         __TBB_ASSERT(where != last, <span class="stringliteral">"Invalid head node"</span>);
-<a name="l01121"></a>01121 
-<a name="l01122"></a>01122         <span class="comment">// First node is a dummy node</span>
-<a name="l01123"></a>01123         ++where;
-<a name="l01124"></a>01124 
-<a name="l01125"></a>01125         <span class="keywordflow">for</span> (;;)
-<a name="l01126"></a>01126         {
-<a name="l01127"></a>01127             <span class="keywordflow">if</span> (where == last || solist_t::get_order_key(where) > order_key)
-<a name="l01128"></a>01128             {
-<a name="l01129"></a>01129                 <span class="comment">// Try to insert it in the right place</span>
-<a name="l01130"></a>01130                 std::pair<iterator, bool> result = my_solist.try_insert(it, where, value, order_key, &new_count);
-<a name="l01131"></a>01131                 
-<a name="l01132"></a>01132                 <span class="keywordflow">if</span> (result.second)
-<a name="l01133"></a>01133                 {
-<a name="l01134"></a>01134                     <span class="comment">// Insertion succeeded, adjust the table size, if needed</span>
-<a name="l01135"></a>01135                     adjust_table_size(new_count, my_number_of_buckets);
-<a name="l01136"></a>01136                     <span class="keywordflow">return</span> result;
-<a name="l01137"></a>01137                 }
-<a name="l01138"></a>01138                 <span class="keywordflow">else</span>
-<a name="l01139"></a>01139                 {
-<a name="l01140"></a>01140                     <span class="comment">// Insertion failed: either the same node was inserted by another thread, or</span>
-<a name="l01141"></a>01141                     <span class="comment">// another element was inserted at exactly the same place as this node.</span>
-<a name="l01142"></a>01142                     <span class="comment">// Proceed with the search from the previous location where order key was</span>
-<a name="l01143"></a>01143                     <span class="comment">// known to be larger (note: this is legal only because there is no safe</span>
-<a name="l01144"></a>01144                     <span class="comment">// concurrent erase operation supported).</span>
-<a name="l01145"></a>01145                     where = it;
-<a name="l01146"></a>01146                     ++where;
-<a name="l01147"></a>01147                     <span class="keywordflow">continue</span>;
-<a name="l01148"></a>01148                 }
-<a name="l01149"></a>01149             }
-<a name="l01150"></a>01150             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!allow_multimapping && solist_t::get_order_key(where) == order_key && my_hash_compare(get_key(*where), get_key(value)) == 0)
-<a name="l01151"></a>01151             {
-<a name="l01152"></a>01152                 <span class="comment">// Element already in the list, return it</span>
-<a name="l01153"></a>01153                 <span class="keywordflow">return</span> std::pair<iterator, bool>(my_solist.get_iterator(where), <span class="keyword">false</span>);
-<a name="l01154"></a>01154             }
-<a name="l01155"></a>01155 
-<a name="l01156"></a>01156             <span class="comment">// Move the iterator forward</span>
-<a name="l01157"></a>01157             it = where;
-<a name="l01158"></a>01158             ++where;
-<a name="l01159"></a>01159         }
-<a name="l01160"></a>01160     }
-<a name="l01161"></a>01161 
-<a name="l01162"></a>01162     <span class="comment">// Find the element in the split-ordered list</span>
-<a name="l01163"></a>01163     iterator internal_find(<span class="keyword">const</span> key_type& key)
-<a name="l01164"></a>01164     {
-<a name="l01165"></a>01165         sokey_t order_key = (sokey_t) my_hash_compare(key);
-<a name="l01166"></a>01166         size_type bucket = order_key % my_number_of_buckets;
-<a name="l01167"></a>01167 
-<a name="l01168"></a>01168         <span class="comment">// If bucket is empty, initialize it first</span>
-<a name="l01169"></a>01169         <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l01170"></a>01170             init_bucket(bucket);
-<a name="l01171"></a>01171 
-<a name="l01172"></a>01172         order_key = split_order_key_regular(order_key);
-<a name="l01173"></a>01173         raw_iterator last = my_solist.raw_end();
-<a name="l01174"></a>01174 
-<a name="l01175"></a>01175         <span class="keywordflow">for</span> (raw_iterator it = get_bucket(bucket); it != last; ++it)
-<a name="l01176"></a>01176         {
-<a name="l01177"></a>01177             <span class="keywordflow">if</span> (solist_t::get_order_key(it) > order_key)
-<a name="l01178"></a>01178             {
-<a name="l01179"></a>01179                 <span class="comment">// If the order key is smaller than the current order key, the element</span>
-<a name="l01180"></a>01180                 <span class="comment">// is not in the hash.</span>
-<a name="l01181"></a>01181                 <span class="keywordflow">return</span> end();
-<a name="l01182"></a>01182             }
-<a name="l01183"></a>01183             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (solist_t::get_order_key(it) == order_key)
-<a name="l01184"></a>01184             {
-<a name="l01185"></a>01185                 <span class="comment">// The fact that order keys match does not mean that the element is found.</span>
-<a name="l01186"></a>01186                 <span class="comment">// Key function comparison has to be performed to check whether this is the</span>
-<a name="l01187"></a>01187                 <span class="comment">// right element. If not, keep searching while order key is the same.</span>
-<a name="l01188"></a>01188                 <span class="keywordflow">if</span> (!my_hash_compare(get_key(*it), key))
-<a name="l01189"></a>01189                     <span class="keywordflow">return</span> my_solist.get_iterator(it);
-<a name="l01190"></a>01190             }
-<a name="l01191"></a>01191         }
-<a name="l01192"></a>01192 
-<a name="l01193"></a>01193         <span class="keywordflow">return</span> end();
-<a name="l01194"></a>01194     }
-<a name="l01195"></a>01195 
-<a name="l01196"></a>01196     <span class="comment">// Erase an element from the list. This is not a concurrency safe function.</span>
-<a name="l01197"></a>01197     iterator internal_erase(const_iterator it)
-<a name="l01198"></a>01198     {
-<a name="l01199"></a>01199         key_type key = get_key(*it);
-<a name="l01200"></a>01200         sokey_t order_key = (sokey_t) my_hash_compare(key);
-<a name="l01201"></a>01201         size_type bucket = order_key % my_number_of_buckets;
-<a name="l01202"></a>01202 
-<a name="l01203"></a>01203         <span class="comment">// If bucket is empty, initialize it first</span>
-<a name="l01204"></a>01204         <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l01205"></a>01205             init_bucket(bucket);
-<a name="l01206"></a>01206 
-<a name="l01207"></a>01207         order_key = split_order_key_regular(order_key);
-<a name="l01208"></a>01208 
-<a name="l01209"></a>01209         raw_iterator previous = get_bucket(bucket);
-<a name="l01210"></a>01210         raw_iterator last = my_solist.raw_end();
-<a name="l01211"></a>01211         raw_iterator where = previous;
-<a name="l01212"></a>01212 
-<a name="l01213"></a>01213         __TBB_ASSERT(where != last, <span class="stringliteral">"Invalid head node"</span>);
-<a name="l01214"></a>01214 
-<a name="l01215"></a>01215         <span class="comment">// First node is a dummy node</span>
-<a name="l01216"></a>01216         ++where;
-<a name="l01217"></a>01217 
-<a name="l01218"></a>01218         <span class="keywordflow">for</span> (;;) {
-<a name="l01219"></a>01219             <span class="keywordflow">if</span> (where == last)
-<a name="l01220"></a>01220                 <span class="keywordflow">return</span> end();
-<a name="l01221"></a>01221             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (my_solist.get_iterator(where) == it)
-<a name="l01222"></a>01222                 <span class="keywordflow">return</span> my_solist.erase_node(previous, it);
-<a name="l01223"></a>01223 
-<a name="l01224"></a>01224             <span class="comment">// Move the iterator forward</span>
-<a name="l01225"></a>01225             previous = where;
-<a name="l01226"></a>01226             ++where;
-<a name="l01227"></a>01227         }
-<a name="l01228"></a>01228     }
-<a name="l01229"></a>01229 
-<a name="l01230"></a>01230     <span class="comment">// Return the [begin, end) pair of iterators with the same key values.</span>
-<a name="l01231"></a>01231     <span class="comment">// This operation makes sense only if mapping is many-to-one.</span>
-<a name="l01232"></a>01232     pairii_t internal_equal_range(<span class="keyword">const</span> key_type& key)
-<a name="l01233"></a>01233     {
-<a name="l01234"></a>01234         sokey_t order_key = (sokey_t) my_hash_compare(key);
-<a name="l01235"></a>01235         size_type bucket = order_key % my_number_of_buckets;
-<a name="l01236"></a>01236 
-<a name="l01237"></a>01237         <span class="comment">// If bucket is empty, initialize it first</span>
-<a name="l01238"></a>01238         <span class="keywordflow">if</span> (!is_initialized(bucket))
-<a name="l01239"></a>01239             init_bucket(bucket);
-<a name="l01240"></a>01240 
-<a name="l01241"></a>01241         order_key = split_order_key_regular(order_key);
-<a name="l01242"></a>01242         raw_iterator end_it = my_solist.raw_end();
-<a name="l01243"></a>01243 
-<a name="l01244"></a>01244         <span class="keywordflow">for</span> (raw_iterator it = get_bucket(bucket); it != end_it; ++it)
-<a name="l01245"></a>01245         {
-<a name="l01246"></a>01246             <span class="keywordflow">if</span> (solist_t::get_order_key(it) > order_key)
-<a name="l01247"></a>01247             {
-<a name="l01248"></a>01248                 <span class="comment">// There is no element with the given key</span>
-<a name="l01249"></a>01249                 <span class="keywordflow">return</span> pairii_t(end(), end());
-<a name="l01250"></a>01250             }
-<a name="l01251"></a>01251             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (solist_t::get_order_key(it) == order_key && !my_hash_compare(get_key(*it), key))
-<a name="l01252"></a>01252             {
-<a name="l01253"></a>01253                 iterator first = my_solist.get_iterator(it);
-<a name="l01254"></a>01254                 iterator last = first;
-<a name="l01255"></a>01255                 <span class="keywordflow">do</span> ++last; <span class="keywordflow">while</span>( allow_multimapping && last != end() && !my_hash_compare(get_key(*last), key) );
-<a name="l01256"></a>01256                 <span class="keywordflow">return</span> pairii_t(first, last);
-<a name="l01257"></a>01257             }
-<a name="l01258"></a>01258         }
-<a name="l01259"></a>01259 
-<a name="l01260"></a>01260         <span class="keywordflow">return</span> pairii_t(end(), end());
-<a name="l01261"></a>01261     }
-<a name="l01262"></a>01262 
-<a name="l01263"></a>01263     <span class="comment">// Bucket APIs</span>
-<a name="l01264"></a>01264     <span class="keywordtype">void</span> init_bucket(size_type bucket)
-<a name="l01265"></a>01265     {
-<a name="l01266"></a>01266         <span class="comment">// Bucket 0 has no parent.</span>
-<a name="l01267"></a>01267         __TBB_ASSERT( bucket != 0, <span class="stringliteral">"The first bucket must always be initialized"</span>);
-<a name="l01268"></a>01268 
-<a name="l01269"></a>01269         size_type parent_bucket = get_parent(bucket);
-<a name="l01270"></a>01270 
-<a name="l01271"></a>01271         <span class="comment">// All parent_bucket buckets have to be initialized before this bucket is</span>
-<a name="l01272"></a>01272         <span class="keywordflow">if</span> (!is_initialized(parent_bucket))
-<a name="l01273"></a>01273             init_bucket(parent_bucket);
-<a name="l01274"></a>01274 
-<a name="l01275"></a>01275         raw_iterator parent = get_bucket(parent_bucket);
-<a name="l01276"></a>01276 
-<a name="l01277"></a>01277         <span class="comment">// Create a dummy first node in this bucket</span>
-<a name="l01278"></a>01278         raw_iterator dummy_node = my_solist.insert_dummy(parent, split_order_key_dummy(bucket));
-<a name="l01279"></a>01279         set_bucket(bucket, dummy_node);
-<a name="l01280"></a>01280     }
-<a name="l01281"></a>01281 
-<a name="l01282"></a>01282     <span class="keywordtype">void</span> adjust_table_size(size_type total_elements, size_type current_size)
-<a name="l01283"></a>01283     {
-<a name="l01284"></a>01284         <span class="comment">// Grow the table by a factor of 2 if possible and needed</span>
-<a name="l01285"></a>01285         <span class="keywordflow">if</span> ( ((<span class="keywordtype">float</span>) total_elements / (<span class="keywordtype">float</span>) current_size) > my_maximum_bucket_size )
-<a name="l01286"></a>01286         {
-<a name="l01287"></a>01287             <span class="comment">// Double the size of the hash only if size has not changed inbetween loads</span>
-<a name="l01288"></a>01288             __TBB_CompareAndSwapW((uintptr_t*)&my_number_of_buckets, uintptr_t(2u*current_size), uintptr_t(current_size) );
-<a name="l01289"></a>01289             <span class="comment">//Simple "my_number_of_buckets.compare_and_swap( current_size<<1, current_size );" does not work for VC8</span>
-<a name="l01290"></a>01290             <span class="comment">//due to overzealous compiler warnings in /Wp64 mode</span>
-<a name="l01291"></a>01291         }
-<a name="l01292"></a>01292     }
-<a name="l01293"></a>01293 
-<a name="l01294"></a>01294     size_type get_parent(size_type bucket)<span class="keyword"> const</span>
-<a name="l01295"></a>01295 <span class="keyword">    </span>{
-<a name="l01296"></a>01296         <span class="comment">// Unsets bucket's most significant turned-on bit</span>
-<a name="l01297"></a>01297         size_type msb = __TBB_Log2((uintptr_t)bucket);
-<a name="l01298"></a>01298         <span class="keywordflow">return</span> bucket & ~(size_type(1) << msb);
-<a name="l01299"></a>01299     }
-<a name="l01300"></a>01300 
-<a name="l01301"></a>01301 
-<a name="l01302"></a>01302     <span class="comment">// Dynamic sized array (segments)</span>
-<a name="l01304"></a>01304 <span class="comment"></span>    <span class="keyword">static</span> size_type segment_index_of( size_type index ) {
-<a name="l01305"></a>01305         <span class="keywordflow">return</span> size_type( __TBB_Log2( uintptr_t(index|1) ) );
-<a name="l01306"></a>01306     }
-<a name="l01307"></a>01307 
-<a name="l01309"></a>01309     <span class="keyword">static</span> size_type segment_base( size_type k ) {
-<a name="l01310"></a>01310         <span class="keywordflow">return</span> (size_type(1)<<k & ~size_type(1));
-<a name="l01311"></a>01311     }
-<a name="l01312"></a>01312 
-<a name="l01314"></a>01314     <span class="keyword">static</span> size_type segment_size( size_type k ) {
-<a name="l01315"></a>01315         <span class="keywordflow">return</span> k? size_type(1)<<k : 2;
-<a name="l01316"></a>01316     }
-<a name="l01317"></a>01317 
-<a name="l01318"></a>01318     raw_iterator get_bucket(size_type bucket)<span class="keyword"> const </span>{
-<a name="l01319"></a>01319         size_type segment = segment_index_of(bucket);
-<a name="l01320"></a>01320         bucket -= segment_base(segment);
-<a name="l01321"></a>01321         __TBB_ASSERT( my_buckets[segment], <span class="stringliteral">"bucket must be in an allocated segment"</span> );
-<a name="l01322"></a>01322         <span class="keywordflow">return</span> my_buckets[segment][bucket];
-<a name="l01323"></a>01323     }
-<a name="l01324"></a>01324 
-<a name="l01325"></a>01325     <span class="keywordtype">void</span> set_bucket(size_type bucket, raw_iterator dummy_head) {
-<a name="l01326"></a>01326         size_type segment = segment_index_of(bucket);
-<a name="l01327"></a>01327         bucket -= segment_base(segment);
-<a name="l01328"></a>01328 
-<a name="l01329"></a>01329         <span class="keywordflow">if</span> (my_buckets[segment] == NULL) {
-<a name="l01330"></a>01330             size_type sz = segment_size(segment);
-<a name="l01331"></a>01331             raw_iterator * new_segment = my_allocator.allocate(sz);
-<a name="l01332"></a>01332             std::memset(new_segment, 0, sz*<span class="keyword">sizeof</span>(raw_iterator));
-<a name="l01333"></a>01333 
-<a name="l01334"></a>01334             <span class="keywordflow">if</span> (__TBB_CompareAndSwapW((<span class="keywordtype">void</span> *) &my_buckets[segment], (uintptr_t)new_segment, 0) != 0)
-<a name="l01335"></a>01335                 my_allocator.deallocate(new_segment, sz);
-<a name="l01336"></a>01336         }
-<a name="l01337"></a>01337 
-<a name="l01338"></a>01338         my_buckets[segment][bucket] = dummy_head;
-<a name="l01339"></a>01339     }
-<a name="l01340"></a>01340 
-<a name="l01341"></a>01341     <span class="keywordtype">bool</span> is_initialized(size_type bucket)<span class="keyword"> const </span>{
-<a name="l01342"></a>01342         size_type segment = segment_index_of(bucket);
-<a name="l01343"></a>01343         bucket -= segment_base(segment);
-<a name="l01344"></a>01344 
-<a name="l01345"></a>01345         <span class="keywordflow">if</span> (my_buckets[segment] == NULL)
-<a name="l01346"></a>01346             <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01347"></a>01347 
-<a name="l01348"></a>01348         raw_iterator it = my_buckets[segment][bucket];
-<a name="l01349"></a>01349         <span class="keywordflow">return</span> (it.get_node_ptr() != NULL);
-<a name="l01350"></a>01350     }
-<a name="l01351"></a>01351 
-<a name="l01352"></a>01352     <span class="comment">// Utilities for keys</span>
-<a name="l01353"></a>01353 
-<a name="l01354"></a>01354     <span class="comment">// A regular order key has its original hash value reversed and the last bit set</span>
-<a name="l01355"></a>01355     sokey_t split_order_key_regular(sokey_t order_key)<span class="keyword"> const </span>{
-<a name="l01356"></a>01356         <span class="keywordflow">return</span> __TBB_ReverseBits(order_key) | 0x1;
-<a name="l01357"></a>01357     }
-<a name="l01358"></a>01358 
-<a name="l01359"></a>01359     <span class="comment">// A dummy order key has its original hash value reversed and the last bit unset</span>
-<a name="l01360"></a>01360     sokey_t split_order_key_dummy(sokey_t order_key)<span class="keyword"> const </span>{
-<a name="l01361"></a>01361         <span class="keywordflow">return</span> __TBB_ReverseBits(order_key) & ~(0x1);
-<a name="l01362"></a>01362     }
-<a name="l01363"></a>01363 
-<a name="l01364"></a>01364     <span class="comment">// Shared variables</span>
-<a name="l01365"></a>01365     atomic<size_type>                                             my_number_of_buckets;       <span class="comment">// Current table size</span>
-<a name="l01366"></a>01366     solist_t                                                      my_solist;                  <span class="comment">// List where all the elements are kept</span>
-<a name="l01367"></a>01367     <span class="keyword">typename</span> allocator_type::template rebind<raw_iterator>::other my_allocator;               <span class="comment">// Allocator object for segments</span>
-<a name="l01368"></a>01368     <span class="keywordtype">float</span>                                                         my_maximum_bucket_size;     <span class="comment">// Maximum size of the bucket</span>
-<a name="l01369"></a>01369     atomic<raw_iterator*>                                         my_buckets[pointers_per_table]; <span class="comment">// The segment table</span>
-<a name="l01370"></a>01370 };
-<a name="l01371"></a>01371 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l01372"></a>01372 <span class="preprocessor"></span><span class="preprocessor">#pragma warning(pop) // warning 4127 -- while (true) has a constant expression in it</span>
-<a name="l01373"></a>01373 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l01374"></a>01374 <span class="preprocessor"></span>
-<a name="l01376"></a>01376 <span class="keyword">static</span> <span class="keyword">const</span> size_t hash_multiplier = <span class="keyword">sizeof</span>(size_t)==4? 2654435769U : 11400714819323198485ULL;
-<a name="l01377"></a>01377 } <span class="comment">// namespace internal</span>
-<a name="l01380"></a>01380 <span class="comment"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l01381"></a>01381 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> T& t ) {
-<a name="l01382"></a>01382     <span class="keywordflow">return</span> static_cast<size_t>( t ) * internal::hash_multiplier;
-<a name="l01383"></a>01383 }
-<a name="l01384"></a>01384 <span class="keyword">template</span><<span class="keyword">typename</span> P>
-<a name="l01385"></a>01385 <span class="keyword">inline</span> size_t tbb_hasher( P* ptr ) {
-<a name="l01386"></a>01386     size_t <span class="keyword">const</span> h = reinterpret_cast<size_t>( ptr );
-<a name="l01387"></a>01387     <span class="keywordflow">return</span> (h >> 3) ^ h;
-<a name="l01388"></a>01388 }
-<a name="l01389"></a>01389 <span class="keyword">template</span><<span class="keyword">typename</span> E, <span class="keyword">typename</span> S, <span class="keyword">typename</span> A>
-<a name="l01390"></a>01390 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> std::basic_string<E,S,A>& s ) {
-<a name="l01391"></a>01391     size_t h = 0;
-<a name="l01392"></a>01392     <span class="keywordflow">for</span>( <span class="keyword">const</span> E* c = s.c_str(); *c; ++c )
-<a name="l01393"></a>01393         h = static_cast<size_t>(*c) ^ (h * internal::hash_multiplier);
-<a name="l01394"></a>01394     <span class="keywordflow">return</span> h;
-<a name="l01395"></a>01395 }
-<a name="l01396"></a>01396 <span class="keyword">template</span><<span class="keyword">typename</span> F, <span class="keyword">typename</span> S>
-<a name="l01397"></a>01397 <span class="keyword">inline</span> size_t tbb_hasher( <span class="keyword">const</span> std::pair<F,S>& p ) {
-<a name="l01398"></a>01398     <span class="keywordflow">return</span> tbb_hasher(p.first) ^ tbb_hasher(p.second);
-<a name="l01399"></a>01399 }
-<a name="l01400"></a>01400 } <span class="comment">// namespace interface5</span>
-<a name="l01401"></a>01401 <span class="keyword">using</span> interface5::tbb_hasher;
-<a name="l01402"></a>01402 } <span class="comment">// namespace tbb</span>
-<a name="l01403"></a>01403 <span class="preprocessor">#endif// __TBB_concurrent_unordered_internal_H</span>
-</pre></div><hr>
+<h1>Memory Allocation</h1><table border="0" cellpadding="0" cellspacing="0">
+<tr><td></td></tr>
+<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00227.html">tbb::aligned_space< T, N ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Block of space aligned sufficiently to construct an array T with N elements.  <a href="a00227.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00238.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00239.html">tbb::cache_aligned_allocator< void ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00239.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00270.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00271.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00299.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00300.html">tbb::scalable_allocator< void ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00300.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00317.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00318.html">tbb::tbb_allocator< void ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00318.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.  <a href="a00326.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a></td></tr>
+
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1.  <a href="a00327.html#_details">More...</a><br></td></tr>
+<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (void *ptr)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (void *ptr, size_t size)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">int __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (void **memptr, size_t alignment, size_t size)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void *__TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (void *ptr, size_t size, size_t alignment)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (void *ptr)</td></tr>
+
+<tr><td class="memItemLeft" nowrap align="right" valign="top">size_t __TBB_EXPORTED_FUNC </td><td class="memItemRight" valign="bottom"><a class="el" href="a00397.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (void *ptr)</td></tr>
+
+</table>
+<hr><h2>Function Documentation</h2>
+<a class="anchor" name="g65a20e812012f15ec7442d5b45d0cba5"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_free" ref="g65a20e812012f15ec7442d5b45d0cba5" args="(void *ptr)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void __TBB_EXPORTED_FUNC scalable_aligned_free           </td>
+          <td>(</td>
+          <td class="paramtype">void * </td>
+          <td class="paramname"> <em>ptr</em>          </td>
+          <td> ) </td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "_aligned_free" analogue. 
+</div>
+</div><p>
+<a class="anchor" name="gc1c7aaa1fe85c17ba5a3a96f7e8d89e7"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_malloc" ref="gc1c7aaa1fe85c17ba5a3a96f7e8d89e7" args="(size_t size, size_t alignment)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* __TBB_EXPORTED_FUNC scalable_aligned_malloc           </td>
+          <td>(</td>
+          <td class="paramtype">size_t </td>
+          <td class="paramname"> <em>size</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t </td>
+          <td class="paramname"> <em>alignment</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "_aligned_malloc" analogue. 
+</div>
+</div><p>
+<a class="anchor" name="gbaea91376be80dfabd7c93eaffd9abaa"></a><!-- doxytag: member="scalable_allocator.h::scalable_aligned_realloc" ref="gbaea91376be80dfabd7c93eaffd9abaa" args="(void *ptr, size_t size, size_t alignment)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* __TBB_EXPORTED_FUNC scalable_aligned_realloc           </td>
+          <td>(</td>
+          <td class="paramtype">void * </td>
+          <td class="paramname"> <em>ptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t </td>
+          <td class="paramname"> <em>size</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t </td>
+          <td class="paramname"> <em>alignment</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "_aligned_realloc" analogue. 
+</div>
+</div><p>
+<a class="anchor" name="g3f5a2fde0bcaa3eda35be32c8658f444"></a><!-- doxytag: member="scalable_allocator.h::scalable_calloc" ref="g3f5a2fde0bcaa3eda35be32c8658f444" args="(size_t nobj, size_t size)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* __TBB_EXPORTED_FUNC scalable_calloc           </td>
+          <td>(</td>
+          <td class="paramtype">size_t </td>
+          <td class="paramname"> <em>nobj</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t </td>
+          <td class="paramname"> <em>size</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "calloc" analogue complementing scalable_malloc. 
+</div>
+</div><p>
+<a class="anchor" name="gca3579c21244dba9f0c351e5984d4565"></a><!-- doxytag: member="scalable_allocator.h::scalable_free" ref="gca3579c21244dba9f0c351e5984d4565" args="(void *ptr)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void __TBB_EXPORTED_FUNC scalable_free           </td>
+          <td>(</td>
+          <td class="paramtype">void * </td>
+          <td class="paramname"> <em>ptr</em>          </td>
+          <td> ) </td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "free" analogue to discard a previously allocated piece of memory. 
+</div>
+</div><p>
+<a class="anchor" name="gc25b8e6c76db0b346a8249796a7a2475"></a><!-- doxytag: member="scalable_allocator.h::scalable_malloc" ref="gc25b8e6c76db0b346a8249796a7a2475" args="(size_t size)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* __TBB_EXPORTED_FUNC scalable_malloc           </td>
+          <td>(</td>
+          <td class="paramtype">size_t </td>
+          <td class="paramname"> <em>size</em>          </td>
+          <td> ) </td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "malloc" analogue to allocate block of memory of size bytes. 
+</div>
+</div><p>
+<a class="anchor" name="g0965ce1b4b7835f92869c7fd867265f7"></a><!-- doxytag: member="scalable_allocator.h::scalable_msize" ref="g0965ce1b4b7835f92869c7fd867265f7" args="(void *ptr)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t __TBB_EXPORTED_FUNC scalable_msize           </td>
+          <td>(</td>
+          <td class="paramtype">void * </td>
+          <td class="paramname"> <em>ptr</em>          </td>
+          <td> ) </td>
+          <td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+The analogue of _msize/malloc_size/malloc_usable_size. Returns the usable size of a memory block previously allocated by scalable_*, or 0 (zero) if ptr does not point to such a block. 
+</div>
+</div><p>
+<a class="anchor" name="g05dcec987480bb2c82ecdead6a085899"></a><!-- doxytag: member="scalable_allocator.h::scalable_posix_memalign" ref="g05dcec987480bb2c82ecdead6a085899" args="(void **memptr, size_t alignment, size_t size)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">int __TBB_EXPORTED_FUNC scalable_posix_memalign           </td>
+          <td>(</td>
+          <td class="paramtype">void ** </td>
+          <td class="paramname"> <em>memptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t </td>
+          <td class="paramname"> <em>alignment</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t </td>
+          <td class="paramname"> <em>size</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "posix_memalign" analogue. 
+</div>
+</div><p>
+<a class="anchor" name="g951bbbbd2d041acb59ba5fa910b52543"></a><!-- doxytag: member="scalable_allocator.h::scalable_realloc" ref="g951bbbbd2d041acb59ba5fa910b52543" args="(void *ptr, size_t size)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">void* __TBB_EXPORTED_FUNC scalable_realloc           </td>
+          <td>(</td>
+          <td class="paramtype">void * </td>
+          <td class="paramname"> <em>ptr</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">size_t </td>
+          <td class="paramname"> <em>size</em></td><td> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td><td width="100%"></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>
+The "realloc" analogue complementing scalable_malloc. 
+</div>
+</div><p>
+<hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
 <p></p>
diff --git a/doc/html/a00374.html b/doc/html/a00398.html
similarity index 74%
rename from doc/html/a00374.html
rename to doc/html/a00398.html
index 9a0d85b..c5e70a7 100644
--- a/doc/html/a00374.html
+++ b/doc/html/a00398.html
@@ -17,36 +17,36 @@
 <h1>Synchronization</h1><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00216.html">tbb::atomic< T ></a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00228.html">tbb::atomic< T ></a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic.  <a href="a00216.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00258.html">tbb::mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Primary template for atomic.  <a href="a00228.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00275.html">tbb::mutex</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock.  <a href="a00258.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00260.html">tbb::null_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Wrapper around the platform's native reader-writer lock.  <a href="a00275.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00277.html">tbb::null_mutex</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing.  <a href="a00260.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00262.html">tbb::null_rw_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A mutex which does nothing.  <a href="a00277.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00279.html">tbb::null_rw_mutex</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing.  <a href="a00262.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00270.html">tbb::queuing_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A rw mutex which does nothing.  <a href="a00279.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html">tbb::queuing_mutex</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning.  <a href="a00270.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Queuing lock with local-only spinning.  <a href="a00288.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Reader-writer lock with local-only spinning.  <a href="a00272.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Reader-writer lock with local-only spinning.  <a href="a00290.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Writer-preference reader-writer lock with local-only spinning on readers.  <a href="a00274.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00278.html">tbb::recursive_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Writer-preference reader-writer lock with local-only spinning on readers.  <a href="a00292.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00296.html">tbb::recursive_mutex</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition.  <a href="a00278.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00286.html">tbb::spin_mutex</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Mutex that allows recursive mutex acquisition.  <a href="a00296.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00305.html">tbb::spin_mutex</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte.  <a href="a00286.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A lock that occupies a single byte.  <a href="a00305.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast, unfair, spinning reader-writer lock with backoff and writer-preference.  <a href="a00288.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Fast, unfair, spinning reader-writer lock with backoff and writer-preference.  <a href="a00307.html#_details">More...</a><br></td></tr>
 </table>
 <hr>
 <p></p>
diff --git a/doc/html/a00375.html b/doc/html/a00399.html
similarity index 92%
rename from doc/html/a00375.html
rename to doc/html/a00399.html
index f797583..417436a 100644
--- a/doc/html/a00375.html
+++ b/doc/html/a00399.html
@@ -17,9 +17,9 @@
 <h1>Timing</h1><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00302.html">tbb::tick_count</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00323.html">tbb::tick_count</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp.  <a href="a00302.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Absolute timestamp.  <a href="a00323.html#_details">More...</a><br></td></tr>
 </table>
 <hr>
 <p></p>
diff --git a/doc/html/a00376.html b/doc/html/a00400.html
similarity index 80%
rename from doc/html/a00376.html
rename to doc/html/a00400.html
index 001c4bc..f7a8d60 100644
--- a/doc/html/a00376.html
+++ b/doc/html/a00400.html
@@ -17,21 +17,21 @@
 <h1>Task Scheduling</h1><table border="0" cellpadding="0" cellspacing="0">
 <tr><td></td></tr>
 <tr><td colspan="2"><br><h2>Classes</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00293.html">tbb::task_group_context</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00313.html">tbb::task_group_context</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks.  <a href="a00293.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00291.html">tbb::task</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Used to form groups of tasks.  <a href="a00313.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00311.html">tbb::task</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks.  <a href="a00291.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00242.html">tbb::empty_task</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Base class for user-defined tasks.  <a href="a00311.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00254.html">tbb::empty_task</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization.  <a href="a00242.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00294.html">tbb::task_list</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">task that does nothing. Useful for synchronization.  <a href="a00254.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00315.html">tbb::task_list</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children.  <a href="a00294.html#_details">More...</a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">A list of children.  <a href="a00315.html#_details">More...</a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td></tr>
 
-<tr><td class="mdescLeft"> </td><td class="mdescRight">Class delimiting the scope of task scheduler activity.  <a href="a00295.html#_details">More...</a><br></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class delimiting the scope of task scheduler activity.  <a href="a00316.html#_details">More...</a><br></td></tr>
 </table>
 <hr>
 <p></p>
diff --git a/doc/html/a00409.html b/doc/html/a00401.html
similarity index 89%
rename from doc/html/a00409.html
rename to doc/html/a00401.html
index 40b2529..48227c6 100644
--- a/doc/html/a00409.html
+++ b/doc/html/a00401.html
@@ -45,18 +45,18 @@
 <a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
 <a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_machine.h"</span>
 <a name="l00026"></a>00026 
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
+<a name="l00027"></a><a class="code" href="a00383.html">00027</a> <span class="keyword">namespace </span>tbb {
 <a name="l00028"></a>00028 
 <a name="l00030"></a>00030 
 <a name="l00032"></a>00032 <span class="keyword">template</span><<span class="keyword">typename</span> T,size_t N>
-<a name="l00033"></a><a class="code" href="a00215.html">00033</a> <span class="keyword">class </span><a class="code" href="a00215.html">aligned_space</a> {
+<a name="l00033"></a><a class="code" href="a00227.html">00033</a> <span class="keyword">class </span><a class="code" href="a00227.html">aligned_space</a> {
 <a name="l00034"></a>00034 <span class="keyword">private</span>:
 <a name="l00035"></a>00035     <span class="keyword">typedef</span> __TBB_TypeWithAlignmentAtLeastAsStrict(T) element_type;
 <a name="l00036"></a>00036     element_type array[(<span class="keyword">sizeof</span>(T)*N+<span class="keyword">sizeof</span>(element_type)-1)/<span class="keyword">sizeof</span>(element_type)];
 <a name="l00037"></a>00037 <span class="keyword">public</span>:
-<a name="l00039"></a><a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">00039</a>     T* <a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>() {<span class="keywordflow">return</span> internal::punned_cast<T*>(<span class="keyword">this</span>);}
+<a name="l00039"></a><a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">00039</a>     T* <a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>() {<span class="keywordflow">return</span> internal::punned_cast<T*>(<span class="keyword">this</span>);}
 <a name="l00040"></a>00040 
-<a name="l00042"></a><a class="code" href="a00215.html#024be075c23c0394c9a2518d993bcd9e">00042</a>     T* <a class="code" href="a00215.html#024be075c23c0394c9a2518d993bcd9e">end</a>() {<span class="keywordflow">return</span> <a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()+N;}
+<a name="l00042"></a><a class="code" href="a00227.html#024be075c23c0394c9a2518d993bcd9e">00042</a>     T* <a class="code" href="a00227.html#024be075c23c0394c9a2518d993bcd9e">end</a>() {<span class="keywordflow">return</span> <a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()+N;}
 <a name="l00043"></a>00043 };
 <a name="l00044"></a>00044 
 <a name="l00045"></a>00045 } <span class="comment">// namespace tbb </span>
diff --git a/doc/html/a00403.html b/doc/html/a00403.html
new file mode 100644
index 0000000..4b66fa4
--- /dev/null
+++ b/doc/html/a00403.html
@@ -0,0 +1,433 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>atomic.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="files.html"><span>File List</span></a></li>
+    <li><a href="globals.html"><span>File Members</span></a></li>
+  </ul></div>
+<h1>atomic.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
+<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment">    writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020 
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_atomic_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_atomic_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include <cstddef></span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 <span class="preprocessor">#if _MSC_VER </span>
+<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_LONG_LONG __int64</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_LONG_LONG long long</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER */</span>
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033 <span class="preprocessor">#include "tbb_machine.h"</span>
+<a name="l00034"></a>00034 
+<a name="l00035"></a>00035 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span>    <span class="comment">// Workaround for overzealous compiler warnings </span>
+<a name="l00037"></a>00037 <span class="preprocessor">    #pragma warning (push)</span>
+<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4244 4267)</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00040"></a>00040 <span class="preprocessor"></span>
+<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
+<a name="l00042"></a>00042 
+<a name="l00044"></a><a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef">00044</a> <span class="keyword">enum</span> <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> {
+<a name="l00046"></a>00046     <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>,
+<a name="l00048"></a>00048     <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
+<a name="l00050"></a>00050     <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>,
+<a name="l00052"></a>00052     <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>
+<a name="l00053"></a>00053 };
+<a name="l00054"></a>00054 
+<a name="l00056"></a>00056 <span class="keyword">namespace </span>internal {
+<a name="l00057"></a>00057 
+<a name="l00058"></a>00058 <span class="preprocessor">#if __TBB_ATTRIBUTE_ALIGNED_PRESENT</span>
+<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_DECL_ATOMIC_FIELD(t,f,a) t f  __attribute__ ((aligned(a)));</span>
+<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#elif __TBB_DECLSPEC_ALIGN_PRESENT</span>
+<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_DECL_ATOMIC_FIELD(t,f,a) __declspec(align(a)) t f;</span>
+<a name="l00062"></a>00062 <span class="preprocessor"></span><span class="preprocessor">#else </span>
+<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor">    #error Do not know syntax for forcing alignment.</span>
+<a name="l00064"></a>00064 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00065"></a>00065 <span class="preprocessor"></span>
+<a name="l00066"></a>00066 <span class="keyword">template</span><size_t S>
+<a name="l00067"></a>00067 <span class="keyword">struct </span>atomic_rep;           <span class="comment">// Primary template declared, but never defined.</span>
+<a name="l00068"></a>00068 
+<a name="l00069"></a>00069 <span class="keyword">template</span><>
+<a name="l00070"></a>00070 <span class="keyword">struct </span>atomic_rep<1> {       <span class="comment">// Specialization</span>
+<a name="l00071"></a>00071     <span class="keyword">typedef</span> int8_t word;
+<a name="l00072"></a>00072     int8_t value;
+<a name="l00073"></a>00073 };
+<a name="l00074"></a>00074 <span class="keyword">template</span><>
+<a name="l00075"></a>00075 <span class="keyword">struct </span>atomic_rep<2> {       <span class="comment">// Specialization</span>
+<a name="l00076"></a>00076     <span class="keyword">typedef</span> int16_t word;
+<a name="l00077"></a>00077     __TBB_DECL_ATOMIC_FIELD(int16_t,value,2)
+<a name="l00078"></a>00078 };
+<a name="l00079"></a>00079 <span class="keyword">template</span><>
+<a name="l00080"></a>00080 <span class="keyword">struct </span>atomic_rep<4> {       <span class="comment">// Specialization</span>
+<a name="l00081"></a>00081 <span class="preprocessor">#if _MSC_VER && __TBB_WORDSIZE==4</span>
+<a name="l00082"></a>00082 <span class="preprocessor"></span>    <span class="comment">// Work-around that avoids spurious /Wp64 warnings</span>
+<a name="l00083"></a>00083     <span class="keyword">typedef</span> intptr_t word;
+<a name="l00084"></a>00084 <span class="preprocessor">#else</span>
+<a name="l00085"></a>00085 <span class="preprocessor"></span>    <span class="keyword">typedef</span> int32_t word;
+<a name="l00086"></a>00086 <span class="preprocessor">#endif</span>
+<a name="l00087"></a>00087 <span class="preprocessor"></span>    __TBB_DECL_ATOMIC_FIELD(int32_t,value,4)
+<a name="l00088"></a>00088 };
+<a name="l00089"></a>00089 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
+<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="keyword">template</span><>
+<a name="l00091"></a>00091 <span class="keyword">struct </span>atomic_rep<8> {       <span class="comment">// Specialization</span>
+<a name="l00092"></a>00092     <span class="keyword">typedef</span> int64_t word;
+<a name="l00093"></a>00093     __TBB_DECL_ATOMIC_FIELD(int64_t,value,8)
+<a name="l00094"></a>00094 };
+<a name="l00095"></a>00095 <span class="preprocessor">#endif</span>
+<a name="l00096"></a>00096 <span class="preprocessor"></span>
+<a name="l00097"></a>00097 <span class="keyword">template</span><size_t Size, memory_semantics M>
+<a name="l00098"></a>00098 <span class="keyword">struct </span>atomic_traits;        <span class="comment">// Primary template declared, but not defined.</span>
+<a name="l00099"></a>00099 
+<a name="l00100"></a>00100 <span class="preprocessor">#define __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(S,M)                                                         \</span>
+<a name="l00101"></a>00101 <span class="preprocessor">    template<> struct atomic_traits<S,M> {                                                               \</span>
+<a name="l00102"></a>00102 <span class="preprocessor">        typedef atomic_rep<S>::word word;                                                                \</span>
+<a name="l00103"></a>00103 <span class="preprocessor">        inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) { \</span>
+<a name="l00104"></a>00104 <span class="preprocessor">            return __TBB_machine_cmpswp##S##M(location,new_value,comparand);                             \</span>
+<a name="l00105"></a>00105 <span class="preprocessor">        }                                                                                                \</span>
+<a name="l00106"></a>00106 <span class="preprocessor">        inline static word fetch_and_add( volatile void* location, word addend ) {                       \</span>
+<a name="l00107"></a>00107 <span class="preprocessor">            return __TBB_machine_fetchadd##S##M(location,addend);                                        \</span>
+<a name="l00108"></a>00108 <span class="preprocessor">        }                                                                                                \</span>
+<a name="l00109"></a>00109 <span class="preprocessor">        inline static word fetch_and_store( volatile void* location, word value ) {                      \</span>
+<a name="l00110"></a>00110 <span class="preprocessor">            return __TBB_machine_fetchstore##S##M(location,value);                                       \</span>
+<a name="l00111"></a>00111 <span class="preprocessor">        }                                                                                                \</span>
+<a name="l00112"></a>00112 <span class="preprocessor">    };</span>
+<a name="l00113"></a>00113 <span class="preprocessor"></span>
+<a name="l00114"></a>00114 <span class="preprocessor">#define __TBB_DECL_ATOMIC_PRIMITIVES(S)                                                                  \</span>
+<a name="l00115"></a>00115 <span class="preprocessor">    template<memory_semantics M>                                                                         \</span>
+<a name="l00116"></a>00116 <span class="preprocessor">    struct atomic_traits<S,M> {                                                                          \</span>
+<a name="l00117"></a>00117 <span class="preprocessor">        typedef atomic_rep<S>::word word;                                                                \</span>
+<a name="l00118"></a>00118 <span class="preprocessor">        inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) { \</span>
+<a name="l00119"></a>00119 <span class="preprocessor">            return __TBB_machine_cmpswp##S(location,new_value,comparand);                                \</span>
+<a name="l00120"></a>00120 <span class="preprocessor">        }                                                                                                \</span>
+<a name="l00121"></a>00121 <span class="preprocessor">        inline static word fetch_and_add( volatile void* location, word addend ) {                       \</span>
+<a name="l00122"></a>00122 <span class="preprocessor">            return __TBB_machine_fetchadd##S(location,addend);                                           \</span>
+<a name="l00123"></a>00123 <span class="preprocessor">        }                                                                                                \</span>
+<a name="l00124"></a>00124 <span class="preprocessor">        inline static word fetch_and_store( volatile void* location, word value ) {                      \</span>
+<a name="l00125"></a>00125 <span class="preprocessor">            return __TBB_machine_fetchstore##S(location,value);                                          \</span>
+<a name="l00126"></a>00126 <span class="preprocessor">        }                                                                                                \</span>
+<a name="l00127"></a>00127 <span class="preprocessor">    };</span>
+<a name="l00128"></a>00128 <span class="preprocessor"></span>
+<a name="l00129"></a>00129 <span class="keyword">template</span><memory_semantics M>
+<a name="l00130"></a>00130 <span class="keyword">struct </span>atomic_load_store_traits;    <span class="comment">// Primary template declaration</span>
+<a name="l00131"></a>00131 
+<a name="l00132"></a>00132 <span class="preprocessor">#define __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(M)                      \</span>
+<a name="l00133"></a>00133 <span class="preprocessor">    template<> struct atomic_load_store_traits<M> {                     \</span>
+<a name="l00134"></a>00134 <span class="preprocessor">        template <typename T>                                           \</span>
+<a name="l00135"></a>00135 <span class="preprocessor">        inline static T load( const volatile T& location ) {            \</span>
+<a name="l00136"></a>00136 <span class="preprocessor">            return __TBB_load_##M( location );                          \</span>
+<a name="l00137"></a>00137 <span class="preprocessor">        }                                                               \</span>
+<a name="l00138"></a>00138 <span class="preprocessor">        template <typename T>                                           \</span>
+<a name="l00139"></a>00139 <span class="preprocessor">        inline static void store( volatile T& location, T value ) {     \</span>
+<a name="l00140"></a>00140 <span class="preprocessor">            __TBB_store_##M( location, value );                         \</span>
+<a name="l00141"></a>00141 <span class="preprocessor">        }                                                               \</span>
+<a name="l00142"></a>00142 <span class="preprocessor">    }</span>
+<a name="l00143"></a>00143 <span class="preprocessor"></span>
+<a name="l00144"></a>00144 <span class="preprocessor">#if __TBB_USE_FENCED_ATOMICS</span>
+<a name="l00145"></a>00145 <span class="preprocessor"></span>__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>)
+<a name="l00146"></a>00146 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>)
+<a name="l00147"></a>00147 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>)
+<a name="l00148"></a>00148 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
+<a name="l00149"></a>00149 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
+<a name="l00150"></a>00150 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
+<a name="l00151"></a>00151 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
+<a name="l00152"></a>00152 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
+<a name="l00153"></a>00153 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
+<a name="l00154"></a>00154 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>)
+<a name="l00155"></a>00155 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>)
+<a name="l00156"></a>00156 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">relaxed</a>)
+<a name="l00157"></a>00157 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
+<a name="l00158"></a>00158 <span class="preprocessor"></span>__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>)
+<a name="l00159"></a>00159 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
+<a name="l00160"></a>00160 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
+<a name="l00161"></a>00161 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,relaxed)
+<a name="l00162"></a>00162 <span class="preprocessor">#endif</span>
+<a name="l00163"></a>00163 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !__TBB_USE_FENCED_ATOMICS */</span>
+<a name="l00164"></a>00164 __TBB_DECL_ATOMIC_PRIMITIVES(1)
+<a name="l00165"></a>00165 __TBB_DECL_ATOMIC_PRIMITIVES(2)
+<a name="l00166"></a>00166 __TBB_DECL_ATOMIC_PRIMITIVES(4)
+<a name="l00167"></a>00167 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
+<a name="l00168"></a>00168 <span class="preprocessor"></span>__TBB_DECL_ATOMIC_PRIMITIVES(8)
+<a name="l00169"></a>00169 <span class="preprocessor">#endif</span>
+<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !__TBB_USE_FENCED_ATOMICS */</span>
+<a name="l00171"></a>00171 
+<a name="l00172"></a>00172 __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">full_fence</a>);
+<a name="l00173"></a>00173 __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>);
+<a name="l00174"></a>00174 __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(<a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>);
+<a name="l00175"></a>00175 __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(relaxed);
+<a name="l00176"></a>00176 
+<a name="l00178"></a>00178 
+<a name="l00180"></a>00180 <span class="preprocessor">#define __TBB_MINUS_ONE(T) (T(T(0)-T(1)))</span>
+<a name="l00181"></a>00181 <span class="preprocessor"></span>
+<a name="l00183"></a>00183 
+<a name="l00185"></a>00185 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00186"></a>00186 <span class="keyword">struct </span>atomic_impl {
+<a name="l00187"></a>00187 <span class="keyword">protected</span>:
+<a name="l00188"></a>00188     atomic_rep<sizeof(T)> rep;
+<a name="l00189"></a>00189 <span class="keyword">private</span>:
+<a name="l00191"></a>00191     <span class="keyword">union </span>converter {
+<a name="l00192"></a>00192         T value;
+<a name="l00193"></a>00193         <span class="keyword">typename</span> atomic_rep<sizeof(T)>::word bits;
+<a name="l00194"></a>00194     };
+<a name="l00195"></a>00195 <span class="keyword">public</span>:
+<a name="l00196"></a>00196     <span class="keyword">typedef</span> T value_type;
+<a name="l00197"></a>00197 
+<a name="l00198"></a>00198     <span class="keyword">template</span><memory_semantics M>
+<a name="l00199"></a>00199     value_type fetch_and_store( value_type value ) {
+<a name="l00200"></a>00200         converter u, w;
+<a name="l00201"></a>00201         u.value = value;
+<a name="l00202"></a>00202         w.bits = internal::atomic_traits<sizeof(value_type),M>::fetch_and_store(&rep.value,u.bits);
+<a name="l00203"></a>00203         <span class="keywordflow">return</span> w.value;
+<a name="l00204"></a>00204     }
+<a name="l00205"></a>00205 
+<a name="l00206"></a>00206     value_type fetch_and_store( value_type value ) {
+<a name="l00207"></a>00207         <span class="keywordflow">return</span> fetch_and_store<full_fence>(value);
+<a name="l00208"></a>00208     }
+<a name="l00209"></a>00209 
+<a name="l00210"></a>00210     <span class="keyword">template</span><memory_semantics M>
+<a name="l00211"></a>00211     value_type compare_and_swap( value_type value, value_type comparand ) {
+<a name="l00212"></a>00212         converter u, v, w;
+<a name="l00213"></a>00213         u.value = value;
+<a name="l00214"></a>00214         v.value = comparand;
+<a name="l00215"></a>00215         w.bits = internal::atomic_traits<sizeof(value_type),M>::compare_and_swap(&rep.value,u.bits,v.bits);
+<a name="l00216"></a>00216         <span class="keywordflow">return</span> w.value;
+<a name="l00217"></a>00217     }
+<a name="l00218"></a>00218 
+<a name="l00219"></a>00219     value_type compare_and_swap( value_type value, value_type comparand ) {
+<a name="l00220"></a>00220         <span class="keywordflow">return</span> compare_and_swap<full_fence>(value,comparand);
+<a name="l00221"></a>00221     }
+<a name="l00222"></a>00222 
+<a name="l00223"></a>00223     operator value_type()<span class="keyword"> const volatile </span>{                <span class="comment">// volatile qualifier here for backwards compatibility </span>
+<a name="l00224"></a>00224         converter w;
+<a name="l00225"></a>00225         w.bits = __TBB_load_with_acquire( rep.value );
+<a name="l00226"></a>00226         <span class="keywordflow">return</span> w.value;
+<a name="l00227"></a>00227     }
+<a name="l00228"></a>00228 
+<a name="l00229"></a>00229     <span class="keyword">template</span><memory_semantics M>
+<a name="l00230"></a>00230     value_type load ()<span class="keyword"> const </span>{
+<a name="l00231"></a>00231         converter u;
+<a name="l00232"></a>00232         u.bits = internal::atomic_load_store_traits<M>::load( rep.value );
+<a name="l00233"></a>00233         <span class="keywordflow">return</span> u.value;
+<a name="l00234"></a>00234     }
+<a name="l00235"></a>00235 
+<a name="l00236"></a>00236     value_type load ()<span class="keyword"> const </span>{
+<a name="l00237"></a>00237         <span class="keywordflow">return</span> load<acquire>();
+<a name="l00238"></a>00238     }
+<a name="l00239"></a>00239 
+<a name="l00240"></a>00240     <span class="keyword">template</span><memory_semantics M>
+<a name="l00241"></a>00241     <span class="keywordtype">void</span> store ( value_type value ) {
+<a name="l00242"></a>00242         converter u;
+<a name="l00243"></a>00243         u.value = value;
+<a name="l00244"></a>00244         internal::atomic_load_store_traits<M>::store( rep.value, u.bits );
+<a name="l00245"></a>00245     }
+<a name="l00246"></a>00246 
+<a name="l00247"></a>00247     <span class="keywordtype">void</span> store ( value_type value ) {
+<a name="l00248"></a>00248         store<release>( value );
+<a name="l00249"></a>00249     }
+<a name="l00250"></a>00250 
+<a name="l00251"></a>00251 <span class="keyword">protected</span>:
+<a name="l00252"></a>00252     value_type store_with_release( value_type rhs ) {
+<a name="l00253"></a>00253         converter u;
+<a name="l00254"></a>00254         u.value = rhs;
+<a name="l00255"></a>00255         __TBB_store_with_release(rep.value,u.bits);
+<a name="l00256"></a>00256         <span class="keywordflow">return</span> rhs;
+<a name="l00257"></a>00257     }
+<a name="l00258"></a>00258 };
+<a name="l00259"></a>00259 
+<a name="l00261"></a>00261 
+<a name="l00264"></a>00264 <span class="keyword">template</span><<span class="keyword">typename</span> I, <span class="keyword">typename</span> D, <span class="keyword">typename</span> StepType>
+<a name="l00265"></a>00265 <span class="keyword">struct </span>atomic_impl_with_arithmetic: atomic_impl<I> {
+<a name="l00266"></a>00266 <span class="keyword">public</span>:
+<a name="l00267"></a>00267     <span class="keyword">typedef</span> I value_type;
+<a name="l00268"></a>00268 
+<a name="l00269"></a>00269     <span class="keyword">template</span><memory_semantics M>
+<a name="l00270"></a>00270     value_type fetch_and_add( D addend ) {
+<a name="l00271"></a>00271         <span class="keywordflow">return</span> value_type(internal::atomic_traits<<span class="keyword">sizeof</span>(value_type),M>::fetch_and_add( &this->rep.value, addend*<span class="keyword">sizeof</span>(StepType) ));
+<a name="l00272"></a>00272     }
+<a name="l00273"></a>00273 
+<a name="l00274"></a>00274     value_type fetch_and_add( D addend ) {
+<a name="l00275"></a>00275         <span class="keywordflow">return</span> fetch_and_add<full_fence>(addend);
+<a name="l00276"></a>00276     }
+<a name="l00277"></a>00277 
+<a name="l00278"></a>00278     <span class="keyword">template</span><memory_semantics M>
+<a name="l00279"></a>00279     value_type fetch_and_increment() {
+<a name="l00280"></a>00280         <span class="keywordflow">return</span> fetch_and_add<M>(1);
+<a name="l00281"></a>00281     }
+<a name="l00282"></a>00282 
+<a name="l00283"></a>00283     value_type fetch_and_increment() {
+<a name="l00284"></a>00284         <span class="keywordflow">return</span> fetch_and_add(1);
+<a name="l00285"></a>00285     }
+<a name="l00286"></a>00286 
+<a name="l00287"></a>00287     <span class="keyword">template</span><memory_semantics M>
+<a name="l00288"></a>00288     value_type fetch_and_decrement() {
+<a name="l00289"></a>00289         <span class="keywordflow">return</span> fetch_and_add<M>(__TBB_MINUS_ONE(D));
+<a name="l00290"></a>00290     }
+<a name="l00291"></a>00291 
+<a name="l00292"></a>00292     value_type fetch_and_decrement() {
+<a name="l00293"></a>00293         <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D));
+<a name="l00294"></a>00294     }
+<a name="l00295"></a>00295 
+<a name="l00296"></a>00296 <span class="keyword">public</span>:
+<a name="l00297"></a>00297     value_type operator+=( D addend ) {
+<a name="l00298"></a>00298         <span class="keywordflow">return</span> fetch_and_add(addend)+addend;
+<a name="l00299"></a>00299     }
+<a name="l00300"></a>00300 
+<a name="l00301"></a>00301     value_type operator-=( D addend ) {
+<a name="l00302"></a>00302         <span class="comment">// Additive inverse of addend computed using binary minus,</span>
+<a name="l00303"></a>00303         <span class="comment">// instead of unary minus, for sake of avoiding compiler warnings.</span>
+<a name="l00304"></a>00304         <span class="keywordflow">return</span> operator+=(D(0)-addend);    
+<a name="l00305"></a>00305     }
+<a name="l00306"></a>00306 
+<a name="l00307"></a>00307     value_type operator++() {
+<a name="l00308"></a>00308         <span class="keywordflow">return</span> fetch_and_add(1)+1;
+<a name="l00309"></a>00309     }
+<a name="l00310"></a>00310 
+<a name="l00311"></a>00311     value_type operator--() {
+<a name="l00312"></a>00312         <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D))-1;
+<a name="l00313"></a>00313     }
+<a name="l00314"></a>00314 
+<a name="l00315"></a>00315     value_type operator++(<span class="keywordtype">int</span>) {
+<a name="l00316"></a>00316         <span class="keywordflow">return</span> fetch_and_add(1);
+<a name="l00317"></a>00317     }
+<a name="l00318"></a>00318 
+<a name="l00319"></a>00319     value_type operator--(<span class="keywordtype">int</span>) {
+<a name="l00320"></a>00320         <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D));
+<a name="l00321"></a>00321     }
+<a name="l00322"></a>00322 };
+<a name="l00323"></a>00323 
+<a name="l00324"></a>00324 } <span class="comment">/* Internal */</span>
+<a name="l00326"></a>00326 
+<a name="l00328"></a>00328 
+<a name="l00330"></a>00330 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00331"></a><a class="code" href="a00228.html">00331</a> <span class="keyword">struct </span><a class="code" href="a00228.html">atomic</a>: internal::atomic_impl<T> {
+<a name="l00332"></a>00332     T operator=( T rhs ) {
+<a name="l00333"></a>00333         <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
+<a name="l00334"></a>00334         <span class="keywordflow">return</span> this->store_with_release(rhs);
+<a name="l00335"></a>00335     }
+<a name="l00336"></a>00336     <a class="code" href="a00228.html">atomic<T></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00228.html">atomic<T></a>& rhs ) {this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;}
+<a name="l00337"></a>00337 };
+<a name="l00338"></a>00338 
+<a name="l00339"></a>00339 <span class="preprocessor">#define __TBB_DECL_ATOMIC(T) \</span>
+<a name="l00340"></a>00340 <span class="preprocessor">    template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> {  \</span>
+<a name="l00341"></a>00341 <span class="preprocessor">        T operator=( T rhs ) {return store_with_release(rhs);}  \</span>
+<a name="l00342"></a>00342 <span class="preprocessor">        atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;}  \</span>
+<a name="l00343"></a>00343 <span class="preprocessor">    };</span>
+<a name="l00344"></a>00344 <span class="preprocessor"></span>
+<a name="l00345"></a>00345 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
+<a name="l00346"></a>00346 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(__TBB_LONG_LONG)
+<a name="l00347"></a>00347 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> __TBB_LONG_LONG)
+<a name="l00348"></a>00348 <span class="preprocessor">#else</span>
+<a name="l00349"></a>00349 <span class="preprocessor"></span><span class="comment">// test_atomic will verify that sizeof(long long)==8</span>
+<a name="l00350"></a>00350 <span class="preprocessor">#endif</span>
+<a name="l00351"></a>00351 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">long</span>)
+<a name="l00352"></a>00352 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)
+<a name="l00353"></a>00353 
+<a name="l00354"></a>00354 <span class="preprocessor">#if defined(_MSC_VER) && __TBB_WORDSIZE==4</span>
+<a name="l00355"></a>00355 <span class="preprocessor"></span><span class="comment">/* Special version of __TBB_DECL_ATOMIC that avoids gratuitous warnings from cl /Wp64 option. </span>
+<a name="l00356"></a>00356 <span class="comment">   It is identical to __TBB_DECL_ATOMIC(unsigned) except that it replaces operator=(T) </span>
+<a name="l00357"></a>00357 <span class="comment">   with an operator=(U) that explicitly converts the U to a T.  Types T and U should be</span>
+<a name="l00358"></a>00358 <span class="comment">   type synonyms on the platform.  Type U should be the wider variant of T from the</span>
+<a name="l00359"></a>00359 <span class="comment">   perspective of /Wp64. */</span>
+<a name="l00360"></a>00360 <span class="preprocessor">#define __TBB_DECL_ATOMIC_ALT(T,U) \</span>
+<a name="l00361"></a>00361 <span class="preprocessor">    template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> {  \</span>
+<a name="l00362"></a>00362 <span class="preprocessor">        T operator=( U rhs ) {return store_with_release(T(rhs));}  \</span>
+<a name="l00363"></a>00363 <span class="preprocessor">        atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;}  \</span>
+<a name="l00364"></a>00364 <span class="preprocessor">    };</span>
+<a name="l00365"></a>00365 <span class="preprocessor"></span><a class="code" href="a00383.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a>(<span class="keywordtype">unsigned</span>,size_t)
+<a name="l00366"></a><a class="code" href="a00383.html#ad165cf61abbe349d413df2589679add">00366</a> <a class="code" href="a00383.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a>(<span class="keywordtype">int</span>,ptrdiff_t)
+<a name="l00367"></a>00367 <span class="preprocessor">#else</span>
+<a name="l00368"></a>00368 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span>)
+<a name="l00369"></a>00369 __TBB_DECL_ATOMIC(<span class="keywordtype">int</span>)
+<a name="l00370"></a>00370 <span class="preprocessor">#endif </span><span class="comment">/* defined(_MSC_VER) && __TBB_WORDSIZE==4 */</span>
+<a name="l00371"></a>00371 
+<a name="l00372"></a>00372 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span>)
+<a name="l00373"></a>00373 __TBB_DECL_ATOMIC(<span class="keywordtype">short</span>)
+<a name="l00374"></a>00374 __TBB_DECL_ATOMIC(<span class="keywordtype">char</span>)
+<a name="l00375"></a>00375 __TBB_DECL_ATOMIC(<span class="keywordtype">signed</span> <span class="keywordtype">char</span>)
+<a name="l00376"></a>00376 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)
+<a name="l00377"></a>00377 
+<a name="l00378"></a>00378 <span class="preprocessor">#if !defined(_MSC_VER)||defined(_NATIVE_WCHAR_T_DEFINED) </span>
+<a name="l00379"></a>00379 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">wchar_t</span>)
+<a name="l00380"></a>00380 <span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER||!defined(_NATIVE_WCHAR_T_DEFINED) */</span>
+<a name="l00381"></a>00381 
+<a name="l00383"></a>00383 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="a00228.html">atomic</a><T*>: internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T> {
+<a name="l00384"></a>00384     T* operator=( T* rhs ) {
+<a name="l00385"></a>00385         <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
+<a name="l00386"></a>00386         <span class="keywordflow">return</span> this->store_with_release(rhs);
+<a name="l00387"></a>00387     }
+<a name="l00388"></a>00388     <a class="code" href="a00228.html">atomic<T*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00228.html">atomic<T*></a>& rhs ) {
+<a name="l00389"></a>00389         this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00390"></a>00390     }
+<a name="l00391"></a>00391     T* operator->()<span class="keyword"> const </span>{
+<a name="l00392"></a>00392         <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
+<a name="l00393"></a>00393     }
+<a name="l00394"></a>00394 };
+<a name="l00395"></a>00395 
+<a name="l00397"></a><a class="code" href="a00229.html">00397</a> <span class="keyword">template</span><> <span class="keyword">struct </span><a class="code" href="a00228.html">atomic</a><void*>: internal::atomic_impl<void*> {
+<a name="l00398"></a>00398     <span class="keywordtype">void</span>* operator=( <span class="keywordtype">void</span>* rhs ) {
+<a name="l00399"></a>00399         <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
+<a name="l00400"></a>00400         <span class="keywordflow">return</span> this->store_with_release(rhs);
+<a name="l00401"></a>00401     }
+<a name="l00402"></a>00402     <a class="code" href="a00228.html">atomic<void*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00228.html">atomic<void*></a>& rhs ) {
+<a name="l00403"></a>00403         this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00404"></a>00404     }
+<a name="l00405"></a>00405 };
+<a name="l00406"></a>00406 
+<a name="l00407"></a>00407 <span class="comment">// Helpers to workaround ugly syntax of calling template member function of a</span>
+<a name="l00408"></a>00408 <span class="comment">// template class with template argument dependent on template parameters.</span>
+<a name="l00409"></a>00409 
+<a name="l00410"></a>00410 <span class="keyword">template</span> <memory_semantics M, <span class="keyword">typename</span> T>
+<a name="l00411"></a>00411 T load ( <span class="keyword">const</span> <a class="code" href="a00228.html">atomic<T></a>& a ) { <span class="keywordflow">return</span> a.template load<M>(); }
+<a name="l00412"></a>00412 
+<a name="l00413"></a>00413 <span class="keyword">template</span> <memory_semantics M, <span class="keyword">typename</span> T>
+<a name="l00414"></a>00414 <span class="keywordtype">void</span> store ( atomic<T>& a, T value ) { <span class="keywordflow">return</span> a.template store<M>(value); }
+<a name="l00415"></a>00415 
+<a name="l00416"></a>00416 } <span class="comment">// namespace tbb</span>
+<a name="l00417"></a>00417 
+<a name="l00418"></a>00418 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
+<a name="l00419"></a>00419 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
+<a name="l00420"></a>00420 <span class="preprocessor"></span><span class="preprocessor">#endif // warnings 4244, 4267 are back</span>
+<a name="l00421"></a>00421 <span class="preprocessor"></span>
+<a name="l00422"></a>00422 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_atomic_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00407.html b/doc/html/a00407.html
deleted file mode 100644
index 2da113e..0000000
--- a/doc/html/a00407.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>_tbb_windef.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>_tbb_windef.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_windef_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#error Do not #include this file directly.  Use "#include tbb/tbb_stddef.h" instead.</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_windef_H */</span>
-<a name="l00024"></a>00024 
-<a name="l00025"></a>00025 <span class="comment">// Check that the target Windows version has all API calls requried for TBB.</span>
-<a name="l00026"></a>00026 <span class="comment">// Do not increase the version in condition beyond 0x0500 without prior discussion!</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#if defined(_WIN32_WINNT) && _WIN32_WINNT<0x0400</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#error TBB is unable to run on old Windows versions; _WIN32_WINNT must be 0x0400 or greater.</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span>
-<a name="l00031"></a>00031 <span class="preprocessor">#if !defined(_MT)</span>
-<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#error TBB requires linkage with multithreaded C/C++ runtime library. \</span>
-<a name="l00033"></a>00033 <span class="preprocessor">       Choose multithreaded DLL runtime in project settings, or use /MD[d] compiler switch.</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span>
-<a name="l00036"></a>00036 <span class="comment">// Workaround for the problem with MVSC headers failing to define namespace std</span>
-<a name="l00037"></a>00037 <span class="keyword">namespace </span>std {
-<a name="l00038"></a>00038   using ::size_t; using ::ptrdiff_t;
-<a name="l00039"></a>00039 }
-<a name="l00040"></a>00040 
-<a name="l00041"></a>00041 <span class="preprocessor">#define __TBB_STRING_AUX(x) #x</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_STRING(x) __TBB_STRING_AUX(x)</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span>
-<a name="l00044"></a>00044 <span class="comment">// Default setting of TBB_USE_DEBUG</span>
-<a name="l00045"></a>00045 <span class="preprocessor">#ifdef TBB_USE_DEBUG</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">#    if TBB_USE_DEBUG </span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor">#        if !defined(_DEBUG)</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor">#            pragma message(__FILE__ "(" __TBB_STRING(__LINE__) ") : Warning: Recommend using /MDd if compiling with TBB_USE_DEBUG!=0")</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor">#        endif</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">#    else</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#        if defined(_DEBUG)</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#            pragma message(__FILE__ "(" __TBB_STRING(__LINE__) ") : Warning: Recommend using /MD if compiling with TBB_USE_DEBUG==0")</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">#        endif</span>
-<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#    endif</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor">#    ifdef _DEBUG</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor">#        define TBB_USE_DEBUG 1</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor">#    endif</span>
-<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span>
-<a name="l00061"></a>00061 <span class="preprocessor">#if __TBB_BUILD && !defined(__TBB_NO_IMPLICIT_LINKAGE)</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00064"></a>00064 <span class="preprocessor"></span>
-<a name="l00065"></a>00065 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00066"></a>00066 <span class="preprocessor"></span><span class="preprocessor">    #if !__TBB_NO_IMPLICIT_LINKAGE</span>
-<a name="l00067"></a>00067 <span class="preprocessor"></span><span class="preprocessor">        #ifdef __TBB_LIB_NAME</span>
-<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor">                #pragma comment(lib, __TBB_STRING(__TBB_LIB_NAME))</span>
-<a name="l00069"></a>00069 <span class="preprocessor"></span><span class="preprocessor">        #else</span>
-<a name="l00070"></a>00070 <span class="preprocessor"></span><span class="preprocessor">                        #ifdef _DEBUG</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor">                                #pragma comment(lib, "tbb_debug.lib")</span>
-<a name="l00072"></a>00072 <span class="preprocessor"></span><span class="preprocessor">                        #else</span>
-<a name="l00073"></a>00073 <span class="preprocessor"></span><span class="preprocessor">                                #pragma comment(lib, "tbb.lib")</span>
-<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor">                        #endif</span>
-<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor">        #endif</span>
-<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
-<a name="l00077"></a>00077 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00410.html b/doc/html/a00410.html
deleted file mode 100644
index f35102f..0000000
--- a/doc/html/a00410.html
+++ /dev/null
@@ -1,376 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>atomic.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>atomic.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_atomic_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_atomic_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include <cstddef></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00026"></a>00026 
-<a name="l00027"></a>00027 <span class="preprocessor">#if _MSC_VER </span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_LONG_LONG __int64</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_LONG_LONG long long</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER */</span>
-<a name="l00032"></a>00032 
-<a name="l00033"></a>00033 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00034"></a>00034 
-<a name="l00035"></a>00035 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span>    <span class="comment">// Workaround for overzealous compiler warnings </span>
-<a name="l00037"></a>00037 <span class="preprocessor">    #pragma warning (push)</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4244 4267)</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span>
-<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
-<a name="l00042"></a>00042 
-<a name="l00044"></a><a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef">00044</a> <span class="keyword">enum</span> <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef">memory_semantics</a> {
-<a name="l00046"></a>00046     <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>,
-<a name="l00048"></a>00048     <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>,
-<a name="l00050"></a>00050     <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>
-<a name="l00051"></a>00051 };
-<a name="l00052"></a>00052 
-<a name="l00054"></a>00054 <span class="keyword">namespace </span>internal {
-<a name="l00055"></a>00055 
-<a name="l00056"></a>00056 <span class="preprocessor">#if __GNUC__ || __SUNPRO_CC || __IBMCPP__</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_DECL_ATOMIC_FIELD(t,f,a) t f  __attribute__ ((aligned(a)));</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor">#elif defined(__INTEL_COMPILER)||_MSC_VER >= 1300</span>
-<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_DECL_ATOMIC_FIELD(t,f,a) __declspec(align(a)) t f;</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#else </span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#error Do not know syntax for forcing alignment.</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
-<a name="l00063"></a>00063 
-<a name="l00064"></a>00064 <span class="keyword">template</span><size_t S>
-<a name="l00065"></a>00065 <span class="keyword">struct </span>atomic_rep;           <span class="comment">// Primary template declared, but never defined.</span>
-<a name="l00066"></a>00066 
-<a name="l00067"></a>00067 <span class="keyword">template</span><>
-<a name="l00068"></a>00068 <span class="keyword">struct </span>atomic_rep<1> {       <span class="comment">// Specialization</span>
-<a name="l00069"></a>00069     <span class="keyword">typedef</span> int8_t word;
-<a name="l00070"></a>00070     int8_t value;
-<a name="l00071"></a>00071 };
-<a name="l00072"></a>00072 <span class="keyword">template</span><>
-<a name="l00073"></a>00073 <span class="keyword">struct </span>atomic_rep<2> {       <span class="comment">// Specialization</span>
-<a name="l00074"></a>00074     <span class="keyword">typedef</span> int16_t word;
-<a name="l00075"></a>00075     __TBB_DECL_ATOMIC_FIELD(int16_t,value,2)
-<a name="l00076"></a>00076 };
-<a name="l00077"></a>00077 <span class="keyword">template</span><>
-<a name="l00078"></a>00078 <span class="keyword">struct </span>atomic_rep<4> {       <span class="comment">// Specialization</span>
-<a name="l00079"></a>00079 <span class="preprocessor">#if _MSC_VER && __TBB_WORDSIZE==4</span>
-<a name="l00080"></a>00080 <span class="preprocessor"></span>    <span class="comment">// Work-around that avoids spurious /Wp64 warnings</span>
-<a name="l00081"></a>00081     <span class="keyword">typedef</span> intptr_t word;
-<a name="l00082"></a>00082 <span class="preprocessor">#else</span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span>    <span class="keyword">typedef</span> int32_t word;
-<a name="l00084"></a>00084 <span class="preprocessor">#endif</span>
-<a name="l00085"></a>00085 <span class="preprocessor"></span>    __TBB_DECL_ATOMIC_FIELD(int32_t,value,4)
-<a name="l00086"></a>00086 };
-<a name="l00087"></a>00087 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="keyword">template</span><>
-<a name="l00089"></a>00089 <span class="keyword">struct </span>atomic_rep<8> {       <span class="comment">// Specialization</span>
-<a name="l00090"></a>00090     <span class="keyword">typedef</span> int64_t word;
-<a name="l00091"></a>00091     __TBB_DECL_ATOMIC_FIELD(int64_t,value,8)
-<a name="l00092"></a>00092 };
-<a name="l00093"></a>00093 <span class="preprocessor">#endif</span>
-<a name="l00094"></a>00094 <span class="preprocessor"></span>
-<a name="l00095"></a>00095 <span class="keyword">template</span><size_t Size, memory_semantics M>
-<a name="l00096"></a>00096 <span class="keyword">struct </span>atomic_traits;        <span class="comment">// Primary template declared, but not defined.</span>
-<a name="l00097"></a>00097 
-<a name="l00098"></a>00098 <span class="preprocessor">#define __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(S,M)                         \</span>
-<a name="l00099"></a>00099 <span class="preprocessor">    template<> struct atomic_traits<S,M> {                               \</span>
-<a name="l00100"></a>00100 <span class="preprocessor">        typedef atomic_rep<S>::word word;                               \</span>
-<a name="l00101"></a>00101 <span class="preprocessor">        inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) {\</span>
-<a name="l00102"></a>00102 <span class="preprocessor">            return __TBB_CompareAndSwap##S##M(location,new_value,comparand);    \</span>
-<a name="l00103"></a>00103 <span class="preprocessor">        }                                                                       \</span>
-<a name="l00104"></a>00104 <span class="preprocessor">        inline static word fetch_and_add( volatile void* location, word addend ) { \</span>
-<a name="l00105"></a>00105 <span class="preprocessor">            return __TBB_FetchAndAdd##S##M(location,addend);                    \</span>
-<a name="l00106"></a>00106 <span class="preprocessor">        }                                                                       \</span>
-<a name="l00107"></a>00107 <span class="preprocessor">        inline static word fetch_and_store( volatile void* location, word value ) {\</span>
-<a name="l00108"></a>00108 <span class="preprocessor">            return __TBB_FetchAndStore##S##M(location,value);                   \</span>
-<a name="l00109"></a>00109 <span class="preprocessor">        }                                                                       \</span>
-<a name="l00110"></a>00110 <span class="preprocessor">    };</span>
-<a name="l00111"></a>00111 <span class="preprocessor"></span>
-<a name="l00112"></a>00112 <span class="preprocessor">#define __TBB_DECL_ATOMIC_PRIMITIVES(S)                                  \</span>
-<a name="l00113"></a>00113 <span class="preprocessor">    template<memory_semantics M>                                         \</span>
-<a name="l00114"></a>00114 <span class="preprocessor">    struct atomic_traits<S,M> {                                          \</span>
-<a name="l00115"></a>00115 <span class="preprocessor">        typedef atomic_rep<S>::word word;                               \</span>
-<a name="l00116"></a>00116 <span class="preprocessor">        inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) {\</span>
-<a name="l00117"></a>00117 <span class="preprocessor">            return __TBB_CompareAndSwap##S(location,new_value,comparand);       \</span>
-<a name="l00118"></a>00118 <span class="preprocessor">        }                                                                       \</span>
-<a name="l00119"></a>00119 <span class="preprocessor">        inline static word fetch_and_add( volatile void* location, word addend ) { \</span>
-<a name="l00120"></a>00120 <span class="preprocessor">            return __TBB_FetchAndAdd##S(location,addend);                       \</span>
-<a name="l00121"></a>00121 <span class="preprocessor">        }                                                                       \</span>
-<a name="l00122"></a>00122 <span class="preprocessor">        inline static word fetch_and_store( volatile void* location, word value ) {\</span>
-<a name="l00123"></a>00123 <span class="preprocessor">            return __TBB_FetchAndStore##S(location,value);                      \</span>
-<a name="l00124"></a>00124 <span class="preprocessor">        }                                                                       \</span>
-<a name="l00125"></a>00125 <span class="preprocessor">    };</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span>
-<a name="l00127"></a>00127 <span class="preprocessor">#if __TBB_DECL_FENCED_ATOMICS</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span>__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00129"></a>00129 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00130"></a>00130 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00131"></a>00131 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">__TBB_full_fence</a>)
-<a name="l00132"></a>00132 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00133"></a>00133 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00134"></a>00134 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00135"></a>00135 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00136"></a>00136 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00137"></a>00137 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>)
-<a name="l00138"></a>00138 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00139"></a>00139 <span class="preprocessor"></span>__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>)
-<a name="l00140"></a>00140 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,release)
-<a name="l00141"></a>00141 <span class="preprocessor">#endif</span>
-<a name="l00142"></a>00142 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00143"></a>00143 <span class="preprocessor"></span>__TBB_DECL_ATOMIC_PRIMITIVES(1)
-<a name="l00144"></a>00144 __TBB_DECL_ATOMIC_PRIMITIVES(2)
-<a name="l00145"></a>00145 __TBB_DECL_ATOMIC_PRIMITIVES(4)
-<a name="l00146"></a>00146 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00147"></a>00147 <span class="preprocessor"></span>__TBB_DECL_ATOMIC_PRIMITIVES(8)
-<a name="l00148"></a>00148 <span class="preprocessor">#endif</span>
-<a name="l00149"></a>00149 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span>
-<a name="l00152"></a>00152 
-<a name="l00154"></a>00154 <span class="preprocessor">#define __TBB_MINUS_ONE(T) (T(T(0)-T(1)))</span>
-<a name="l00155"></a>00155 <span class="preprocessor"></span>
-<a name="l00157"></a>00157 
-<a name="l00159"></a>00159 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00160"></a>00160 <span class="keyword">struct </span>atomic_impl {
-<a name="l00161"></a>00161 <span class="keyword">protected</span>:
-<a name="l00162"></a>00162     atomic_rep<sizeof(T)> rep;
-<a name="l00163"></a>00163 <span class="keyword">private</span>:
-<a name="l00165"></a>00165     <span class="keyword">union </span>converter {
-<a name="l00166"></a>00166         T value;
-<a name="l00167"></a>00167         <span class="keyword">typename</span> atomic_rep<sizeof(T)>::word bits;
-<a name="l00168"></a>00168     };
-<a name="l00169"></a>00169 <span class="keyword">public</span>:
-<a name="l00170"></a>00170     <span class="keyword">typedef</span> T value_type;
-<a name="l00171"></a>00171 
-<a name="l00172"></a>00172     <span class="keyword">template</span><memory_semantics M>
-<a name="l00173"></a>00173     value_type fetch_and_store( value_type value ) {
-<a name="l00174"></a>00174         converter u, w;
-<a name="l00175"></a>00175         u.value = value;
-<a name="l00176"></a>00176         w.bits = internal::atomic_traits<sizeof(value_type),M>::fetch_and_store(&rep.value,u.bits);
-<a name="l00177"></a>00177         <span class="keywordflow">return</span> w.value;
-<a name="l00178"></a>00178     }
-<a name="l00179"></a>00179 
-<a name="l00180"></a>00180     value_type fetch_and_store( value_type value ) {
-<a name="l00181"></a>00181         <span class="keywordflow">return</span> fetch_and_store<__TBB_full_fence>(value);
-<a name="l00182"></a>00182     }
-<a name="l00183"></a>00183 
-<a name="l00184"></a>00184     <span class="keyword">template</span><memory_semantics M>
-<a name="l00185"></a>00185     value_type compare_and_swap( value_type value, value_type comparand ) {
-<a name="l00186"></a>00186         converter u, v, w;
-<a name="l00187"></a>00187         u.value = value;
-<a name="l00188"></a>00188         v.value = comparand;
-<a name="l00189"></a>00189         w.bits = internal::atomic_traits<sizeof(value_type),M>::compare_and_swap(&rep.value,u.bits,v.bits);
-<a name="l00190"></a>00190         <span class="keywordflow">return</span> w.value;
-<a name="l00191"></a>00191     }
-<a name="l00192"></a>00192 
-<a name="l00193"></a>00193     value_type compare_and_swap( value_type value, value_type comparand ) {
-<a name="l00194"></a>00194         <span class="keywordflow">return</span> compare_and_swap<__TBB_full_fence>(value,comparand);
-<a name="l00195"></a>00195     }
-<a name="l00196"></a>00196 
-<a name="l00197"></a>00197     operator value_type()<span class="keyword"> const volatile </span>{                <span class="comment">// volatile qualifier here for backwards compatibility </span>
-<a name="l00198"></a>00198         converter w;
-<a name="l00199"></a>00199         w.bits = __TBB_load_with_acquire( rep.value );
-<a name="l00200"></a>00200         <span class="keywordflow">return</span> w.value;
-<a name="l00201"></a>00201     }
-<a name="l00202"></a>00202 
-<a name="l00203"></a>00203 <span class="keyword">protected</span>:
-<a name="l00204"></a>00204     value_type store_with_release( value_type rhs ) {
-<a name="l00205"></a>00205         converter u;
-<a name="l00206"></a>00206         u.value = rhs;
-<a name="l00207"></a>00207         __TBB_store_with_release(rep.value,u.bits);
-<a name="l00208"></a>00208         <span class="keywordflow">return</span> rhs;
-<a name="l00209"></a>00209     }
-<a name="l00210"></a>00210 };
-<a name="l00211"></a>00211 
-<a name="l00213"></a>00213 
-<a name="l00216"></a>00216 <span class="keyword">template</span><<span class="keyword">typename</span> I, <span class="keyword">typename</span> D, <span class="keyword">typename</span> StepType>
-<a name="l00217"></a>00217 <span class="keyword">struct </span>atomic_impl_with_arithmetic: atomic_impl<I> {
-<a name="l00218"></a>00218 <span class="keyword">public</span>:
-<a name="l00219"></a>00219     <span class="keyword">typedef</span> I value_type;
-<a name="l00220"></a>00220 
-<a name="l00221"></a>00221     <span class="keyword">template</span><memory_semantics M>
-<a name="l00222"></a>00222     value_type fetch_and_add( D addend ) {
-<a name="l00223"></a>00223         <span class="keywordflow">return</span> value_type(internal::atomic_traits<<span class="keyword">sizeof</span>(value_type),M>::fetch_and_add( &this->rep.value, addend*<span class="keyword">sizeof</span>(StepType) ));
-<a name="l00224"></a>00224     }
-<a name="l00225"></a>00225 
-<a name="l00226"></a>00226     value_type fetch_and_add( D addend ) {
-<a name="l00227"></a>00227         <span class="keywordflow">return</span> fetch_and_add<__TBB_full_fence>(addend);
-<a name="l00228"></a>00228     }
-<a name="l00229"></a>00229 
-<a name="l00230"></a>00230     <span class="keyword">template</span><memory_semantics M>
-<a name="l00231"></a>00231     value_type fetch_and_increment() {
-<a name="l00232"></a>00232         <span class="keywordflow">return</span> fetch_and_add<M>(1);
-<a name="l00233"></a>00233     }
-<a name="l00234"></a>00234 
-<a name="l00235"></a>00235     value_type fetch_and_increment() {
-<a name="l00236"></a>00236         <span class="keywordflow">return</span> fetch_and_add(1);
-<a name="l00237"></a>00237     }
-<a name="l00238"></a>00238 
-<a name="l00239"></a>00239     <span class="keyword">template</span><memory_semantics M>
-<a name="l00240"></a>00240     value_type fetch_and_decrement() {
-<a name="l00241"></a>00241         <span class="keywordflow">return</span> fetch_and_add<M>(__TBB_MINUS_ONE(D));
-<a name="l00242"></a>00242     }
-<a name="l00243"></a>00243 
-<a name="l00244"></a>00244     value_type fetch_and_decrement() {
-<a name="l00245"></a>00245         <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D));
-<a name="l00246"></a>00246     }
-<a name="l00247"></a>00247 
-<a name="l00248"></a>00248 <span class="keyword">public</span>:
-<a name="l00249"></a>00249     value_type operator+=( D addend ) {
-<a name="l00250"></a>00250         <span class="keywordflow">return</span> fetch_and_add(addend)+addend;
-<a name="l00251"></a>00251     }
-<a name="l00252"></a>00252 
-<a name="l00253"></a>00253     value_type operator-=( D addend ) {
-<a name="l00254"></a>00254         <span class="comment">// Additive inverse of addend computed using binary minus,</span>
-<a name="l00255"></a>00255         <span class="comment">// instead of unary minus, for sake of avoiding compiler warnings.</span>
-<a name="l00256"></a>00256         <span class="keywordflow">return</span> operator+=(D(0)-addend);    
-<a name="l00257"></a>00257     }
-<a name="l00258"></a>00258 
-<a name="l00259"></a>00259     value_type operator++() {
-<a name="l00260"></a>00260         <span class="keywordflow">return</span> fetch_and_add(1)+1;
-<a name="l00261"></a>00261     }
-<a name="l00262"></a>00262 
-<a name="l00263"></a>00263     value_type operator--() {
-<a name="l00264"></a>00264         <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D))-1;
-<a name="l00265"></a>00265     }
-<a name="l00266"></a>00266 
-<a name="l00267"></a>00267     value_type operator++(<span class="keywordtype">int</span>) {
-<a name="l00268"></a>00268         <span class="keywordflow">return</span> fetch_and_add(1);
-<a name="l00269"></a>00269     }
-<a name="l00270"></a>00270 
-<a name="l00271"></a>00271     value_type operator--(<span class="keywordtype">int</span>) {
-<a name="l00272"></a>00272         <span class="keywordflow">return</span> fetch_and_add(__TBB_MINUS_ONE(D));
-<a name="l00273"></a>00273     }
-<a name="l00274"></a>00274 };
-<a name="l00275"></a>00275 
-<a name="l00276"></a>00276 } <span class="comment">/* Internal */</span>
-<a name="l00278"></a>00278 
-<a name="l00280"></a>00280 
-<a name="l00282"></a>00282 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00283"></a><a class="code" href="a00216.html">00283</a> <span class="keyword">struct </span><a class="code" href="a00216.html">atomic</a>: internal::atomic_impl<T> {
-<a name="l00284"></a>00284     T operator=( T rhs ) {
-<a name="l00285"></a>00285         <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
-<a name="l00286"></a>00286         <span class="keywordflow">return</span> this->store_with_release(rhs);
-<a name="l00287"></a>00287     }
-<a name="l00288"></a>00288     <a class="code" href="a00216.html">atomic<T></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00216.html">atomic<T></a>& rhs ) {this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;}
-<a name="l00289"></a>00289 };
-<a name="l00290"></a>00290 
-<a name="l00291"></a>00291 <span class="preprocessor">#define __TBB_DECL_ATOMIC(T) \</span>
-<a name="l00292"></a>00292 <span class="preprocessor">    template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> {  \</span>
-<a name="l00293"></a>00293 <span class="preprocessor">        T operator=( T rhs ) {return store_with_release(rhs);}  \</span>
-<a name="l00294"></a>00294 <span class="preprocessor">        atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;}  \</span>
-<a name="l00295"></a>00295 <span class="preprocessor">    };</span>
-<a name="l00296"></a>00296 <span class="preprocessor"></span>
-<a name="l00297"></a>00297 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00298"></a>00298 <span class="preprocessor"></span><span class="comment">// otherwise size is verified by test_atomic</span>
-<a name="l00299"></a>00299 __TBB_DECL_ATOMIC(__TBB_LONG_LONG)
-<a name="l00300"></a>00300 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> __TBB_LONG_LONG)
-<a name="l00301"></a>00301 <span class="preprocessor">#endif</span>
-<a name="l00302"></a>00302 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">long</span>)
-<a name="l00303"></a>00303 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)
-<a name="l00304"></a>00304 
-<a name="l00305"></a>00305 <span class="preprocessor">#if defined(_MSC_VER) && __TBB_WORDSIZE==4</span>
-<a name="l00306"></a>00306 <span class="preprocessor"></span><span class="comment">/* Special version of __TBB_DECL_ATOMIC that avoids gratuitous warnings from cl /Wp64 option. </span>
-<a name="l00307"></a>00307 <span class="comment">   It is identical to __TBB_DECL_ATOMIC(unsigned) except that it replaces operator=(T) </span>
-<a name="l00308"></a>00308 <span class="comment">   with an operator=(U) that explicitly converts the U to a T.  Types T and U should be</span>
-<a name="l00309"></a>00309 <span class="comment">   type synonyms on the platform.  Type U should be the wider variant of T from the</span>
-<a name="l00310"></a>00310 <span class="comment">   perspective of /Wp64. */</span>
-<a name="l00311"></a>00311 <span class="preprocessor">#define __TBB_DECL_ATOMIC_ALT(T,U) \</span>
-<a name="l00312"></a>00312 <span class="preprocessor">    template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> {  \</span>
-<a name="l00313"></a>00313 <span class="preprocessor">        T operator=( U rhs ) {return store_with_release(T(rhs));}  \</span>
-<a name="l00314"></a>00314 <span class="preprocessor">        atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;}  \</span>
-<a name="l00315"></a>00315 <span class="preprocessor">    };</span>
-<a name="l00316"></a>00316 <span class="preprocessor"></span><a class="code" href="a00362.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a>(<span class="keywordtype">unsigned</span>,size_t)
-<a name="l00317"></a><a class="code" href="a00362.html#ad165cf61abbe349d413df2589679add">00317</a> <a class="code" href="a00362.html#ad165cf61abbe349d413df2589679add">__TBB_DECL_ATOMIC_ALT</a>(<span class="keywordtype">int</span>,ptrdiff_t)
-<a name="l00318"></a>00318 <span class="preprocessor">#else</span>
-<a name="l00319"></a>00319 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span>)
-<a name="l00320"></a>00320 __TBB_DECL_ATOMIC(<span class="keywordtype">int</span>)
-<a name="l00321"></a>00321 <span class="preprocessor">#endif </span><span class="comment">/* defined(_MSC_VER) && __TBB_WORDSIZE==4 */</span>
-<a name="l00322"></a>00322 
-<a name="l00323"></a>00323 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span>)
-<a name="l00324"></a>00324 __TBB_DECL_ATOMIC(<span class="keywordtype">short</span>)
-<a name="l00325"></a>00325 __TBB_DECL_ATOMIC(<span class="keywordtype">char</span>)
-<a name="l00326"></a>00326 __TBB_DECL_ATOMIC(<span class="keywordtype">signed</span> <span class="keywordtype">char</span>)
-<a name="l00327"></a>00327 __TBB_DECL_ATOMIC(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)
-<a name="l00328"></a>00328 
-<a name="l00329"></a>00329 <span class="preprocessor">#if !defined(_MSC_VER)||defined(_NATIVE_WCHAR_T_DEFINED) </span>
-<a name="l00330"></a>00330 <span class="preprocessor"></span>__TBB_DECL_ATOMIC(<span class="keywordtype">wchar_t</span>)
-<a name="l00331"></a>00331 <span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER||!defined(_NATIVE_WCHAR_T_DEFINED) */</span>
-<a name="l00332"></a>00332 
-<a name="l00334"></a>00334 <span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">struct </span><a class="code" href="a00216.html">atomic</a><T*>: internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T> {
-<a name="l00335"></a>00335     T* operator=( T* rhs ) {
-<a name="l00336"></a>00336         <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
-<a name="l00337"></a>00337         <span class="keywordflow">return</span> this->store_with_release(rhs);
-<a name="l00338"></a>00338     }
-<a name="l00339"></a>00339     <a class="code" href="a00216.html">atomic<T*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00216.html">atomic<T*></a>& rhs ) {
-<a name="l00340"></a>00340         this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00341"></a>00341     }
-<a name="l00342"></a>00342     T* operator->()<span class="keyword"> const </span>{
-<a name="l00343"></a>00343         <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00344"></a>00344     }
-<a name="l00345"></a>00345 };
-<a name="l00346"></a>00346 
-<a name="l00348"></a><a class="code" href="a00217.html">00348</a> <span class="keyword">template</span><> <span class="keyword">struct </span><a class="code" href="a00216.html">atomic</a><void*>: internal::atomic_impl<void*> {
-<a name="l00349"></a>00349     <span class="keywordtype">void</span>* operator=( <span class="keywordtype">void</span>* rhs ) {
-<a name="l00350"></a>00350         <span class="comment">// "this" required here in strict ISO C++ because store_with_release is a dependent name</span>
-<a name="l00351"></a>00351         <span class="keywordflow">return</span> this->store_with_release(rhs);
-<a name="l00352"></a>00352     }
-<a name="l00353"></a>00353     <a class="code" href="a00216.html">atomic<void*></a>& operator=( <span class="keyword">const</span> <a class="code" href="a00216.html">atomic<void*></a>& rhs ) {
-<a name="l00354"></a>00354         this->store_with_release(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00355"></a>00355     }
-<a name="l00356"></a>00356 };
-<a name="l00357"></a>00357 
-<a name="l00358"></a>00358 } <span class="comment">// namespace tbb</span>
-<a name="l00359"></a>00359 
-<a name="l00360"></a>00360 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00361"></a>00361 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
-<a name="l00362"></a>00362 <span class="preprocessor"></span><span class="preprocessor">#endif // warnings 4244, 4267 are back</span>
-<a name="l00363"></a>00363 <span class="preprocessor"></span>
-<a name="l00364"></a>00364 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_atomic_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00418.html b/doc/html/a00412.html
similarity index 76%
copy from doc/html/a00418.html
copy to doc/html/a00412.html
index 8d93ac8..d4d404c 100644
--- a/doc/html/a00418.html
+++ b/doc/html/a00412.html
@@ -49,45 +49,45 @@
 <a name="l00037"></a>00037 
 <a name="l00038"></a>00038 
 <a name="l00039"></a>00039 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00040"></a><a class="code" href="a00221.html">00040</a> <span class="keyword">class </span><a class="code" href="a00221.html">blocked_range</a> {
+<a name="l00040"></a><a class="code" href="a00233.html">00040</a> <span class="keyword">class </span><a class="code" href="a00233.html">blocked_range</a> {
 <a name="l00041"></a>00041 <span class="keyword">public</span>:
 <a name="l00043"></a>00043 
-<a name="l00045"></a><a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">00045</a>     <span class="keyword">typedef</span> Value <a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>;
+<a name="l00045"></a><a class="code" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">00045</a>     <span class="keyword">typedef</span> Value <a class="code" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>;
 <a name="l00046"></a>00046 
-<a name="l00048"></a><a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">00048</a>     <span class="keyword">typedef</span> std::size_t <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>;
+<a name="l00048"></a><a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">00048</a>     <span class="keyword">typedef</span> std::size_t <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>;
 <a name="l00049"></a>00049 
 <a name="l00051"></a>00051 
-<a name="l00052"></a><a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">00052</a>     <a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>() : my_end(), my_begin() {}
+<a name="l00052"></a><a class="code" href="a00233.html#94607755c5110d199202234d58d022ac">00052</a>     <a class="code" href="a00233.html#94607755c5110d199202234d58d022ac">blocked_range</a>() : my_end(), my_begin() {}
 <a name="l00053"></a>00053 
-<a name="l00055"></a><a class="code" href="a00221.html#14795a36ead1414b4371dbe1a4656359">00055</a>     <a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>( Value begin_, Value end_, <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1 ) : 
+<a name="l00055"></a><a class="code" href="a00233.html#14795a36ead1414b4371dbe1a4656359">00055</a>     <a class="code" href="a00233.html#94607755c5110d199202234d58d022ac">blocked_range</a>( Value begin_, Value end_, <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1 ) : 
 <a name="l00056"></a>00056         my_end(end_), my_begin(begin_), my_grainsize(grainsize_) 
 <a name="l00057"></a>00057     {
 <a name="l00058"></a>00058         __TBB_ASSERT( my_grainsize>0, <span class="stringliteral">"grainsize must be positive"</span> );
 <a name="l00059"></a>00059     }
 <a name="l00060"></a>00060 
-<a name="l00062"></a><a class="code" href="a00221.html#18d2258400756ac1446dac7676b18df3">00062</a>     <a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
+<a name="l00062"></a><a class="code" href="a00233.html#18d2258400756ac1446dac7676b18df3">00062</a>     <a class="code" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00233.html#18d2258400756ac1446dac7676b18df3">begin</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
 <a name="l00063"></a>00063 
-<a name="l00065"></a><a class="code" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">00065</a>     <a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
+<a name="l00065"></a><a class="code" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">00065</a>     <a class="code" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
 <a name="l00066"></a>00066 
 <a name="l00068"></a>00068 
-<a name="l00069"></a><a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">00069</a>     <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()<span class="keyword"> const </span>{
-<a name="l00070"></a>00070         __TBB_ASSERT( !(<a class="code" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<<a class="code" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin</a>()), <span class="stringliteral">"size() unspecified if end()<begin()"</span> );
-<a name="l00071"></a>00071         <span class="keywordflow">return</span> <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>(my_end-my_begin);
+<a name="l00069"></a><a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">00069</a>     <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()<span class="keyword"> const </span>{
+<a name="l00070"></a>00070         __TBB_ASSERT( !(<a class="code" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<<a class="code" href="a00233.html#18d2258400756ac1446dac7676b18df3">begin</a>()), <span class="stringliteral">"size() unspecified if end()<begin()"</span> );
+<a name="l00071"></a>00071         <span class="keywordflow">return</span> <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>(my_end-my_begin);
 <a name="l00072"></a>00072     }
 <a name="l00073"></a>00073 
-<a name="l00075"></a><a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">00075</a>     <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
+<a name="l00075"></a><a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">00075</a>     <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
 <a name="l00076"></a>00076 
 <a name="l00077"></a>00077     <span class="comment">//------------------------------------------------------------------------</span>
 <a name="l00078"></a>00078     <span class="comment">// Methods that implement Range concept</span>
 <a name="l00079"></a>00079     <span class="comment">//------------------------------------------------------------------------</span>
 <a name="l00080"></a>00080 
-<a name="l00082"></a><a class="code" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">00082</a>     <span class="keywordtype">bool</span> <a class="code" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !(my_begin<my_end);}
+<a name="l00082"></a><a class="code" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">00082</a>     <span class="keywordtype">bool</span> <a class="code" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !(my_begin<my_end);}
 <a name="l00083"></a>00083 
 <a name="l00085"></a>00085 
-<a name="l00086"></a><a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">00086</a>     <span class="keywordtype">bool</span> <a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize<<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>();}
+<a name="l00086"></a><a class="code" href="a00233.html#41a58b703d574b6e1ca155df3576f578">00086</a>     <span class="keywordtype">bool</span> <a class="code" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize<<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>();}
 <a name="l00087"></a>00087 
 <a name="l00089"></a>00089 
-<a name="l00091"></a><a class="code" href="a00221.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">00091</a>     <a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>( <a class="code" href="a00221.html">blocked_range</a>& r, <a class="code" href="a00290.html">split</a> ) : 
+<a name="l00091"></a><a class="code" href="a00233.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">00091</a>     <a class="code" href="a00233.html#94607755c5110d199202234d58d022ac">blocked_range</a>( <a class="code" href="a00233.html">blocked_range</a>& r, <a class="code" href="a00309.html">split</a> ) : 
 <a name="l00092"></a>00092         my_end(r.my_end),
 <a name="l00093"></a>00093         my_begin(do_split(r)),
 <a name="l00094"></a>00094         my_grainsize(r.my_grainsize)
@@ -96,13 +96,13 @@
 <a name="l00097"></a>00097 <span class="keyword">private</span>:
 <a name="l00099"></a>00099     Value my_end;
 <a name="l00100"></a>00100     Value my_begin;
-<a name="l00101"></a>00101     <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> my_grainsize;
+<a name="l00101"></a>00101     <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> my_grainsize;
 <a name="l00102"></a>00102 
 <a name="l00104"></a>00104 
-<a name="l00105"></a>00105     <span class="keyword">static</span> Value do_split( <a class="code" href="a00221.html">blocked_range</a>& r ) {
-<a name="l00106"></a>00106         __TBB_ASSERT( r.<a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>(), <span class="stringliteral">"cannot split blocked_range that is not divisible"</span> );
-<a name="l00107"></a>00107         Value middle = r.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> + (r.<a class="code" href="a00221.html#1ec95c8988b50064dd603998b16f3930">my_end</a>-r.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a>)/2u;
-<a name="l00108"></a>00108         r.<a class="code" href="a00221.html#1ec95c8988b50064dd603998b16f3930">my_end</a> = middle;
+<a name="l00105"></a>00105     <span class="keyword">static</span> Value do_split( <a class="code" href="a00233.html">blocked_range</a>& r ) {
+<a name="l00106"></a>00106         __TBB_ASSERT( r.<a class="code" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>(), <span class="stringliteral">"cannot split blocked_range that is not divisible"</span> );
+<a name="l00107"></a>00107         Value middle = r.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> + (r.<a class="code" href="a00233.html#1ec95c8988b50064dd603998b16f3930">my_end</a>-r.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a>)/2u;
+<a name="l00108"></a>00108         r.<a class="code" href="a00233.html#1ec95c8988b50064dd603998b16f3930">my_end</a> = middle;
 <a name="l00109"></a>00109         <span class="keywordflow">return</span> middle;
 <a name="l00110"></a>00110     }
 <a name="l00111"></a>00111 
diff --git a/doc/html/a00419.html b/doc/html/a00413.html
similarity index 76%
rename from doc/html/a00419.html
rename to doc/html/a00413.html
index 92ed076..286df5b 100644
--- a/doc/html/a00419.html
+++ b/doc/html/a00413.html
@@ -49,54 +49,54 @@
 <a name="l00028"></a>00028 
 <a name="l00030"></a>00030 
 <a name="l00031"></a>00031 <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue=RowValue>
-<a name="l00032"></a><a class="code" href="a00222.html">00032</a> <span class="keyword">class </span><a class="code" href="a00222.html">blocked_range2d</a> {
+<a name="l00032"></a><a class="code" href="a00234.html">00032</a> <span class="keyword">class </span><a class="code" href="a00234.html">blocked_range2d</a> {
 <a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00222.html#a807a22fe658ec38b8edfd69521d0383">00035</a>     <span class="keyword">typedef</span> <a class="code" href="a00221.html">blocked_range<RowValue></a> <a class="code" href="a00221.html">row_range_type</a>;
-<a name="l00036"></a>00036     <span class="keyword">typedef</span> <a class="code" href="a00221.html">blocked_range<ColValue></a> <a class="code" href="a00221.html">col_range_type</a>;
+<a name="l00035"></a><a class="code" href="a00234.html#a807a22fe658ec38b8edfd69521d0383">00035</a>     <span class="keyword">typedef</span> <a class="code" href="a00233.html">blocked_range<RowValue></a> <a class="code" href="a00233.html">row_range_type</a>;
+<a name="l00036"></a>00036     <span class="keyword">typedef</span> <a class="code" href="a00233.html">blocked_range<ColValue></a> <a class="code" href="a00233.html">col_range_type</a>;
 <a name="l00037"></a>00037  
 <a name="l00038"></a>00038 <span class="keyword">private</span>:
-<a name="l00039"></a>00039     <a class="code" href="a00221.html">row_range_type</a> my_rows;
-<a name="l00040"></a>00040     <a class="code" href="a00221.html">col_range_type</a> my_cols;
+<a name="l00039"></a>00039     <a class="code" href="a00233.html">row_range_type</a> my_rows;
+<a name="l00040"></a>00040     <a class="code" href="a00233.html">col_range_type</a> my_cols;
 <a name="l00041"></a>00041 
 <a name="l00042"></a>00042 <span class="keyword">public</span>:
 <a name="l00043"></a>00043 
-<a name="l00044"></a>00044     <a class="code" href="a00222.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end, <span class="keyword">typename</span> <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize,
-<a name="l00045"></a>00045                      ColValue col_begin, ColValue col_end, <span class="keyword">typename</span> <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) : 
+<a name="l00044"></a>00044     <a class="code" href="a00234.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end, <span class="keyword">typename</span> <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize,
+<a name="l00045"></a>00045                      ColValue col_begin, ColValue col_end, <span class="keyword">typename</span> <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) : 
 <a name="l00046"></a>00046         my_rows(row_begin,row_end,row_grainsize),
 <a name="l00047"></a>00047         my_cols(col_begin,col_end,col_grainsize)
 <a name="l00048"></a>00048     {
 <a name="l00049"></a>00049     }
 <a name="l00050"></a>00050 
-<a name="l00051"></a>00051     <a class="code" href="a00222.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end,
+<a name="l00051"></a>00051     <a class="code" href="a00234.html">blocked_range2d</a>( RowValue row_begin, RowValue row_end,
 <a name="l00052"></a>00052                      ColValue col_begin, ColValue col_end ) : 
 <a name="l00053"></a>00053         my_rows(row_begin,row_end),
 <a name="l00054"></a>00054         my_cols(col_begin,col_end)
 <a name="l00055"></a>00055     {
 <a name="l00056"></a>00056     }
 <a name="l00057"></a>00057 
-<a name="l00059"></a><a class="code" href="a00222.html#d144cb2d88cef553420311aca8667a44">00059</a>     <span class="keywordtype">bool</span> <a class="code" href="a00222.html#d144cb2d88cef553420311aca8667a44">empty</a>()<span class="keyword"> const </span>{
+<a name="l00059"></a><a class="code" href="a00234.html#d144cb2d88cef553420311aca8667a44">00059</a>     <span class="keywordtype">bool</span> <a class="code" href="a00234.html#d144cb2d88cef553420311aca8667a44">empty</a>()<span class="keyword"> const </span>{
 <a name="l00060"></a>00060         <span class="comment">// Yes, it is a logical OR here, not AND.</span>
-<a name="l00061"></a>00061         <span class="keywordflow">return</span> my_rows.<a class="code" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
+<a name="l00061"></a>00061         <span class="keywordflow">return</span> my_rows.<a class="code" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
 <a name="l00062"></a>00062     }
 <a name="l00063"></a>00063 
-<a name="l00065"></a><a class="code" href="a00222.html#ad36a9b38e4fef26d376f99552ce2d92">00065</a>     <span class="keywordtype">bool</span> <a class="code" href="a00222.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>()<span class="keyword"> const </span>{
-<a name="l00066"></a>00066         <span class="keywordflow">return</span> my_rows.<a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
+<a name="l00065"></a><a class="code" href="a00234.html#ad36a9b38e4fef26d376f99552ce2d92">00065</a>     <span class="keywordtype">bool</span> <a class="code" href="a00234.html#ad36a9b38e4fef26d376f99552ce2d92">is_divisible</a>()<span class="keyword"> const </span>{
+<a name="l00066"></a>00066         <span class="keywordflow">return</span> my_rows.<a class="code" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
 <a name="l00067"></a>00067     }
 <a name="l00068"></a>00068 
-<a name="l00069"></a>00069     <a class="code" href="a00222.html">blocked_range2d</a>( <a class="code" href="a00222.html">blocked_range2d</a>& r, <a class="code" href="a00290.html">split</a> ) : 
+<a name="l00069"></a>00069     <a class="code" href="a00234.html">blocked_range2d</a>( <a class="code" href="a00234.html">blocked_range2d</a>& r, <a class="code" href="a00309.html">split</a> ) : 
 <a name="l00070"></a>00070         my_rows(r.my_rows),
 <a name="l00071"></a>00071         my_cols(r.my_cols)
 <a name="l00072"></a>00072     {
-<a name="l00073"></a>00073         <span class="keywordflow">if</span>( my_rows.<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00074"></a>00074             my_cols.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00222.html#9837bbaabc5836741fde79512ea1131d">my_cols</a>);
+<a name="l00073"></a>00073         <span class="keywordflow">if</span>( my_rows.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00074"></a>00074             my_cols.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00234.html#9837bbaabc5836741fde79512ea1131d">my_cols</a>);
 <a name="l00075"></a>00075         } <span class="keywordflow">else</span> {
-<a name="l00076"></a>00076             my_rows.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00222.html#4be7c7b39da256afe9c67be735b6f788">my_rows</a>);
+<a name="l00076"></a>00076             my_rows.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00234.html#4be7c7b39da256afe9c67be735b6f788">my_rows</a>);
 <a name="l00077"></a>00077         }
 <a name="l00078"></a>00078     }
 <a name="l00079"></a>00079 
-<a name="l00081"></a><a class="code" href="a00222.html#f496e7348a82652fba581203477cc07c">00081</a>     <span class="keyword">const</span> <a class="code" href="a00221.html">row_range_type</a>& <a class="code" href="a00222.html#f496e7348a82652fba581203477cc07c">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
+<a name="l00081"></a><a class="code" href="a00234.html#f496e7348a82652fba581203477cc07c">00081</a>     <span class="keyword">const</span> <a class="code" href="a00233.html">row_range_type</a>& <a class="code" href="a00234.html#f496e7348a82652fba581203477cc07c">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
 <a name="l00082"></a>00082 
-<a name="l00084"></a><a class="code" href="a00222.html#392a46759af2c884957115771affa7f4">00084</a>     <span class="keyword">const</span> <a class="code" href="a00221.html">col_range_type</a>& <a class="code" href="a00222.html#392a46759af2c884957115771affa7f4">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
+<a name="l00084"></a><a class="code" href="a00234.html#392a46759af2c884957115771affa7f4">00084</a>     <span class="keyword">const</span> <a class="code" href="a00233.html">col_range_type</a>& <a class="code" href="a00234.html#392a46759af2c884957115771affa7f4">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
 <a name="l00085"></a>00085 };
 <a name="l00086"></a>00086 
 <a name="l00087"></a>00087 } <span class="comment">// namespace tbb </span>
diff --git a/doc/html/a00420.html b/doc/html/a00414.html
similarity index 71%
rename from doc/html/a00420.html
rename to doc/html/a00414.html
index 19b0f7b..2816ac7 100644
--- a/doc/html/a00420.html
+++ b/doc/html/a00414.html
@@ -49,20 +49,20 @@
 <a name="l00028"></a>00028 
 <a name="l00030"></a>00030 
 <a name="l00031"></a>00031 <span class="keyword">template</span><<span class="keyword">typename</span> PageValue, <span class="keyword">typename</span> RowValue=PageValue, <span class="keyword">typename</span> ColValue=RowValue>
-<a name="l00032"></a><a class="code" href="a00223.html">00032</a> <span class="keyword">class </span><a class="code" href="a00223.html">blocked_range3d</a> {
+<a name="l00032"></a><a class="code" href="a00235.html">00032</a> <span class="keyword">class </span><a class="code" href="a00235.html">blocked_range3d</a> {
 <a name="l00033"></a>00033 <span class="keyword">public</span>:
-<a name="l00035"></a><a class="code" href="a00223.html#b8ebf17a552ba47825e9b3887855b719">00035</a>     <span class="keyword">typedef</span> <a class="code" href="a00221.html">blocked_range<PageValue></a> <a class="code" href="a00221.html">page_range_type</a>;
-<a name="l00036"></a>00036     <span class="keyword">typedef</span> <a class="code" href="a00221.html">blocked_range<RowValue></a>  <a class="code" href="a00221.html">row_range_type</a>;
-<a name="l00037"></a>00037     <span class="keyword">typedef</span> <a class="code" href="a00221.html">blocked_range<ColValue></a>  <a class="code" href="a00221.html">col_range_type</a>;
+<a name="l00035"></a><a class="code" href="a00235.html#b8ebf17a552ba47825e9b3887855b719">00035</a>     <span class="keyword">typedef</span> <a class="code" href="a00233.html">blocked_range<PageValue></a> <a class="code" href="a00233.html">page_range_type</a>;
+<a name="l00036"></a>00036     <span class="keyword">typedef</span> <a class="code" href="a00233.html">blocked_range<RowValue></a>  <a class="code" href="a00233.html">row_range_type</a>;
+<a name="l00037"></a>00037     <span class="keyword">typedef</span> <a class="code" href="a00233.html">blocked_range<ColValue></a>  <a class="code" href="a00233.html">col_range_type</a>;
 <a name="l00038"></a>00038  
 <a name="l00039"></a>00039 <span class="keyword">private</span>:
-<a name="l00040"></a>00040     <a class="code" href="a00221.html">page_range_type</a> my_pages;
-<a name="l00041"></a>00041     <a class="code" href="a00221.html">row_range_type</a>  my_rows;
-<a name="l00042"></a>00042     <a class="code" href="a00221.html">col_range_type</a>  my_cols;
+<a name="l00040"></a>00040     <a class="code" href="a00233.html">page_range_type</a> my_pages;
+<a name="l00041"></a>00041     <a class="code" href="a00233.html">row_range_type</a>  my_rows;
+<a name="l00042"></a>00042     <a class="code" href="a00233.html">col_range_type</a>  my_cols;
 <a name="l00043"></a>00043 
 <a name="l00044"></a>00044 <span class="keyword">public</span>:
 <a name="l00045"></a>00045 
-<a name="l00046"></a>00046     <a class="code" href="a00223.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end,
+<a name="l00046"></a>00046     <a class="code" href="a00235.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end,
 <a name="l00047"></a>00047                      RowValue  row_begin,  RowValue row_end,
 <a name="l00048"></a>00048                      ColValue  col_begin,  ColValue col_end ) : 
 <a name="l00049"></a>00049         my_pages(page_begin,page_end),
@@ -71,49 +71,49 @@
 <a name="l00052"></a>00052     {
 <a name="l00053"></a>00053     }
 <a name="l00054"></a>00054 
-<a name="l00055"></a>00055     <a class="code" href="a00223.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end, <span class="keyword">typename</span> <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize, 
-<a name="l00056"></a>00056                      RowValue  row_begin,  RowValue row_end,   <span class="keyword">typename</span> <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize,
-<a name="l00057"></a>00057                      ColValue  col_begin,  ColValue col_end,   <span class="keyword">typename</span> <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) :  
+<a name="l00055"></a>00055     <a class="code" href="a00235.html">blocked_range3d</a>( PageValue page_begin, PageValue page_end, <span class="keyword">typename</span> <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">page_range_type::size_type</a> page_grainsize, 
+<a name="l00056"></a>00056                      RowValue  row_begin,  RowValue row_end,   <span class="keyword">typename</span> <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">row_range_type::size_type</a> row_grainsize,
+<a name="l00057"></a>00057                      ColValue  col_begin,  ColValue col_end,   <span class="keyword">typename</span> <a class="code" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">col_range_type::size_type</a> col_grainsize ) :  
 <a name="l00058"></a>00058         my_pages(page_begin,page_end,page_grainsize),
 <a name="l00059"></a>00059         my_rows(row_begin,row_end,row_grainsize),
 <a name="l00060"></a>00060         my_cols(col_begin,col_end,col_grainsize)
 <a name="l00061"></a>00061     {
 <a name="l00062"></a>00062     }
 <a name="l00063"></a>00063 
-<a name="l00065"></a><a class="code" href="a00223.html#356860e1c977d91711e8216bd55c0b25">00065</a>     <span class="keywordtype">bool</span> <a class="code" href="a00223.html#356860e1c977d91711e8216bd55c0b25">empty</a>()<span class="keyword"> const </span>{
+<a name="l00065"></a><a class="code" href="a00235.html#356860e1c977d91711e8216bd55c0b25">00065</a>     <span class="keywordtype">bool</span> <a class="code" href="a00235.html#356860e1c977d91711e8216bd55c0b25">empty</a>()<span class="keyword"> const </span>{
 <a name="l00066"></a>00066         <span class="comment">// Yes, it is a logical OR here, not AND.</span>
-<a name="l00067"></a>00067         <span class="keywordflow">return</span> my_pages.<a class="code" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_rows.<a class="code" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
+<a name="l00067"></a>00067         <span class="keywordflow">return</span> my_pages.<a class="code" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_rows.<a class="code" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>() || my_cols.<a class="code" href="a00233.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>();
 <a name="l00068"></a>00068     }
 <a name="l00069"></a>00069 
-<a name="l00071"></a><a class="code" href="a00223.html#39d69191721c488e737ae5d9c5336b9c">00071</a>     <span class="keywordtype">bool</span> <a class="code" href="a00223.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>()<span class="keyword"> const </span>{
-<a name="l00072"></a>00072         <span class="keywordflow">return</span>  my_pages.<a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_rows.<a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
+<a name="l00071"></a><a class="code" href="a00235.html#39d69191721c488e737ae5d9c5336b9c">00071</a>     <span class="keywordtype">bool</span> <a class="code" href="a00235.html#39d69191721c488e737ae5d9c5336b9c">is_divisible</a>()<span class="keyword"> const </span>{
+<a name="l00072"></a>00072         <span class="keywordflow">return</span>  my_pages.<a class="code" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_rows.<a class="code" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>() || my_cols.<a class="code" href="a00233.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>();
 <a name="l00073"></a>00073     }
 <a name="l00074"></a>00074 
-<a name="l00075"></a>00075     <a class="code" href="a00223.html">blocked_range3d</a>( <a class="code" href="a00223.html">blocked_range3d</a>& r, <a class="code" href="a00290.html">split</a> ) : 
+<a name="l00075"></a>00075     <a class="code" href="a00235.html">blocked_range3d</a>( <a class="code" href="a00235.html">blocked_range3d</a>& r, <a class="code" href="a00309.html">split</a> ) : 
 <a name="l00076"></a>00076         my_pages(r.my_pages),
 <a name="l00077"></a>00077         my_rows(r.my_rows),
 <a name="l00078"></a>00078         my_cols(r.my_cols)
 <a name="l00079"></a>00079     {
-<a name="l00080"></a>00080         <span class="keywordflow">if</span>( my_pages.<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_rows.<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00081"></a>00081             <span class="keywordflow">if</span> ( my_rows.<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00082"></a>00082                 my_cols.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00223.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
+<a name="l00080"></a>00080         <span class="keywordflow">if</span>( my_pages.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_rows.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00081"></a>00081             <span class="keywordflow">if</span> ( my_rows.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_rows.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00082"></a>00082                 my_cols.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00235.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
 <a name="l00083"></a>00083             } <span class="keywordflow">else</span> {
-<a name="l00084"></a>00084                 my_rows.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00223.html#76ead25c280ef630b88a1c8846471707">my_rows</a>);
+<a name="l00084"></a>00084                 my_rows.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = row_range_type::do_split(r.<a class="code" href="a00235.html#76ead25c280ef630b88a1c8846471707">my_rows</a>);
 <a name="l00085"></a>00085             }
 <a name="l00086"></a>00086         } <span class="keywordflow">else</span> {
-<a name="l00087"></a>00087             <span class="keywordflow">if</span> ( my_pages.<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
-<a name="l00088"></a>00088                 my_cols.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00223.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
+<a name="l00087"></a>00087             <span class="keywordflow">if</span> ( my_pages.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_cols.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) < my_cols.<a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()*double(my_pages.<a class="code" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()) ) {
+<a name="l00088"></a>00088                 my_cols.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = col_range_type::do_split(r.<a class="code" href="a00235.html#ef7143ddf8f5b1265b5a6d05be00cde5">my_cols</a>);
 <a name="l00089"></a>00089             } <span class="keywordflow">else</span> {
-<a name="l00090"></a>00090                     my_pages.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = page_range_type::do_split(r.<a class="code" href="a00223.html#b18ae46a01d42745078d9e287ab87baa">my_pages</a>);
+<a name="l00090"></a>00090                     my_pages.<a class="code" href="a00233.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> = page_range_type::do_split(r.<a class="code" href="a00235.html#b18ae46a01d42745078d9e287ab87baa">my_pages</a>);
 <a name="l00091"></a>00091             }
 <a name="l00092"></a>00092         }
 <a name="l00093"></a>00093     }
 <a name="l00094"></a>00094 
-<a name="l00096"></a><a class="code" href="a00223.html#cf971430aa12361d3ed245344b7c6764">00096</a>     <span class="keyword">const</span> <a class="code" href="a00221.html">page_range_type</a>& <a class="code" href="a00223.html#cf971430aa12361d3ed245344b7c6764">pages</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_pages;}
+<a name="l00096"></a><a class="code" href="a00235.html#cf971430aa12361d3ed245344b7c6764">00096</a>     <span class="keyword">const</span> <a class="code" href="a00233.html">page_range_type</a>& <a class="code" href="a00235.html#cf971430aa12361d3ed245344b7c6764">pages</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_pages;}
 <a name="l00097"></a>00097 
-<a name="l00099"></a><a class="code" href="a00223.html#1584623e59ff32a8aa82006827508be4">00099</a>     <span class="keyword">const</span> <a class="code" href="a00221.html">row_range_type</a>& <a class="code" href="a00223.html#1584623e59ff32a8aa82006827508be4">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
+<a name="l00099"></a><a class="code" href="a00235.html#1584623e59ff32a8aa82006827508be4">00099</a>     <span class="keyword">const</span> <a class="code" href="a00233.html">row_range_type</a>& <a class="code" href="a00235.html#1584623e59ff32a8aa82006827508be4">rows</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_rows;}
 <a name="l00100"></a>00100 
-<a name="l00102"></a><a class="code" href="a00223.html#3336ba9480fd6c43e158f9beb024c050">00102</a>     <span class="keyword">const</span> <a class="code" href="a00221.html">col_range_type</a>& <a class="code" href="a00223.html#3336ba9480fd6c43e158f9beb024c050">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
+<a name="l00102"></a><a class="code" href="a00235.html#3336ba9480fd6c43e158f9beb024c050">00102</a>     <span class="keyword">const</span> <a class="code" href="a00233.html">col_range_type</a>& <a class="code" href="a00235.html#3336ba9480fd6c43e158f9beb024c050">cols</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_cols;}
 <a name="l00103"></a>00103 
 <a name="l00104"></a>00104 };
 <a name="l00105"></a>00105 
diff --git a/doc/html/a00421.html b/doc/html/a00415.html
similarity index 88%
rename from doc/html/a00421.html
rename to doc/html/a00415.html
index ed92d3f..ddaf487 100644
--- a/doc/html/a00421.html
+++ b/doc/html/a00415.html
@@ -66,7 +66,7 @@
 <a name="l00051"></a>00051 <span class="preprocessor"></span>
 <a name="l00053"></a>00053 
 <a name="l00056"></a>00056 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00057"></a><a class="code" href="a00226.html">00057</a> <span class="keyword">class </span><a class="code" href="a00226.html">cache_aligned_allocator</a> {
+<a name="l00057"></a><a class="code" href="a00238.html">00057</a> <span class="keyword">class </span><a class="code" href="a00238.html">cache_aligned_allocator</a> {
 <a name="l00058"></a>00058 <span class="keyword">public</span>:
 <a name="l00059"></a>00059     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
 <a name="l00060"></a>00060     <span class="keyword">typedef</span> value_type* pointer;
@@ -76,32 +76,32 @@
 <a name="l00064"></a>00064     <span class="keyword">typedef</span> size_t size_type;
 <a name="l00065"></a>00065     <span class="keyword">typedef</span> ptrdiff_t difference_type;
 <a name="l00066"></a>00066     <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00067"></a>00067         <span class="keyword">typedef</span> <a class="code" href="a00226.html">cache_aligned_allocator<U></a> other;
+<a name="l00067"></a>00067         <span class="keyword">typedef</span> <a class="code" href="a00238.html">cache_aligned_allocator<U></a> other;
 <a name="l00068"></a>00068     };
 <a name="l00069"></a>00069 
-<a name="l00070"></a>00070     <a class="code" href="a00226.html">cache_aligned_allocator</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00071"></a>00071     <a class="code" href="a00226.html">cache_aligned_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00226.html">cache_aligned_allocator</a>& ) <span class="keywordflow">throw</span>() {}
-<a name="l00072"></a>00072     <span class="keyword">template</span><<span class="keyword">typename</span> U> <a class="code" href="a00226.html">cache_aligned_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00226.html">cache_aligned_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
+<a name="l00070"></a>00070     <a class="code" href="a00238.html">cache_aligned_allocator</a>() <span class="keywordflow">throw</span>() {}
+<a name="l00071"></a>00071     <a class="code" href="a00238.html">cache_aligned_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00238.html">cache_aligned_allocator</a>& ) <span class="keywordflow">throw</span>() {}
+<a name="l00072"></a>00072     <span class="keyword">template</span><<span class="keyword">typename</span> U> <a class="code" href="a00238.html">cache_aligned_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00238.html">cache_aligned_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
 <a name="l00073"></a>00073 
 <a name="l00074"></a>00074     pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
 <a name="l00075"></a>00075     const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
 <a name="l00076"></a>00076     
-<a name="l00078"></a><a class="code" href="a00226.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">00078</a>     pointer <a class="code" href="a00226.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* hint=0 ) {
+<a name="l00078"></a><a class="code" href="a00238.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">00078</a>     pointer <a class="code" href="a00238.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* hint=0 ) {
 <a name="l00079"></a>00079         <span class="comment">// The "hint" argument is always ignored in NFS_Allocate thus const_cast shouldn't hurt</span>
 <a name="l00080"></a>00080         <span class="keywordflow">return</span> pointer(internal::NFS_Allocate( n, <span class="keyword">sizeof</span>(value_type), const_cast<void*>(hint) ));
 <a name="l00081"></a>00081     }
 <a name="l00082"></a>00082 
-<a name="l00084"></a><a class="code" href="a00226.html#3d4eadf188f7d85d3805ae534e0b8e1c">00084</a>     <span class="keywordtype">void</span> <a class="code" href="a00226.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( pointer p, size_type ) {
+<a name="l00084"></a><a class="code" href="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">00084</a>     <span class="keywordtype">void</span> <a class="code" href="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( pointer p, size_type ) {
 <a name="l00085"></a>00085         internal::NFS_Free(p);
 <a name="l00086"></a>00086     }
 <a name="l00087"></a>00087 
-<a name="l00089"></a><a class="code" href="a00226.html#fb23b687b4c0429dab4c7f8017266cf0">00089</a>     size_type <a class="code" href="a00226.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const throw() {
+<a name="l00089"></a><a class="code" href="a00238.html#fb23b687b4c0429dab4c7f8017266cf0">00089</a>     size_type <a class="code" href="a00238.html#fb23b687b4c0429dab4c7f8017266cf0">max_size</a>() const throw() {
 <a name="l00090"></a>00090         <span class="keywordflow">return</span> (~size_t(0)-internal::NFS_MaxLineSize)/<span class="keyword">sizeof</span>(value_type);
 <a name="l00091"></a>00091     }
 <a name="l00092"></a>00092 
-<a name="l00094"></a><a class="code" href="a00226.html#958ee8745c86c275bfc9533af565e017">00094</a>     <span class="keywordtype">void</span> <a class="code" href="a00226.html#958ee8745c86c275bfc9533af565e017">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
+<a name="l00094"></a><a class="code" href="a00238.html#958ee8745c86c275bfc9533af565e017">00094</a>     <span class="keywordtype">void</span> <a class="code" href="a00238.html#958ee8745c86c275bfc9533af565e017">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
 <a name="l00095"></a>00095 
-<a name="l00097"></a><a class="code" href="a00226.html#cd298895a4f1654b5149ec84b591ecb5">00097</a>     <span class="keywordtype">void</span> <a class="code" href="a00226.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>( pointer p ) {p->~value_type();}
+<a name="l00097"></a><a class="code" href="a00238.html#cd298895a4f1654b5149ec84b591ecb5">00097</a>     <span class="keywordtype">void</span> <a class="code" href="a00238.html#cd298895a4f1654b5149ec84b591ecb5">destroy</a>( pointer p ) {p->~value_type();}
 <a name="l00098"></a>00098 };
 <a name="l00099"></a>00099 
 <a name="l00100"></a>00100 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
@@ -110,18 +110,18 @@
 <a name="l00103"></a>00103 <span class="preprocessor"></span>
 <a name="l00105"></a>00105 
 <a name="l00106"></a>00106 <span class="keyword">template</span><> 
-<a name="l00107"></a><a class="code" href="a00227.html">00107</a> <span class="keyword">class </span><a class="code" href="a00226.html">cache_aligned_allocator</a><void> {
+<a name="l00107"></a><a class="code" href="a00239.html">00107</a> <span class="keyword">class </span><a class="code" href="a00238.html">cache_aligned_allocator</a><void> {
 <a name="l00108"></a>00108 <span class="keyword">public</span>:
 <a name="l00109"></a>00109     <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
 <a name="l00110"></a>00110     <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
 <a name="l00111"></a>00111     <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
 <a name="l00112"></a>00112     <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00113"></a>00113         <span class="keyword">typedef</span> <a class="code" href="a00226.html">cache_aligned_allocator<U></a> other;
+<a name="l00113"></a>00113         <span class="keyword">typedef</span> <a class="code" href="a00238.html">cache_aligned_allocator<U></a> other;
 <a name="l00114"></a>00114     };
 <a name="l00115"></a>00115 };
 <a name="l00116"></a>00116 
 <a name="l00117"></a>00117 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00118"></a>00118 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00226.html">cache_aligned_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00226.html">cache_aligned_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
+<a name="l00118"></a>00118 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00238.html">cache_aligned_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00238.html">cache_aligned_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
 <a name="l00119"></a>00119 
 <a name="l00120"></a>00120 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
 <a name="l00121"></a>00121 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> cache_aligned_allocator<T>&, <span class="keyword">const</span> cache_aligned_allocator<U>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
diff --git a/doc/html/a00423.html b/doc/html/a00417.html
similarity index 92%
rename from doc/html/a00423.html
rename to doc/html/a00417.html
index a836bb6..f2e13e5 100644
--- a/doc/html/a00423.html
+++ b/doc/html/a00417.html
@@ -49,24 +49,24 @@
 <a name="l00031"></a>00031 
 <a name="l00032"></a>00032 
 <a name="l00033"></a>00033     <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00034"></a><a class="code" href="a00229.html">00034</a>         <span class="keyword">class </span><a class="code" href="a00229.html">combinable</a> {
+<a name="l00034"></a><a class="code" href="a00241.html">00034</a>         <span class="keyword">class </span><a class="code" href="a00241.html">combinable</a> {
 <a name="l00035"></a>00035     <span class="keyword">private</span>:
-<a name="l00036"></a>00036         <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00226.html">tbb::cache_aligned_allocator<T></a> <a class="code" href="a00226.html">my_alloc</a>;
+<a name="l00036"></a>00036         <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00238.html">tbb::cache_aligned_allocator<T></a> <a class="code" href="a00238.html">my_alloc</a>;
 <a name="l00037"></a>00037 
 <a name="l00038"></a>00038         <span class="keyword">typedef</span> <span class="keyword">typename</span> tbb::enumerable_thread_specific<T, my_alloc, ets_no_key> my_ets_type;
 <a name="l00039"></a>00039         my_ets_type my_ets; 
 <a name="l00040"></a>00040  
 <a name="l00041"></a>00041     <span class="keyword">public</span>:
 <a name="l00042"></a>00042 
-<a name="l00043"></a>00043         <a class="code" href="a00229.html">combinable</a>() { }
+<a name="l00043"></a>00043         <a class="code" href="a00241.html">combinable</a>() { }
 <a name="l00044"></a>00044 
 <a name="l00045"></a>00045         <span class="keyword">template</span> <<span class="keyword">typename</span> finit>
-<a name="l00046"></a>00046         <a class="code" href="a00229.html">combinable</a>( finit _finit) : my_ets(_finit) { }
+<a name="l00046"></a>00046         <a class="code" href="a00241.html">combinable</a>( finit _finit) : my_ets(_finit) { }
 <a name="l00047"></a>00047 
-<a name="l00049"></a><a class="code" href="a00229.html#2c87e79ae98588a5780f708773388843">00049</a>         <a class="code" href="a00229.html#2c87e79ae98588a5780f708773388843">~combinable</a>() { 
+<a name="l00049"></a><a class="code" href="a00241.html#2c87e79ae98588a5780f708773388843">00049</a>         <a class="code" href="a00241.html#2c87e79ae98588a5780f708773388843">~combinable</a>() { 
 <a name="l00050"></a>00050         }
 <a name="l00051"></a>00051 
-<a name="l00052"></a>00052         <a class="code" href="a00229.html">combinable</a>(<span class="keyword">const</span> <a class="code" href="a00229.html">combinable</a>& other) : my_ets(other.my_ets) { }
+<a name="l00052"></a>00052         <a class="code" href="a00241.html">combinable</a>(<span class="keyword">const</span> <a class="code" href="a00241.html">combinable</a>& other) : my_ets(other.my_ets) { }
 <a name="l00053"></a>00053 
 <a name="l00054"></a>00054         combinable & operator=( <span class="keyword">const</span> combinable & other) { my_ets = other.my_ets; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
 <a name="l00055"></a>00055 
diff --git a/doc/html/a00418.html b/doc/html/a00418.html
index 8d93ac8..9e50f24 100644
--- a/doc/html/a00418.html
+++ b/doc/html/a00418.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>blocked_range.h Source File</title>
+<title>concurrent_hash_map.h Source File</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -19,7 +19,7 @@
     <li><a href="files.html"><span>File List</span></a></li>
     <li><a href="globals.html"><span>File Members</span></a></li>
   </ul></div>
-<h1>blocked_range.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>concurrent_hash_map.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
 <a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
 <a name="l00003"></a>00003 <span class="comment"></span>
 <a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
@@ -39,83 +39,1175 @@
 <a name="l00018"></a>00018 <span class="comment">    writing.</span>
 <a name="l00019"></a>00019 <span class="comment">*/</span>
 <a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_blocked_range_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_blocked_range_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_hash_map_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_hash_map_H</span>
 <a name="l00023"></a>00023 <span class="preprocessor"></span>
 <a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
 <a name="l00025"></a>00025 
-<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
-<a name="l00027"></a>00027 
-<a name="l00037"></a>00037 
-<a name="l00038"></a>00038 
-<a name="l00039"></a>00039 <span class="keyword">template</span><<span class="keyword">typename</span> Value>
-<a name="l00040"></a><a class="code" href="a00221.html">00040</a> <span class="keyword">class </span><a class="code" href="a00221.html">blocked_range</a> {
-<a name="l00041"></a>00041 <span class="keyword">public</span>:
-<a name="l00043"></a>00043 
-<a name="l00045"></a><a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">00045</a>     <span class="keyword">typedef</span> Value <a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a>;
-<a name="l00046"></a>00046 
-<a name="l00048"></a><a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">00048</a>     <span class="keyword">typedef</span> std::size_t <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>;
-<a name="l00049"></a>00049 
-<a name="l00051"></a>00051 
-<a name="l00052"></a><a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">00052</a>     <a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>() : my_end(), my_begin() {}
-<a name="l00053"></a>00053 
-<a name="l00055"></a><a class="code" href="a00221.html#14795a36ead1414b4371dbe1a4656359">00055</a>     <a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>( Value begin_, Value end_, <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> grainsize_=1 ) : 
-<a name="l00056"></a>00056         my_end(end_), my_begin(begin_), my_grainsize(grainsize_) 
-<a name="l00057"></a>00057     {
-<a name="l00058"></a>00058         __TBB_ASSERT( my_grainsize>0, <span class="stringliteral">"grainsize must be positive"</span> );
-<a name="l00059"></a>00059     }
-<a name="l00060"></a>00060 
-<a name="l00062"></a><a class="code" href="a00221.html#18d2258400756ac1446dac7676b18df3">00062</a>     <a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
+<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span>    <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
+<a name="l00028"></a>00028 <span class="preprocessor">    #pragma warning (push)</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4530)</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include <iterator></span>
+<a name="l00033"></a>00033 <span class="preprocessor">#include <utility></span>      <span class="comment">// Need std::pair</span>
+<a name="l00034"></a>00034 <span class="preprocessor">#include <cstring></span>      <span class="comment">// Need std::memset</span>
+<a name="l00035"></a>00035 
+<a name="l00036"></a>00036 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
+<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span>
+<a name="l00040"></a>00040 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
+<a name="l00041"></a>00041 <span class="preprocessor">#include "tbb_allocator.h"</span>
+<a name="l00042"></a>00042 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
+<a name="l00043"></a>00043 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00044"></a>00044 <span class="preprocessor">#include "aligned_space.h"</span>
+<a name="l00045"></a>00045 <span class="preprocessor">#include "tbb_exception.h"</span>
+<a name="l00046"></a>00046 <span class="preprocessor">#include "tbb_profiling.h"</span>
+<a name="l00047"></a>00047 <span class="preprocessor">#include "internal/_concurrent_unordered_impl.h"</span> <span class="comment">// Need tbb_hasher</span>
+<a name="l00048"></a>00048 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
+<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor">#include <typeinfo></span>
+<a name="l00050"></a>00050 <span class="preprocessor">#endif</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_STATISTICS</span>
+<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#include <stdio.h></span>
+<a name="l00053"></a>00053 <span class="preprocessor">#endif</span>
+<a name="l00054"></a>00054 <span class="preprocessor"></span>
+<a name="l00055"></a>00055 <span class="keyword">namespace </span>tbb {
+<a name="l00056"></a>00056 
+<a name="l00058"></a>00058 <span class="keyword">template</span><<span class="keyword">typename</span> Key>
+<a name="l00059"></a><a class="code" href="a00321.html">00059</a> <span class="keyword">struct </span><a class="code" href="a00321.html">tbb_hash_compare</a> {
+<a name="l00060"></a>00060     <span class="keyword">static</span> size_t hash( <span class="keyword">const</span> Key& a ) { <span class="keywordflow">return</span> tbb_hasher(a); }
+<a name="l00061"></a>00061     <span class="keyword">static</span> <span class="keywordtype">bool</span> equal( <span class="keyword">const</span> Key& a, <span class="keyword">const</span> Key& b ) { <span class="keywordflow">return</span> a == b; }
+<a name="l00062"></a>00062 };
 <a name="l00063"></a>00063 
-<a name="l00065"></a><a class="code" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">00065</a>     <a class="code" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">const_iterator</a> <a class="code" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
-<a name="l00066"></a>00066 
+<a name="l00064"></a>00064 <span class="keyword">namespace </span>interface5 {
+<a name="l00065"></a>00065 
+<a name="l00066"></a>00066     <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare = tbb_hash_compare<Key>, <span class="keyword">typename</span> A = tbb_allocator<std::pair<Key, T> > >
+<a name="l00067"></a>00067     <span class="keyword">class </span><a class="code" href="a00243.html">concurrent_hash_map</a>;
 <a name="l00068"></a>00068 
-<a name="l00069"></a><a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">00069</a>     <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>()<span class="keyword"> const </span>{
-<a name="l00070"></a>00070         __TBB_ASSERT( !(<a class="code" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>()<<a class="code" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin</a>()), <span class="stringliteral">"size() unspecified if end()<begin()"</span> );
-<a name="l00071"></a>00071         <span class="keywordflow">return</span> <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a>(my_end-my_begin);
-<a name="l00072"></a>00072     }
-<a name="l00073"></a>00073 
-<a name="l00075"></a><a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">00075</a>     <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> <a class="code" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">grainsize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
-<a name="l00076"></a>00076 
-<a name="l00077"></a>00077     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00078"></a>00078     <span class="comment">// Methods that implement Range concept</span>
-<a name="l00079"></a>00079     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00080"></a>00080 
-<a name="l00082"></a><a class="code" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">00082</a>     <span class="keywordtype">bool</span> <a class="code" href="a00221.html#8f4f02f530eb3f2e7ea26e06f76aef9d">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !(my_begin<my_end);}
-<a name="l00083"></a>00083 
-<a name="l00085"></a>00085 
-<a name="l00086"></a><a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">00086</a>     <span class="keywordtype">bool</span> <a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize<<a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>();}
-<a name="l00087"></a>00087 
-<a name="l00089"></a>00089 
-<a name="l00091"></a><a class="code" href="a00221.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">00091</a>     <a class="code" href="a00221.html#94607755c5110d199202234d58d022ac">blocked_range</a>( <a class="code" href="a00221.html">blocked_range</a>& r, <a class="code" href="a00290.html">split</a> ) : 
-<a name="l00092"></a>00092         my_end(r.my_end),
-<a name="l00093"></a>00093         my_begin(do_split(r)),
-<a name="l00094"></a>00094         my_grainsize(r.my_grainsize)
-<a name="l00095"></a>00095     {}
-<a name="l00096"></a>00096 
-<a name="l00097"></a>00097 <span class="keyword">private</span>:
-<a name="l00099"></a>00099     Value my_end;
-<a name="l00100"></a>00100     Value my_begin;
-<a name="l00101"></a>00101     <a class="code" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">size_type</a> my_grainsize;
-<a name="l00102"></a>00102 
-<a name="l00104"></a>00104 
-<a name="l00105"></a>00105     <span class="keyword">static</span> Value do_split( <a class="code" href="a00221.html">blocked_range</a>& r ) {
-<a name="l00106"></a>00106         __TBB_ASSERT( r.<a class="code" href="a00221.html#41a58b703d574b6e1ca155df3576f578">is_divisible</a>(), <span class="stringliteral">"cannot split blocked_range that is not divisible"</span> );
-<a name="l00107"></a>00107         Value middle = r.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a> + (r.<a class="code" href="a00221.html#1ec95c8988b50064dd603998b16f3930">my_end</a>-r.<a class="code" href="a00221.html#e02559f817d8352c7bdf41dfddc53958">my_begin</a>)/2u;
-<a name="l00108"></a>00108         r.<a class="code" href="a00221.html#1ec95c8988b50064dd603998b16f3930">my_end</a> = middle;
-<a name="l00109"></a>00109         <span class="keywordflow">return</span> middle;
-<a name="l00110"></a>00110     }
-<a name="l00111"></a>00111 
-<a name="l00112"></a>00112     <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue>
-<a name="l00113"></a>00113     <span class="keyword">friend</span> <span class="keyword">class </span>blocked_range2d;
-<a name="l00114"></a>00114 
-<a name="l00115"></a>00115     <span class="keyword">template</span><<span class="keyword">typename</span> RowValue, <span class="keyword">typename</span> ColValue, <span class="keyword">typename</span> PageValue>
-<a name="l00116"></a>00116     <span class="keyword">friend</span> <span class="keyword">class </span>blocked_range3d;
-<a name="l00117"></a>00117 };
-<a name="l00118"></a>00118 
-<a name="l00119"></a>00119 } <span class="comment">// namespace tbb </span>
-<a name="l00120"></a>00120 
-<a name="l00121"></a>00121 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_blocked_range_H */</span>
+<a name="l00070"></a>00070     <span class="keyword">namespace </span>internal {
+<a name="l00071"></a>00071 
+<a name="l00072"></a>00072 
+<a name="l00074"></a>00074     <span class="keyword">typedef</span> size_t hashcode_t;
+<a name="l00076"></a>00076     <span class="keyword">struct </span>hash_map_node_base : tbb::internal::no_copy {
+<a name="l00078"></a>00078         <span class="keyword">typedef</span> <a class="code" href="a00307.html">spin_rw_mutex</a> mutex_t;
+<a name="l00080"></a>00080         <span class="keyword">typedef</span> mutex_t::scoped_lock scoped_t;
+<a name="l00082"></a>00082         hash_map_node_base *next;
+<a name="l00083"></a>00083         mutex_t <a class="code" href="a00275.html">mutex</a>;
+<a name="l00084"></a>00084     };
+<a name="l00086"></a>00086     <span class="keyword">static</span> hash_map_node_base *<span class="keyword">const</span> rehash_req = reinterpret_cast<hash_map_node_base*>(size_t(3));
+<a name="l00088"></a>00088     <span class="keyword">static</span> hash_map_node_base *<span class="keyword">const</span> empty_rehashed = reinterpret_cast<hash_map_node_base*>(size_t(0));
+<a name="l00090"></a>00090     <span class="keyword">class </span>hash_map_base {
+<a name="l00091"></a>00091     <span class="keyword">public</span>:
+<a name="l00093"></a>00093         <span class="keyword">typedef</span> size_t size_type;
+<a name="l00095"></a>00095         <span class="keyword">typedef</span> size_t hashcode_t;
+<a name="l00097"></a>00097         <span class="keyword">typedef</span> size_t segment_index_t;
+<a name="l00099"></a>00099         <span class="keyword">typedef</span> hash_map_node_base node_base;
+<a name="l00101"></a>00101         <span class="keyword">struct </span>bucket : tbb::internal::no_copy {
+<a name="l00103"></a>00103             <span class="keyword">typedef</span> spin_rw_mutex mutex_t;
+<a name="l00105"></a>00105             <span class="keyword">typedef</span> mutex_t::scoped_lock scoped_t;
+<a name="l00106"></a>00106             mutex_t mutex;
+<a name="l00107"></a>00107             node_base *node_list;
+<a name="l00108"></a>00108         };
+<a name="l00110"></a>00110         <span class="keyword">static</span> size_type <span class="keyword">const</span> embedded_block = 1;
+<a name="l00112"></a>00112         <span class="keyword">static</span> size_type <span class="keyword">const</span> embedded_buckets = 1<<embedded_block;
+<a name="l00114"></a>00114         <span class="keyword">static</span> size_type <span class="keyword">const</span> first_block = 8; <span class="comment">//including embedded_block. perfect with bucket size 16, so the allocations are power of 4096</span>
+<a name="l00116"></a>00116 <span class="comment"></span>        <span class="keyword">static</span> size_type <span class="keyword">const</span> pointers_per_table = <span class="keyword">sizeof</span>(segment_index_t) * 8; <span class="comment">// one segment per bit</span>
+<a name="l00118"></a>00118 <span class="comment"></span>        <span class="keyword">typedef</span> bucket *segment_ptr_t;
+<a name="l00120"></a>00120         <span class="keyword">typedef</span> segment_ptr_t segments_table_t[pointers_per_table];
+<a name="l00122"></a>00122         atomic<hashcode_t> my_mask;
+<a name="l00124"></a>00124         segments_table_t my_table;
+<a name="l00126"></a>00126         atomic<size_type> my_size; <span class="comment">// It must be in separate cache line from my_mask due to performance effects</span>
+<a name="l00128"></a>00128 <span class="comment"></span>        bucket my_embedded_segment[embedded_buckets];
+<a name="l00129"></a>00129 <span class="preprocessor">#if __TBB_STATISTICS</span>
+<a name="l00130"></a>00130 <span class="preprocessor"></span>        atomic<unsigned> my_info_resizes; <span class="comment">// concurrent ones</span>
+<a name="l00131"></a>00131         <span class="keyword">mutable</span> atomic<unsigned> my_info_restarts; <span class="comment">// race collisions</span>
+<a name="l00132"></a>00132         atomic<unsigned> my_info_rehashes;  <span class="comment">// invocations of rehash_bucket</span>
+<a name="l00133"></a>00133 <span class="preprocessor">#endif</span>
+<a name="l00135"></a>00135 <span class="preprocessor">        hash_map_base() {</span>
+<a name="l00136"></a>00136 <span class="preprocessor"></span>            std::memset( <span class="keyword">this</span>, 0, pointers_per_table*<span class="keyword">sizeof</span>(segment_ptr_t) <span class="comment">// 32*4=128   or 64*8=512</span>
+<a name="l00137"></a>00137                 + <span class="keyword">sizeof</span>(my_size) + <span class="keyword">sizeof</span>(my_mask)  <span class="comment">// 4+4 or 8+8</span>
+<a name="l00138"></a>00138                 + embedded_buckets*<span class="keyword">sizeof</span>(bucket) ); <span class="comment">// n*8 or n*16</span>
+<a name="l00139"></a>00139             <span class="keywordflow">for</span>( size_type i = 0; i < embedded_block; i++ ) <span class="comment">// fill the table</span>
+<a name="l00140"></a>00140                 my_table[i] = my_embedded_segment + segment_base(i);
+<a name="l00141"></a>00141             my_mask = embedded_buckets - 1;
+<a name="l00142"></a>00142             __TBB_ASSERT( embedded_block <= first_block, <span class="stringliteral">"The first block number must include embedded blocks"</span>);
+<a name="l00143"></a>00143 <span class="preprocessor">#if __TBB_STATISTICS</span>
+<a name="l00144"></a>00144 <span class="preprocessor"></span>            my_info_resizes = 0; <span class="comment">// concurrent ones</span>
+<a name="l00145"></a>00145             my_info_restarts = 0; <span class="comment">// race collisions</span>
+<a name="l00146"></a>00146             my_info_rehashes = 0;  <span class="comment">// invocations of rehash_bucket</span>
+<a name="l00147"></a>00147 <span class="preprocessor">#endif</span>
+<a name="l00148"></a>00148 <span class="preprocessor"></span>        }
+<a name="l00149"></a>00149 
+<a name="l00151"></a>00151         <span class="keyword">static</span> segment_index_t segment_index_of( size_type index ) {
+<a name="l00152"></a>00152             <span class="keywordflow">return</span> segment_index_t( __TBB_Log2( index|1 ) );
+<a name="l00153"></a>00153         }
+<a name="l00154"></a>00154 
+<a name="l00156"></a>00156         <span class="keyword">static</span> segment_index_t segment_base( segment_index_t k ) {
+<a name="l00157"></a>00157             <span class="keywordflow">return</span> (segment_index_t(1)<<k & ~segment_index_t(1));
+<a name="l00158"></a>00158         }
+<a name="l00159"></a>00159 
+<a name="l00161"></a>00161         <span class="keyword">static</span> size_type segment_size( segment_index_t k ) {
+<a name="l00162"></a>00162             <span class="keywordflow">return</span> size_type(1)<<k; <span class="comment">// fake value for k==0</span>
+<a name="l00163"></a>00163         }
+<a name="l00164"></a>00164         
+<a name="l00166"></a>00166         <span class="keyword">static</span> <span class="keywordtype">bool</span> is_valid( <span class="keywordtype">void</span> *ptr ) {
+<a name="l00167"></a>00167             <span class="keywordflow">return</span> reinterpret_cast<size_t>(ptr) > size_t(63);
+<a name="l00168"></a>00168         }
+<a name="l00169"></a>00169 
+<a name="l00171"></a>00171         <span class="keyword">static</span> <span class="keywordtype">void</span> init_buckets( segment_ptr_t ptr, size_type sz, <span class="keywordtype">bool</span> is_initial ) {
+<a name="l00172"></a>00172             <span class="keywordflow">if</span>( is_initial ) std::memset(ptr, 0, sz*<span class="keyword">sizeof</span>(bucket) );
+<a name="l00173"></a>00173             <span class="keywordflow">else</span> <span class="keywordflow">for</span>(size_type i = 0; i < sz; i++, ptr++) {
+<a name="l00174"></a>00174                     *reinterpret_cast<intptr_t*>(&ptr->mutex) = 0;
+<a name="l00175"></a>00175                     ptr->node_list = rehash_req;
+<a name="l00176"></a>00176                 }
+<a name="l00177"></a>00177         }
+<a name="l00178"></a>00178         
+<a name="l00180"></a>00180         <span class="keyword">static</span> <span class="keywordtype">void</span> add_to_bucket( bucket *b, node_base *n ) {
+<a name="l00181"></a>00181             __TBB_ASSERT(b->node_list != rehash_req, NULL);
+<a name="l00182"></a>00182             n->next = b->node_list;
+<a name="l00183"></a>00183             b->node_list = n; <span class="comment">// its under lock and flag is set</span>
+<a name="l00184"></a>00184         }
+<a name="l00185"></a>00185 
+<a name="l00187"></a>00187         <span class="keyword">struct </span>enable_segment_failsafe {
+<a name="l00188"></a>00188             segment_ptr_t *my_segment_ptr;
+<a name="l00189"></a>00189             enable_segment_failsafe(segments_table_t &table, segment_index_t k) : my_segment_ptr(&table[k]) {}
+<a name="l00190"></a>00190             ~enable_segment_failsafe() {
+<a name="l00191"></a>00191                 <span class="keywordflow">if</span>( my_segment_ptr ) *my_segment_ptr = 0; <span class="comment">// indicate no allocation in progress</span>
+<a name="l00192"></a>00192             }
+<a name="l00193"></a>00193         };
+<a name="l00194"></a>00194 
+<a name="l00196"></a>00196         <span class="keywordtype">void</span> enable_segment( segment_index_t k, <span class="keywordtype">bool</span> is_initial = <span class="keyword">false</span> ) {
+<a name="l00197"></a>00197             __TBB_ASSERT( k, <span class="stringliteral">"Zero segment must be embedded"</span> );
+<a name="l00198"></a>00198             enable_segment_failsafe watchdog( my_table, k );
+<a name="l00199"></a>00199             cache_aligned_allocator<bucket> alloc;
+<a name="l00200"></a>00200             size_type sz;
+<a name="l00201"></a>00201             __TBB_ASSERT( !is_valid(my_table[k]), <span class="stringliteral">"Wrong concurrent assignment"</span>);
+<a name="l00202"></a>00202             <span class="keywordflow">if</span>( k >= first_block ) {
+<a name="l00203"></a>00203                 sz = segment_size( k );
+<a name="l00204"></a>00204                 segment_ptr_t ptr = alloc.allocate( sz );
+<a name="l00205"></a>00205                 init_buckets( ptr, sz, is_initial );
+<a name="l00206"></a>00206                 itt_hide_store_word( my_table[k], ptr );
+<a name="l00207"></a>00207                 sz <<= 1;<span class="comment">// double it to get entire capacity of the container</span>
+<a name="l00208"></a>00208             } <span class="keywordflow">else</span> { <span class="comment">// the first block</span>
+<a name="l00209"></a>00209                 __TBB_ASSERT( k == embedded_block, <span class="stringliteral">"Wrong segment index"</span> );
+<a name="l00210"></a>00210                 sz = segment_size( first_block );
+<a name="l00211"></a>00211                 segment_ptr_t ptr = alloc.allocate( sz - embedded_buckets );
+<a name="l00212"></a>00212                 init_buckets( ptr, sz - embedded_buckets, is_initial );
+<a name="l00213"></a>00213                 ptr -= segment_base(embedded_block);
+<a name="l00214"></a>00214                 <span class="keywordflow">for</span>(segment_index_t i = embedded_block; i < first_block; i++) <span class="comment">// calc the offsets</span>
+<a name="l00215"></a>00215                     itt_hide_store_word( my_table[i], ptr + segment_base(i) );
+<a name="l00216"></a>00216             }
+<a name="l00217"></a>00217             itt_store_word_with_release( my_mask, sz-1 );
+<a name="l00218"></a>00218             watchdog.my_segment_ptr = 0;
+<a name="l00219"></a>00219         }
+<a name="l00220"></a>00220 
+<a name="l00222"></a>00222         bucket *get_bucket( hashcode_t h ) <span class="keyword">const</span> <span class="keywordflow">throw</span>() { <span class="comment">// TODO: add throw() everywhere?</span>
+<a name="l00223"></a>00223             segment_index_t s = segment_index_of( h );
+<a name="l00224"></a>00224             h -= segment_base(s);
+<a name="l00225"></a>00225             segment_ptr_t seg = my_table[s];
+<a name="l00226"></a>00226             __TBB_ASSERT( is_valid(seg), <span class="stringliteral">"hashcode must be cut by valid mask for allocated segments"</span> );
+<a name="l00227"></a>00227             <span class="keywordflow">return</span> &seg[h];
+<a name="l00228"></a>00228         }
+<a name="l00229"></a>00229 
+<a name="l00230"></a>00230         <span class="comment">// internal serial rehashing helper</span>
+<a name="l00231"></a>00231         <span class="keywordtype">void</span> mark_rehashed_levels( hashcode_t h ) <span class="keywordflow">throw</span> () {
+<a name="l00232"></a>00232             segment_index_t s = segment_index_of( h );
+<a name="l00233"></a>00233             <span class="keywordflow">while</span>( segment_ptr_t seg = my_table[++s] )
+<a name="l00234"></a>00234                 <span class="keywordflow">if</span>( seg[h].node_list == rehash_req ) {
+<a name="l00235"></a>00235                     seg[h].node_list = empty_rehashed;
+<a name="l00236"></a>00236                     mark_rehashed_levels( h + ((hashcode_t)1<<s) ); <span class="comment">// optimized segment_base(s)</span>
+<a name="l00237"></a>00237                 }
+<a name="l00238"></a>00238         }
+<a name="l00239"></a>00239 
+<a name="l00241"></a>00241         <span class="comment">// Splitting into two functions should help inlining</span>
+<a name="l00242"></a>00242         <span class="keyword">inline</span> <span class="keywordtype">bool</span> check_mask_race( <span class="keyword">const</span> hashcode_t h, hashcode_t &m )<span class="keyword"> const </span>{
+<a name="l00243"></a>00243             hashcode_t m_now, m_old = m;
+<a name="l00244"></a>00244             m_now = (hashcode_t) itt_load_word_with_acquire( my_mask );
+<a name="l00245"></a>00245             <span class="keywordflow">if</span>( m_old != m_now )
+<a name="l00246"></a>00246                 <span class="keywordflow">return</span> check_rehashing_collision( h, m_old, m = m_now );
+<a name="l00247"></a>00247             <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00248"></a>00248         }
+<a name="l00249"></a>00249 
+<a name="l00251"></a>00251         <span class="keywordtype">bool</span> check_rehashing_collision( <span class="keyword">const</span> hashcode_t h, hashcode_t m_old, hashcode_t m )<span class="keyword"> const </span>{
+<a name="l00252"></a>00252             __TBB_ASSERT(m_old != m, NULL); <span class="comment">// TODO?: m arg could be optimized out by passing h = h&m</span>
+<a name="l00253"></a>00253             <span class="keywordflow">if</span>( (h & m_old) != (h & m) ) { <span class="comment">// mask changed for this hashcode, rare event</span>
+<a name="l00254"></a>00254                 <span class="comment">// condition above proves that 'h' has some other bits set beside 'm_old'</span>
+<a name="l00255"></a>00255                 <span class="comment">// find next applicable mask after m_old    //TODO: look at bsl instruction</span>
+<a name="l00256"></a>00256                 <span class="keywordflow">for</span>( ++m_old; !(h & m_old); m_old <<= 1 ) <span class="comment">// at maximum few rounds depending on the first block size</span>
+<a name="l00257"></a>00257                     ;
+<a name="l00258"></a>00258                 m_old = (m_old<<1) - 1; <span class="comment">// get full mask from a bit</span>
+<a name="l00259"></a>00259                 __TBB_ASSERT((m_old&(m_old+1))==0 && m_old <= m, NULL);
+<a name="l00260"></a>00260                 <span class="comment">// check whether it is rehashing/ed</span>
+<a name="l00261"></a>00261                 <span class="keywordflow">if</span>( itt_load_word_with_acquire(get_bucket(h & m_old)->node_list) != rehash_req )
+<a name="l00262"></a>00262                 {
+<a name="l00263"></a>00263 <span class="preprocessor">#if __TBB_STATISTICS</span>
+<a name="l00264"></a>00264 <span class="preprocessor"></span>                    my_info_restarts++; <span class="comment">// race collisions</span>
+<a name="l00265"></a>00265 <span class="preprocessor">#endif</span>
+<a name="l00266"></a>00266 <span class="preprocessor"></span>                    <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00267"></a>00267                 }
+<a name="l00268"></a>00268             }
+<a name="l00269"></a>00269             <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00270"></a>00270         }
+<a name="l00271"></a>00271 
+<a name="l00273"></a>00273         segment_index_t insert_new_node( bucket *b, node_base *n, hashcode_t mask ) {
+<a name="l00274"></a>00274             size_type sz = ++my_size; <span class="comment">// prefix form is to enforce allocation after the first item inserted</span>
+<a name="l00275"></a>00275             add_to_bucket( b, n );
+<a name="l00276"></a>00276             <span class="comment">// check load factor</span>
+<a name="l00277"></a>00277             <span class="keywordflow">if</span>( sz >= mask ) { <span class="comment">// TODO: add custom load_factor </span>
+<a name="l00278"></a>00278                 segment_index_t new_seg = __TBB_Log2( mask+1 ); <span class="comment">//optimized segment_index_of</span>
+<a name="l00279"></a>00279                 __TBB_ASSERT( is_valid(my_table[new_seg-1]), <span class="stringliteral">"new allocations must not publish new mask until segment has allocated"</span>);
+<a name="l00280"></a>00280                 <span class="keywordflow">if</span>( !itt_hide_load_word(my_table[new_seg])
+<a name="l00281"></a>00281                   && __TBB_CompareAndSwapW(&my_table[new_seg], 2, 0) == 0 )
+<a name="l00282"></a>00282                     <span class="keywordflow">return</span> new_seg; <span class="comment">// The value must be processed</span>
+<a name="l00283"></a>00283             }
+<a name="l00284"></a>00284             <span class="keywordflow">return</span> 0;
+<a name="l00285"></a>00285         }
+<a name="l00286"></a>00286 
+<a name="l00288"></a>00288         <span class="keywordtype">void</span> reserve(size_type buckets) {
+<a name="l00289"></a>00289             <span class="keywordflow">if</span>( !buckets-- ) <span class="keywordflow">return</span>;
+<a name="l00290"></a>00290             <span class="keywordtype">bool</span> is_initial = !my_size;
+<a name="l00291"></a>00291             <span class="keywordflow">for</span>( size_type m = my_mask; buckets > m; m = my_mask )
+<a name="l00292"></a>00292                 enable_segment( segment_index_of( m+1 ), is_initial );
+<a name="l00293"></a>00293         }
+<a name="l00295"></a>00295         <span class="keywordtype">void</span> internal_swap(hash_map_base &table) {
+<a name="l00296"></a>00296             std::swap(this->my_mask, table.my_mask);
+<a name="l00297"></a>00297             std::swap(this->my_size, table.my_size);
+<a name="l00298"></a>00298             <span class="keywordflow">for</span>(size_type i = 0; i < embedded_buckets; i++)
+<a name="l00299"></a>00299                 std::swap(this->my_embedded_segment[i].node_list, table.my_embedded_segment[i].node_list);
+<a name="l00300"></a>00300             <span class="keywordflow">for</span>(size_type i = embedded_block; i < pointers_per_table; i++)
+<a name="l00301"></a>00301                 std::swap(this->my_table[i], table.my_table[i]);
+<a name="l00302"></a>00302         }
+<a name="l00303"></a>00303     };
+<a name="l00304"></a>00304 
+<a name="l00305"></a>00305     <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
+<a name="l00306"></a>00306     <span class="keyword">class </span>hash_map_range;
+<a name="l00307"></a>00307 
+<a name="l00309"></a>00309 
+<a name="l00311"></a>00311     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
+<a name="l00312"></a>00312     <span class="keyword">class </span>hash_map_iterator
+<a name="l00313"></a>00313         : <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value>
+<a name="l00314"></a>00314     {
+<a name="l00315"></a>00315         <span class="keyword">typedef</span> Container map_type;
+<a name="l00316"></a>00316         <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::node node;
+<a name="l00317"></a>00317         <span class="keyword">typedef</span> hash_map_base::node_base node_base;
+<a name="l00318"></a>00318         <span class="keyword">typedef</span> hash_map_base::bucket bucket;
+<a name="l00319"></a>00319 
+<a name="l00320"></a>00320         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00321"></a>00321         <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> hash_map_iterator<C,T>& i, <span class="keyword">const</span> hash_map_iterator<C,U>& j );
+<a name="l00322"></a>00322 
+<a name="l00323"></a>00323         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00324"></a>00324         <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> hash_map_iterator<C,T>& i, <span class="keyword">const</span> hash_map_iterator<C,U>& j );
+<a name="l00325"></a>00325 
+<a name="l00326"></a>00326         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00327"></a>00327         <span class="keyword">friend</span> ptrdiff_t operator-( <span class="keyword">const</span> hash_map_iterator<C,T>& i, <span class="keyword">const</span> hash_map_iterator<C,U>& j );
+<a name="l00328"></a>00328     
+<a name="l00329"></a>00329         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
+<a name="l00330"></a>00330         <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_iterator;
+<a name="l00331"></a>00331 
+<a name="l00332"></a>00332         <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00333"></a>00333         <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_range;
+<a name="l00334"></a>00334 
+<a name="l00335"></a>00335         <span class="keywordtype">void</span> advance_to_next_bucket() { <span class="comment">// TODO?: refactor to iterator_base class</span>
+<a name="l00336"></a>00336             size_t k = my_index+1;
+<a name="l00337"></a>00337             <span class="keywordflow">while</span>( my_bucket && k <= my_map->my_mask ) {
+<a name="l00338"></a>00338                 <span class="comment">// Following test uses 2's-complement wizardry</span>
+<a name="l00339"></a>00339                 <span class="keywordflow">if</span>( k& (k-2) ) <span class="comment">// not the beginning of a segment</span>
+<a name="l00340"></a>00340                     ++my_bucket;
+<a name="l00341"></a>00341                 <span class="keywordflow">else</span> my_bucket = my_map->get_bucket( k );
+<a name="l00342"></a>00342                 my_node = static_cast<node*>( my_bucket->node_list );
+<a name="l00343"></a>00343                 <span class="keywordflow">if</span>( hash_map_base::is_valid(my_node) ) {
+<a name="l00344"></a>00344                     my_index = k; <span class="keywordflow">return</span>;
+<a name="l00345"></a>00345                 }
+<a name="l00346"></a>00346                 ++k;
+<a name="l00347"></a>00347             }
+<a name="l00348"></a>00348             my_bucket = 0; my_node = 0; my_index = k; <span class="comment">// the end</span>
+<a name="l00349"></a>00349         }
+<a name="l00350"></a>00350 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
+<a name="l00351"></a>00351 <span class="preprocessor"></span>        <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
+<a name="l00352"></a>00352         <span class="keyword">friend</span> <span class="keyword">class </span>interface5::concurrent_hash_map;
+<a name="l00353"></a>00353 <span class="preprocessor">#else</span>
+<a name="l00354"></a>00354 <span class="preprocessor"></span>    <span class="keyword">public</span>: <span class="comment">// workaround</span>
+<a name="l00355"></a>00355 <span class="preprocessor">#endif</span>
+<a name="l00357"></a>00357 <span class="preprocessor">        const Container *my_map;</span>
+<a name="l00358"></a>00358 <span class="preprocessor"></span>
+<a name="l00360"></a>00360         size_t my_index;
+<a name="l00361"></a>00361 
+<a name="l00363"></a>00363         <span class="keyword">const</span> bucket *my_bucket;
+<a name="l00364"></a>00364 
+<a name="l00366"></a>00366         node *my_node;
+<a name="l00367"></a>00367 
+<a name="l00368"></a>00368         hash_map_iterator( <span class="keyword">const</span> Container &map, size_t index, <span class="keyword">const</span> bucket *b, node_base *n );
+<a name="l00369"></a>00369 
+<a name="l00370"></a>00370     <span class="keyword">public</span>:
+<a name="l00372"></a>00372         hash_map_iterator() {}
+<a name="l00373"></a>00373         hash_map_iterator( <span class="keyword">const</span> hash_map_iterator<Container,typename Container::value_type> &other ) :
+<a name="l00374"></a>00374             my_map(other.my_map),
+<a name="l00375"></a>00375             my_index(other.my_index),
+<a name="l00376"></a>00376             my_bucket(other.my_bucket),
+<a name="l00377"></a>00377             my_node(other.my_node)
+<a name="l00378"></a>00378         {}
+<a name="l00379"></a>00379         Value& operator*()<span class="keyword"> const </span>{
+<a name="l00380"></a>00380             __TBB_ASSERT( hash_map_base::is_valid(my_node), <span class="stringliteral">"iterator uninitialized or at end of container?"</span> );
+<a name="l00381"></a>00381             <span class="keywordflow">return</span> my_node->item;
+<a name="l00382"></a>00382         }
+<a name="l00383"></a>00383         Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
+<a name="l00384"></a>00384         hash_map_iterator& operator++();
+<a name="l00385"></a>00385         
+<a name="l00387"></a>00387         hash_map_iterator operator++(<span class="keywordtype">int</span>) {
+<a name="l00388"></a>00388             hash_map_iterator old(*<span class="keyword">this</span>);
+<a name="l00389"></a>00389             operator++();
+<a name="l00390"></a>00390             <span class="keywordflow">return</span> old;
+<a name="l00391"></a>00391         }
+<a name="l00392"></a>00392     };
+<a name="l00393"></a>00393 
+<a name="l00394"></a>00394     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
+<a name="l00395"></a>00395     hash_map_iterator<Container,Value>::hash_map_iterator( <span class="keyword">const</span> Container &map, size_t index, <span class="keyword">const</span> bucket *b, node_base *n ) :
+<a name="l00396"></a>00396         my_map(&map),
+<a name="l00397"></a>00397         my_index(index),
+<a name="l00398"></a>00398         my_bucket(b),
+<a name="l00399"></a>00399         my_node( static_cast<node*>(n) )
+<a name="l00400"></a>00400     {
+<a name="l00401"></a>00401         <span class="keywordflow">if</span>( b && !hash_map_base::is_valid(n) )
+<a name="l00402"></a>00402             advance_to_next_bucket();
+<a name="l00403"></a>00403     }
+<a name="l00404"></a>00404 
+<a name="l00405"></a>00405     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
+<a name="l00406"></a>00406     hash_map_iterator<Container,Value>& hash_map_iterator<Container,Value>::operator++() {
+<a name="l00407"></a>00407         my_node = static_cast<node*>( my_node->next );
+<a name="l00408"></a>00408         <span class="keywordflow">if</span>( !my_node ) advance_to_next_bucket();
+<a name="l00409"></a>00409         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00410"></a>00410     }
+<a name="l00411"></a>00411 
+<a name="l00412"></a>00412     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00413"></a>00413     <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> hash_map_iterator<Container,T>& i, <span class="keyword">const</span> hash_map_iterator<Container,U>& j ) {
+<a name="l00414"></a>00414         <span class="keywordflow">return</span> i.my_node == j.my_node && i.my_map == j.my_map;
+<a name="l00415"></a>00415     }
+<a name="l00416"></a>00416 
+<a name="l00417"></a>00417     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00418"></a>00418     <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> hash_map_iterator<Container,T>& i, <span class="keyword">const</span> hash_map_iterator<Container,U>& j ) {
+<a name="l00419"></a>00419         <span class="keywordflow">return</span> i.my_node != j.my_node || i.my_map != j.my_map;
+<a name="l00420"></a>00420     }
+<a name="l00421"></a>00421 
+<a name="l00423"></a>00423 
+<a name="l00424"></a>00424     <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
+<a name="l00425"></a>00425     <span class="keyword">class </span>hash_map_range {
+<a name="l00426"></a>00426         <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::map_type map_type;
+<a name="l00427"></a>00427         Iterator my_begin;
+<a name="l00428"></a>00428         Iterator my_end;
+<a name="l00429"></a>00429         <span class="keyword">mutable</span> Iterator my_midpoint;
+<a name="l00430"></a>00430         size_t my_grainsize;
+<a name="l00432"></a>00432         <span class="keywordtype">void</span> set_midpoint() <span class="keyword">const</span>;
+<a name="l00433"></a>00433         <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_range;
+<a name="l00434"></a>00434     <span class="keyword">public</span>:
+<a name="l00436"></a>00436         <span class="keyword">typedef</span> std::size_t size_type;
+<a name="l00437"></a>00437         <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::value_type value_type;
+<a name="l00438"></a>00438         <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::reference reference;
+<a name="l00439"></a>00439         <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::difference_type difference_type;
+<a name="l00440"></a>00440         <span class="keyword">typedef</span> Iterator iterator;
+<a name="l00441"></a>00441 
+<a name="l00443"></a>00443         <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin==my_end;}
+<a name="l00444"></a>00444 
+<a name="l00446"></a>00446         <span class="keywordtype">bool</span> is_divisible()<span class="keyword"> const </span>{
+<a name="l00447"></a>00447             <span class="keywordflow">return</span> my_midpoint!=my_end;
+<a name="l00448"></a>00448         }
+<a name="l00450"></a>00450         hash_map_range( hash_map_range& r, split ) : 
+<a name="l00451"></a>00451             my_end(r.my_end),
+<a name="l00452"></a>00452             my_grainsize(r.my_grainsize)
+<a name="l00453"></a>00453         {
+<a name="l00454"></a>00454             r.my_end = my_begin = r.my_midpoint;
+<a name="l00455"></a>00455             __TBB_ASSERT( !empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
+<a name="l00456"></a>00456             __TBB_ASSERT( !r.empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
+<a name="l00457"></a>00457             set_midpoint();
+<a name="l00458"></a>00458             r.set_midpoint();
+<a name="l00459"></a>00459         }
+<a name="l00461"></a>00461         <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00462"></a>00462         hash_map_range( hash_map_range<U>& r) : 
+<a name="l00463"></a>00463             my_begin(r.my_begin),
+<a name="l00464"></a>00464             my_end(r.my_end),
+<a name="l00465"></a>00465             my_midpoint(r.my_midpoint),
+<a name="l00466"></a>00466             my_grainsize(r.my_grainsize)
+<a name="l00467"></a>00467         {}
+<a name="l00468"></a>00468 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00470"></a>00470 <span class="preprocessor">        hash_map_range( const Iterator& begin_, const Iterator& end_, size_type grainsize_ = 1 ) : </span>
+<a name="l00471"></a>00471 <span class="preprocessor"></span>            my_begin(begin_), 
+<a name="l00472"></a>00472             my_end(end_),
+<a name="l00473"></a>00473             my_grainsize(grainsize_)
+<a name="l00474"></a>00474         {
+<a name="l00475"></a>00475             <span class="keywordflow">if</span>(!my_end.my_index && !my_end.my_bucket) <span class="comment">// end</span>
+<a name="l00476"></a>00476                 my_end.my_index = my_end.my_map->my_mask + 1;
+<a name="l00477"></a>00477             set_midpoint();
+<a name="l00478"></a>00478             __TBB_ASSERT( grainsize_>0, <span class="stringliteral">"grainsize must be positive"</span> );
+<a name="l00479"></a>00479         }
+<a name="l00480"></a>00480 <span class="preprocessor">#endif</span>
+<a name="l00482"></a>00482 <span class="preprocessor">        hash_map_range( const map_type &map, size_type grainsize_ = 1 ) : </span>
+<a name="l00483"></a>00483 <span class="preprocessor"></span>            my_begin( Iterator( map, 0, map.my_embedded_segment, map.my_embedded_segment->node_list ) ),
+<a name="l00484"></a>00484             my_end( Iterator( map, map.my_mask + 1, 0, 0 ) ),
+<a name="l00485"></a>00485             my_grainsize( grainsize_ )
+<a name="l00486"></a>00486         {
+<a name="l00487"></a>00487             __TBB_ASSERT( grainsize_>0, <span class="stringliteral">"grainsize must be positive"</span> );
+<a name="l00488"></a>00488             set_midpoint();
+<a name="l00489"></a>00489         }
+<a name="l00490"></a>00490         <span class="keyword">const</span> Iterator& begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
+<a name="l00491"></a>00491         <span class="keyword">const</span> Iterator& end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
+<a name="l00493"></a>00493         size_type grainsize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
+<a name="l00494"></a>00494     };
+<a name="l00495"></a>00495 
+<a name="l00496"></a>00496     <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
+<a name="l00497"></a>00497     <span class="keywordtype">void</span> hash_map_range<Iterator>::set_midpoint()<span class="keyword"> const </span>{
+<a name="l00498"></a>00498         <span class="comment">// Split by groups of nodes</span>
+<a name="l00499"></a>00499         size_t m = my_end.my_index-my_begin.my_index;
+<a name="l00500"></a>00500         <span class="keywordflow">if</span>( m > my_grainsize ) {
+<a name="l00501"></a>00501             m = my_begin.my_index + m/2u;
+<a name="l00502"></a>00502             hash_map_base::bucket *b = my_begin.my_map->get_bucket(m);
+<a name="l00503"></a>00503             my_midpoint = Iterator(*my_begin.my_map,m,b,b->node_list);
+<a name="l00504"></a>00504         } <span class="keywordflow">else</span> {
+<a name="l00505"></a>00505             my_midpoint = my_end;
+<a name="l00506"></a>00506         }
+<a name="l00507"></a>00507         __TBB_ASSERT( my_begin.my_index <= my_midpoint.my_index,
+<a name="l00508"></a>00508             <span class="stringliteral">"my_begin is after my_midpoint"</span> );
+<a name="l00509"></a>00509         __TBB_ASSERT( my_midpoint.my_index <= my_end.my_index,
+<a name="l00510"></a>00510             <span class="stringliteral">"my_midpoint is after my_end"</span> );
+<a name="l00511"></a>00511         __TBB_ASSERT( my_begin != my_midpoint || my_begin == my_end,
+<a name="l00512"></a>00512             <span class="stringliteral">"[my_begin, my_midpoint) range should not be empty"</span> );
+<a name="l00513"></a>00513     }
+<a name="l00514"></a>00514 
+<a name="l00515"></a>00515     } <span class="comment">// internal</span>
+<a name="l00517"></a>00517 <span class="comment"></span>
+<a name="l00519"></a>00519 
+<a name="l00548"></a>00548 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> Allocator>
+<a name="l00549"></a><a class="code" href="a00243.html">00549</a> <span class="keyword">class </span><a class="code" href="a00243.html">concurrent_hash_map</a> : <span class="keyword">protected</span> internal::hash_map_base {
+<a name="l00550"></a>00550     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
+<a name="l00551"></a>00551     <span class="keyword">friend</span> <span class="keyword">class </span>internal::hash_map_iterator;
+<a name="l00552"></a>00552 
+<a name="l00553"></a>00553     <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00554"></a>00554     <span class="keyword">friend</span> <span class="keyword">class </span>internal::hash_map_range;
+<a name="l00555"></a>00555 
+<a name="l00556"></a>00556 <span class="keyword">public</span>:
+<a name="l00557"></a>00557     <span class="keyword">typedef</span> Key key_type;
+<a name="l00558"></a>00558     <span class="keyword">typedef</span> T mapped_type;
+<a name="l00559"></a>00559     <span class="keyword">typedef</span> std::pair<const Key,T> value_type;
+<a name="l00560"></a>00560     <span class="keyword">typedef</span> hash_map_base::size_type size_type;
+<a name="l00561"></a>00561     <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00562"></a>00562     <span class="keyword">typedef</span> value_type *pointer;
+<a name="l00563"></a>00563     <span class="keyword">typedef</span> <span class="keyword">const</span> value_type *const_pointer;
+<a name="l00564"></a>00564     <span class="keyword">typedef</span> value_type &reference;
+<a name="l00565"></a>00565     <span class="keyword">typedef</span> <span class="keyword">const</span> value_type &const_reference;
+<a name="l00566"></a>00566     <span class="keyword">typedef</span> internal::hash_map_iterator<concurrent_hash_map,value_type> iterator;
+<a name="l00567"></a>00567     <span class="keyword">typedef</span> internal::hash_map_iterator<concurrent_hash_map,const value_type> const_iterator;
+<a name="l00568"></a>00568     <span class="keyword">typedef</span> internal::hash_map_range<iterator> range_type;
+<a name="l00569"></a>00569     <span class="keyword">typedef</span> internal::hash_map_range<const_iterator> const_range_type;
+<a name="l00570"></a>00570     <span class="keyword">typedef</span> Allocator allocator_type;
+<a name="l00571"></a>00571 
+<a name="l00572"></a>00572 <span class="keyword">protected</span>:
+<a name="l00573"></a>00573     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00246.html">const_accessor</a>;
+<a name="l00574"></a>00574     <span class="keyword">struct </span>node;
+<a name="l00575"></a>00575     <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<node>::other node_allocator_type;
+<a name="l00576"></a>00576     node_allocator_type my_allocator;
+<a name="l00577"></a>00577     HashCompare my_hash_compare;
+<a name="l00578"></a>00578 
+<a name="l00579"></a>00579     <span class="keyword">struct </span>node : <span class="keyword">public</span> node_base {
+<a name="l00580"></a>00580         value_type item;
+<a name="l00581"></a>00581         node( <span class="keyword">const</span> Key &key ) : item(key, T()) {}
+<a name="l00582"></a>00582         node( <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T &t ) : item(key, t) {}
+<a name="l00583"></a>00583         <span class="comment">// exception-safe allocation, see C++ Standard 2003, clause 5.3.4p17</span>
+<a name="l00584"></a>00584         <span class="keywordtype">void</span> *operator new( size_t <span class="comment">/*size*/</span>, node_allocator_type &a ) {
+<a name="l00585"></a>00585             <span class="keywordtype">void</span> *ptr = a.allocate(1);
+<a name="l00586"></a>00586             <span class="keywordflow">if</span>(!ptr) 
+<a name="l00587"></a>00587                 tbb::internal::throw_exception(tbb::internal::eid_bad_alloc);
+<a name="l00588"></a>00588             <span class="keywordflow">return</span> ptr;
+<a name="l00589"></a>00589         }
+<a name="l00590"></a>00590         <span class="comment">// match placement-new form above to be called if exception thrown in constructor</span>
+<a name="l00591"></a>00591         <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span> *ptr, node_allocator_type &a ) {<span class="keywordflow">return</span> a.deallocate(static_cast<node*>(ptr),1); }
+<a name="l00592"></a>00592     };
+<a name="l00593"></a>00593 
+<a name="l00594"></a>00594     <span class="keywordtype">void</span> delete_node( node_base *n ) {
+<a name="l00595"></a>00595         my_allocator.destroy( static_cast<node*>(n) );
+<a name="l00596"></a>00596         my_allocator.deallocate( static_cast<node*>(n), 1);
+<a name="l00597"></a>00597     }
+<a name="l00598"></a>00598 
+<a name="l00599"></a>00599     node *search_bucket( <span class="keyword">const</span> key_type &key, bucket *b )<span class="keyword"> const </span>{
+<a name="l00600"></a>00600         node *n = static_cast<node*>( b->node_list );
+<a name="l00601"></a>00601         <span class="keywordflow">while</span>( is_valid(n) && !my_hash_compare.equal(key, n->item.first) )
+<a name="l00602"></a>00602             n = static_cast<node*>( n->next );
+<a name="l00603"></a>00603         __TBB_ASSERT(n != internal::rehash_req, <span class="stringliteral">"Search can be executed only for rehashed bucket"</span>);
+<a name="l00604"></a>00604         <span class="keywordflow">return</span> n;
+<a name="l00605"></a>00605     }
+<a name="l00606"></a>00606 
+<a name="l00608"></a><a class="code" href="a00245.html">00608</a>     <span class="keyword">class </span><a class="code" href="a00245.html">bucket_accessor</a> : <span class="keyword">public</span> bucket::scoped_t {
+<a name="l00609"></a>00609         bucket *my_b;
+<a name="l00610"></a>00610     <span class="keyword">public</span>:
+<a name="l00611"></a>00611         <a class="code" href="a00245.html">bucket_accessor</a>( <a class="code" href="a00243.html">concurrent_hash_map</a> *base, <span class="keyword">const</span> hashcode_t h, <span class="keywordtype">bool</span> writer = <span class="keyword">false</span> ) { <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( base, h, writer ); }
+<a name="l00613"></a><a class="code" href="a00245.html#d11c77f4d70a94d4fb344492bbf18007">00613</a>         <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00243.html">concurrent_hash_map</a> *base, <span class="keyword">const</span> hashcode_t h, <span class="keywordtype">bool</span> writer = <span class="keyword">false</span> ) {
+<a name="l00614"></a>00614             my_b = base->get_bucket( h );
+<a name="l00615"></a>00615             <span class="comment">// TODO: actually, notification is unnecessary here, just hiding double-check</span>
+<a name="l00616"></a>00616             <span class="keywordflow">if</span>( itt_load_word_with_acquire(my_b->node_list) == internal::rehash_req
+<a name="l00617"></a>00617                 && try_acquire( my_b->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> ) )
+<a name="l00618"></a>00618             {
+<a name="l00619"></a>00619                 <span class="keywordflow">if</span>( my_b->node_list == internal::rehash_req ) base-><a class="code" href="a00243.html#4962c7da24793ccc05524cc3bbcf1efa">rehash_bucket</a>( my_b, h ); <span class="comment">//recursive rehashing</span>
+<a name="l00620"></a>00620             }
+<a name="l00621"></a>00621             <span class="keywordflow">else</span> bucket::scoped_t::acquire( my_b->mutex, writer );
+<a name="l00622"></a>00622             __TBB_ASSERT( my_b->node_list != internal::rehash_req, NULL);
+<a name="l00623"></a>00623         }
+<a name="l00625"></a><a class="code" href="a00245.html#07d958f151a0eaa92f50fd56ad6440e2">00625</a>         <span class="keywordtype">bool</span> is_writer() { <span class="keywordflow">return</span> bucket::scoped_t::is_writer; }
+<a name="l00627"></a><a class="code" href="a00245.html#fa6314b861c574f86ed189b124cf5853">00627</a>         bucket *operator() () { <span class="keywordflow">return</span> my_b; }
+<a name="l00628"></a>00628     };
+<a name="l00629"></a>00629 
+<a name="l00630"></a>00630     <span class="comment">// TODO refactor to hash_base</span>
+<a name="l00631"></a>00631     <span class="keywordtype">void</span> rehash_bucket( bucket *b_new, <span class="keyword">const</span> hashcode_t h ) {
+<a name="l00632"></a>00632         __TBB_ASSERT( *(intptr_t*)(&b_new->mutex), <span class="stringliteral">"b_new must be locked (for write)"</span>);
+<a name="l00633"></a>00633         __TBB_ASSERT( h > 1, <span class="stringliteral">"The lowermost buckets can't be rehashed"</span> );
+<a name="l00634"></a>00634         __TBB_store_with_release(b_new->node_list, internal::empty_rehashed); <span class="comment">// mark rehashed</span>
+<a name="l00635"></a>00635         hashcode_t mask = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
+<a name="l00636"></a>00636 <span class="preprocessor">#if __TBB_STATISTICS</span>
+<a name="l00637"></a>00637 <span class="preprocessor"></span>        my_info_rehashes++; <span class="comment">// invocations of rehash_bucket</span>
+<a name="l00638"></a>00638 <span class="preprocessor">#endif</span>
+<a name="l00639"></a>00639 <span class="preprocessor"></span>
+<a name="l00640"></a>00640         bucket_accessor b_old( <span class="keyword">this</span>, h & mask );
+<a name="l00641"></a>00641 
+<a name="l00642"></a>00642         mask = (mask<<1) | 1; <span class="comment">// get full mask for new bucket</span>
+<a name="l00643"></a>00643         __TBB_ASSERT( (mask&(mask+1))==0 && (h & mask) == h, NULL );
+<a name="l00644"></a>00644     restart:
+<a name="l00645"></a>00645         <span class="keywordflow">for</span>( node_base **p = &b_old()->node_list, *n = __TBB_load_with_acquire(*p); is_valid(n); n = *p ) {
+<a name="l00646"></a>00646             hashcode_t c = my_hash_compare.hash( static_cast<node*>(n)->item.first );
+<a name="l00647"></a>00647 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00648"></a>00648 <span class="preprocessor"></span>            hashcode_t bmask = h & (mask>>1);
+<a name="l00649"></a>00649             bmask = bmask==0? 1 : ( 1u<<(__TBB_Log2( bmask )+1 ) ) - 1; <span class="comment">// minimal mask of parent bucket</span>
+<a name="l00650"></a>00650             __TBB_ASSERT( (c & bmask) == (h & bmask), <span class="stringliteral">"hash() function changed for key in table"</span> );
+<a name="l00651"></a>00651 <span class="preprocessor">#endif</span>
+<a name="l00652"></a>00652 <span class="preprocessor"></span>            <span class="keywordflow">if</span>( (c & mask) == h ) {
+<a name="l00653"></a>00653                 <span class="keywordflow">if</span>( !b_old.is_writer() )
+<a name="l00654"></a>00654                     <span class="keywordflow">if</span>( !b_old.upgrade_to_writer() ) {
+<a name="l00655"></a>00655                         <span class="keywordflow">goto</span> restart; <span class="comment">// node ptr can be invalid due to concurrent erase</span>
+<a name="l00656"></a>00656                     }
+<a name="l00657"></a>00657                 *p = n->next; <span class="comment">// exclude from b_old</span>
+<a name="l00658"></a>00658                 add_to_bucket( b_new, n );
+<a name="l00659"></a>00659             } <span class="keywordflow">else</span> p = &n->next; <span class="comment">// iterate to next item</span>
+<a name="l00660"></a>00660         }
+<a name="l00661"></a>00661     }
+<a name="l00662"></a>00662 
+<a name="l00663"></a>00663 <span class="keyword">public</span>:
+<a name="l00664"></a>00664     
+<a name="l00665"></a>00665     <span class="keyword">class </span>accessor;
+<a name="l00667"></a><a class="code" href="a00246.html">00667</a>     <span class="keyword">class </span><a class="code" href="a00246.html">const_accessor</a> : <span class="keyword">private</span> node::scoped_t <span class="comment">/*which derived from no_copy*/</span> {
+<a name="l00668"></a>00668         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00243.html">concurrent_hash_map</a><Key,T,HashCompare,Allocator>;
+<a name="l00669"></a>00669         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00244.html">accessor</a>;
+<a name="l00670"></a>00670     <span class="keyword">public</span>:
+<a name="l00672"></a><a class="code" href="a00246.html#a8e50238483ba451363dccebd981d346">00672</a>         <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
+<a name="l00673"></a>00673 
+<a name="l00675"></a><a class="code" href="a00246.html#84c3080d0c6124d55c8bb4cf6055e65f">00675</a>         <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_node;}
+<a name="l00676"></a>00676 
+<a name="l00678"></a><a class="code" href="a00246.html#7db006d41b49dc5f1716a913769d4698">00678</a>         <span class="keywordtype">void</span> <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
+<a name="l00679"></a>00679             <span class="keywordflow">if</span>( my_node ) {
+<a name="l00680"></a>00680                 node::scoped_t::release();
+<a name="l00681"></a>00681                 my_node = 0;
+<a name="l00682"></a>00682             }
+<a name="l00683"></a>00683         }
+<a name="l00684"></a>00684 
+<a name="l00686"></a><a class="code" href="a00246.html#9411df8197ceb4881ec4c7368a0a7f88">00686</a>         const_reference operator*()<span class="keyword"> const </span>{
+<a name="l00687"></a>00687             __TBB_ASSERT( my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
+<a name="l00688"></a>00688             <span class="keywordflow">return</span> my_node->item;
+<a name="l00689"></a>00689         }
+<a name="l00690"></a>00690 
+<a name="l00692"></a><a class="code" href="a00246.html#3d03a48ecb8cd9549bd8be64b09c9b0d">00692</a>         const_pointer operator->()<span class="keyword"> const </span>{
+<a name="l00693"></a>00693             <span class="keywordflow">return</span> &operator*();
+<a name="l00694"></a>00694         }
+<a name="l00695"></a>00695 
+<a name="l00697"></a><a class="code" href="a00246.html#27399c613eb1aecd4660803955dda09d">00697</a>         <a class="code" href="a00246.html">const_accessor</a>() : my_node(NULL) {}
+<a name="l00698"></a>00698 
+<a name="l00700"></a><a class="code" href="a00246.html#928769b139d53427e7075c1f86148e4c">00700</a>         ~<a class="code" href="a00246.html">const_accessor</a>() {
+<a name="l00701"></a>00701             my_node = NULL; <span class="comment">// scoped lock's release() is called in its destructor</span>
+<a name="l00702"></a>00702         }
+<a name="l00703"></a>00703     <span class="keyword">protected</span>:
+<a name="l00704"></a>00704         <span class="keywordtype">bool</span> is_writer() { <span class="keywordflow">return</span> node::scoped_t::is_writer; }
+<a name="l00705"></a>00705         node *my_node;
+<a name="l00706"></a>00706         hashcode_t my_hash;
+<a name="l00707"></a>00707     };
+<a name="l00708"></a>00708 
+<a name="l00710"></a><a class="code" href="a00244.html">00710</a>     <span class="keyword">class </span><a class="code" href="a00244.html">accessor</a>: <span class="keyword">public</span> <a class="code" href="a00246.html">const_accessor</a> {
+<a name="l00711"></a>00711     <span class="keyword">public</span>:
+<a name="l00713"></a><a class="code" href="a00244.html#0b648be7a95a8fb2971042c15eb112c1">00713</a>         <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
+<a name="l00714"></a>00714 
+<a name="l00716"></a><a class="code" href="a00244.html#170280ea807a22e742095de3e8c5ea38">00716</a>         reference operator*()<span class="keyword"> const </span>{
+<a name="l00717"></a>00717             __TBB_ASSERT( this->my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
+<a name="l00718"></a>00718             <span class="keywordflow">return</span> this->my_node->item;
+<a name="l00719"></a>00719         }
+<a name="l00720"></a>00720 
+<a name="l00722"></a><a class="code" href="a00244.html#a807920cdffe3ec5c5e282b4d1ff92a2">00722</a>         pointer operator->()<span class="keyword"> const </span>{
+<a name="l00723"></a>00723             <span class="keywordflow">return</span> &operator*();
+<a name="l00724"></a>00724         }
+<a name="l00725"></a>00725     };
+<a name="l00726"></a>00726 
+<a name="l00728"></a><a class="code" href="a00243.html#1ad413f5b666176e7669bf4c87d1ff3f">00728</a>     <a class="code" href="a00243.html">concurrent_hash_map</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00729"></a>00729         : internal::hash_map_base(), my_allocator(a)
+<a name="l00730"></a>00730     {}
+<a name="l00731"></a>00731 
+<a name="l00733"></a><a class="code" href="a00243.html#46b9896317662c3cfa3c876ad7592a7c">00733</a>     <a class="code" href="a00243.html">concurrent_hash_map</a>(size_type n, <span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00734"></a>00734         : my_allocator(a)
+<a name="l00735"></a>00735     {
+<a name="l00736"></a>00736         reserve( n );
+<a name="l00737"></a>00737     }
+<a name="l00738"></a>00738 
+<a name="l00740"></a><a class="code" href="a00243.html#6fb14710893308fb47aaeee55ee30dc3">00740</a>     <a class="code" href="a00243.html">concurrent_hash_map</a>( <span class="keyword">const</span> <a class="code" href="a00243.html">concurrent_hash_map</a>& table, <span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00741"></a>00741         : internal::hash_map_base(), my_allocator(a)
+<a name="l00742"></a>00742     {
+<a name="l00743"></a>00743         internal_copy(table);
+<a name="l00744"></a>00744     }
+<a name="l00745"></a>00745 
+<a name="l00747"></a>00747     <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00748"></a><a class="code" href="a00243.html#83c40f2053f208861b90390e12a36436">00748</a>     <a class="code" href="a00243.html">concurrent_hash_map</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00749"></a>00749         : my_allocator(a)
+<a name="l00750"></a>00750     {
+<a name="l00751"></a>00751         reserve( std::distance(first, last) ); <span class="comment">// TODO: load_factor?</span>
+<a name="l00752"></a>00752         internal_copy(first, last);
+<a name="l00753"></a>00753     }
+<a name="l00754"></a>00754 
+<a name="l00756"></a><a class="code" href="a00243.html#088d1aaccc816884a49e38f7065622c8">00756</a>     <a class="code" href="a00243.html">concurrent_hash_map</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00243.html">concurrent_hash_map</a>& table ) {
+<a name="l00757"></a>00757         <span class="keywordflow">if</span>( <span class="keyword">this</span>!=&table ) {
+<a name="l00758"></a>00758             clear();
+<a name="l00759"></a>00759             internal_copy(table);
+<a name="l00760"></a>00760         } 
+<a name="l00761"></a>00761         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00762"></a>00762     }
+<a name="l00763"></a>00763 
+<a name="l00764"></a>00764 
+<a name="l00766"></a>00766 
+<a name="l00768"></a>00768     <span class="keywordtype">void</span> rehash(size_type n = 0);
+<a name="l00769"></a>00769     
+<a name="l00771"></a>00771     <span class="keywordtype">void</span> clear();
+<a name="l00772"></a>00772 
+<a name="l00774"></a><a class="code" href="a00243.html#2aa8e2d28d5af1284cf78d20a9c22731">00774</a>     ~<a class="code" href="a00243.html">concurrent_hash_map</a>() { clear(); }
+<a name="l00775"></a>00775 
+<a name="l00776"></a>00776     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00777"></a>00777     <span class="comment">// Parallel algorithm support</span>
+<a name="l00778"></a>00778     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00779"></a>00779     range_type range( size_type grainsize=1 ) {
+<a name="l00780"></a>00780         <span class="keywordflow">return</span> range_type( *<span class="keyword">this</span>, grainsize );
+<a name="l00781"></a>00781     }
+<a name="l00782"></a>00782     const_range_type range( size_type grainsize=1 )<span class="keyword"> const </span>{
+<a name="l00783"></a>00783         <span class="keywordflow">return</span> const_range_type( *<span class="keyword">this</span>, grainsize );
+<a name="l00784"></a>00784     }
+<a name="l00785"></a>00785 
+<a name="l00786"></a>00786     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00787"></a>00787     <span class="comment">// STL support - not thread-safe methods</span>
+<a name="l00788"></a>00788     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00789"></a>00789     iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0,my_embedded_segment,my_embedded_segment->node_list);}
+<a name="l00790"></a>00790     iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0,0,0);}
+<a name="l00791"></a>00791     const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0,my_embedded_segment,my_embedded_segment->node_list);}
+<a name="l00792"></a>00792     const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0,0,0);}
+<a name="l00793"></a>00793     std::pair<iterator, iterator> equal_range( <span class="keyword">const</span> Key& key ) { <span class="keywordflow">return</span> internal_equal_range(key, end()); }
+<a name="l00794"></a>00794     std::pair<const_iterator, const_iterator> equal_range( <span class="keyword">const</span> Key& key )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> internal_equal_range(key, end()); }
+<a name="l00795"></a>00795     
+<a name="l00797"></a><a class="code" href="a00243.html#6aa56a8b5a25e61a97fa0b54fe2b5659">00797</a>     size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size; }
+<a name="l00798"></a>00798 
+<a name="l00800"></a><a class="code" href="a00243.html#61ff2e5bb44e5469366fd5295e5d0ebe">00800</a>     <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size == 0; }
+<a name="l00801"></a>00801 
+<a name="l00803"></a><a class="code" href="a00243.html#2bce57fe9b594abe1e6d2568aea8b357">00803</a>     size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (~size_type(0))/<span class="keyword">sizeof</span>(node);}
+<a name="l00804"></a>00804 
+<a name="l00806"></a><a class="code" href="a00243.html#af34cb91b1d0f36a885a1a3432dd9af1">00806</a>     size_type bucket_count()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_mask+1; }
+<a name="l00807"></a>00807 
+<a name="l00809"></a><a class="code" href="a00243.html#6cbcacb4a256a85bf89576c101373ca7">00809</a>     allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
+<a name="l00810"></a>00810 
+<a name="l00812"></a>00812     <span class="keywordtype">void</span> swap(<a class="code" href="a00243.html">concurrent_hash_map</a> &table);
+<a name="l00813"></a>00813 
+<a name="l00814"></a>00814     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00815"></a>00815     <span class="comment">// concurrent map operations</span>
+<a name="l00816"></a>00816     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00817"></a>00817 
+<a name="l00819"></a><a class="code" href="a00243.html#6968eb6feed2df36be421df0464297af">00819</a>     size_type count( <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
+<a name="l00820"></a>00820         <span class="keywordflow">return</span> const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, NULL, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
+<a name="l00821"></a>00821     }
+<a name="l00822"></a>00822 
+<a name="l00824"></a>00824 
+<a name="l00825"></a><a class="code" href="a00243.html#2afcc33dade7bb24e008d60c0df38230">00825</a>     <span class="keywordtype">bool</span> find( <a class="code" href="a00246.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
+<a name="l00826"></a>00826         result.<a class="code" href="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a>();
+<a name="l00827"></a>00827         <span class="keywordflow">return</span> const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
+<a name="l00828"></a>00828     }
+<a name="l00829"></a>00829 
+<a name="l00831"></a>00831 
+<a name="l00832"></a><a class="code" href="a00243.html#7bc475d1968f7f0af3d736d7e8a0d7df">00832</a>     <span class="keywordtype">bool</span> find( <a class="code" href="a00244.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
+<a name="l00833"></a>00833         result.<a class="code" href="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a>();
+<a name="l00834"></a>00834         <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
+<a name="l00835"></a>00835     }
+<a name="l00836"></a>00836         
+<a name="l00838"></a>00838 
+<a name="l00839"></a><a class="code" href="a00243.html#47fe0e60151a9bd7a444db827772a4e6">00839</a>     <span class="keywordtype">bool</span> insert( <a class="code" href="a00246.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key ) {
+<a name="l00840"></a>00840         result.<a class="code" href="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a>();
+<a name="l00841"></a>00841         <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
+<a name="l00842"></a>00842     }
+<a name="l00843"></a>00843 
+<a name="l00845"></a>00845 
+<a name="l00846"></a><a class="code" href="a00243.html#54e0955ecd11575b4c07166838a72893">00846</a>     <span class="keywordtype">bool</span> insert( <a class="code" href="a00244.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
+<a name="l00847"></a>00847         result.<a class="code" href="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a>();
+<a name="l00848"></a>00848         <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
+<a name="l00849"></a>00849     }
+<a name="l00850"></a>00850 
+<a name="l00852"></a>00852 
+<a name="l00853"></a><a class="code" href="a00243.html#091efd2d12fdad4fe9e54d9629a9dfc3">00853</a>     <span class="keywordtype">bool</span> insert( <a class="code" href="a00246.html">const_accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
+<a name="l00854"></a>00854         result.<a class="code" href="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a>();
+<a name="l00855"></a>00855         <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
+<a name="l00856"></a>00856     }
+<a name="l00857"></a>00857 
+<a name="l00859"></a>00859 
+<a name="l00860"></a><a class="code" href="a00243.html#39183d78d6e8425917555ab542ab92de">00860</a>     <span class="keywordtype">bool</span> insert( <a class="code" href="a00244.html">accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
+<a name="l00861"></a>00861         result.<a class="code" href="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a>();
+<a name="l00862"></a>00862         <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
+<a name="l00863"></a>00863     }
+<a name="l00864"></a>00864 
+<a name="l00866"></a>00866 
+<a name="l00867"></a><a class="code" href="a00243.html#3f121a316af8135de476a30fae6d7c07">00867</a>     <span class="keywordtype">bool</span> insert( <span class="keyword">const</span> value_type &value ) {
+<a name="l00868"></a>00868         <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, NULL, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
+<a name="l00869"></a>00869     }
+<a name="l00870"></a>00870 
+<a name="l00872"></a>00872     <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00873"></a><a class="code" href="a00243.html#1dd37fad87e561151ba1e242ca94bcc1">00873</a>     <span class="keywordtype">void</span> insert(I first, I last) {
+<a name="l00874"></a>00874         <span class="keywordflow">for</span>(; first != last; ++first)
+<a name="l00875"></a>00875             insert( *first );
+<a name="l00876"></a>00876     }
+<a name="l00877"></a>00877 
+<a name="l00879"></a>00879 
+<a name="l00880"></a>00880     <span class="keywordtype">bool</span> erase( <span class="keyword">const</span> Key& key );
+<a name="l00881"></a>00881 
+<a name="l00883"></a>00883 
+<a name="l00884"></a><a class="code" href="a00243.html#e698ef3d70b2d1a29a7a5551784d3653">00884</a>     <span class="keywordtype">bool</span> erase( <a class="code" href="a00246.html">const_accessor</a>& item_accessor ) {
+<a name="l00885"></a>00885         <span class="keywordflow">return</span> exclude( item_accessor );
+<a name="l00886"></a>00886     }
+<a name="l00887"></a>00887 
+<a name="l00889"></a>00889 
+<a name="l00890"></a><a class="code" href="a00243.html#5f12d150d421420965db07368666a84f">00890</a>     <span class="keywordtype">bool</span> erase( <a class="code" href="a00244.html">accessor</a>& item_accessor ) {
+<a name="l00891"></a>00891         <span class="keywordflow">return</span> exclude( item_accessor );
+<a name="l00892"></a>00892     }
+<a name="l00893"></a>00893 
+<a name="l00894"></a>00894 <span class="keyword">protected</span>:
+<a name="l00896"></a>00896     <span class="keywordtype">bool</span> lookup( <span class="keywordtype">bool</span> op_insert, <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T *t, const_accessor *result, <span class="keywordtype">bool</span> write );
+<a name="l00897"></a>00897 
+<a name="l00899"></a>00899     <span class="keywordtype">bool</span> exclude( const_accessor &item_accessor );
+<a name="l00900"></a>00900 
+<a name="l00902"></a>00902     <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00903"></a>00903     std::pair<I, I> internal_equal_range( <span class="keyword">const</span> Key& key, I end ) <span class="keyword">const</span>;
+<a name="l00904"></a>00904 
+<a name="l00906"></a>00906     <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> <a class="code" href="a00243.html">concurrent_hash_map</a>& source );
+<a name="l00907"></a>00907 
+<a name="l00908"></a>00908     <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00909"></a>00909     <span class="keywordtype">void</span> internal_copy(I first, I last);
+<a name="l00910"></a>00910 
+<a name="l00912"></a>00912 
+<a name="l00914"></a><a class="code" href="a00243.html#2f76ed101a0ccc8875b846c2f747897e">00914</a>     const_pointer internal_fast_find( <span class="keyword">const</span> Key& key )<span class="keyword"> const </span>{
+<a name="l00915"></a>00915         hashcode_t h = my_hash_compare.hash( key );
+<a name="l00916"></a>00916         hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );
+<a name="l00917"></a>00917         node *n;
+<a name="l00918"></a>00918     restart:
+<a name="l00919"></a>00919         __TBB_ASSERT((m&(m+1))==0, NULL);
+<a name="l00920"></a>00920         bucket *b = get_bucket( h & m );
+<a name="l00921"></a>00921         <span class="comment">// TODO: actually, notification is unnecessary here, just hiding double-check</span>
+<a name="l00922"></a>00922         <span class="keywordflow">if</span>( itt_load_word_with_acquire(b->node_list) == internal::rehash_req )
+<a name="l00923"></a>00923         {
+<a name="l00924"></a>00924             bucket::scoped_t lock;
+<a name="l00925"></a>00925             <span class="keywordflow">if</span>( lock.try_acquire( b->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> ) ) {
+<a name="l00926"></a>00926                 <span class="keywordflow">if</span>( b->node_list == internal::rehash_req)
+<a name="l00927"></a>00927                     const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->rehash_bucket( b, h & m ); <span class="comment">//recursive rehashing</span>
+<a name="l00928"></a>00928             }
+<a name="l00929"></a>00929             <span class="keywordflow">else</span> lock.acquire( b->mutex, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
+<a name="l00930"></a>00930             __TBB_ASSERT(b->node_list!=internal::rehash_req,NULL);
+<a name="l00931"></a>00931         }
+<a name="l00932"></a>00932         n = search_bucket( key, b );
+<a name="l00933"></a>00933         <span class="keywordflow">if</span>( n )
+<a name="l00934"></a>00934             <span class="keywordflow">return</span> &n->item;
+<a name="l00935"></a>00935         <span class="keywordflow">else</span> <span class="keywordflow">if</span>( check_mask_race( h, m ) )
+<a name="l00936"></a>00936             <span class="keywordflow">goto</span> restart;
+<a name="l00937"></a>00937         <span class="keywordflow">return</span> 0;
+<a name="l00938"></a>00938     }
+<a name="l00939"></a>00939 };
+<a name="l00940"></a>00940 
+<a name="l00941"></a>00941 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00942"></a>00942 <span class="preprocessor"></span>    <span class="comment">// Suppress "conditional expression is constant" warning.</span>
+<a name="l00943"></a>00943 <span class="preprocessor">    #pragma warning( push )</span>
+<a name="l00944"></a>00944 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning( disable: 4127 )</span>
+<a name="l00945"></a>00945 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00946"></a>00946 <span class="preprocessor"></span>
+<a name="l00947"></a>00947 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
+<a name="l00948"></a><a class="code" href="a00243.html#3f3413264a99174a224ef96f6c4ea769">00948</a> <span class="keywordtype">bool</span> <a class="code" href="a00243.html">concurrent_hash_map<Key,T,HashCompare,A>::lookup</a>( <span class="keywordtype">bool</span> op_insert, <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T *t, <a class="code" href="a00246.html">const_accessor</a> *result, <span class="keywordtype">bool</span> write ) {
+<a name="l00949"></a>00949     __TBB_ASSERT( !result || !result-><a class="code" href="a00246.html#21856da696b0765cc3db90663160d95e">my_node</a>, NULL );
+<a name="l00950"></a>00950     <span class="keywordtype">bool</span> return_value;
+<a name="l00951"></a>00951     hashcode_t <span class="keyword">const</span> h = my_hash_compare.hash( key );
+<a name="l00952"></a>00952     hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );
+<a name="l00953"></a>00953     segment_index_t grow_segment = 0;
+<a name="l00954"></a>00954     node *n, *tmp_n = 0;
+<a name="l00955"></a>00955     restart:
+<a name="l00956"></a>00956     {<span class="comment">//lock scope</span>
+<a name="l00957"></a>00957         __TBB_ASSERT((m&(m+1))==0, NULL);
+<a name="l00958"></a>00958         return_value = <span class="keyword">false</span>;
+<a name="l00959"></a>00959         <span class="comment">// get bucket</span>
+<a name="l00960"></a>00960         <a class="code" href="a00245.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
+<a name="l00961"></a>00961 
+<a name="l00962"></a>00962         <span class="comment">// find a node</span>
+<a name="l00963"></a>00963         n = search_bucket( key, b() );
+<a name="l00964"></a>00964         <span class="keywordflow">if</span>( op_insert ) {
+<a name="l00965"></a>00965             <span class="comment">// [opt] insert a key</span>
+<a name="l00966"></a>00966             <span class="keywordflow">if</span>( !n ) {
+<a name="l00967"></a>00967                 <span class="keywordflow">if</span>( !tmp_n ) {
+<a name="l00968"></a>00968                     <span class="keywordflow">if</span>(t) tmp_n = <span class="keyword">new</span>( my_allocator ) node(key, *t);
+<a name="l00969"></a>00969                     <span class="keywordflow">else</span>  tmp_n = <span class="keyword">new</span>( my_allocator ) node(key);
+<a name="l00970"></a>00970                 }
+<a name="l00971"></a>00971                 <span class="keywordflow">if</span>( !b.<a class="code" href="a00245.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a>() && !b.upgrade_to_writer() ) { <span class="comment">// TODO: improved insertion</span>
+<a name="l00972"></a>00972                     <span class="comment">// Rerun search_list, in case another thread inserted the item during the upgrade.</span>
+<a name="l00973"></a>00973                     n = search_bucket( key, b() );
+<a name="l00974"></a>00974                     <span class="keywordflow">if</span>( is_valid(n) ) { <span class="comment">// unfortunately, it did</span>
+<a name="l00975"></a>00975                         b.downgrade_to_reader();
+<a name="l00976"></a>00976                         <span class="keywordflow">goto</span> exists;
+<a name="l00977"></a>00977                     }
+<a name="l00978"></a>00978                 }
+<a name="l00979"></a>00979                 <span class="keywordflow">if</span>( check_mask_race(h, m) )
+<a name="l00980"></a>00980                     <span class="keywordflow">goto</span> restart; <span class="comment">// b.release() is done in ~b().</span>
+<a name="l00981"></a>00981                 <span class="comment">// insert and set flag to grow the container</span>
+<a name="l00982"></a>00982                 grow_segment = insert_new_node( b(), n = tmp_n, m );
+<a name="l00983"></a>00983                 tmp_n = 0;
+<a name="l00984"></a>00984                 return_value = <span class="keyword">true</span>;
+<a name="l00985"></a>00985             }
+<a name="l00986"></a>00986         } <span class="keywordflow">else</span> { <span class="comment">// find or count</span>
+<a name="l00987"></a>00987             <span class="keywordflow">if</span>( !n ) {
+<a name="l00988"></a>00988                 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
+<a name="l00989"></a>00989                     <span class="keywordflow">goto</span> restart; <span class="comment">// b.release() is done in ~b(). TODO: replace by continue</span>
+<a name="l00990"></a>00990                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00991"></a>00991             }
+<a name="l00992"></a>00992             return_value = <span class="keyword">true</span>;
+<a name="l00993"></a>00993         }
+<a name="l00994"></a>00994     exists:
+<a name="l00995"></a>00995         <span class="keywordflow">if</span>( !result ) <span class="keywordflow">goto</span> check_growth;
+<a name="l00996"></a>00996         <span class="comment">// TODO: the following seems as generic/regular operation</span>
+<a name="l00997"></a>00997         <span class="comment">// acquire the item</span>
+<a name="l00998"></a>00998         <span class="keywordflow">if</span>( !result->try_acquire( n->mutex, write ) ) {
+<a name="l00999"></a>00999             <span class="comment">// we are unlucky, prepare for longer wait</span>
+<a name="l01000"></a>01000             <a class="code" href="a00230.html">tbb::internal::atomic_backoff</a> trials;
+<a name="l01001"></a>01001             <span class="keywordflow">do</span> {
+<a name="l01002"></a>01002                 <span class="keywordflow">if</span>( !trials.bounded_pause() ) {
+<a name="l01003"></a>01003                     <span class="comment">// the wait takes really long, restart the operation</span>
+<a name="l01004"></a>01004                     b.release();
+<a name="l01005"></a>01005                     __TBB_ASSERT( !op_insert || !return_value, <span class="stringliteral">"Can't acquire new item in locked bucket?"</span> );
+<a name="l01006"></a>01006                     __TBB_Yield();
+<a name="l01007"></a>01007                     m = (hashcode_t) itt_load_word_with_acquire( my_mask );
+<a name="l01008"></a>01008                     <span class="keywordflow">goto</span> restart;
+<a name="l01009"></a>01009                 }
+<a name="l01010"></a>01010             } <span class="keywordflow">while</span>( !result->try_acquire( n->mutex, write ) );
+<a name="l01011"></a>01011         }
+<a name="l01012"></a>01012     }<span class="comment">//lock scope</span>
+<a name="l01013"></a>01013     result-><a class="code" href="a00246.html#21856da696b0765cc3db90663160d95e">my_node</a> = n;
+<a name="l01014"></a>01014     result-><a class="code" href="a00246.html#4936cc9432926ed38f0207828b388e24">my_hash</a> = h;
+<a name="l01015"></a>01015 check_growth:
+<a name="l01016"></a>01016     <span class="comment">// [opt] grow the container</span>
+<a name="l01017"></a>01017     <span class="keywordflow">if</span>( grow_segment ) {
+<a name="l01018"></a>01018 <span class="preprocessor">#if __TBB_STATISTICS</span>
+<a name="l01019"></a>01019 <span class="preprocessor"></span>        my_info_resizes++; <span class="comment">// concurrent ones</span>
+<a name="l01020"></a>01020 <span class="preprocessor">#endif</span>
+<a name="l01021"></a>01021 <span class="preprocessor"></span>        enable_segment( grow_segment );
+<a name="l01022"></a>01022     }
+<a name="l01023"></a>01023     <span class="keywordflow">if</span>( tmp_n ) <span class="comment">// if op_insert only</span>
+<a name="l01024"></a>01024         delete_node( tmp_n );
+<a name="l01025"></a>01025     <span class="keywordflow">return</span> return_value;
+<a name="l01026"></a>01026 }
+<a name="l01027"></a>01027 
+<a name="l01028"></a>01028 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
+<a name="l01029"></a>01029 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l01030"></a><a class="code" href="a00243.html#8f5373b8e1864619d1ffcf3bf3f1f13d">01030</a> std::pair<I, I> <a class="code" href="a00243.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_equal_range</a>( <span class="keyword">const</span> Key& key, I end_ )<span class="keyword"> const </span>{
+<a name="l01031"></a>01031     hashcode_t h = my_hash_compare.hash( key );
+<a name="l01032"></a>01032     hashcode_t m = my_mask;
+<a name="l01033"></a>01033     __TBB_ASSERT((m&(m+1))==0, NULL);
+<a name="l01034"></a>01034     h &= m;
+<a name="l01035"></a>01035     bucket *b = get_bucket( h );
+<a name="l01036"></a>01036     <span class="keywordflow">while</span>( b->node_list == internal::rehash_req ) {
+<a name="l01037"></a>01037         m = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
+<a name="l01038"></a>01038         b = get_bucket( h &= m );
+<a name="l01039"></a>01039     }
+<a name="l01040"></a>01040     node *n = search_bucket( key, b );
+<a name="l01041"></a>01041     <span class="keywordflow">if</span>( !n )
+<a name="l01042"></a>01042         <span class="keywordflow">return</span> std::make_pair(end_, end_);
+<a name="l01043"></a>01043     iterator lower(*<span class="keyword">this</span>, h, b, n), upper(lower);
+<a name="l01044"></a>01044     <span class="keywordflow">return</span> std::make_pair(lower, ++upper);
+<a name="l01045"></a>01045 }
+<a name="l01046"></a>01046 
+<a name="l01047"></a>01047 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
+<a name="l01048"></a><a class="code" href="a00243.html#0c964214eb38f54603aa75fdff6d2709">01048</a> <span class="keywordtype">bool</span> <a class="code" href="a00243.html">concurrent_hash_map<Key,T,HashCompare,A>::exclude</a>( <a class="code" href="a00246.html">const_accessor</a> &item_accessor ) {
+<a name="l01049"></a>01049     __TBB_ASSERT( item_accessor.<a class="code" href="a00246.html#21856da696b0765cc3db90663160d95e">my_node</a>, NULL );
+<a name="l01050"></a>01050     node_base *<span class="keyword">const</span> n = item_accessor.<a class="code" href="a00246.html#21856da696b0765cc3db90663160d95e">my_node</a>;
+<a name="l01051"></a>01051     hashcode_t <span class="keyword">const</span> h = item_accessor.<a class="code" href="a00246.html#4936cc9432926ed38f0207828b388e24">my_hash</a>;
+<a name="l01052"></a>01052     hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );
+<a name="l01053"></a>01053     <span class="keywordflow">do</span> {
+<a name="l01054"></a>01054         <span class="comment">// get bucket</span>
+<a name="l01055"></a>01055         <a class="code" href="a00245.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m, <span class="comment">/*writer=*/</span><span class="keyword">true</span> );
+<a name="l01056"></a>01056         node_base **p = &b()->node_list;
+<a name="l01057"></a>01057         <span class="keywordflow">while</span>( *p && *p != n )
+<a name="l01058"></a>01058             p = &(*p)->next;
+<a name="l01059"></a>01059         <span class="keywordflow">if</span>( !*p ) { <span class="comment">// someone else was the first</span>
+<a name="l01060"></a>01060             <span class="keywordflow">if</span>( check_mask_race( h, m ) )
+<a name="l01061"></a>01061                 <span class="keywordflow">continue</span>;
+<a name="l01062"></a>01062             item_accessor.<a class="code" href="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a>();
+<a name="l01063"></a>01063             <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01064"></a>01064         }
+<a name="l01065"></a>01065         __TBB_ASSERT( *p == n, NULL );
+<a name="l01066"></a>01066         *p = n->next; <span class="comment">// remove from container</span>
+<a name="l01067"></a>01067         my_size--;
+<a name="l01068"></a>01068         <span class="keywordflow">break</span>;
+<a name="l01069"></a>01069     } <span class="keywordflow">while</span>(<span class="keyword">true</span>);
+<a name="l01070"></a>01070     <span class="keywordflow">if</span>( !item_accessor.<a class="code" href="a00246.html#45ab59454c6f11fe938bbcab637cdd73">is_writer</a>() ) <span class="comment">// need to get exclusive lock</span>
+<a name="l01071"></a>01071         item_accessor.upgrade_to_writer(); <span class="comment">// return value means nothing here</span>
+<a name="l01072"></a>01072     item_accessor.<a class="code" href="a00246.html#7db006d41b49dc5f1716a913769d4698">release</a>();
+<a name="l01073"></a>01073     delete_node( n ); <span class="comment">// Only one thread can delete it</span>
+<a name="l01074"></a>01074     <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01075"></a>01075 }
+<a name="l01076"></a>01076 
+<a name="l01077"></a>01077 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
+<a name="l01078"></a><a class="code" href="a00243.html#f27802b3a8d1863c29e743e9c6b4e870">01078</a> <span class="keywordtype">bool</span> <a class="code" href="a00243.html">concurrent_hash_map<Key,T,HashCompare,A>::erase</a>( <span class="keyword">const</span> Key &key ) {
+<a name="l01079"></a>01079     node_base *n;
+<a name="l01080"></a>01080     hashcode_t <span class="keyword">const</span> h = my_hash_compare.hash( key );
+<a name="l01081"></a>01081     hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );
+<a name="l01082"></a>01082 restart:
+<a name="l01083"></a>01083     {<span class="comment">//lock scope</span>
+<a name="l01084"></a>01084         <span class="comment">// get bucket</span>
+<a name="l01085"></a>01085         <a class="code" href="a00245.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
+<a name="l01086"></a>01086     search:
+<a name="l01087"></a>01087         node_base **p = &b()->node_list;
+<a name="l01088"></a>01088         n = *p;
+<a name="l01089"></a>01089         <span class="keywordflow">while</span>( is_valid(n) && !my_hash_compare.equal(key, static_cast<node*>(n)->item.first ) ) {
+<a name="l01090"></a>01090             p = &n->next;
+<a name="l01091"></a>01091             n = *p;
+<a name="l01092"></a>01092         }
+<a name="l01093"></a>01093         <span class="keywordflow">if</span>( !n ) { <span class="comment">// not found, but mask could be changed</span>
+<a name="l01094"></a>01094             <span class="keywordflow">if</span>( check_mask_race( h, m ) )
+<a name="l01095"></a>01095                 <span class="keywordflow">goto</span> restart;
+<a name="l01096"></a>01096             <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01097"></a>01097         }
+<a name="l01098"></a>01098         <span class="keywordflow">else</span> <span class="keywordflow">if</span>( !b.<a class="code" href="a00245.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a>() && !b.upgrade_to_writer() ) {
+<a name="l01099"></a>01099             <span class="keywordflow">if</span>( check_mask_race( h, m ) ) <span class="comment">// contended upgrade, check mask</span>
+<a name="l01100"></a>01100                 <span class="keywordflow">goto</span> restart;
+<a name="l01101"></a>01101             <span class="keywordflow">goto</span> search;
+<a name="l01102"></a>01102         }
+<a name="l01103"></a>01103         *p = n->next;
+<a name="l01104"></a>01104         my_size--;
+<a name="l01105"></a>01105     }
+<a name="l01106"></a>01106     {
+<a name="l01107"></a>01107         <span class="keyword">typename</span> node::scoped_t item_locker( n->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
+<a name="l01108"></a>01108     }
+<a name="l01109"></a>01109     <span class="comment">// note: there should be no threads pretending to acquire this mutex again, do not try to upgrade const_accessor!</span>
+<a name="l01110"></a>01110     delete_node( n ); <span class="comment">// Only one thread can delete it due to write lock on the bucket</span>
+<a name="l01111"></a>01111     <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01112"></a>01112 }
+<a name="l01113"></a>01113 
+<a name="l01114"></a>01114 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
+<a name="l01115"></a>01115 <span class="keywordtype">void</span> <a class="code" href="a00243.html">concurrent_hash_map<Key,T,HashCompare,A>::swap</a>(<a class="code" href="a00243.html">concurrent_hash_map<Key,T,HashCompare,A></a> &table) {
+<a name="l01116"></a>01116     std::swap(this->my_allocator, table.<a class="code" href="a00243.html#a72cb6e9873e5541295682179e5a7f74">my_allocator</a>);
+<a name="l01117"></a>01117     std::swap(this->my_hash_compare, table.<a class="code" href="a00243.html#53c747a3f2d2d2c85aec866e19c31c29">my_hash_compare</a>);
+<a name="l01118"></a>01118     internal_swap(table);
+<a name="l01119"></a>01119 }
+<a name="l01120"></a>01120 
+<a name="l01121"></a>01121 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
+<a name="l01122"></a><a class="code" href="a00243.html#94758113d8993cfe5afdf2d63a728869">01122</a> <span class="keywordtype">void</span> <a class="code" href="a00243.html">concurrent_hash_map<Key,T,HashCompare,A>::rehash</a>(size_type sz) {
+<a name="l01123"></a>01123     reserve( sz ); <span class="comment">// TODO: add reduction of number of buckets as well</span>
+<a name="l01124"></a>01124     hashcode_t mask = my_mask;
+<a name="l01125"></a>01125     hashcode_t b = (mask+1)>>1; <span class="comment">// size or first index of the last segment</span>
+<a name="l01126"></a>01126     __TBB_ASSERT((b&(b-1))==0, NULL);
+<a name="l01127"></a>01127     bucket *bp = get_bucket( b ); <span class="comment">// only the last segment should be scanned for rehashing</span>
+<a name="l01128"></a>01128     <span class="keywordflow">for</span>(; b <= mask; b++, bp++ ) {
+<a name="l01129"></a>01129         node_base *n = bp->node_list;
+<a name="l01130"></a>01130         __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, <span class="stringliteral">"Broken internal structure"</span> );
+<a name="l01131"></a>01131         __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during rehash() execution"</span> );
+<a name="l01132"></a>01132         <span class="keywordflow">if</span>( n == internal::rehash_req ) { <span class="comment">// rehash bucket, conditional because rehashing of a previous bucket may affect this one</span>
+<a name="l01133"></a>01133             hashcode_t h = b; bucket *b_old = bp;
+<a name="l01134"></a>01134             <span class="keywordflow">do</span> {
+<a name="l01135"></a>01135                 __TBB_ASSERT( h > 1, <span class="stringliteral">"The lowermost buckets can't be rehashed"</span> );
+<a name="l01136"></a>01136                 hashcode_t m = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
+<a name="l01137"></a>01137                 b_old = get_bucket( h &= m );
+<a name="l01138"></a>01138             } <span class="keywordflow">while</span>( b_old->node_list == internal::rehash_req );
+<a name="l01139"></a>01139             <span class="comment">// now h - is index of the root rehashed bucket b_old</span>
+<a name="l01140"></a>01140             mark_rehashed_levels( h ); <span class="comment">// mark all non-rehashed children recursively across all segments</span>
+<a name="l01141"></a>01141             <span class="keywordflow">for</span>( node_base **p = &b_old->node_list, *q = *p; is_valid(q); q = *p ) {
+<a name="l01142"></a>01142                 hashcode_t c = my_hash_compare.hash( static_cast<node*>(q)->item.first );
+<a name="l01143"></a>01143                 <span class="keywordflow">if</span>( (c & mask) != h ) { <span class="comment">// should be rehashed</span>
+<a name="l01144"></a>01144                     *p = q->next; <span class="comment">// exclude from b_old</span>
+<a name="l01145"></a>01145                     bucket *b_new = get_bucket( c & mask );
+<a name="l01146"></a>01146                     __TBB_ASSERT( b_new->node_list != internal::rehash_req, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
+<a name="l01147"></a>01147                     add_to_bucket( b_new, q );
+<a name="l01148"></a>01148                 } <span class="keywordflow">else</span> p = &q->next; <span class="comment">// iterate to next item</span>
+<a name="l01149"></a>01149             }
+<a name="l01150"></a>01150         }
+<a name="l01151"></a>01151     }
+<a name="l01152"></a>01152 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01153"></a>01153 <span class="preprocessor"></span>    <span class="keywordtype">int</span> current_size = int(my_size), buckets = int(mask)+1, empty_buckets = 0, overpopulated_buckets = 0; <span class="comment">// usage statistics</span>
+<a name="l01154"></a>01154     <span class="keyword">static</span> <span class="keywordtype">bool</span> reported = <span class="keyword">false</span>;
+<a name="l01155"></a>01155 <span class="preprocessor">#endif</span>
+<a name="l01156"></a>01156 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01157"></a>01157 <span class="preprocessor"></span>    <span class="keywordflow">for</span>( b = 0; b <= mask; b++ ) {<span class="comment">// only last segment should be scanned for rehashing</span>
+<a name="l01158"></a>01158         <span class="keywordflow">if</span>( b & (b-2) ) ++bp; <span class="comment">// not the beginning of a segment</span>
+<a name="l01159"></a>01159         <span class="keywordflow">else</span> bp = get_bucket( b );
+<a name="l01160"></a>01160         node_base *n = bp->node_list;
+<a name="l01161"></a>01161         __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during rehash() execution"</span> );
+<a name="l01162"></a>01162         __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed, <span class="stringliteral">"Broken internal structure"</span> );
+<a name="l01163"></a>01163 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01164"></a>01164 <span class="preprocessor"></span>        <span class="keywordflow">if</span>( n == internal::empty_rehashed ) empty_buckets++;
+<a name="l01165"></a>01165         <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n->next ) overpopulated_buckets++;
+<a name="l01166"></a>01166 <span class="preprocessor">#endif</span>
+<a name="l01167"></a>01167 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l01168"></a>01168 <span class="preprocessor"></span>        <span class="keywordflow">for</span>( ; is_valid(n); n = n->next ) {
+<a name="l01169"></a>01169             hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first ) & mask;
+<a name="l01170"></a>01170             __TBB_ASSERT( h == b, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
+<a name="l01171"></a>01171         }
+<a name="l01172"></a>01172 <span class="preprocessor">#endif</span>
+<a name="l01173"></a>01173 <span class="preprocessor"></span>    }
+<a name="l01174"></a>01174 <span class="preprocessor">#endif // TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01175"></a>01175 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l01176"></a>01176 <span class="preprocessor"></span>    <span class="keywordflow">if</span>( buckets > current_size) empty_buckets -= buckets - current_size;
+<a name="l01177"></a>01177     <span class="keywordflow">else</span> overpopulated_buckets -= current_size - buckets; <span class="comment">// TODO: load_factor?</span>
+<a name="l01178"></a>01178     <span class="keywordflow">if</span>( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
+<a name="l01179"></a>01179         tbb::internal::runtime_warning(
+<a name="l01180"></a>01180             <span class="stringliteral">"Performance is not optimal because the hash function produces bad randomness in lower bits in %s.\nSize: %d  Empties: %d  Overlaps: %d"</span>,
+<a name="l01181"></a>01181             <span class="keyword">typeid</span>(*this).name(), current_size, empty_buckets, overpopulated_buckets );
+<a name="l01182"></a>01182         reported = <span class="keyword">true</span>;
+<a name="l01183"></a>01183     }
+<a name="l01184"></a>01184 <span class="preprocessor">#endif</span>
+<a name="l01185"></a>01185 <span class="preprocessor"></span>}
+<a name="l01186"></a>01186 
+<a name="l01187"></a>01187 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
+<a name="l01188"></a><a class="code" href="a00243.html#220686fe17b197eedf19dd856cd02e36">01188</a> <span class="keywordtype">void</span> <a class="code" href="a00243.html">concurrent_hash_map<Key,T,HashCompare,A>::clear</a>() {
+<a name="l01189"></a>01189     hashcode_t m = my_mask;
+<a name="l01190"></a>01190     __TBB_ASSERT((m&(m+1))==0, NULL);
+<a name="l01191"></a>01191 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
+<a name="l01192"></a>01192 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
+<a name="l01193"></a>01193 <span class="preprocessor"></span>    <span class="keywordtype">int</span> current_size = int(my_size), buckets = int(m)+1, empty_buckets = 0, overpopulated_buckets = 0; <span class="comment">// usage statistics</span>
+<a name="l01194"></a>01194     <span class="keyword">static</span> <span class="keywordtype">bool</span> reported = <span class="keyword">false</span>;
+<a name="l01195"></a>01195 <span class="preprocessor">#endif</span>
+<a name="l01196"></a>01196 <span class="preprocessor"></span>    bucket *bp = 0;
+<a name="l01197"></a>01197     <span class="comment">// check consistency</span>
+<a name="l01198"></a>01198     <span class="keywordflow">for</span>( segment_index_t b = 0; b <= m; b++ ) {
+<a name="l01199"></a>01199         <span class="keywordflow">if</span>( b & (b-2) ) ++bp; <span class="comment">// not the beginning of a segment</span>
+<a name="l01200"></a>01200         <span class="keywordflow">else</span> bp = get_bucket( b );
+<a name="l01201"></a>01201         node_base *n = bp->node_list;
+<a name="l01202"></a>01202         __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, <span class="stringliteral">"Broken internal structure"</span> );
+<a name="l01203"></a>01203         __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during clear() execution"</span> );
+<a name="l01204"></a>01204 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
+<a name="l01205"></a>01205 <span class="preprocessor"></span>        <span class="keywordflow">if</span>( n == internal::empty_rehashed ) empty_buckets++;
+<a name="l01206"></a>01206         <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n == internal::rehash_req ) buckets--;
+<a name="l01207"></a>01207         <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n->next ) overpopulated_buckets++;
+<a name="l01208"></a>01208 <span class="preprocessor">#endif</span>
+<a name="l01209"></a>01209 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
+<a name="l01210"></a>01210 <span class="preprocessor"></span>        <span class="keywordflow">for</span>(; is_valid(n); n = n->next ) {
+<a name="l01211"></a>01211             hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first );
+<a name="l01212"></a>01212             h &= m;
+<a name="l01213"></a>01213             __TBB_ASSERT( h == b || get_bucket(h)->node_list == internal::rehash_req, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
+<a name="l01214"></a>01214         }
+<a name="l01215"></a>01215 <span class="preprocessor">#endif</span>
+<a name="l01216"></a>01216 <span class="preprocessor"></span>    }
+<a name="l01217"></a>01217 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
+<a name="l01218"></a>01218 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_STATISTICS</span>
+<a name="l01219"></a>01219 <span class="preprocessor"></span>    printf( <span class="stringliteral">"items=%d buckets: capacity=%d rehashed=%d empty=%d overpopulated=%d"</span>
+<a name="l01220"></a>01220         <span class="stringliteral">" concurrent: resizes=%u rehashes=%u restarts=%u\n"</span>,
+<a name="l01221"></a>01221         current_size, <span class="keywordtype">int</span>(m+1), buckets, empty_buckets, overpopulated_buckets,
+<a name="l01222"></a>01222         <span class="keywordtype">unsigned</span>(my_info_resizes), <span class="keywordtype">unsigned</span>(my_info_rehashes), <span class="keywordtype">unsigned</span>(my_info_restarts) );
+<a name="l01223"></a>01223     my_info_resizes = 0; <span class="comment">// concurrent ones</span>
+<a name="l01224"></a>01224     my_info_restarts = 0; <span class="comment">// race collisions</span>
+<a name="l01225"></a>01225     my_info_rehashes = 0;  <span class="comment">// invocations of rehash_bucket</span>
+<a name="l01226"></a>01226 <span class="preprocessor">#endif</span>
+<a name="l01227"></a>01227 <span class="preprocessor"></span>    <span class="keywordflow">if</span>( buckets > current_size) empty_buckets -= buckets - current_size;
+<a name="l01228"></a>01228     <span class="keywordflow">else</span> overpopulated_buckets -= current_size - buckets; <span class="comment">// TODO: load_factor?</span>
+<a name="l01229"></a>01229     <span class="keywordflow">if</span>( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
+<a name="l01230"></a>01230         tbb::internal::runtime_warning(
+<a name="l01231"></a>01231             <span class="stringliteral">"Performance is not optimal because the hash function produces bad randomness in lower bits in %s.\nSize: %d  Empties: %d  Overlaps: %d"</span>,
+<a name="l01232"></a>01232             <span class="keyword">typeid</span>(*this).name(), current_size, empty_buckets, overpopulated_buckets );
+<a name="l01233"></a>01233         reported = <span class="keyword">true</span>;
+<a name="l01234"></a>01234     }
+<a name="l01235"></a>01235 <span class="preprocessor">#endif</span>
+<a name="l01236"></a>01236 <span class="preprocessor"></span><span class="preprocessor">#endif//TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
+<a name="l01237"></a>01237 <span class="preprocessor"></span>    my_size = 0;
+<a name="l01238"></a>01238     segment_index_t s = segment_index_of( m );
+<a name="l01239"></a>01239     __TBB_ASSERT( s+1 == pointers_per_table || !my_table[s+1], <span class="stringliteral">"wrong mask or concurrent grow"</span> );
+<a name="l01240"></a>01240     <a class="code" href="a00238.html">cache_aligned_allocator<bucket></a> alloc;
+<a name="l01241"></a>01241     <span class="keywordflow">do</span> {
+<a name="l01242"></a>01242         __TBB_ASSERT( is_valid( my_table[s] ), <span class="stringliteral">"wrong mask or concurrent grow"</span> );
+<a name="l01243"></a>01243         segment_ptr_t buckets_ptr = my_table[s];
+<a name="l01244"></a>01244         size_type sz = segment_size( s ? s : 1 );
+<a name="l01245"></a>01245         <span class="keywordflow">for</span>( segment_index_t i = 0; i < sz; i++ )
+<a name="l01246"></a>01246             <span class="keywordflow">for</span>( node_base *n = buckets_ptr[i].node_list; is_valid(n); n = buckets_ptr[i].node_list ) {
+<a name="l01247"></a>01247                 buckets_ptr[i].node_list = n->next;
+<a name="l01248"></a>01248                 delete_node( n );
+<a name="l01249"></a>01249             }
+<a name="l01250"></a>01250         <span class="keywordflow">if</span>( s >= first_block) <span class="comment">// the first segment or the next</span>
+<a name="l01251"></a>01251             alloc.<a class="code" href="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, sz );
+<a name="l01252"></a>01252         <span class="keywordflow">else</span> <span class="keywordflow">if</span>( s == embedded_block && embedded_block != first_block )
+<a name="l01253"></a>01253             alloc.<a class="code" href="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, segment_size(first_block)-embedded_buckets );
+<a name="l01254"></a>01254         <span class="keywordflow">if</span>( s >= embedded_block ) my_table[s] = 0;
+<a name="l01255"></a>01255     } <span class="keywordflow">while</span>(s-- > 0);
+<a name="l01256"></a>01256     my_mask = embedded_buckets - 1;
+<a name="l01257"></a>01257 }
+<a name="l01258"></a>01258 
+<a name="l01259"></a>01259 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
+<a name="l01260"></a><a class="code" href="a00243.html#72c9c9e9655fcf096f5f0ed9c8ba6669">01260</a> <span class="keywordtype">void</span> <a class="code" href="a00243.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>( <span class="keyword">const</span> <a class="code" href="a00243.html">concurrent_hash_map</a>& source ) {
+<a name="l01261"></a>01261     reserve( source.my_size ); <span class="comment">// TODO: load_factor?</span>
+<a name="l01262"></a>01262     hashcode_t mask = source.my_mask;
+<a name="l01263"></a>01263     <span class="keywordflow">if</span>( my_mask == mask ) { <span class="comment">// optimized version</span>
+<a name="l01264"></a>01264         bucket *dst = 0, *src = 0;
+<a name="l01265"></a>01265         <span class="keywordtype">bool</span> rehash_required = <span class="keyword">false</span>;
+<a name="l01266"></a>01266         <span class="keywordflow">for</span>( hashcode_t k = 0; k <= mask; k++ ) {
+<a name="l01267"></a>01267             <span class="keywordflow">if</span>( k & (k-2) ) ++dst,src++; <span class="comment">// not the beginning of a segment</span>
+<a name="l01268"></a>01268             <span class="keywordflow">else</span> { dst = get_bucket( k ); src = source.get_bucket( k ); }
+<a name="l01269"></a>01269             __TBB_ASSERT( dst->node_list != internal::rehash_req, <span class="stringliteral">"Invalid bucket in destination table"</span>);
+<a name="l01270"></a>01270             node *n = static_cast<node*>( src->node_list );
+<a name="l01271"></a>01271             <span class="keywordflow">if</span>( n == internal::rehash_req ) { <span class="comment">// source is not rehashed, items are in previous buckets</span>
+<a name="l01272"></a>01272                 rehash_required = <span class="keyword">true</span>;
+<a name="l01273"></a>01273                 dst->node_list = internal::rehash_req;
+<a name="l01274"></a>01274             } <span class="keywordflow">else</span> <span class="keywordflow">for</span>(; n; n = static_cast<node*>( n->next ) ) {
+<a name="l01275"></a>01275                 add_to_bucket( dst, <span class="keyword">new</span>( my_allocator ) node(n->item.first, n->item.second) );
+<a name="l01276"></a>01276                 ++my_size; <span class="comment">// TODO: replace by non-atomic op</span>
+<a name="l01277"></a>01277             }
+<a name="l01278"></a>01278         }
+<a name="l01279"></a>01279         <span class="keywordflow">if</span>( rehash_required ) <a class="code" href="a00243.html#94758113d8993cfe5afdf2d63a728869">rehash</a>();
+<a name="l01280"></a>01280     } <span class="keywordflow">else</span> <a class="code" href="a00243.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a>( source.<a class="code" href="a00243.html#35a8c373fc3d52099ae18f0553162491">begin</a>(), source.<a class="code" href="a00243.html#67c50bddda53b9a10318f8981e4fc4fa">end</a>() );
+<a name="l01281"></a>01281 }
+<a name="l01282"></a>01282 
+<a name="l01283"></a>01283 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
+<a name="l01284"></a>01284 <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l01285"></a>01285 <span class="keywordtype">void</span> <a class="code" href="a00243.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>(I first, I last) {
+<a name="l01286"></a>01286     hashcode_t m = my_mask;
+<a name="l01287"></a>01287     <span class="keywordflow">for</span>(; first != last; ++first) {
+<a name="l01288"></a>01288         hashcode_t h = my_hash_compare.hash( first->first );
+<a name="l01289"></a>01289         bucket *b = get_bucket( h & m );
+<a name="l01290"></a>01290         __TBB_ASSERT( b->node_list != internal::rehash_req, <span class="stringliteral">"Invalid bucket in destination table"</span>);
+<a name="l01291"></a>01291         node *n = <span class="keyword">new</span>( my_allocator ) node(first->first, first->second);
+<a name="l01292"></a>01292         add_to_bucket( b, n );
+<a name="l01293"></a>01293         ++my_size; <span class="comment">// TODO: replace by non-atomic op</span>
+<a name="l01294"></a>01294     }
+<a name="l01295"></a>01295 }
+<a name="l01296"></a>01296 
+<a name="l01297"></a>01297 } <span class="comment">// namespace interface5</span>
+<a name="l01298"></a>01298 
+<a name="l01299"></a>01299 <span class="keyword">using</span> interface5::concurrent_hash_map;
+<a name="l01300"></a>01300 
+<a name="l01301"></a>01301 
+<a name="l01302"></a>01302 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2>
+<a name="l01303"></a>01303 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A1> &a, <span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A2> &b) {
+<a name="l01304"></a>01304     <span class="keywordflow">if</span>(a.size() != b.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01305"></a>01305     <span class="keyword">typename</span> concurrent_hash_map<Key, T, HashCompare, A1>::const_iterator i(a.begin()), i_end(a.end());
+<a name="l01306"></a>01306     <span class="keyword">typename</span> concurrent_hash_map<Key, T, HashCompare, A2>::const_iterator j, j_end(b.end());
+<a name="l01307"></a>01307     <span class="keywordflow">for</span>(; i != i_end; ++i) {
+<a name="l01308"></a>01308         j = b.equal_range(i->first).first;
+<a name="l01309"></a>01309         <span class="keywordflow">if</span>( j == j_end || !(i->second == j->second) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01310"></a>01310     }
+<a name="l01311"></a>01311     <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01312"></a>01312 }
+<a name="l01313"></a>01313 
+<a name="l01314"></a>01314 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2>
+<a name="l01315"></a>01315 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A1> &a, <span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A2> &b)
+<a name="l01316"></a>01316 {    <span class="keywordflow">return</span> !(a == b); }
+<a name="l01317"></a>01317 
+<a name="l01318"></a>01318 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
+<a name="l01319"></a>01319 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap(concurrent_hash_map<Key, T, HashCompare, A> &a, concurrent_hash_map<Key, T, HashCompare, A> &b)
+<a name="l01320"></a>01320 {    a.swap( b ); }
+<a name="l01321"></a>01321 
+<a name="l01322"></a>01322 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l01323"></a>01323 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning( pop )</span>
+<a name="l01324"></a>01324 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4127 is back</span>
+<a name="l01325"></a>01325 <span class="preprocessor"></span>
+<a name="l01326"></a>01326 } <span class="comment">// namespace tbb</span>
+<a name="l01327"></a>01327 
+<a name="l01328"></a>01328 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_hash_map_H */</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00424.html b/doc/html/a00424.html
deleted file mode 100644
index 211159c..0000000
--- a/doc/html/a00424.html
+++ /dev/null
@@ -1,1219 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_hash_map.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>concurrent_hash_map.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_hash_map_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_hash_map_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 
-<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>    <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00028"></a>00028 <span class="preprocessor">    #pragma warning (push)</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4530)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <iterator></span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include <utility></span>      <span class="comment">// Need std::pair</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#include <cstring></span>      <span class="comment">// Need std::memset</span>
-<a name="l00035"></a>00035 
-<a name="l00036"></a>00036 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span>
-<a name="l00040"></a>00040 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00041"></a>00041 <span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00042"></a>00042 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
-<a name="l00043"></a>00043 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00044"></a>00044 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00045"></a>00045 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00047"></a>00047 <span class="preprocessor">#include "_concurrent_unordered_internal.h"</span> <span class="comment">// Need tbb_hasher</span>
-<a name="l00048"></a>00048 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor">#include <typeinfo></span>
-<a name="l00050"></a>00050 <span class="preprocessor">#endif</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#include <stdio.h></span>
-<a name="l00053"></a>00053 <span class="preprocessor">#endif</span>
-<a name="l00054"></a>00054 <span class="preprocessor"></span>
-<a name="l00055"></a>00055 <span class="keyword">namespace </span>tbb {
-<a name="l00056"></a>00056 
-<a name="l00058"></a>00058 <span class="keyword">template</span><<span class="keyword">typename</span> Key>
-<a name="l00059"></a><a class="code" href="a00300.html">00059</a> <span class="keyword">struct </span><a class="code" href="a00300.html">tbb_hash_compare</a> {
-<a name="l00060"></a>00060     <span class="keyword">static</span> size_t hash( <span class="keyword">const</span> Key& a ) { <span class="keywordflow">return</span> tbb_hasher(a); }
-<a name="l00061"></a>00061     <span class="keyword">static</span> <span class="keywordtype">bool</span> equal( <span class="keyword">const</span> Key& a, <span class="keyword">const</span> Key& b ) { <span class="keywordflow">return</span> a == b; }
-<a name="l00062"></a>00062 };
-<a name="l00063"></a>00063 
-<a name="l00064"></a>00064 <span class="keyword">namespace </span>interface5 {
-<a name="l00065"></a>00065 
-<a name="l00066"></a>00066     <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare = tbb_hash_compare<Key>, <span class="keyword">typename</span> A = tbb_allocator<std::pair<Key, T> > >
-<a name="l00067"></a>00067     <span class="keyword">class </span><a class="code" href="a00231.html">concurrent_hash_map</a>;
-<a name="l00068"></a>00068 
-<a name="l00070"></a>00070     <span class="keyword">namespace </span>internal {
-<a name="l00071"></a>00071 
-<a name="l00072"></a>00072 
-<a name="l00074"></a>00074     <span class="keyword">typedef</span> size_t hashcode_t;
-<a name="l00076"></a>00076     <span class="keyword">struct </span>hash_map_node_base : tbb::internal::no_copy {
-<a name="l00078"></a>00078         <span class="keyword">typedef</span> <a class="code" href="a00288.html">spin_rw_mutex</a> mutex_t;
-<a name="l00080"></a>00080         <span class="keyword">typedef</span> mutex_t::scoped_lock scoped_t;
-<a name="l00082"></a>00082         hash_map_node_base *next;
-<a name="l00083"></a>00083         mutex_t <a class="code" href="a00258.html">mutex</a>;
-<a name="l00084"></a>00084     };
-<a name="l00086"></a>00086     <span class="keyword">static</span> hash_map_node_base *<span class="keyword">const</span> rehash_req = reinterpret_cast<hash_map_node_base*>(size_t(3));
-<a name="l00088"></a>00088     <span class="keyword">static</span> hash_map_node_base *<span class="keyword">const</span> empty_rehashed = reinterpret_cast<hash_map_node_base*>(size_t(0));
-<a name="l00090"></a>00090     <span class="keyword">class </span>hash_map_base {
-<a name="l00091"></a>00091     <span class="keyword">public</span>:
-<a name="l00093"></a>00093         <span class="keyword">typedef</span> size_t size_type;
-<a name="l00095"></a>00095         <span class="keyword">typedef</span> size_t hashcode_t;
-<a name="l00097"></a>00097         <span class="keyword">typedef</span> size_t segment_index_t;
-<a name="l00099"></a>00099         <span class="keyword">typedef</span> hash_map_node_base node_base;
-<a name="l00101"></a>00101         <span class="keyword">struct </span>bucket : tbb::internal::no_copy {
-<a name="l00103"></a>00103             <span class="keyword">typedef</span> spin_rw_mutex mutex_t;
-<a name="l00105"></a>00105             <span class="keyword">typedef</span> mutex_t::scoped_lock scoped_t;
-<a name="l00106"></a>00106             mutex_t mutex;
-<a name="l00107"></a>00107             node_base *node_list;
-<a name="l00108"></a>00108         };
-<a name="l00110"></a>00110         <span class="keyword">static</span> size_type <span class="keyword">const</span> embedded_block = 1;
-<a name="l00112"></a>00112         <span class="keyword">static</span> size_type <span class="keyword">const</span> embedded_buckets = 1<<embedded_block;
-<a name="l00114"></a>00114         <span class="keyword">static</span> size_type <span class="keyword">const</span> first_block = 8; <span class="comment">//including embedded_block. perfect with bucket size 16, so the allocations are power of 4096</span>
-<a name="l00116"></a>00116 <span class="comment"></span>        <span class="keyword">static</span> size_type <span class="keyword">const</span> pointers_per_table = <span class="keyword">sizeof</span>(segment_index_t) * 8; <span class="comment">// one segment per bit</span>
-<a name="l00118"></a>00118 <span class="comment"></span>        <span class="keyword">typedef</span> bucket *segment_ptr_t;
-<a name="l00120"></a>00120         <span class="keyword">typedef</span> segment_ptr_t segments_table_t[pointers_per_table];
-<a name="l00122"></a>00122         atomic<hashcode_t> my_mask;
-<a name="l00124"></a>00124         segments_table_t my_table;
-<a name="l00126"></a>00126         atomic<size_type> my_size; <span class="comment">// It must be in separate cache line from my_mask due to performance effects</span>
-<a name="l00128"></a>00128 <span class="comment"></span>        bucket my_embedded_segment[embedded_buckets];
-<a name="l00129"></a>00129 <span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l00130"></a>00130 <span class="preprocessor"></span>        atomic<unsigned> my_info_resizes; <span class="comment">// concurrent ones</span>
-<a name="l00131"></a>00131         <span class="keyword">mutable</span> atomic<unsigned> my_info_restarts; <span class="comment">// race collisions</span>
-<a name="l00132"></a>00132         atomic<unsigned> my_info_rehashes;  <span class="comment">// invocations of rehash_bucket</span>
-<a name="l00133"></a>00133 <span class="preprocessor">#endif</span>
-<a name="l00135"></a>00135 <span class="preprocessor">        hash_map_base() {</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span>            std::memset( <span class="keyword">this</span>, 0, pointers_per_table*<span class="keyword">sizeof</span>(segment_ptr_t) <span class="comment">// 32*4=128   or 64*8=512</span>
-<a name="l00137"></a>00137                 + <span class="keyword">sizeof</span>(my_size) + <span class="keyword">sizeof</span>(my_mask)  <span class="comment">// 4+4 or 8+8</span>
-<a name="l00138"></a>00138                 + embedded_buckets*<span class="keyword">sizeof</span>(bucket) ); <span class="comment">// n*8 or n*16</span>
-<a name="l00139"></a>00139             <span class="keywordflow">for</span>( size_type i = 0; i < embedded_block; i++ ) <span class="comment">// fill the table</span>
-<a name="l00140"></a>00140                 my_table[i] = my_embedded_segment + segment_base(i);
-<a name="l00141"></a>00141             my_mask = embedded_buckets - 1;
-<a name="l00142"></a>00142             __TBB_ASSERT( embedded_block <= first_block, <span class="stringliteral">"The first block number must include embedded blocks"</span>);
-<a name="l00143"></a>00143 <span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l00144"></a>00144 <span class="preprocessor"></span>            my_info_resizes = 0; <span class="comment">// concurrent ones</span>
-<a name="l00145"></a>00145             my_info_restarts = 0; <span class="comment">// race collisions</span>
-<a name="l00146"></a>00146             my_info_rehashes = 0;  <span class="comment">// invocations of rehash_bucket</span>
-<a name="l00147"></a>00147 <span class="preprocessor">#endif</span>
-<a name="l00148"></a>00148 <span class="preprocessor"></span>        }
-<a name="l00149"></a>00149 
-<a name="l00151"></a>00151         <span class="keyword">static</span> segment_index_t segment_index_of( size_type index ) {
-<a name="l00152"></a>00152             <span class="keywordflow">return</span> segment_index_t( __TBB_Log2( index|1 ) );
-<a name="l00153"></a>00153         }
-<a name="l00154"></a>00154 
-<a name="l00156"></a>00156         <span class="keyword">static</span> segment_index_t segment_base( segment_index_t k ) {
-<a name="l00157"></a>00157             <span class="keywordflow">return</span> (segment_index_t(1)<<k & ~segment_index_t(1));
-<a name="l00158"></a>00158         }
-<a name="l00159"></a>00159 
-<a name="l00161"></a>00161         <span class="keyword">static</span> size_type segment_size( segment_index_t k ) {
-<a name="l00162"></a>00162             <span class="keywordflow">return</span> size_type(1)<<k; <span class="comment">// fake value for k==0</span>
-<a name="l00163"></a>00163         }
-<a name="l00164"></a>00164         
-<a name="l00166"></a>00166         <span class="keyword">static</span> <span class="keywordtype">bool</span> is_valid( <span class="keywordtype">void</span> *ptr ) {
-<a name="l00167"></a>00167             <span class="keywordflow">return</span> reinterpret_cast<size_t>(ptr) > size_t(63);
-<a name="l00168"></a>00168         }
-<a name="l00169"></a>00169 
-<a name="l00171"></a>00171         <span class="keyword">static</span> <span class="keywordtype">void</span> init_buckets( segment_ptr_t ptr, size_type sz, <span class="keywordtype">bool</span> is_initial ) {
-<a name="l00172"></a>00172             <span class="keywordflow">if</span>( is_initial ) std::memset(ptr, 0, sz*<span class="keyword">sizeof</span>(bucket) );
-<a name="l00173"></a>00173             <span class="keywordflow">else</span> <span class="keywordflow">for</span>(size_type i = 0; i < sz; i++, ptr++) {
-<a name="l00174"></a>00174                     *reinterpret_cast<intptr_t*>(&ptr->mutex) = 0;
-<a name="l00175"></a>00175                     ptr->node_list = rehash_req;
-<a name="l00176"></a>00176                 }
-<a name="l00177"></a>00177         }
-<a name="l00178"></a>00178         
-<a name="l00180"></a>00180         <span class="keyword">static</span> <span class="keywordtype">void</span> add_to_bucket( bucket *b, node_base *n ) {
-<a name="l00181"></a>00181             __TBB_ASSERT(b->node_list != rehash_req, NULL);
-<a name="l00182"></a>00182             n->next = b->node_list;
-<a name="l00183"></a>00183             b->node_list = n; <span class="comment">// its under lock and flag is set</span>
-<a name="l00184"></a>00184         }
-<a name="l00185"></a>00185 
-<a name="l00187"></a>00187         <span class="keyword">struct </span>enable_segment_failsafe {
-<a name="l00188"></a>00188             segment_ptr_t *my_segment_ptr;
-<a name="l00189"></a>00189             enable_segment_failsafe(segments_table_t &table, segment_index_t k) : my_segment_ptr(&table[k]) {}
-<a name="l00190"></a>00190             ~enable_segment_failsafe() {
-<a name="l00191"></a>00191                 <span class="keywordflow">if</span>( my_segment_ptr ) *my_segment_ptr = 0; <span class="comment">// indicate no allocation in progress</span>
-<a name="l00192"></a>00192             }
-<a name="l00193"></a>00193         };
-<a name="l00194"></a>00194 
-<a name="l00196"></a>00196         <span class="keywordtype">void</span> enable_segment( segment_index_t k, <span class="keywordtype">bool</span> is_initial = <span class="keyword">false</span> ) {
-<a name="l00197"></a>00197             __TBB_ASSERT( k, <span class="stringliteral">"Zero segment must be embedded"</span> );
-<a name="l00198"></a>00198             enable_segment_failsafe watchdog( my_table, k );
-<a name="l00199"></a>00199             cache_aligned_allocator<bucket> alloc;
-<a name="l00200"></a>00200             size_type sz;
-<a name="l00201"></a>00201             __TBB_ASSERT( !is_valid(my_table[k]), <span class="stringliteral">"Wrong concurrent assignment"</span>);
-<a name="l00202"></a>00202             <span class="keywordflow">if</span>( k >= first_block ) {
-<a name="l00203"></a>00203                 sz = segment_size( k );
-<a name="l00204"></a>00204                 segment_ptr_t ptr = alloc.allocate( sz );
-<a name="l00205"></a>00205                 init_buckets( ptr, sz, is_initial );
-<a name="l00206"></a>00206                 itt_hide_store_word( my_table[k], ptr );
-<a name="l00207"></a>00207                 sz <<= 1;<span class="comment">// double it to get entire capacity of the container</span>
-<a name="l00208"></a>00208             } <span class="keywordflow">else</span> { <span class="comment">// the first block</span>
-<a name="l00209"></a>00209                 __TBB_ASSERT( k == embedded_block, <span class="stringliteral">"Wrong segment index"</span> );
-<a name="l00210"></a>00210                 sz = segment_size( first_block );
-<a name="l00211"></a>00211                 segment_ptr_t ptr = alloc.allocate( sz - embedded_buckets );
-<a name="l00212"></a>00212                 init_buckets( ptr, sz - embedded_buckets, is_initial );
-<a name="l00213"></a>00213                 ptr -= segment_base(embedded_block);
-<a name="l00214"></a>00214                 <span class="keywordflow">for</span>(segment_index_t i = embedded_block; i < first_block; i++) <span class="comment">// calc the offsets</span>
-<a name="l00215"></a>00215                     itt_hide_store_word( my_table[i], ptr + segment_base(i) );
-<a name="l00216"></a>00216             }
-<a name="l00217"></a>00217             itt_store_word_with_release( my_mask, sz-1 );
-<a name="l00218"></a>00218             watchdog.my_segment_ptr = 0;
-<a name="l00219"></a>00219         }
-<a name="l00220"></a>00220 
-<a name="l00222"></a>00222         bucket *get_bucket( hashcode_t h ) <span class="keyword">const</span> <span class="keywordflow">throw</span>() { <span class="comment">// TODO: add throw() everywhere?</span>
-<a name="l00223"></a>00223             segment_index_t s = segment_index_of( h );
-<a name="l00224"></a>00224             h -= segment_base(s);
-<a name="l00225"></a>00225             segment_ptr_t seg = my_table[s];
-<a name="l00226"></a>00226             __TBB_ASSERT( is_valid(seg), <span class="stringliteral">"hashcode must be cut by valid mask for allocated segments"</span> );
-<a name="l00227"></a>00227             <span class="keywordflow">return</span> &seg[h];
-<a name="l00228"></a>00228         }
-<a name="l00229"></a>00229 
-<a name="l00230"></a>00230         <span class="comment">// internal serial rehashing helper</span>
-<a name="l00231"></a>00231         <span class="keywordtype">void</span> mark_rehashed_levels( hashcode_t h ) <span class="keywordflow">throw</span> () {
-<a name="l00232"></a>00232             segment_index_t s = segment_index_of( h );
-<a name="l00233"></a>00233             <span class="keywordflow">while</span>( segment_ptr_t seg = my_table[++s] )
-<a name="l00234"></a>00234                 <span class="keywordflow">if</span>( seg[h].node_list == rehash_req ) {
-<a name="l00235"></a>00235                     seg[h].node_list = empty_rehashed;
-<a name="l00236"></a>00236                     mark_rehashed_levels( h + ((hashcode_t)1<<s) ); <span class="comment">// optimized segment_base(s)</span>
-<a name="l00237"></a>00237                 }
-<a name="l00238"></a>00238         }
-<a name="l00239"></a>00239 
-<a name="l00241"></a>00241         <span class="comment">// Splitting into two functions should help inlining</span>
-<a name="l00242"></a>00242         <span class="keyword">inline</span> <span class="keywordtype">bool</span> check_mask_race( <span class="keyword">const</span> hashcode_t h, hashcode_t &m )<span class="keyword"> const </span>{
-<a name="l00243"></a>00243             hashcode_t m_now, m_old = m;
-<a name="l00244"></a>00244             m_now = (hashcode_t) itt_load_word_with_acquire( my_mask );
-<a name="l00245"></a>00245             <span class="keywordflow">if</span>( m_old != m_now )
-<a name="l00246"></a>00246                 <span class="keywordflow">return</span> check_rehashing_collision( h, m_old, m = m_now );
-<a name="l00247"></a>00247             <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00248"></a>00248         }
-<a name="l00249"></a>00249 
-<a name="l00251"></a>00251         <span class="keywordtype">bool</span> check_rehashing_collision( <span class="keyword">const</span> hashcode_t h, hashcode_t m_old, hashcode_t m )<span class="keyword"> const </span>{
-<a name="l00252"></a>00252             __TBB_ASSERT(m_old != m, NULL); <span class="comment">// TODO?: m arg could be optimized out by passing h = h&m</span>
-<a name="l00253"></a>00253             <span class="keywordflow">if</span>( (h & m_old) != (h & m) ) { <span class="comment">// mask changed for this hashcode, rare event</span>
-<a name="l00254"></a>00254                 <span class="comment">// condition above proves that 'h' has some other bits set beside 'm_old'</span>
-<a name="l00255"></a>00255                 <span class="comment">// find next applicable mask after m_old    //TODO: look at bsl instruction</span>
-<a name="l00256"></a>00256                 <span class="keywordflow">for</span>( ++m_old; !(h & m_old); m_old <<= 1 ) <span class="comment">// at maximum few rounds depending on the first block size</span>
-<a name="l00257"></a>00257                     ;
-<a name="l00258"></a>00258                 m_old = (m_old<<1) - 1; <span class="comment">// get full mask from a bit</span>
-<a name="l00259"></a>00259                 __TBB_ASSERT((m_old&(m_old+1))==0 && m_old <= m, NULL);
-<a name="l00260"></a>00260                 <span class="comment">// check whether it is rehashing/ed</span>
-<a name="l00261"></a>00261                 <span class="keywordflow">if</span>( itt_load_word_with_acquire(get_bucket(h & m_old)->node_list) != rehash_req )
-<a name="l00262"></a>00262                 {
-<a name="l00263"></a>00263 <span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l00264"></a>00264 <span class="preprocessor"></span>                    my_info_restarts++; <span class="comment">// race collisions</span>
-<a name="l00265"></a>00265 <span class="preprocessor">#endif</span>
-<a name="l00266"></a>00266 <span class="preprocessor"></span>                    <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00267"></a>00267                 }
-<a name="l00268"></a>00268             }
-<a name="l00269"></a>00269             <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00270"></a>00270         }
-<a name="l00271"></a>00271 
-<a name="l00273"></a>00273         segment_index_t insert_new_node( bucket *b, node_base *n, hashcode_t mask ) {
-<a name="l00274"></a>00274             size_type sz = ++my_size; <span class="comment">// prefix form is to enforce allocation after the first item inserted</span>
-<a name="l00275"></a>00275             add_to_bucket( b, n );
-<a name="l00276"></a>00276             <span class="comment">// check load factor</span>
-<a name="l00277"></a>00277             <span class="keywordflow">if</span>( sz >= mask ) { <span class="comment">// TODO: add custom load_factor </span>
-<a name="l00278"></a>00278                 segment_index_t new_seg = __TBB_Log2( mask+1 ); <span class="comment">//optimized segment_index_of</span>
-<a name="l00279"></a>00279                 __TBB_ASSERT( is_valid(my_table[new_seg-1]), <span class="stringliteral">"new allocations must not publish new mask until segment has allocated"</span>);
-<a name="l00280"></a>00280                 <span class="keywordflow">if</span>( !itt_hide_load_word(my_table[new_seg])
-<a name="l00281"></a>00281                   && __TBB_CompareAndSwapW(&my_table[new_seg], 2, 0) == 0 )
-<a name="l00282"></a>00282                     <span class="keywordflow">return</span> new_seg; <span class="comment">// The value must be processed</span>
-<a name="l00283"></a>00283             }
-<a name="l00284"></a>00284             <span class="keywordflow">return</span> 0;
-<a name="l00285"></a>00285         }
-<a name="l00286"></a>00286 
-<a name="l00288"></a>00288         <span class="keywordtype">void</span> reserve(size_type buckets) {
-<a name="l00289"></a>00289             <span class="keywordflow">if</span>( !buckets-- ) <span class="keywordflow">return</span>;
-<a name="l00290"></a>00290             <span class="keywordtype">bool</span> is_initial = !my_size;
-<a name="l00291"></a>00291             <span class="keywordflow">for</span>( size_type m = my_mask; buckets > m; m = my_mask )
-<a name="l00292"></a>00292                 enable_segment( segment_index_of( m+1 ), is_initial );
-<a name="l00293"></a>00293         }
-<a name="l00295"></a>00295         <span class="keywordtype">void</span> internal_swap(hash_map_base &table) {
-<a name="l00296"></a>00296             std::swap(this->my_mask, table.my_mask);
-<a name="l00297"></a>00297             std::swap(this->my_size, table.my_size);
-<a name="l00298"></a>00298             <span class="keywordflow">for</span>(size_type i = 0; i < embedded_buckets; i++)
-<a name="l00299"></a>00299                 std::swap(this->my_embedded_segment[i].node_list, table.my_embedded_segment[i].node_list);
-<a name="l00300"></a>00300             <span class="keywordflow">for</span>(size_type i = embedded_block; i < pointers_per_table; i++)
-<a name="l00301"></a>00301                 std::swap(this->my_table[i], table.my_table[i]);
-<a name="l00302"></a>00302         }
-<a name="l00303"></a>00303     };
-<a name="l00304"></a>00304 
-<a name="l00305"></a>00305     <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
-<a name="l00306"></a>00306     <span class="keyword">class </span>hash_map_range;
-<a name="l00307"></a>00307 
-<a name="l00309"></a>00309 
-<a name="l00311"></a>00311     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00312"></a>00312     <span class="keyword">class </span>hash_map_iterator
-<a name="l00313"></a>00313         : <span class="keyword">public</span> std::iterator<std::forward_iterator_tag,Value>
-<a name="l00314"></a>00314     {
-<a name="l00315"></a>00315         <span class="keyword">typedef</span> Container map_type;
-<a name="l00316"></a>00316         <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::node node;
-<a name="l00317"></a>00317         <span class="keyword">typedef</span> hash_map_base::node_base node_base;
-<a name="l00318"></a>00318         <span class="keyword">typedef</span> hash_map_base::bucket bucket;
-<a name="l00319"></a>00319 
-<a name="l00320"></a>00320         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00321"></a>00321         <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> hash_map_iterator<C,T>& i, <span class="keyword">const</span> hash_map_iterator<C,U>& j );
-<a name="l00322"></a>00322 
-<a name="l00323"></a>00323         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00324"></a>00324         <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> hash_map_iterator<C,T>& i, <span class="keyword">const</span> hash_map_iterator<C,U>& j );
-<a name="l00325"></a>00325 
-<a name="l00326"></a>00326         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00327"></a>00327         <span class="keyword">friend</span> ptrdiff_t operator-( <span class="keyword">const</span> hash_map_iterator<C,T>& i, <span class="keyword">const</span> hash_map_iterator<C,U>& j );
-<a name="l00328"></a>00328     
-<a name="l00329"></a>00329         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00330"></a>00330         <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_iterator;
-<a name="l00331"></a>00331 
-<a name="l00332"></a>00332         <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00333"></a>00333         <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_range;
-<a name="l00334"></a>00334 
-<a name="l00335"></a>00335         <span class="keywordtype">void</span> advance_to_next_bucket() { <span class="comment">// TODO?: refactor to iterator_base class</span>
-<a name="l00336"></a>00336             size_t k = my_index+1;
-<a name="l00337"></a>00337             <span class="keywordflow">while</span>( my_bucket && k <= my_map->my_mask ) {
-<a name="l00338"></a>00338                 <span class="comment">// Following test uses 2's-complement wizardry</span>
-<a name="l00339"></a>00339                 <span class="keywordflow">if</span>( k& (k-2) ) <span class="comment">// not the beginning of a segment</span>
-<a name="l00340"></a>00340                     ++my_bucket;
-<a name="l00341"></a>00341                 <span class="keywordflow">else</span> my_bucket = my_map->get_bucket( k );
-<a name="l00342"></a>00342                 my_node = static_cast<node*>( my_bucket->node_list );
-<a name="l00343"></a>00343                 <span class="keywordflow">if</span>( hash_map_base::is_valid(my_node) ) {
-<a name="l00344"></a>00344                     my_index = k; <span class="keywordflow">return</span>;
-<a name="l00345"></a>00345                 }
-<a name="l00346"></a>00346                 ++k;
-<a name="l00347"></a>00347             }
-<a name="l00348"></a>00348             my_bucket = 0; my_node = 0; my_index = k; <span class="comment">// the end</span>
-<a name="l00349"></a>00349         }
-<a name="l00350"></a>00350 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
-<a name="l00351"></a>00351 <span class="preprocessor"></span>        <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l00352"></a>00352         <span class="keyword">friend</span> <span class="keyword">class </span>interface5::concurrent_hash_map;
-<a name="l00353"></a>00353 <span class="preprocessor">#else</span>
-<a name="l00354"></a>00354 <span class="preprocessor"></span>    <span class="keyword">public</span>: <span class="comment">// workaround</span>
-<a name="l00355"></a>00355 <span class="preprocessor">#endif</span>
-<a name="l00357"></a>00357 <span class="preprocessor">        const Container *my_map;</span>
-<a name="l00358"></a>00358 <span class="preprocessor"></span>
-<a name="l00360"></a>00360         size_t my_index;
-<a name="l00361"></a>00361 
-<a name="l00363"></a>00363         <span class="keyword">const</span> bucket *my_bucket;
-<a name="l00364"></a>00364 
-<a name="l00366"></a>00366         node *my_node;
-<a name="l00367"></a>00367 
-<a name="l00368"></a>00368         hash_map_iterator( <span class="keyword">const</span> Container &map, size_t index, <span class="keyword">const</span> bucket *b, node_base *n );
-<a name="l00369"></a>00369 
-<a name="l00370"></a>00370     <span class="keyword">public</span>:
-<a name="l00372"></a>00372         hash_map_iterator() {}
-<a name="l00373"></a>00373         hash_map_iterator( <span class="keyword">const</span> hash_map_iterator<Container,typename Container::value_type> &other ) :
-<a name="l00374"></a>00374             my_map(other.my_map),
-<a name="l00375"></a>00375             my_index(other.my_index),
-<a name="l00376"></a>00376             my_bucket(other.my_bucket),
-<a name="l00377"></a>00377             my_node(other.my_node)
-<a name="l00378"></a>00378         {}
-<a name="l00379"></a>00379         Value& operator*()<span class="keyword"> const </span>{
-<a name="l00380"></a>00380             __TBB_ASSERT( hash_map_base::is_valid(my_node), <span class="stringliteral">"iterator uninitialized or at end of container?"</span> );
-<a name="l00381"></a>00381             <span class="keywordflow">return</span> my_node->item;
-<a name="l00382"></a>00382         }
-<a name="l00383"></a>00383         Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00384"></a>00384         hash_map_iterator& operator++();
-<a name="l00385"></a>00385         
-<a name="l00387"></a>00387         hash_map_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00388"></a>00388             hash_map_iterator old(*<span class="keyword">this</span>);
-<a name="l00389"></a>00389             operator++();
-<a name="l00390"></a>00390             <span class="keywordflow">return</span> old;
-<a name="l00391"></a>00391         }
-<a name="l00392"></a>00392     };
-<a name="l00393"></a>00393 
-<a name="l00394"></a>00394     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00395"></a>00395     hash_map_iterator<Container,Value>::hash_map_iterator( <span class="keyword">const</span> Container &map, size_t index, <span class="keyword">const</span> bucket *b, node_base *n ) :
-<a name="l00396"></a>00396         my_map(&map),
-<a name="l00397"></a>00397         my_index(index),
-<a name="l00398"></a>00398         my_bucket(b),
-<a name="l00399"></a>00399         my_node( static_cast<node*>(n) )
-<a name="l00400"></a>00400     {
-<a name="l00401"></a>00401         <span class="keywordflow">if</span>( b && !hash_map_base::is_valid(n) )
-<a name="l00402"></a>00402             advance_to_next_bucket();
-<a name="l00403"></a>00403     }
-<a name="l00404"></a>00404 
-<a name="l00405"></a>00405     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00406"></a>00406     hash_map_iterator<Container,Value>& hash_map_iterator<Container,Value>::operator++() {
-<a name="l00407"></a>00407         my_node = static_cast<node*>( my_node->next );
-<a name="l00408"></a>00408         <span class="keywordflow">if</span>( !my_node ) advance_to_next_bucket();
-<a name="l00409"></a>00409         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00410"></a>00410     }
-<a name="l00411"></a>00411 
-<a name="l00412"></a>00412     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00413"></a>00413     <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> hash_map_iterator<Container,T>& i, <span class="keyword">const</span> hash_map_iterator<Container,U>& j ) {
-<a name="l00414"></a>00414         <span class="keywordflow">return</span> i.my_node == j.my_node && i.my_map == j.my_map;
-<a name="l00415"></a>00415     }
-<a name="l00416"></a>00416 
-<a name="l00417"></a>00417     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00418"></a>00418     <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> hash_map_iterator<Container,T>& i, <span class="keyword">const</span> hash_map_iterator<Container,U>& j ) {
-<a name="l00419"></a>00419         <span class="keywordflow">return</span> i.my_node != j.my_node || i.my_map != j.my_map;
-<a name="l00420"></a>00420     }
-<a name="l00421"></a>00421 
-<a name="l00423"></a>00423 
-<a name="l00424"></a>00424     <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
-<a name="l00425"></a>00425     <span class="keyword">class </span>hash_map_range {
-<a name="l00426"></a>00426         <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::map_type map_type;
-<a name="l00427"></a>00427         Iterator my_begin;
-<a name="l00428"></a>00428         Iterator my_end;
-<a name="l00429"></a>00429         <span class="keyword">mutable</span> Iterator my_midpoint;
-<a name="l00430"></a>00430         size_t my_grainsize;
-<a name="l00432"></a>00432         <span class="keywordtype">void</span> set_midpoint() <span class="keyword">const</span>;
-<a name="l00433"></a>00433         <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">friend</span> <span class="keyword">class </span>hash_map_range;
-<a name="l00434"></a>00434     <span class="keyword">public</span>:
-<a name="l00436"></a>00436         <span class="keyword">typedef</span> std::size_t size_type;
-<a name="l00437"></a>00437         <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::value_type value_type;
-<a name="l00438"></a>00438         <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::reference reference;
-<a name="l00439"></a>00439         <span class="keyword">typedef</span> <span class="keyword">typename</span> Iterator::difference_type difference_type;
-<a name="l00440"></a>00440         <span class="keyword">typedef</span> Iterator iterator;
-<a name="l00441"></a>00441 
-<a name="l00443"></a>00443         <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin==my_end;}
-<a name="l00444"></a>00444 
-<a name="l00446"></a>00446         <span class="keywordtype">bool</span> is_divisible()<span class="keyword"> const </span>{
-<a name="l00447"></a>00447             <span class="keywordflow">return</span> my_midpoint!=my_end;
-<a name="l00448"></a>00448         }
-<a name="l00450"></a>00450         hash_map_range( hash_map_range& r, split ) : 
-<a name="l00451"></a>00451             my_end(r.my_end),
-<a name="l00452"></a>00452             my_grainsize(r.my_grainsize)
-<a name="l00453"></a>00453         {
-<a name="l00454"></a>00454             r.my_end = my_begin = r.my_midpoint;
-<a name="l00455"></a>00455             __TBB_ASSERT( !empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00456"></a>00456             __TBB_ASSERT( !r.empty(), <span class="stringliteral">"Splitting despite the range is not divisible"</span> );
-<a name="l00457"></a>00457             set_midpoint();
-<a name="l00458"></a>00458             r.set_midpoint();
-<a name="l00459"></a>00459         }
-<a name="l00461"></a>00461         <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00462"></a>00462         hash_map_range( hash_map_range<U>& r) : 
-<a name="l00463"></a>00463             my_begin(r.my_begin),
-<a name="l00464"></a>00464             my_end(r.my_end),
-<a name="l00465"></a>00465             my_midpoint(r.my_midpoint),
-<a name="l00466"></a>00466             my_grainsize(r.my_grainsize)
-<a name="l00467"></a>00467         {}
-<a name="l00468"></a>00468 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00470"></a>00470 <span class="preprocessor">        hash_map_range( const Iterator& begin_, const Iterator& end_, size_type grainsize_ = 1 ) : </span>
-<a name="l00471"></a>00471 <span class="preprocessor"></span>            my_begin(begin_), 
-<a name="l00472"></a>00472             my_end(end_),
-<a name="l00473"></a>00473             my_grainsize(grainsize_)
-<a name="l00474"></a>00474         {
-<a name="l00475"></a>00475             <span class="keywordflow">if</span>(!my_end.my_index && !my_end.my_bucket) <span class="comment">// end</span>
-<a name="l00476"></a>00476                 my_end.my_index = my_end.my_map->my_mask + 1;
-<a name="l00477"></a>00477             set_midpoint();
-<a name="l00478"></a>00478             __TBB_ASSERT( grainsize_>0, <span class="stringliteral">"grainsize must be positive"</span> );
-<a name="l00479"></a>00479         }
-<a name="l00480"></a>00480 <span class="preprocessor">#endif</span>
-<a name="l00482"></a>00482 <span class="preprocessor">        hash_map_range( const map_type &map, size_type grainsize_ = 1 ) : </span>
-<a name="l00483"></a>00483 <span class="preprocessor"></span>            my_begin( Iterator( map, 0, map.my_embedded_segment, map.my_embedded_segment->node_list ) ),
-<a name="l00484"></a>00484             my_end( Iterator( map, map.my_mask + 1, 0, 0 ) ),
-<a name="l00485"></a>00485             my_grainsize( grainsize_ )
-<a name="l00486"></a>00486         {
-<a name="l00487"></a>00487             __TBB_ASSERT( grainsize_>0, <span class="stringliteral">"grainsize must be positive"</span> );
-<a name="l00488"></a>00488             set_midpoint();
-<a name="l00489"></a>00489         }
-<a name="l00490"></a>00490         <span class="keyword">const</span> Iterator& begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_begin;}
-<a name="l00491"></a>00491         <span class="keyword">const</span> Iterator& end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_end;}
-<a name="l00493"></a>00493         size_type grainsize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> my_grainsize;}
-<a name="l00494"></a>00494     };
-<a name="l00495"></a>00495 
-<a name="l00496"></a>00496     <span class="keyword">template</span><<span class="keyword">typename</span> Iterator>
-<a name="l00497"></a>00497     <span class="keywordtype">void</span> hash_map_range<Iterator>::set_midpoint()<span class="keyword"> const </span>{
-<a name="l00498"></a>00498         <span class="comment">// Split by groups of nodes</span>
-<a name="l00499"></a>00499         size_t m = my_end.my_index-my_begin.my_index;
-<a name="l00500"></a>00500         <span class="keywordflow">if</span>( m > my_grainsize ) {
-<a name="l00501"></a>00501             m = my_begin.my_index + m/2u;
-<a name="l00502"></a>00502             hash_map_base::bucket *b = my_begin.my_map->get_bucket(m);
-<a name="l00503"></a>00503             my_midpoint = Iterator(*my_begin.my_map,m,b,b->node_list);
-<a name="l00504"></a>00504         } <span class="keywordflow">else</span> {
-<a name="l00505"></a>00505             my_midpoint = my_end;
-<a name="l00506"></a>00506         }
-<a name="l00507"></a>00507         __TBB_ASSERT( my_begin.my_index <= my_midpoint.my_index,
-<a name="l00508"></a>00508             <span class="stringliteral">"my_begin is after my_midpoint"</span> );
-<a name="l00509"></a>00509         __TBB_ASSERT( my_midpoint.my_index <= my_end.my_index,
-<a name="l00510"></a>00510             <span class="stringliteral">"my_midpoint is after my_end"</span> );
-<a name="l00511"></a>00511         __TBB_ASSERT( my_begin != my_midpoint || my_begin == my_end,
-<a name="l00512"></a>00512             <span class="stringliteral">"[my_begin, my_midpoint) range should not be empty"</span> );
-<a name="l00513"></a>00513     }
-<a name="l00514"></a>00514 
-<a name="l00515"></a>00515     } <span class="comment">// internal</span>
-<a name="l00517"></a>00517 <span class="comment"></span>
-<a name="l00519"></a>00519 
-<a name="l00548"></a>00548 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> Allocator>
-<a name="l00549"></a><a class="code" href="a00231.html">00549</a> <span class="keyword">class </span><a class="code" href="a00231.html">concurrent_hash_map</a> : <span class="keyword">protected</span> internal::hash_map_base {
-<a name="l00550"></a>00550     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00551"></a>00551     <span class="keyword">friend</span> <span class="keyword">class </span>internal::hash_map_iterator;
-<a name="l00552"></a>00552 
-<a name="l00553"></a>00553     <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00554"></a>00554     <span class="keyword">friend</span> <span class="keyword">class </span>internal::hash_map_range;
-<a name="l00555"></a>00555 
-<a name="l00556"></a>00556 <span class="keyword">public</span>:
-<a name="l00557"></a>00557     <span class="keyword">typedef</span> Key key_type;
-<a name="l00558"></a>00558     <span class="keyword">typedef</span> T mapped_type;
-<a name="l00559"></a>00559     <span class="keyword">typedef</span> std::pair<const Key,T> value_type;
-<a name="l00560"></a>00560     <span class="keyword">typedef</span> hash_map_base::size_type size_type;
-<a name="l00561"></a>00561     <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00562"></a>00562     <span class="keyword">typedef</span> value_type *pointer;
-<a name="l00563"></a>00563     <span class="keyword">typedef</span> <span class="keyword">const</span> value_type *const_pointer;
-<a name="l00564"></a>00564     <span class="keyword">typedef</span> value_type &reference;
-<a name="l00565"></a>00565     <span class="keyword">typedef</span> <span class="keyword">const</span> value_type &const_reference;
-<a name="l00566"></a>00566     <span class="keyword">typedef</span> internal::hash_map_iterator<concurrent_hash_map,value_type> iterator;
-<a name="l00567"></a>00567     <span class="keyword">typedef</span> internal::hash_map_iterator<concurrent_hash_map,const value_type> const_iterator;
-<a name="l00568"></a>00568     <span class="keyword">typedef</span> internal::hash_map_range<iterator> range_type;
-<a name="l00569"></a>00569     <span class="keyword">typedef</span> internal::hash_map_range<const_iterator> const_range_type;
-<a name="l00570"></a>00570     <span class="keyword">typedef</span> Allocator allocator_type;
-<a name="l00571"></a>00571 
-<a name="l00572"></a>00572 <span class="keyword">protected</span>:
-<a name="l00573"></a>00573     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00234.html">const_accessor</a>;
-<a name="l00574"></a>00574     <span class="keyword">struct </span>node;
-<a name="l00575"></a>00575     <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<node>::other node_allocator_type;
-<a name="l00576"></a>00576     node_allocator_type my_allocator;
-<a name="l00577"></a>00577     HashCompare my_hash_compare;
-<a name="l00578"></a>00578 
-<a name="l00579"></a>00579     <span class="keyword">struct </span>node : <span class="keyword">public</span> node_base {
-<a name="l00580"></a>00580         value_type item;
-<a name="l00581"></a>00581         node( <span class="keyword">const</span> Key &key ) : item(key, T()) {}
-<a name="l00582"></a>00582         node( <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T &t ) : item(key, t) {}
-<a name="l00583"></a>00583         <span class="comment">// exception-safe allocation, see C++ Standard 2003, clause 5.3.4p17</span>
-<a name="l00584"></a>00584         <span class="keywordtype">void</span> *operator new( size_t <span class="comment">/*size*/</span>, node_allocator_type &a ) {
-<a name="l00585"></a>00585             <span class="keywordtype">void</span> *ptr = a.allocate(1);
-<a name="l00586"></a>00586             <span class="keywordflow">if</span>(!ptr) 
-<a name="l00587"></a>00587                 tbb::internal::throw_exception(tbb::internal::eid_bad_alloc);
-<a name="l00588"></a>00588             <span class="keywordflow">return</span> ptr;
-<a name="l00589"></a>00589         }
-<a name="l00590"></a>00590         <span class="comment">// match placement-new form above to be called if exception thrown in constructor</span>
-<a name="l00591"></a>00591         <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span> *ptr, node_allocator_type &a ) {<span class="keywordflow">return</span> a.deallocate(static_cast<node*>(ptr),1); }
-<a name="l00592"></a>00592     };
-<a name="l00593"></a>00593 
-<a name="l00594"></a>00594     <span class="keywordtype">void</span> delete_node( node_base *n ) {
-<a name="l00595"></a>00595         my_allocator.destroy( static_cast<node*>(n) );
-<a name="l00596"></a>00596         my_allocator.deallocate( static_cast<node*>(n), 1);
-<a name="l00597"></a>00597     }
-<a name="l00598"></a>00598 
-<a name="l00599"></a>00599     node *search_bucket( <span class="keyword">const</span> key_type &key, bucket *b )<span class="keyword"> const </span>{
-<a name="l00600"></a>00600         node *n = static_cast<node*>( b->node_list );
-<a name="l00601"></a>00601         <span class="keywordflow">while</span>( is_valid(n) && !my_hash_compare.equal(key, n->item.first) )
-<a name="l00602"></a>00602             n = static_cast<node*>( n->next );
-<a name="l00603"></a>00603         __TBB_ASSERT(n != internal::rehash_req, <span class="stringliteral">"Search can be executed only for rehashed bucket"</span>);
-<a name="l00604"></a>00604         <span class="keywordflow">return</span> n;
-<a name="l00605"></a>00605     }
-<a name="l00606"></a>00606 
-<a name="l00608"></a><a class="code" href="a00233.html">00608</a>     <span class="keyword">class </span><a class="code" href="a00233.html">bucket_accessor</a> : <span class="keyword">public</span> bucket::scoped_t {
-<a name="l00609"></a>00609         bucket *my_b;
-<a name="l00610"></a>00610     <span class="keyword">public</span>:
-<a name="l00611"></a>00611         <a class="code" href="a00233.html">bucket_accessor</a>( <a class="code" href="a00231.html">concurrent_hash_map</a> *base, <span class="keyword">const</span> hashcode_t h, <span class="keywordtype">bool</span> writer = <span class="keyword">false</span> ) { <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( base, h, writer ); }
-<a name="l00613"></a><a class="code" href="a00233.html#d11c77f4d70a94d4fb344492bbf18007">00613</a>         <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00231.html">concurrent_hash_map</a> *base, <span class="keyword">const</span> hashcode_t h, <span class="keywordtype">bool</span> writer = <span class="keyword">false</span> ) {
-<a name="l00614"></a>00614             my_b = base->get_bucket( h );
-<a name="l00615"></a>00615             <span class="comment">// TODO: actually, notification is unnecessary here, just hiding double-check</span>
-<a name="l00616"></a>00616             <span class="keywordflow">if</span>( itt_load_word_with_acquire(my_b->node_list) == internal::rehash_req
-<a name="l00617"></a>00617                 && try_acquire( my_b->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> ) )
-<a name="l00618"></a>00618             {
-<a name="l00619"></a>00619                 <span class="keywordflow">if</span>( my_b->node_list == internal::rehash_req ) base-><a class="code" href="a00231.html#4962c7da24793ccc05524cc3bbcf1efa">rehash_bucket</a>( my_b, h ); <span class="comment">//recursive rehashing</span>
-<a name="l00620"></a>00620             }
-<a name="l00621"></a>00621             <span class="keywordflow">else</span> bucket::scoped_t::acquire( my_b->mutex, writer );
-<a name="l00622"></a>00622             __TBB_ASSERT( my_b->node_list != internal::rehash_req, NULL);
-<a name="l00623"></a>00623         }
-<a name="l00625"></a><a class="code" href="a00233.html#07d958f151a0eaa92f50fd56ad6440e2">00625</a>         <span class="keywordtype">bool</span> is_writer() { <span class="keywordflow">return</span> bucket::scoped_t::is_writer; }
-<a name="l00627"></a><a class="code" href="a00233.html#fa6314b861c574f86ed189b124cf5853">00627</a>         bucket *operator() () { <span class="keywordflow">return</span> my_b; }
-<a name="l00628"></a>00628     };
-<a name="l00629"></a>00629 
-<a name="l00630"></a>00630     <span class="comment">// TODO refactor to hash_base</span>
-<a name="l00631"></a>00631     <span class="keywordtype">void</span> rehash_bucket( bucket *b_new, <span class="keyword">const</span> hashcode_t h ) {
-<a name="l00632"></a>00632         __TBB_ASSERT( *(intptr_t*)(&b_new->mutex), <span class="stringliteral">"b_new must be locked (for write)"</span>);
-<a name="l00633"></a>00633         __TBB_ASSERT( h > 1, <span class="stringliteral">"The lowermost buckets can't be rehashed"</span> );
-<a name="l00634"></a>00634         __TBB_store_with_release(b_new->node_list, internal::empty_rehashed); <span class="comment">// mark rehashed</span>
-<a name="l00635"></a>00635         hashcode_t mask = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
-<a name="l00636"></a>00636 <span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l00637"></a>00637 <span class="preprocessor"></span>        my_info_rehashes++; <span class="comment">// invocations of rehash_bucket</span>
-<a name="l00638"></a>00638 <span class="preprocessor">#endif</span>
-<a name="l00639"></a>00639 <span class="preprocessor"></span>
-<a name="l00640"></a>00640         bucket_accessor b_old( <span class="keyword">this</span>, h & mask );
-<a name="l00641"></a>00641 
-<a name="l00642"></a>00642         mask = (mask<<1) | 1; <span class="comment">// get full mask for new bucket</span>
-<a name="l00643"></a>00643         __TBB_ASSERT( (mask&(mask+1))==0 && (h & mask) == h, NULL );
-<a name="l00644"></a>00644     restart:
-<a name="l00645"></a>00645         <span class="keywordflow">for</span>( node_base **p = &b_old()->node_list, *n = __TBB_load_with_acquire(*p); is_valid(n); n = *p ) {
-<a name="l00646"></a>00646             hashcode_t c = my_hash_compare.hash( static_cast<node*>(n)->item.first );
-<a name="l00647"></a>00647 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00648"></a>00648 <span class="preprocessor"></span>            hashcode_t bmask = h & (mask>>1);
-<a name="l00649"></a>00649             bmask = bmask==0? 1 : ( 1u<<(__TBB_Log2( bmask )+1 ) ) - 1; <span class="comment">// minimal mask of parent bucket</span>
-<a name="l00650"></a>00650             __TBB_ASSERT( (c & bmask) == (h & bmask), <span class="stringliteral">"hash() function changed for key in table"</span> );
-<a name="l00651"></a>00651 <span class="preprocessor">#endif</span>
-<a name="l00652"></a>00652 <span class="preprocessor"></span>            <span class="keywordflow">if</span>( (c & mask) == h ) {
-<a name="l00653"></a>00653                 <span class="keywordflow">if</span>( !b_old.is_writer() )
-<a name="l00654"></a>00654                     <span class="keywordflow">if</span>( !b_old.upgrade_to_writer() ) {
-<a name="l00655"></a>00655                         <span class="keywordflow">goto</span> restart; <span class="comment">// node ptr can be invalid due to concurrent erase</span>
-<a name="l00656"></a>00656                     }
-<a name="l00657"></a>00657                 *p = n->next; <span class="comment">// exclude from b_old</span>
-<a name="l00658"></a>00658                 add_to_bucket( b_new, n );
-<a name="l00659"></a>00659             } <span class="keywordflow">else</span> p = &n->next; <span class="comment">// iterate to next item</span>
-<a name="l00660"></a>00660         }
-<a name="l00661"></a>00661     }
-<a name="l00662"></a>00662 
-<a name="l00663"></a>00663 <span class="keyword">public</span>:
-<a name="l00664"></a>00664     
-<a name="l00665"></a>00665     <span class="keyword">class </span>accessor;
-<a name="l00667"></a><a class="code" href="a00234.html">00667</a>     <span class="keyword">class </span><a class="code" href="a00234.html">const_accessor</a> : <span class="keyword">private</span> node::scoped_t <span class="comment">/*which derived from no_copy*/</span> {
-<a name="l00668"></a>00668         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00231.html">concurrent_hash_map</a><Key,T,HashCompare,Allocator>;
-<a name="l00669"></a>00669         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00232.html">accessor</a>;
-<a name="l00670"></a>00670     <span class="keyword">public</span>:
-<a name="l00672"></a><a class="code" href="a00234.html#a8e50238483ba451363dccebd981d346">00672</a>         <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
-<a name="l00673"></a>00673 
-<a name="l00675"></a><a class="code" href="a00234.html#84c3080d0c6124d55c8bb4cf6055e65f">00675</a>         <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_node;}
-<a name="l00676"></a>00676 
-<a name="l00678"></a><a class="code" href="a00234.html#7db006d41b49dc5f1716a913769d4698">00678</a>         <span class="keywordtype">void</span> <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
-<a name="l00679"></a>00679             <span class="keywordflow">if</span>( my_node ) {
-<a name="l00680"></a>00680                 node::scoped_t::release();
-<a name="l00681"></a>00681                 my_node = 0;
-<a name="l00682"></a>00682             }
-<a name="l00683"></a>00683         }
-<a name="l00684"></a>00684 
-<a name="l00686"></a><a class="code" href="a00234.html#9411df8197ceb4881ec4c7368a0a7f88">00686</a>         const_reference operator*()<span class="keyword"> const </span>{
-<a name="l00687"></a>00687             __TBB_ASSERT( my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
-<a name="l00688"></a>00688             <span class="keywordflow">return</span> my_node->item;
-<a name="l00689"></a>00689         }
-<a name="l00690"></a>00690 
-<a name="l00692"></a><a class="code" href="a00234.html#3d03a48ecb8cd9549bd8be64b09c9b0d">00692</a>         const_pointer operator->()<span class="keyword"> const </span>{
-<a name="l00693"></a>00693             <span class="keywordflow">return</span> &operator*();
-<a name="l00694"></a>00694         }
-<a name="l00695"></a>00695 
-<a name="l00697"></a><a class="code" href="a00234.html#27399c613eb1aecd4660803955dda09d">00697</a>         <a class="code" href="a00234.html">const_accessor</a>() : my_node(NULL) {}
-<a name="l00698"></a>00698 
-<a name="l00700"></a><a class="code" href="a00234.html#928769b139d53427e7075c1f86148e4c">00700</a>         ~<a class="code" href="a00234.html">const_accessor</a>() {
-<a name="l00701"></a>00701             my_node = NULL; <span class="comment">// scoped lock's release() is called in its destructor</span>
-<a name="l00702"></a>00702         }
-<a name="l00703"></a>00703     <span class="keyword">protected</span>:
-<a name="l00704"></a>00704         <span class="keywordtype">bool</span> is_writer() { <span class="keywordflow">return</span> node::scoped_t::is_writer; }
-<a name="l00705"></a>00705         node *my_node;
-<a name="l00706"></a>00706         hashcode_t my_hash;
-<a name="l00707"></a>00707     };
-<a name="l00708"></a>00708 
-<a name="l00710"></a><a class="code" href="a00232.html">00710</a>     <span class="keyword">class </span><a class="code" href="a00232.html">accessor</a>: <span class="keyword">public</span> <a class="code" href="a00234.html">const_accessor</a> {
-<a name="l00711"></a>00711     <span class="keyword">public</span>:
-<a name="l00713"></a><a class="code" href="a00232.html#0b648be7a95a8fb2971042c15eb112c1">00713</a>         <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_hash_map::value_type value_type;
-<a name="l00714"></a>00714 
-<a name="l00716"></a><a class="code" href="a00232.html#170280ea807a22e742095de3e8c5ea38">00716</a>         reference operator*()<span class="keyword"> const </span>{
-<a name="l00717"></a>00717             __TBB_ASSERT( this->my_node, <span class="stringliteral">"attempt to dereference empty accessor"</span> );
-<a name="l00718"></a>00718             <span class="keywordflow">return</span> this->my_node->item;
-<a name="l00719"></a>00719         }
-<a name="l00720"></a>00720 
-<a name="l00722"></a><a class="code" href="a00232.html#a807920cdffe3ec5c5e282b4d1ff92a2">00722</a>         pointer operator->()<span class="keyword"> const </span>{
-<a name="l00723"></a>00723             <span class="keywordflow">return</span> &operator*();
-<a name="l00724"></a>00724         }
-<a name="l00725"></a>00725     };
-<a name="l00726"></a>00726 
-<a name="l00728"></a><a class="code" href="a00231.html#1ad413f5b666176e7669bf4c87d1ff3f">00728</a>     <a class="code" href="a00231.html">concurrent_hash_map</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00729"></a>00729         : internal::hash_map_base(), my_allocator(a)
-<a name="l00730"></a>00730     {}
-<a name="l00731"></a>00731 
-<a name="l00733"></a><a class="code" href="a00231.html#46b9896317662c3cfa3c876ad7592a7c">00733</a>     <a class="code" href="a00231.html">concurrent_hash_map</a>(size_type n, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00734"></a>00734         : my_allocator(a)
-<a name="l00735"></a>00735     {
-<a name="l00736"></a>00736         reserve( n );
-<a name="l00737"></a>00737     }
-<a name="l00738"></a>00738 
-<a name="l00740"></a><a class="code" href="a00231.html#6fb14710893308fb47aaeee55ee30dc3">00740</a>     <a class="code" href="a00231.html">concurrent_hash_map</a>( <span class="keyword">const</span> <a class="code" href="a00231.html">concurrent_hash_map</a>& table, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00741"></a>00741         : internal::hash_map_base(), my_allocator(a)
-<a name="l00742"></a>00742     {
-<a name="l00743"></a>00743         internal_copy(table);
-<a name="l00744"></a>00744     }
-<a name="l00745"></a>00745 
-<a name="l00747"></a>00747     <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00748"></a><a class="code" href="a00231.html#83c40f2053f208861b90390e12a36436">00748</a>     <a class="code" href="a00231.html">concurrent_hash_map</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00749"></a>00749         : my_allocator(a)
-<a name="l00750"></a>00750     {
-<a name="l00751"></a>00751         reserve( std::distance(first, last) ); <span class="comment">// TODO: load_factor?</span>
-<a name="l00752"></a>00752         internal_copy(first, last);
-<a name="l00753"></a>00753     }
-<a name="l00754"></a>00754 
-<a name="l00756"></a><a class="code" href="a00231.html#088d1aaccc816884a49e38f7065622c8">00756</a>     <a class="code" href="a00231.html">concurrent_hash_map</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00231.html">concurrent_hash_map</a>& table ) {
-<a name="l00757"></a>00757         <span class="keywordflow">if</span>( <span class="keyword">this</span>!=&table ) {
-<a name="l00758"></a>00758             clear();
-<a name="l00759"></a>00759             internal_copy(table);
-<a name="l00760"></a>00760         } 
-<a name="l00761"></a>00761         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00762"></a>00762     }
-<a name="l00763"></a>00763 
-<a name="l00764"></a>00764 
-<a name="l00766"></a>00766 
-<a name="l00768"></a>00768     <span class="keywordtype">void</span> rehash(size_type n = 0);
-<a name="l00769"></a>00769     
-<a name="l00771"></a>00771     <span class="keywordtype">void</span> clear();
-<a name="l00772"></a>00772 
-<a name="l00774"></a><a class="code" href="a00231.html#2aa8e2d28d5af1284cf78d20a9c22731">00774</a>     ~<a class="code" href="a00231.html">concurrent_hash_map</a>() { clear(); }
-<a name="l00775"></a>00775 
-<a name="l00776"></a>00776     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00777"></a>00777     <span class="comment">// Parallel algorithm support</span>
-<a name="l00778"></a>00778     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00779"></a>00779     range_type range( size_type grainsize=1 ) {
-<a name="l00780"></a>00780         <span class="keywordflow">return</span> range_type( *<span class="keyword">this</span>, grainsize );
-<a name="l00781"></a>00781     }
-<a name="l00782"></a>00782     const_range_type range( size_type grainsize=1 )<span class="keyword"> const </span>{
-<a name="l00783"></a>00783         <span class="keywordflow">return</span> const_range_type( *<span class="keyword">this</span>, grainsize );
-<a name="l00784"></a>00784     }
-<a name="l00785"></a>00785 
-<a name="l00786"></a>00786     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00787"></a>00787     <span class="comment">// STL support - not thread-safe methods</span>
-<a name="l00788"></a>00788     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00789"></a>00789     iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0,my_embedded_segment,my_embedded_segment->node_list);}
-<a name="l00790"></a>00790     iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0,0,0);}
-<a name="l00791"></a>00791     const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0,my_embedded_segment,my_embedded_segment->node_list);}
-<a name="l00792"></a>00792     const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0,0,0);}
-<a name="l00793"></a>00793     std::pair<iterator, iterator> equal_range( <span class="keyword">const</span> Key& key ) { <span class="keywordflow">return</span> internal_equal_range(key, end()); }
-<a name="l00794"></a>00794     std::pair<const_iterator, const_iterator> equal_range( <span class="keyword">const</span> Key& key )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> internal_equal_range(key, end()); }
-<a name="l00795"></a>00795     
-<a name="l00797"></a><a class="code" href="a00231.html#6aa56a8b5a25e61a97fa0b54fe2b5659">00797</a>     size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size; }
-<a name="l00798"></a>00798 
-<a name="l00800"></a><a class="code" href="a00231.html#61ff2e5bb44e5469366fd5295e5d0ebe">00800</a>     <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size == 0; }
-<a name="l00801"></a>00801 
-<a name="l00803"></a><a class="code" href="a00231.html#2bce57fe9b594abe1e6d2568aea8b357">00803</a>     size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (~size_type(0))/<span class="keyword">sizeof</span>(node);}
-<a name="l00804"></a>00804 
-<a name="l00806"></a><a class="code" href="a00231.html#af34cb91b1d0f36a885a1a3432dd9af1">00806</a>     size_type bucket_count()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_mask+1; }
-<a name="l00807"></a>00807 
-<a name="l00809"></a><a class="code" href="a00231.html#6cbcacb4a256a85bf89576c101373ca7">00809</a>     allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00810"></a>00810 
-<a name="l00812"></a>00812     <span class="keywordtype">void</span> swap(<a class="code" href="a00231.html">concurrent_hash_map</a> &table);
-<a name="l00813"></a>00813 
-<a name="l00814"></a>00814     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00815"></a>00815     <span class="comment">// concurrent map operations</span>
-<a name="l00816"></a>00816     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00817"></a>00817 
-<a name="l00819"></a><a class="code" href="a00231.html#6968eb6feed2df36be421df0464297af">00819</a>     size_type count( <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
-<a name="l00820"></a>00820         <span class="keywordflow">return</span> const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, NULL, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00821"></a>00821     }
-<a name="l00822"></a>00822 
-<a name="l00824"></a>00824 
-<a name="l00825"></a><a class="code" href="a00231.html#2afcc33dade7bb24e008d60c0df38230">00825</a>     <span class="keywordtype">bool</span> find( <a class="code" href="a00234.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key )<span class="keyword"> const </span>{
-<a name="l00826"></a>00826         result.<a class="code" href="a00234.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l00827"></a>00827         <span class="keywordflow">return</span> const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00828"></a>00828     }
-<a name="l00829"></a>00829 
-<a name="l00831"></a>00831 
-<a name="l00832"></a><a class="code" href="a00231.html#7bc475d1968f7f0af3d736d7e8a0d7df">00832</a>     <span class="keywordtype">bool</span> find( <a class="code" href="a00232.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00833"></a>00833         result.<a class="code" href="a00234.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l00834"></a>00834         <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">false</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
-<a name="l00835"></a>00835     }
-<a name="l00836"></a>00836         
-<a name="l00838"></a>00838 
-<a name="l00839"></a><a class="code" href="a00231.html#47fe0e60151a9bd7a444db827772a4e6">00839</a>     <span class="keywordtype">bool</span> insert( <a class="code" href="a00234.html">const_accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00840"></a>00840         result.<a class="code" href="a00234.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l00841"></a>00841         <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00842"></a>00842     }
-<a name="l00843"></a>00843 
-<a name="l00845"></a>00845 
-<a name="l00846"></a><a class="code" href="a00231.html#54e0955ecd11575b4c07166838a72893">00846</a>     <span class="keywordtype">bool</span> insert( <a class="code" href="a00232.html">accessor</a> &result, <span class="keyword">const</span> Key &key ) {
-<a name="l00847"></a>00847         result.<a class="code" href="a00234.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l00848"></a>00848         <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, key, NULL, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
-<a name="l00849"></a>00849     }
-<a name="l00850"></a>00850 
-<a name="l00852"></a>00852 
-<a name="l00853"></a><a class="code" href="a00231.html#091efd2d12fdad4fe9e54d9629a9dfc3">00853</a>     <span class="keywordtype">bool</span> insert( <a class="code" href="a00234.html">const_accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
-<a name="l00854"></a>00854         result.<a class="code" href="a00234.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l00855"></a>00855         <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, &result, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00856"></a>00856     }
-<a name="l00857"></a>00857 
-<a name="l00859"></a>00859 
-<a name="l00860"></a><a class="code" href="a00231.html#39183d78d6e8425917555ab542ab92de">00860</a>     <span class="keywordtype">bool</span> insert( <a class="code" href="a00232.html">accessor</a> &result, <span class="keyword">const</span> value_type &value ) {
-<a name="l00861"></a>00861         result.<a class="code" href="a00234.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l00862"></a>00862         <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, &result, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
-<a name="l00863"></a>00863     }
-<a name="l00864"></a>00864 
-<a name="l00866"></a>00866 
-<a name="l00867"></a><a class="code" href="a00231.html#3f121a316af8135de476a30fae6d7c07">00867</a>     <span class="keywordtype">bool</span> insert( <span class="keyword">const</span> value_type &value ) {
-<a name="l00868"></a>00868         <span class="keywordflow">return</span> lookup(<span class="comment">/*insert*/</span><span class="keyword">true</span>, value.first, &value.second, NULL, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00869"></a>00869     }
-<a name="l00870"></a>00870 
-<a name="l00872"></a>00872     <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00873"></a><a class="code" href="a00231.html#1dd37fad87e561151ba1e242ca94bcc1">00873</a>     <span class="keywordtype">void</span> insert(I first, I last) {
-<a name="l00874"></a>00874         <span class="keywordflow">for</span>(; first != last; ++first)
-<a name="l00875"></a>00875             insert( *first );
-<a name="l00876"></a>00876     }
-<a name="l00877"></a>00877 
-<a name="l00879"></a>00879 
-<a name="l00880"></a>00880     <span class="keywordtype">bool</span> erase( <span class="keyword">const</span> Key& key );
-<a name="l00881"></a>00881 
-<a name="l00883"></a>00883 
-<a name="l00884"></a><a class="code" href="a00231.html#e698ef3d70b2d1a29a7a5551784d3653">00884</a>     <span class="keywordtype">bool</span> erase( <a class="code" href="a00234.html">const_accessor</a>& item_accessor ) {
-<a name="l00885"></a>00885         <span class="keywordflow">return</span> exclude( item_accessor );
-<a name="l00886"></a>00886     }
-<a name="l00887"></a>00887 
-<a name="l00889"></a>00889 
-<a name="l00890"></a><a class="code" href="a00231.html#5f12d150d421420965db07368666a84f">00890</a>     <span class="keywordtype">bool</span> erase( <a class="code" href="a00232.html">accessor</a>& item_accessor ) {
-<a name="l00891"></a>00891         <span class="keywordflow">return</span> exclude( item_accessor );
-<a name="l00892"></a>00892     }
-<a name="l00893"></a>00893 
-<a name="l00894"></a>00894 <span class="keyword">protected</span>:
-<a name="l00896"></a>00896     <span class="keywordtype">bool</span> lookup( <span class="keywordtype">bool</span> op_insert, <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T *t, const_accessor *result, <span class="keywordtype">bool</span> write );
-<a name="l00897"></a>00897 
-<a name="l00899"></a>00899     <span class="keywordtype">bool</span> exclude( const_accessor &item_accessor );
-<a name="l00900"></a>00900 
-<a name="l00902"></a>00902     <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00903"></a>00903     std::pair<I, I> internal_equal_range( <span class="keyword">const</span> Key& key, I end ) <span class="keyword">const</span>;
-<a name="l00904"></a>00904 
-<a name="l00906"></a>00906     <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> <a class="code" href="a00231.html">concurrent_hash_map</a>& source );
-<a name="l00907"></a>00907 
-<a name="l00908"></a>00908     <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00909"></a>00909     <span class="keywordtype">void</span> internal_copy(I first, I last);
-<a name="l00910"></a>00910 
-<a name="l00912"></a>00912 
-<a name="l00914"></a><a class="code" href="a00231.html#2f76ed101a0ccc8875b846c2f747897e">00914</a>     const_pointer internal_fast_find( <span class="keyword">const</span> Key& key )<span class="keyword"> const </span>{
-<a name="l00915"></a>00915         hashcode_t h = my_hash_compare.hash( key );
-<a name="l00916"></a>00916         hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );
-<a name="l00917"></a>00917         node *n;
-<a name="l00918"></a>00918     restart:
-<a name="l00919"></a>00919         __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l00920"></a>00920         bucket *b = get_bucket( h & m );
-<a name="l00921"></a>00921         <span class="comment">// TODO: actually, notification is unnecessary here, just hiding double-check</span>
-<a name="l00922"></a>00922         <span class="keywordflow">if</span>( itt_load_word_with_acquire(b->node_list) == internal::rehash_req )
-<a name="l00923"></a>00923         {
-<a name="l00924"></a>00924             bucket::scoped_t lock;
-<a name="l00925"></a>00925             <span class="keywordflow">if</span>( lock.try_acquire( b->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> ) ) {
-<a name="l00926"></a>00926                 <span class="keywordflow">if</span>( b->node_list == internal::rehash_req)
-<a name="l00927"></a>00927                     const_cast<concurrent_hash_map*>(<span class="keyword">this</span>)->rehash_bucket( b, h & m ); <span class="comment">//recursive rehashing</span>
-<a name="l00928"></a>00928             }
-<a name="l00929"></a>00929             <span class="keywordflow">else</span> lock.acquire( b->mutex, <span class="comment">/*write=*/</span><span class="keyword">false</span> );
-<a name="l00930"></a>00930             __TBB_ASSERT(b->node_list!=internal::rehash_req,NULL);
-<a name="l00931"></a>00931         }
-<a name="l00932"></a>00932         n = search_bucket( key, b );
-<a name="l00933"></a>00933         <span class="keywordflow">if</span>( n )
-<a name="l00934"></a>00934             <span class="keywordflow">return</span> &n->item;
-<a name="l00935"></a>00935         <span class="keywordflow">else</span> <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l00936"></a>00936             <span class="keywordflow">goto</span> restart;
-<a name="l00937"></a>00937         <span class="keywordflow">return</span> 0;
-<a name="l00938"></a>00938     }
-<a name="l00939"></a>00939 };
-<a name="l00940"></a>00940 
-<a name="l00941"></a>00941 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00942"></a>00942 <span class="preprocessor"></span>    <span class="comment">// Suppress "conditional expression is constant" warning.</span>
-<a name="l00943"></a>00943 <span class="preprocessor">    #pragma warning( push )</span>
-<a name="l00944"></a>00944 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning( disable: 4127 )</span>
-<a name="l00945"></a>00945 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00946"></a>00946 <span class="preprocessor"></span>
-<a name="l00947"></a>00947 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l00948"></a><a class="code" href="a00231.html#3f3413264a99174a224ef96f6c4ea769">00948</a> <span class="keywordtype">bool</span> <a class="code" href="a00231.html">concurrent_hash_map<Key,T,HashCompare,A>::lookup</a>( <span class="keywordtype">bool</span> op_insert, <span class="keyword">const</span> Key &key, <span class="keyword">const</span> T *t, <a class="code" href="a00234.html">const_accessor</a> *result, <span class="keywordtype">bool</span> write ) {
-<a name="l00949"></a>00949     __TBB_ASSERT( !result || !result-><a class="code" href="a00234.html#21856da696b0765cc3db90663160d95e">my_node</a>, NULL );
-<a name="l00950"></a>00950     <span class="keywordtype">bool</span> return_value;
-<a name="l00951"></a>00951     hashcode_t <span class="keyword">const</span> h = my_hash_compare.hash( key );
-<a name="l00952"></a>00952     hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );
-<a name="l00953"></a>00953     segment_index_t grow_segment = 0;
-<a name="l00954"></a>00954     node *n, *tmp_n = 0;
-<a name="l00955"></a>00955     restart:
-<a name="l00956"></a>00956     {<span class="comment">//lock scope</span>
-<a name="l00957"></a>00957         __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l00958"></a>00958         return_value = <span class="keyword">false</span>;
-<a name="l00959"></a>00959         <span class="comment">// get bucket</span>
-<a name="l00960"></a>00960         <a class="code" href="a00233.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
-<a name="l00961"></a>00961 
-<a name="l00962"></a>00962         <span class="comment">// find a node</span>
-<a name="l00963"></a>00963         n = search_bucket( key, b() );
-<a name="l00964"></a>00964         <span class="keywordflow">if</span>( op_insert ) {
-<a name="l00965"></a>00965             <span class="comment">// [opt] insert a key</span>
-<a name="l00966"></a>00966             <span class="keywordflow">if</span>( !n ) {
-<a name="l00967"></a>00967                 <span class="keywordflow">if</span>( !tmp_n ) {
-<a name="l00968"></a>00968                     <span class="keywordflow">if</span>(t) tmp_n = <span class="keyword">new</span>( my_allocator ) node(key, *t);
-<a name="l00969"></a>00969                     <span class="keywordflow">else</span>  tmp_n = <span class="keyword">new</span>( my_allocator ) node(key);
-<a name="l00970"></a>00970                 }
-<a name="l00971"></a>00971                 <span class="keywordflow">if</span>( !b.<a class="code" href="a00233.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a>() && !b.upgrade_to_writer() ) { <span class="comment">// TODO: improved insertion</span>
-<a name="l00972"></a>00972                     <span class="comment">// Rerun search_list, in case another thread inserted the item during the upgrade.</span>
-<a name="l00973"></a>00973                     n = search_bucket( key, b() );
-<a name="l00974"></a>00974                     <span class="keywordflow">if</span>( is_valid(n) ) { <span class="comment">// unfortunately, it did</span>
-<a name="l00975"></a>00975                         b.downgrade_to_reader();
-<a name="l00976"></a>00976                         <span class="keywordflow">goto</span> exists;
-<a name="l00977"></a>00977                     }
-<a name="l00978"></a>00978                 }
-<a name="l00979"></a>00979                 <span class="keywordflow">if</span>( check_mask_race(h, m) )
-<a name="l00980"></a>00980                     <span class="keywordflow">goto</span> restart; <span class="comment">// b.release() is done in ~b().</span>
-<a name="l00981"></a>00981                 <span class="comment">// insert and set flag to grow the container</span>
-<a name="l00982"></a>00982                 grow_segment = insert_new_node( b(), n = tmp_n, m );
-<a name="l00983"></a>00983                 tmp_n = 0;
-<a name="l00984"></a>00984                 return_value = <span class="keyword">true</span>;
-<a name="l00985"></a>00985             }
-<a name="l00986"></a>00986         } <span class="keywordflow">else</span> { <span class="comment">// find or count</span>
-<a name="l00987"></a>00987             <span class="keywordflow">if</span>( !n ) {
-<a name="l00988"></a>00988                 <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l00989"></a>00989                     <span class="keywordflow">goto</span> restart; <span class="comment">// b.release() is done in ~b(). TODO: replace by continue</span>
-<a name="l00990"></a>00990                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00991"></a>00991             }
-<a name="l00992"></a>00992             return_value = <span class="keyword">true</span>;
-<a name="l00993"></a>00993         }
-<a name="l00994"></a>00994     exists:
-<a name="l00995"></a>00995         <span class="keywordflow">if</span>( !result ) <span class="keywordflow">goto</span> check_growth;
-<a name="l00996"></a>00996         <span class="comment">// TODO: the following seems as generic/regular operation</span>
-<a name="l00997"></a>00997         <span class="comment">// acquire the item</span>
-<a name="l00998"></a>00998         <span class="keywordflow">if</span>( !result->try_acquire( n->mutex, write ) ) {
-<a name="l00999"></a>00999             <span class="comment">// we are unlucky, prepare for longer wait</span>
-<a name="l01000"></a>01000             <a class="code" href="a00218.html">tbb::internal::atomic_backoff</a> trials;
-<a name="l01001"></a>01001             <span class="keywordflow">do</span> {
-<a name="l01002"></a>01002                 <span class="keywordflow">if</span>( !trials.bounded_pause() ) {
-<a name="l01003"></a>01003                     <span class="comment">// the wait takes really long, restart the operation</span>
-<a name="l01004"></a>01004                     b.release();
-<a name="l01005"></a>01005                     __TBB_ASSERT( !op_insert || !return_value, <span class="stringliteral">"Can't acquire new item in locked bucket?"</span> );
-<a name="l01006"></a>01006                     __TBB_Yield();
-<a name="l01007"></a>01007                     m = (hashcode_t) itt_load_word_with_acquire( my_mask );
-<a name="l01008"></a>01008                     <span class="keywordflow">goto</span> restart;
-<a name="l01009"></a>01009                 }
-<a name="l01010"></a>01010             } <span class="keywordflow">while</span>( !result->try_acquire( n->mutex, write ) );
-<a name="l01011"></a>01011         }
-<a name="l01012"></a>01012     }<span class="comment">//lock scope</span>
-<a name="l01013"></a>01013     result-><a class="code" href="a00234.html#21856da696b0765cc3db90663160d95e">my_node</a> = n;
-<a name="l01014"></a>01014     result-><a class="code" href="a00234.html#4936cc9432926ed38f0207828b388e24">my_hash</a> = h;
-<a name="l01015"></a>01015 check_growth:
-<a name="l01016"></a>01016     <span class="comment">// [opt] grow the container</span>
-<a name="l01017"></a>01017     <span class="keywordflow">if</span>( grow_segment ) {
-<a name="l01018"></a>01018 <span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l01019"></a>01019 <span class="preprocessor"></span>        my_info_resizes++; <span class="comment">// concurrent ones</span>
-<a name="l01020"></a>01020 <span class="preprocessor">#endif</span>
-<a name="l01021"></a>01021 <span class="preprocessor"></span>        enable_segment( grow_segment );
-<a name="l01022"></a>01022     }
-<a name="l01023"></a>01023     <span class="keywordflow">if</span>( tmp_n ) <span class="comment">// if op_insert only</span>
-<a name="l01024"></a>01024         delete_node( tmp_n );
-<a name="l01025"></a>01025     <span class="keywordflow">return</span> return_value;
-<a name="l01026"></a>01026 }
-<a name="l01027"></a>01027 
-<a name="l01028"></a>01028 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01029"></a>01029 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l01030"></a><a class="code" href="a00231.html#8f5373b8e1864619d1ffcf3bf3f1f13d">01030</a> std::pair<I, I> <a class="code" href="a00231.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_equal_range</a>( <span class="keyword">const</span> Key& key, I end_ )<span class="keyword"> const </span>{
-<a name="l01031"></a>01031     hashcode_t h = my_hash_compare.hash( key );
-<a name="l01032"></a>01032     hashcode_t m = my_mask;
-<a name="l01033"></a>01033     __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l01034"></a>01034     h &= m;
-<a name="l01035"></a>01035     bucket *b = get_bucket( h );
-<a name="l01036"></a>01036     <span class="keywordflow">while</span>( b->node_list == internal::rehash_req ) {
-<a name="l01037"></a>01037         m = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
-<a name="l01038"></a>01038         b = get_bucket( h &= m );
-<a name="l01039"></a>01039     }
-<a name="l01040"></a>01040     node *n = search_bucket( key, b );
-<a name="l01041"></a>01041     <span class="keywordflow">if</span>( !n )
-<a name="l01042"></a>01042         <span class="keywordflow">return</span> std::make_pair(end_, end_);
-<a name="l01043"></a>01043     iterator lower(*<span class="keyword">this</span>, h, b, n), upper(lower);
-<a name="l01044"></a>01044     <span class="keywordflow">return</span> std::make_pair(lower, ++upper);
-<a name="l01045"></a>01045 }
-<a name="l01046"></a>01046 
-<a name="l01047"></a>01047 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01048"></a><a class="code" href="a00231.html#0c964214eb38f54603aa75fdff6d2709">01048</a> <span class="keywordtype">bool</span> <a class="code" href="a00231.html">concurrent_hash_map<Key,T,HashCompare,A>::exclude</a>( <a class="code" href="a00234.html">const_accessor</a> &item_accessor ) {
-<a name="l01049"></a>01049     __TBB_ASSERT( item_accessor.<a class="code" href="a00234.html#21856da696b0765cc3db90663160d95e">my_node</a>, NULL );
-<a name="l01050"></a>01050     node_base *<span class="keyword">const</span> n = item_accessor.<a class="code" href="a00234.html#21856da696b0765cc3db90663160d95e">my_node</a>;
-<a name="l01051"></a>01051     hashcode_t <span class="keyword">const</span> h = item_accessor.<a class="code" href="a00234.html#4936cc9432926ed38f0207828b388e24">my_hash</a>;
-<a name="l01052"></a>01052     hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );
-<a name="l01053"></a>01053     <span class="keywordflow">do</span> {
-<a name="l01054"></a>01054         <span class="comment">// get bucket</span>
-<a name="l01055"></a>01055         <a class="code" href="a00233.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m, <span class="comment">/*writer=*/</span><span class="keyword">true</span> );
-<a name="l01056"></a>01056         node_base **p = &b()->node_list;
-<a name="l01057"></a>01057         <span class="keywordflow">while</span>( *p && *p != n )
-<a name="l01058"></a>01058             p = &(*p)->next;
-<a name="l01059"></a>01059         <span class="keywordflow">if</span>( !*p ) { <span class="comment">// someone else was the first</span>
-<a name="l01060"></a>01060             <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l01061"></a>01061                 <span class="keywordflow">continue</span>;
-<a name="l01062"></a>01062             item_accessor.<a class="code" href="a00234.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l01063"></a>01063             <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01064"></a>01064         }
-<a name="l01065"></a>01065         __TBB_ASSERT( *p == n, NULL );
-<a name="l01066"></a>01066         *p = n->next; <span class="comment">// remove from container</span>
-<a name="l01067"></a>01067         my_size--;
-<a name="l01068"></a>01068         <span class="keywordflow">break</span>;
-<a name="l01069"></a>01069     } <span class="keywordflow">while</span>(<span class="keyword">true</span>);
-<a name="l01070"></a>01070     <span class="keywordflow">if</span>( !item_accessor.<a class="code" href="a00234.html#45ab59454c6f11fe938bbcab637cdd73">is_writer</a>() ) <span class="comment">// need to get exclusive lock</span>
-<a name="l01071"></a>01071         item_accessor.upgrade_to_writer(); <span class="comment">// return value means nothing here</span>
-<a name="l01072"></a>01072     item_accessor.<a class="code" href="a00234.html#7db006d41b49dc5f1716a913769d4698">release</a>();
-<a name="l01073"></a>01073     delete_node( n ); <span class="comment">// Only one thread can delete it</span>
-<a name="l01074"></a>01074     <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01075"></a>01075 }
-<a name="l01076"></a>01076 
-<a name="l01077"></a>01077 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01078"></a><a class="code" href="a00231.html#f27802b3a8d1863c29e743e9c6b4e870">01078</a> <span class="keywordtype">bool</span> <a class="code" href="a00231.html">concurrent_hash_map<Key,T,HashCompare,A>::erase</a>( <span class="keyword">const</span> Key &key ) {
-<a name="l01079"></a>01079     node_base *n;
-<a name="l01080"></a>01080     hashcode_t <span class="keyword">const</span> h = my_hash_compare.hash( key );
-<a name="l01081"></a>01081     hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );
-<a name="l01082"></a>01082 restart:
-<a name="l01083"></a>01083     {<span class="comment">//lock scope</span>
-<a name="l01084"></a>01084         <span class="comment">// get bucket</span>
-<a name="l01085"></a>01085         <a class="code" href="a00233.html">bucket_accessor</a> b( <span class="keyword">this</span>, h & m );
-<a name="l01086"></a>01086     search:
-<a name="l01087"></a>01087         node_base **p = &b()->node_list;
-<a name="l01088"></a>01088         n = *p;
-<a name="l01089"></a>01089         <span class="keywordflow">while</span>( is_valid(n) && !my_hash_compare.equal(key, static_cast<node*>(n)->item.first ) ) {
-<a name="l01090"></a>01090             p = &n->next;
-<a name="l01091"></a>01091             n = *p;
-<a name="l01092"></a>01092         }
-<a name="l01093"></a>01093         <span class="keywordflow">if</span>( !n ) { <span class="comment">// not found, but mask could be changed</span>
-<a name="l01094"></a>01094             <span class="keywordflow">if</span>( check_mask_race( h, m ) )
-<a name="l01095"></a>01095                 <span class="keywordflow">goto</span> restart;
-<a name="l01096"></a>01096             <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01097"></a>01097         }
-<a name="l01098"></a>01098         <span class="keywordflow">else</span> <span class="keywordflow">if</span>( !b.<a class="code" href="a00233.html#07d958f151a0eaa92f50fd56ad6440e2">is_writer</a>() && !b.upgrade_to_writer() ) {
-<a name="l01099"></a>01099             <span class="keywordflow">if</span>( check_mask_race( h, m ) ) <span class="comment">// contended upgrade, check mask</span>
-<a name="l01100"></a>01100                 <span class="keywordflow">goto</span> restart;
-<a name="l01101"></a>01101             <span class="keywordflow">goto</span> search;
-<a name="l01102"></a>01102         }
-<a name="l01103"></a>01103         *p = n->next;
-<a name="l01104"></a>01104         my_size--;
-<a name="l01105"></a>01105     }
-<a name="l01106"></a>01106     {
-<a name="l01107"></a>01107         <span class="keyword">typename</span> node::scoped_t item_locker( n->mutex, <span class="comment">/*write=*/</span><span class="keyword">true</span> );
-<a name="l01108"></a>01108     }
-<a name="l01109"></a>01109     <span class="comment">// note: there should be no threads pretending to acquire this mutex again, do not try to upgrade const_accessor!</span>
-<a name="l01110"></a>01110     delete_node( n ); <span class="comment">// Only one thread can delete it due to write lock on the bucket</span>
-<a name="l01111"></a>01111     <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01112"></a>01112 }
-<a name="l01113"></a>01113 
-<a name="l01114"></a>01114 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01115"></a>01115 <span class="keywordtype">void</span> <a class="code" href="a00231.html">concurrent_hash_map<Key,T,HashCompare,A>::swap</a>(<a class="code" href="a00231.html">concurrent_hash_map<Key,T,HashCompare,A></a> &table) {
-<a name="l01116"></a>01116     std::swap(this->my_allocator, table.<a class="code" href="a00231.html#a72cb6e9873e5541295682179e5a7f74">my_allocator</a>);
-<a name="l01117"></a>01117     std::swap(this->my_hash_compare, table.<a class="code" href="a00231.html#53c747a3f2d2d2c85aec866e19c31c29">my_hash_compare</a>);
-<a name="l01118"></a>01118     internal_swap(table);
-<a name="l01119"></a>01119 }
-<a name="l01120"></a>01120 
-<a name="l01121"></a>01121 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01122"></a><a class="code" href="a00231.html#94758113d8993cfe5afdf2d63a728869">01122</a> <span class="keywordtype">void</span> <a class="code" href="a00231.html">concurrent_hash_map<Key,T,HashCompare,A>::rehash</a>(size_type sz) {
-<a name="l01123"></a>01123     reserve( sz ); <span class="comment">// TODO: add reduction of number of buckets as well</span>
-<a name="l01124"></a>01124     hashcode_t mask = my_mask;
-<a name="l01125"></a>01125     hashcode_t b = (mask+1)>>1; <span class="comment">// size or first index of the last segment</span>
-<a name="l01126"></a>01126     __TBB_ASSERT((b&(b-1))==0, NULL);
-<a name="l01127"></a>01127     bucket *bp = get_bucket( b ); <span class="comment">// only the last segment should be scanned for rehashing</span>
-<a name="l01128"></a>01128     <span class="keywordflow">for</span>(; b <= mask; b++, bp++ ) {
-<a name="l01129"></a>01129         node_base *n = bp->node_list;
-<a name="l01130"></a>01130         __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, <span class="stringliteral">"Broken internal structure"</span> );
-<a name="l01131"></a>01131         __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during rehash() execution"</span> );
-<a name="l01132"></a>01132         <span class="keywordflow">if</span>( n == internal::rehash_req ) { <span class="comment">// rehash bucket, conditional because rehashing of a previous bucket may affect this one</span>
-<a name="l01133"></a>01133             hashcode_t h = b; bucket *b_old = bp;
-<a name="l01134"></a>01134             <span class="keywordflow">do</span> {
-<a name="l01135"></a>01135                 __TBB_ASSERT( h > 1, <span class="stringliteral">"The lowermost buckets can't be rehashed"</span> );
-<a name="l01136"></a>01136                 hashcode_t m = ( 1u<<__TBB_Log2( h ) ) - 1; <span class="comment">// get parent mask from the topmost bit</span>
-<a name="l01137"></a>01137                 b_old = get_bucket( h &= m );
-<a name="l01138"></a>01138             } <span class="keywordflow">while</span>( b_old->node_list == internal::rehash_req );
-<a name="l01139"></a>01139             <span class="comment">// now h - is index of the root rehashed bucket b_old</span>
-<a name="l01140"></a>01140             mark_rehashed_levels( h ); <span class="comment">// mark all non-rehashed children recursively across all segments</span>
-<a name="l01141"></a>01141             <span class="keywordflow">for</span>( node_base **p = &b_old->node_list, *q = *p; is_valid(q); q = *p ) {
-<a name="l01142"></a>01142                 hashcode_t c = my_hash_compare.hash( static_cast<node*>(q)->item.first );
-<a name="l01143"></a>01143                 <span class="keywordflow">if</span>( (c & mask) != h ) { <span class="comment">// should be rehashed</span>
-<a name="l01144"></a>01144                     *p = q->next; <span class="comment">// exclude from b_old</span>
-<a name="l01145"></a>01145                     bucket *b_new = get_bucket( c & mask );
-<a name="l01146"></a>01146                     __TBB_ASSERT( b_new->node_list != internal::rehash_req, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
-<a name="l01147"></a>01147                     add_to_bucket( b_new, q );
-<a name="l01148"></a>01148                 } <span class="keywordflow">else</span> p = &q->next; <span class="comment">// iterate to next item</span>
-<a name="l01149"></a>01149             }
-<a name="l01150"></a>01150         }
-<a name="l01151"></a>01151     }
-<a name="l01152"></a>01152 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01153"></a>01153 <span class="preprocessor"></span>    <span class="keywordtype">int</span> current_size = int(my_size), buckets = int(mask)+1, empty_buckets = 0, overpopulated_buckets = 0; <span class="comment">// usage statistics</span>
-<a name="l01154"></a>01154     <span class="keyword">static</span> <span class="keywordtype">bool</span> reported = <span class="keyword">false</span>;
-<a name="l01155"></a>01155 <span class="preprocessor">#endif</span>
-<a name="l01156"></a>01156 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01157"></a>01157 <span class="preprocessor"></span>    <span class="keywordflow">for</span>( b = 0; b <= mask; b++ ) {<span class="comment">// only last segment should be scanned for rehashing</span>
-<a name="l01158"></a>01158         <span class="keywordflow">if</span>( b & (b-2) ) ++bp; <span class="comment">// not the beginning of a segment</span>
-<a name="l01159"></a>01159         <span class="keywordflow">else</span> bp = get_bucket( b );
-<a name="l01160"></a>01160         node_base *n = bp->node_list;
-<a name="l01161"></a>01161         __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during rehash() execution"</span> );
-<a name="l01162"></a>01162         __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed, <span class="stringliteral">"Broken internal structure"</span> );
-<a name="l01163"></a>01163 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01164"></a>01164 <span class="preprocessor"></span>        <span class="keywordflow">if</span>( n == internal::empty_rehashed ) empty_buckets++;
-<a name="l01165"></a>01165         <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n->next ) overpopulated_buckets++;
-<a name="l01166"></a>01166 <span class="preprocessor">#endif</span>
-<a name="l01167"></a>01167 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l01168"></a>01168 <span class="preprocessor"></span>        <span class="keywordflow">for</span>( ; is_valid(n); n = n->next ) {
-<a name="l01169"></a>01169             hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first ) & mask;
-<a name="l01170"></a>01170             __TBB_ASSERT( h == b, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
-<a name="l01171"></a>01171         }
-<a name="l01172"></a>01172 <span class="preprocessor">#endif</span>
-<a name="l01173"></a>01173 <span class="preprocessor"></span>    }
-<a name="l01174"></a>01174 <span class="preprocessor">#endif // TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01175"></a>01175 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l01176"></a>01176 <span class="preprocessor"></span>    <span class="keywordflow">if</span>( buckets > current_size) empty_buckets -= buckets - current_size;
-<a name="l01177"></a>01177     <span class="keywordflow">else</span> overpopulated_buckets -= current_size - buckets; <span class="comment">// TODO: load_factor?</span>
-<a name="l01178"></a>01178     <span class="keywordflow">if</span>( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
-<a name="l01179"></a>01179         tbb::internal::runtime_warning(
-<a name="l01180"></a>01180             <span class="stringliteral">"Performance is not optimal because the hash function produces bad randomness in lower bits in %s.\nSize: %d  Empties: %d  Overlaps: %d"</span>,
-<a name="l01181"></a>01181             <span class="keyword">typeid</span>(*this).name(), current_size, empty_buckets, overpopulated_buckets );
-<a name="l01182"></a>01182         reported = <span class="keyword">true</span>;
-<a name="l01183"></a>01183     }
-<a name="l01184"></a>01184 <span class="preprocessor">#endif</span>
-<a name="l01185"></a>01185 <span class="preprocessor"></span>}
-<a name="l01186"></a>01186 
-<a name="l01187"></a>01187 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01188"></a><a class="code" href="a00231.html#220686fe17b197eedf19dd856cd02e36">01188</a> <span class="keywordtype">void</span> <a class="code" href="a00231.html">concurrent_hash_map<Key,T,HashCompare,A>::clear</a>() {
-<a name="l01189"></a>01189     hashcode_t m = my_mask;
-<a name="l01190"></a>01190     __TBB_ASSERT((m&(m+1))==0, NULL);
-<a name="l01191"></a>01191 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
-<a name="l01192"></a>01192 <span class="preprocessor"></span><span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
-<a name="l01193"></a>01193 <span class="preprocessor"></span>    <span class="keywordtype">int</span> current_size = int(my_size), buckets = int(m)+1, empty_buckets = 0, overpopulated_buckets = 0; <span class="comment">// usage statistics</span>
-<a name="l01194"></a>01194     <span class="keyword">static</span> <span class="keywordtype">bool</span> reported = <span class="keyword">false</span>;
-<a name="l01195"></a>01195 <span class="preprocessor">#endif</span>
-<a name="l01196"></a>01196 <span class="preprocessor"></span>    bucket *bp = 0;
-<a name="l01197"></a>01197     <span class="comment">// check consistency</span>
-<a name="l01198"></a>01198     <span class="keywordflow">for</span>( segment_index_t b = 0; b <= m; b++ ) {
-<a name="l01199"></a>01199         <span class="keywordflow">if</span>( b & (b-2) ) ++bp; <span class="comment">// not the beginning of a segment</span>
-<a name="l01200"></a>01200         <span class="keywordflow">else</span> bp = get_bucket( b );
-<a name="l01201"></a>01201         node_base *n = bp->node_list;
-<a name="l01202"></a>01202         __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, <span class="stringliteral">"Broken internal structure"</span> );
-<a name="l01203"></a>01203         __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, <span class="stringliteral">"concurrent or unexpectedly terminated operation during clear() execution"</span> );
-<a name="l01204"></a>01204 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
-<a name="l01205"></a>01205 <span class="preprocessor"></span>        <span class="keywordflow">if</span>( n == internal::empty_rehashed ) empty_buckets++;
-<a name="l01206"></a>01206         <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n == internal::rehash_req ) buckets--;
-<a name="l01207"></a>01207         <span class="keywordflow">else</span> <span class="keywordflow">if</span>( n->next ) overpopulated_buckets++;
-<a name="l01208"></a>01208 <span class="preprocessor">#endif</span>
-<a name="l01209"></a>01209 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
-<a name="l01210"></a>01210 <span class="preprocessor"></span>        <span class="keywordflow">for</span>(; is_valid(n); n = n->next ) {
-<a name="l01211"></a>01211             hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first );
-<a name="l01212"></a>01212             h &= m;
-<a name="l01213"></a>01213             __TBB_ASSERT( h == b || get_bucket(h)->node_list == internal::rehash_req, <span class="stringliteral">"hash() function changed for key in table or internal error"</span> );
-<a name="l01214"></a>01214         }
-<a name="l01215"></a>01215 <span class="preprocessor">#endif</span>
-<a name="l01216"></a>01216 <span class="preprocessor"></span>    }
-<a name="l01217"></a>01217 <span class="preprocessor">#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
-<a name="l01218"></a>01218 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_STATISTICS</span>
-<a name="l01219"></a>01219 <span class="preprocessor"></span>    printf( <span class="stringliteral">"items=%d buckets: capacity=%d rehashed=%d empty=%d overpopulated=%d"</span>
-<a name="l01220"></a>01220         <span class="stringliteral">" concurrent: resizes=%u rehashes=%u restarts=%u\n"</span>,
-<a name="l01221"></a>01221         current_size, <span class="keywordtype">int</span>(m+1), buckets, empty_buckets, overpopulated_buckets,
-<a name="l01222"></a>01222         <span class="keywordtype">unsigned</span>(my_info_resizes), <span class="keywordtype">unsigned</span>(my_info_rehashes), <span class="keywordtype">unsigned</span>(my_info_restarts) );
-<a name="l01223"></a>01223     my_info_resizes = 0; <span class="comment">// concurrent ones</span>
-<a name="l01224"></a>01224     my_info_restarts = 0; <span class="comment">// race collisions</span>
-<a name="l01225"></a>01225     my_info_rehashes = 0;  <span class="comment">// invocations of rehash_bucket</span>
-<a name="l01226"></a>01226 <span class="preprocessor">#endif</span>
-<a name="l01227"></a>01227 <span class="preprocessor"></span>    <span class="keywordflow">if</span>( buckets > current_size) empty_buckets -= buckets - current_size;
-<a name="l01228"></a>01228     <span class="keywordflow">else</span> overpopulated_buckets -= current_size - buckets; <span class="comment">// TODO: load_factor?</span>
-<a name="l01229"></a>01229     <span class="keywordflow">if</span>( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {
-<a name="l01230"></a>01230         tbb::internal::runtime_warning(
-<a name="l01231"></a>01231             <span class="stringliteral">"Performance is not optimal because the hash function produces bad randomness in lower bits in %s.\nSize: %d  Empties: %d  Overlaps: %d"</span>,
-<a name="l01232"></a>01232             <span class="keyword">typeid</span>(*this).name(), current_size, empty_buckets, overpopulated_buckets );
-<a name="l01233"></a>01233         reported = <span class="keyword">true</span>;
-<a name="l01234"></a>01234     }
-<a name="l01235"></a>01235 <span class="preprocessor">#endif</span>
-<a name="l01236"></a>01236 <span class="preprocessor"></span><span class="preprocessor">#endif//TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS</span>
-<a name="l01237"></a>01237 <span class="preprocessor"></span>    my_size = 0;
-<a name="l01238"></a>01238     segment_index_t s = segment_index_of( m );
-<a name="l01239"></a>01239     __TBB_ASSERT( s+1 == pointers_per_table || !my_table[s+1], <span class="stringliteral">"wrong mask or concurrent grow"</span> );
-<a name="l01240"></a>01240     <a class="code" href="a00226.html">cache_aligned_allocator<bucket></a> alloc;
-<a name="l01241"></a>01241     <span class="keywordflow">do</span> {
-<a name="l01242"></a>01242         __TBB_ASSERT( is_valid( my_table[s] ), <span class="stringliteral">"wrong mask or concurrent grow"</span> );
-<a name="l01243"></a>01243         segment_ptr_t buckets_ptr = my_table[s];
-<a name="l01244"></a>01244         size_type sz = segment_size( s ? s : 1 );
-<a name="l01245"></a>01245         <span class="keywordflow">for</span>( segment_index_t i = 0; i < sz; i++ )
-<a name="l01246"></a>01246             <span class="keywordflow">for</span>( node_base *n = buckets_ptr[i].node_list; is_valid(n); n = buckets_ptr[i].node_list ) {
-<a name="l01247"></a>01247                 buckets_ptr[i].node_list = n->next;
-<a name="l01248"></a>01248                 delete_node( n );
-<a name="l01249"></a>01249             }
-<a name="l01250"></a>01250         <span class="keywordflow">if</span>( s >= first_block) <span class="comment">// the first segment or the next</span>
-<a name="l01251"></a>01251             alloc.<a class="code" href="a00226.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, sz );
-<a name="l01252"></a>01252         <span class="keywordflow">else</span> <span class="keywordflow">if</span>( s == embedded_block && embedded_block != first_block )
-<a name="l01253"></a>01253             alloc.<a class="code" href="a00226.html#3d4eadf188f7d85d3805ae534e0b8e1c">deallocate</a>( buckets_ptr, segment_size(first_block)-embedded_buckets );
-<a name="l01254"></a>01254         <span class="keywordflow">if</span>( s >= embedded_block ) my_table[s] = 0;
-<a name="l01255"></a>01255     } <span class="keywordflow">while</span>(s-- > 0);
-<a name="l01256"></a>01256     my_mask = embedded_buckets - 1;
-<a name="l01257"></a>01257 }
-<a name="l01258"></a>01258 
-<a name="l01259"></a>01259 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01260"></a><a class="code" href="a00231.html#72c9c9e9655fcf096f5f0ed9c8ba6669">01260</a> <span class="keywordtype">void</span> <a class="code" href="a00231.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>( <span class="keyword">const</span> <a class="code" href="a00231.html">concurrent_hash_map</a>& source ) {
-<a name="l01261"></a>01261     reserve( source.my_size ); <span class="comment">// TODO: load_factor?</span>
-<a name="l01262"></a>01262     hashcode_t mask = source.my_mask;
-<a name="l01263"></a>01263     <span class="keywordflow">if</span>( my_mask == mask ) { <span class="comment">// optimized version</span>
-<a name="l01264"></a>01264         bucket *dst = 0, *src = 0;
-<a name="l01265"></a>01265         <span class="keywordtype">bool</span> rehash_required = <span class="keyword">false</span>;
-<a name="l01266"></a>01266         <span class="keywordflow">for</span>( hashcode_t k = 0; k <= mask; k++ ) {
-<a name="l01267"></a>01267             <span class="keywordflow">if</span>( k & (k-2) ) ++dst,src++; <span class="comment">// not the beginning of a segment</span>
-<a name="l01268"></a>01268             <span class="keywordflow">else</span> { dst = get_bucket( k ); src = source.get_bucket( k ); }
-<a name="l01269"></a>01269             __TBB_ASSERT( dst->node_list != internal::rehash_req, <span class="stringliteral">"Invalid bucket in destination table"</span>);
-<a name="l01270"></a>01270             node *n = static_cast<node*>( src->node_list );
-<a name="l01271"></a>01271             <span class="keywordflow">if</span>( n == internal::rehash_req ) { <span class="comment">// source is not rehashed, items are in previous buckets</span>
-<a name="l01272"></a>01272                 rehash_required = <span class="keyword">true</span>;
-<a name="l01273"></a>01273                 dst->node_list = internal::rehash_req;
-<a name="l01274"></a>01274             } <span class="keywordflow">else</span> <span class="keywordflow">for</span>(; n; n = static_cast<node*>( n->next ) ) {
-<a name="l01275"></a>01275                 add_to_bucket( dst, <span class="keyword">new</span>( my_allocator ) node(n->item.first, n->item.second) );
-<a name="l01276"></a>01276                 ++my_size; <span class="comment">// TODO: replace by non-atomic op</span>
-<a name="l01277"></a>01277             }
-<a name="l01278"></a>01278         }
-<a name="l01279"></a>01279         <span class="keywordflow">if</span>( rehash_required ) <a class="code" href="a00231.html#94758113d8993cfe5afdf2d63a728869">rehash</a>();
-<a name="l01280"></a>01280     } <span class="keywordflow">else</span> <a class="code" href="a00231.html#72c9c9e9655fcf096f5f0ed9c8ba6669">internal_copy</a>( source.<a class="code" href="a00231.html#35a8c373fc3d52099ae18f0553162491">begin</a>(), source.<a class="code" href="a00231.html#67c50bddda53b9a10318f8981e4fc4fa">end</a>() );
-<a name="l01281"></a>01281 }
-<a name="l01282"></a>01282 
-<a name="l01283"></a>01283 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01284"></a>01284 <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l01285"></a>01285 <span class="keywordtype">void</span> <a class="code" href="a00231.html">concurrent_hash_map<Key,T,HashCompare,A>::internal_copy</a>(I first, I last) {
-<a name="l01286"></a>01286     hashcode_t m = my_mask;
-<a name="l01287"></a>01287     <span class="keywordflow">for</span>(; first != last; ++first) {
-<a name="l01288"></a>01288         hashcode_t h = my_hash_compare.hash( first->first );
-<a name="l01289"></a>01289         bucket *b = get_bucket( h & m );
-<a name="l01290"></a>01290         __TBB_ASSERT( b->node_list != internal::rehash_req, <span class="stringliteral">"Invalid bucket in destination table"</span>);
-<a name="l01291"></a>01291         node *n = <span class="keyword">new</span>( my_allocator ) node(first->first, first->second);
-<a name="l01292"></a>01292         add_to_bucket( b, n );
-<a name="l01293"></a>01293         ++my_size; <span class="comment">// TODO: replace by non-atomic op</span>
-<a name="l01294"></a>01294     }
-<a name="l01295"></a>01295 }
-<a name="l01296"></a>01296 
-<a name="l01297"></a>01297 } <span class="comment">// namespace interface5</span>
-<a name="l01298"></a>01298 
-<a name="l01299"></a>01299 <span class="keyword">using</span> interface5::concurrent_hash_map;
-<a name="l01300"></a>01300 
-<a name="l01301"></a>01301 
-<a name="l01302"></a>01302 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2>
-<a name="l01303"></a>01303 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A1> &a, <span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A2> &b) {
-<a name="l01304"></a>01304     <span class="keywordflow">if</span>(a.size() != b.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01305"></a>01305     <span class="keyword">typename</span> concurrent_hash_map<Key, T, HashCompare, A1>::const_iterator i(a.begin()), i_end(a.end());
-<a name="l01306"></a>01306     <span class="keyword">typename</span> concurrent_hash_map<Key, T, HashCompare, A2>::const_iterator j, j_end(b.end());
-<a name="l01307"></a>01307     <span class="keywordflow">for</span>(; i != i_end; ++i) {
-<a name="l01308"></a>01308         j = b.equal_range(i->first).first;
-<a name="l01309"></a>01309         <span class="keywordflow">if</span>( j == j_end || !(i->second == j->second) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01310"></a>01310     }
-<a name="l01311"></a>01311     <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01312"></a>01312 }
-<a name="l01313"></a>01313 
-<a name="l01314"></a>01314 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A1, <span class="keyword">typename</span> A2>
-<a name="l01315"></a>01315 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A1> &a, <span class="keyword">const</span> concurrent_hash_map<Key, T, HashCompare, A2> &b)
-<a name="l01316"></a>01316 {    <span class="keywordflow">return</span> !(a == b); }
-<a name="l01317"></a>01317 
-<a name="l01318"></a>01318 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> HashCompare, <span class="keyword">typename</span> A>
-<a name="l01319"></a>01319 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap(concurrent_hash_map<Key, T, HashCompare, A> &a, concurrent_hash_map<Key, T, HashCompare, A> &b)
-<a name="l01320"></a>01320 {    a.swap( b ); }
-<a name="l01321"></a>01321 
-<a name="l01322"></a>01322 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l01323"></a>01323 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning( pop )</span>
-<a name="l01324"></a>01324 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4127 is back</span>
-<a name="l01325"></a>01325 <span class="preprocessor"></span>
-<a name="l01326"></a>01326 } <span class="comment">// namespace tbb</span>
-<a name="l01327"></a>01327 
-<a name="l01328"></a>01328 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_hash_map_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00429.html b/doc/html/a00429.html
new file mode 100644
index 0000000..916715f
--- /dev/null
+++ b/doc/html/a00429.html
@@ -0,0 +1,328 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>concurrent_priority_queue.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="files.html"><span>File List</span></a></li>
+    <li><a href="globals.html"><span>File Members</span></a></li>
+  </ul></div>
+<h1>concurrent_priority_queue.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
+<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment">    writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020 
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_priority_queue_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_priority_queue_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include "tbb_exception.h"</span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00028"></a>00028 <span class="preprocessor">#include "tbb_profiling.h"</span>
+<a name="l00029"></a>00029 <span class="preprocessor">#include "internal/_aggregator_impl.h"</span>
+<a name="l00030"></a>00030 <span class="preprocessor">#include <vector></span>
+<a name="l00031"></a>00031 <span class="preprocessor">#include <iterator></span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include <functional></span>
+<a name="l00033"></a>00033 
+<a name="l00034"></a>00034 <span class="keyword">namespace </span>tbb {
+<a name="l00035"></a>00035 <span class="keyword">namespace </span>interface5 {
+<a name="l00036"></a>00036 
+<a name="l00037"></a>00037 <span class="keyword">using namespace </span>tbb::internal;
+<a name="l00038"></a>00038 
+<a name="l00040"></a>00040 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Compare=std::less<T>, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
+<a name="l00041"></a><a class="code" href="a00247.html">00041</a> <span class="keyword">class </span><a class="code" href="a00247.html">concurrent_priority_queue</a> {
+<a name="l00042"></a>00042  <span class="keyword">public</span>:
+<a name="l00044"></a><a class="code" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">00044</a>     <span class="keyword">typedef</span> T <a class="code" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a>;
+<a name="l00045"></a>00045 
+<a name="l00047"></a><a class="code" href="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">00047</a>     <span class="keyword">typedef</span> T& <a class="code" href="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a>;
+<a name="l00048"></a>00048 
+<a name="l00050"></a><a class="code" href="a00247.html#a4ded8601a434098605be0dcc4febc60">00050</a>     <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00247.html#a4ded8601a434098605be0dcc4febc60">const_reference</a>;
+<a name="l00051"></a>00051 
+<a name="l00053"></a><a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">00053</a>     <span class="keyword">typedef</span> size_t <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a>;
+<a name="l00054"></a>00054 
+<a name="l00056"></a><a class="code" href="a00247.html#77399bc76b3ecd60e33f7e35a5becd87">00056</a>     <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00247.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a>;
+<a name="l00057"></a>00057 
+<a name="l00059"></a><a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">00059</a>     <span class="keyword">typedef</span> A <a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>;
+<a name="l00060"></a>00060 
+<a name="l00062"></a><a class="code" href="a00247.html#eefa40599afe00ea393897d8f5662e65">00062</a>     <span class="keyword">explicit</span> <a class="code" href="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>()) : mark(0), my_size(0), data(a)
+<a name="l00063"></a>00063     {
+<a name="l00064"></a>00064         my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
+<a name="l00065"></a>00065     }
+<a name="l00066"></a>00066 
+<a name="l00068"></a><a class="code" href="a00247.html#4555b4a55415a70024c4004b51e9f385">00068</a>     <span class="keyword">explicit</span> <a class="code" href="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> init_capacity, <span class="keyword">const</span> <a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00 [...]
+<a name="l00069"></a>00069         mark(0), my_size(0), data(a)
+<a name="l00070"></a>00070     {
+<a name="l00071"></a>00071         data.reserve(init_capacity);
+<a name="l00072"></a>00072         my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
+<a name="l00073"></a>00073     }
+<a name="l00074"></a>00074 
+<a name="l00076"></a>00076     <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
+<a name="l00077"></a><a class="code" href="a00247.html#9147cb4207017c260a0c3929c12cd40f">00077</a>     <a class="code" href="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>()) :
+<a name="l00078"></a>00078         data(begin, end, a)
+<a name="l00079"></a>00079     {
+<a name="l00080"></a>00080         mark = 0;
+<a name="l00081"></a>00081         my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
+<a name="l00082"></a>00082         heapify();
+<a name="l00083"></a>00083         my_size = data.size();
+<a name="l00084"></a>00084     }
+<a name="l00085"></a>00085 
+<a name="l00087"></a>00087 
+<a name="l00088"></a><a class="code" href="a00247.html#509419e320f200456d89dc54a65140b3">00088</a>     <span class="keyword">explicit</span> <a class="code" href="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00247.html">concurrent_priority_queue</a>& src) : mark(src.mark),
+<a name="l00089"></a>00089         my_size(src.my_size), data(src.data.begin(), src.data.end(), src.data.<a class="code" href="a00247.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a>())
+<a name="l00090"></a>00090     {
+<a name="l00091"></a>00091         my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
+<a name="l00092"></a>00092         heapify();
+<a name="l00093"></a>00093     }
+<a name="l00094"></a>00094 
+<a name="l00096"></a>00096 
+<a name="l00097"></a><a class="code" href="a00247.html#c8b20e7430c5302936030bef59a562be">00097</a>     <a class="code" href="a00247.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00247.html">concurrent_priority_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a) : mark(src.mark),
+<a name="l00098"></a>00098         my_size(src.my_size), data(src.data.begin(), src.data.end(), a)
+<a name="l00099"></a>00099     {
+<a name="l00100"></a>00100         my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
+<a name="l00101"></a>00101         heapify();
+<a name="l00102"></a>00102     }
+<a name="l00103"></a>00103 
+<a name="l00105"></a>00105 
+<a name="l00106"></a><a class="code" href="a00247.html#2ab7f7808891027ac0f0f5b3a4be51e9">00106</a>     <a class="code" href="a00247.html">concurrent_priority_queue</a>& <a class="code" href="a00247.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a>(<span class="keyword">const</span> <a class="code" href="a00247.html">concurrent_priority_queue</a>& src) {
+<a name="l00107"></a>00107         <span class="keywordflow">if</span> (<span class="keyword">this</span> != &src) {
+<a name="l00108"></a>00108             std::vector<value_type, allocator_type>(src.<a class="code" href="a00247.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.begin(), src.<a class="code" href="a00247.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.end(), src.<a class="code" href="a00247.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.get_allocator()).<a class="code" href="a00247.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(data);
+<a name="l00109"></a>00109             mark = src.<a class="code" href="a00247.html#7fcd8d21ea4228b6079a2f2723550af0">mark</a>;
+<a name="l00110"></a>00110             my_size = src.<a class="code" href="a00247.html#9e480a4ce8950a0729a642cdac2bec41">my_size</a>;
+<a name="l00111"></a>00111         }
+<a name="l00112"></a>00112         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00113"></a>00113     }
+<a name="l00114"></a>00114 
+<a name="l00116"></a>00116 
+<a name="l00118"></a><a class="code" href="a00247.html#317c508fa92df218be5d014c26c09bb7">00118</a>     <span class="keywordtype">bool</span> <a class="code" href="a00247.html#317c508fa92df218be5d014c26c09bb7">empty</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="a00247.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a>()==0; }
+<a name="l00119"></a>00119 
+<a name="l00121"></a>00121 
+<a name="l00123"></a><a class="code" href="a00247.html#8b2ae25c61338c6fd59e94fe09822ba5">00123</a>     <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="code" href="a00247.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> __TBB_load_with_acquire(my_size); }
+<a name="l00124"></a>00124 
+<a name="l00126"></a>00126 
+<a name="l00127"></a><a class="code" href="a00247.html#d905af7b8f6defff562f5ae9c3275763">00127</a>     <span class="keywordtype">void</span> <a class="code" href="a00247.html#d905af7b8f6defff562f5ae9c3275763">push</a>(<a class="code" href="a00247.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> elem) {
+<a name="l00128"></a>00128         cpq_operation op_data(elem, PUSH_OP);
+<a name="l00129"></a>00129         my_aggregator.execute(&op_data);
+<a name="l00130"></a>00130         <span class="keywordflow">if</span> (op_data.status == FAILED) <span class="comment">// exception thrown</span>
+<a name="l00131"></a>00131             throw_exception(eid_bad_alloc);
+<a name="l00132"></a>00132     }
+<a name="l00133"></a>00133 
+<a name="l00135"></a>00135 
+<a name="l00138"></a><a class="code" href="a00247.html#e036461a29cc40902a2bb79abf9f5146">00138</a>     <span class="keywordtype">bool</span> <a class="code" href="a00247.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a>(<a class="code" href="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> elem) {
+<a name="l00139"></a>00139         cpq_operation op_data(POP_OP);
+<a name="l00140"></a>00140         op_data.elem = &elem;
+<a name="l00141"></a>00141         my_aggregator.execute(&op_data);
+<a name="l00142"></a>00142         <span class="keywordflow">return</span> op_data.status==SUCCEEDED;
+<a name="l00143"></a>00143     }
+<a name="l00144"></a>00144 
+<a name="l00146"></a>00146 
+<a name="l00149"></a><a class="code" href="a00247.html#0bdcdf7cde9fd369edca845bec34ca94">00149</a>     <span class="keywordtype">void</span> <a class="code" href="a00247.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a>() {
+<a name="l00150"></a>00150         data.clear();
+<a name="l00151"></a>00151         mark = 0;
+<a name="l00152"></a>00152         my_size = 0;
+<a name="l00153"></a>00153     }
+<a name="l00154"></a>00154 
+<a name="l00156"></a>00156 
+<a name="l00157"></a><a class="code" href="a00247.html#0ecdc6a04aa259374425d424ca2a6082">00157</a>     <span class="keywordtype">void</span> <a class="code" href="a00247.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(<a class="code" href="a00247.html">concurrent_priority_queue</a>& q) {
+<a name="l00158"></a>00158         data.swap(q.<a class="code" href="a00247.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>);
+<a name="l00159"></a>00159         std::swap(mark, q.<a class="code" href="a00247.html#7fcd8d21ea4228b6079a2f2723550af0">mark</a>);
+<a name="l00160"></a>00160         std::swap(my_size, q.<a class="code" href="a00247.html#9e480a4ce8950a0729a642cdac2bec41">my_size</a>);
+<a name="l00161"></a>00161     }
+<a name="l00162"></a>00162 
+<a name="l00164"></a><a class="code" href="a00247.html#d545d444fb0d16148f9b61fd89f9a337">00164</a>     <a class="code" href="a00247.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> <a class="code" href="a00247.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data.get_allocator(); }
+<a name="l00165"></a>00165 
+<a name="l00166"></a>00166  <span class="keyword">private</span>:
+<a name="l00167"></a>00167     <span class="keyword">enum</span> operation_type {INVALID_OP, PUSH_OP, POP_OP};
+<a name="l00168"></a>00168     <span class="keyword">enum</span> operation_status { WAIT=0, SUCCEEDED, FAILED };
+<a name="l00169"></a>00169 
+<a name="l00170"></a>00170     <span class="keyword">class </span>cpq_operation : <span class="keyword">public</span> aggregated_operation<cpq_operation> {
+<a name="l00171"></a>00171      <span class="keyword">public</span>:
+<a name="l00172"></a>00172         operation_type type;
+<a name="l00173"></a>00173         <span class="keyword">union </span>{
+<a name="l00174"></a>00174             <a class="code" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> *elem;
+<a name="l00175"></a>00175             <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> sz;
+<a name="l00176"></a>00176         };
+<a name="l00177"></a>00177         cpq_operation(<a class="code" href="a00247.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> e, operation_type t) :
+<a name="l00178"></a>00178             type(t), elem(const_cast<<a class="code" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a>*>(&e)) {}
+<a name="l00179"></a>00179         cpq_operation(operation_type t) : type(t) {}
+<a name="l00180"></a>00180     };
+<a name="l00181"></a>00181 
+<a name="l00182"></a>00182     <span class="keyword">class </span>my_functor_t {
+<a name="l00183"></a>00183         concurrent_priority_queue<T, Compare, A> *cpq;
+<a name="l00184"></a>00184      <span class="keyword">public</span>:
+<a name="l00185"></a>00185         my_functor_t() {}
+<a name="l00186"></a>00186         my_functor_t(concurrent_priority_queue<T, Compare, A> *cpq_) : cpq(cpq_) {}
+<a name="l00187"></a>00187         <span class="keywordtype">void</span> operator()(cpq_operation* op_list) {
+<a name="l00188"></a>00188             cpq->handle_operations(op_list);
+<a name="l00189"></a>00189         }
+<a name="l00190"></a>00190     };
+<a name="l00191"></a>00191 
+<a name="l00192"></a>00192     aggregator< my_functor_t, cpq_operation> my_aggregator;
+<a name="l00194"></a>00194     <span class="keywordtype">char</span> padding1[NFS_MaxLineSize - <span class="keyword">sizeof</span>(aggregator< my_functor_t, cpq_operation >)];
+<a name="l00196"></a>00196     <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> mark;
+<a name="l00197"></a>00197     __TBB_atomic <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> my_size;
+<a name="l00198"></a>00198     Compare compare;
+<a name="l00200"></a>00200     <span class="keywordtype">char</span> padding2[NFS_MaxLineSize - (2*<span class="keyword">sizeof</span>(<a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a>)) - <span class="keyword">sizeof</span>(Compare)];
+<a name="l00202"></a>00202 
+<a name="l00219"></a>00219     std::vector<value_type, allocator_type> data;
+<a name="l00220"></a>00220 
+<a name="l00221"></a>00221     <span class="keywordtype">void</span> handle_operations(cpq_operation *op_list) {
+<a name="l00222"></a>00222         cpq_operation *tmp, *pop_list=NULL;
+<a name="l00223"></a>00223 
+<a name="l00224"></a>00224         __TBB_ASSERT(mark == data.size(), NULL);
+<a name="l00225"></a>00225 
+<a name="l00226"></a>00226         <span class="comment">// first pass processes all constant time operations: pushes,</span>
+<a name="l00227"></a>00227         <span class="comment">// tops, some pops. Also reserve.</span>
+<a name="l00228"></a>00228         <span class="keywordflow">while</span> (op_list) {
+<a name="l00229"></a>00229             <span class="comment">// ITT note: &(op_list->status) tag is used to cover accesses to op_list</span>
+<a name="l00230"></a>00230             <span class="comment">// node. This thread is going to handle the operation, and so will acquire it</span>
+<a name="l00231"></a>00231             <span class="comment">// and perform the associated operation w/o triggering a race condition; the</span>
+<a name="l00232"></a>00232             <span class="comment">// thread that created the operation is waiting on the status field, so when</span>
+<a name="l00233"></a>00233             <span class="comment">// this thread is done with the operation, it will perform a</span>
+<a name="l00234"></a>00234             <span class="comment">// store_with_release to give control back to the waiting thread in</span>
+<a name="l00235"></a>00235             <span class="comment">// aggregator::insert_operation.</span>
+<a name="l00236"></a>00236             call_itt_notify(acquired, &(op_list->status));
+<a name="l00237"></a>00237             __TBB_ASSERT(op_list->type != INVALID_OP, NULL);
+<a name="l00238"></a>00238             tmp = op_list;
+<a name="l00239"></a>00239             op_list = itt_hide_load_word(op_list->next);
+<a name="l00240"></a>00240             <span class="keywordflow">if</span> (tmp->type == PUSH_OP) {
+<a name="l00241"></a>00241                 __TBB_TRY {
+<a name="l00242"></a>00242                     data.push_back(*(tmp->elem));
+<a name="l00243"></a>00243                     __TBB_store_with_release(my_size, my_size+1);
+<a name="l00244"></a>00244                     itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
+<a name="l00245"></a>00245                 } __TBB_CATCH(...) {
+<a name="l00246"></a>00246                     itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
+<a name="l00247"></a>00247                 }
+<a name="l00248"></a>00248             }
+<a name="l00249"></a>00249             <span class="keywordflow">else</span> { <span class="comment">// tmp->type == POP_OP</span>
+<a name="l00250"></a>00250                 __TBB_ASSERT(tmp->type == POP_OP, NULL);
+<a name="l00251"></a>00251                 <span class="keywordflow">if</span> (mark < data.size() &&
+<a name="l00252"></a>00252                     compare(data[0], data[data.size()-1])) {
+<a name="l00253"></a>00253                     <span class="comment">// there are newly pushed elems and the last one</span>
+<a name="l00254"></a>00254                     <span class="comment">// is higher than top</span>
+<a name="l00255"></a>00255                     *(tmp->elem) = data[data.size()-1]; <span class="comment">// copy the data</span>
+<a name="l00256"></a>00256                     __TBB_store_with_release(my_size, my_size-1);
+<a name="l00257"></a>00257                     itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
+<a name="l00258"></a>00258                     data.pop_back();
+<a name="l00259"></a>00259                     __TBB_ASSERT(mark<=data.size(), NULL);
+<a name="l00260"></a>00260                 }
+<a name="l00261"></a>00261                 <span class="keywordflow">else</span> { <span class="comment">// no convenient item to pop; postpone</span>
+<a name="l00262"></a>00262                     itt_hide_store_word(tmp->next, pop_list);
+<a name="l00263"></a>00263                     pop_list = tmp;
+<a name="l00264"></a>00264                 }
+<a name="l00265"></a>00265             }
+<a name="l00266"></a>00266         }
+<a name="l00267"></a>00267 
+<a name="l00268"></a>00268         <span class="comment">// second pass processes pop operations</span>
+<a name="l00269"></a>00269         <span class="keywordflow">while</span> (pop_list) {
+<a name="l00270"></a>00270             tmp = pop_list;
+<a name="l00271"></a>00271             pop_list = itt_hide_load_word(pop_list->next);
+<a name="l00272"></a>00272             __TBB_ASSERT(tmp->type == POP_OP, NULL);
+<a name="l00273"></a>00273             <span class="keywordflow">if</span> (data.empty()) {
+<a name="l00274"></a>00274                 itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
+<a name="l00275"></a>00275             }
+<a name="l00276"></a>00276             <span class="keywordflow">else</span> {
+<a name="l00277"></a>00277                 __TBB_ASSERT(mark<=data.size(), NULL);
+<a name="l00278"></a>00278                 <span class="keywordflow">if</span> (mark < data.size() &&
+<a name="l00279"></a>00279                     compare(data[0], data[data.size()-1])) {
+<a name="l00280"></a>00280                     <span class="comment">// there are newly pushed elems and the last one is</span>
+<a name="l00281"></a>00281                     <span class="comment">// higher than top</span>
+<a name="l00282"></a>00282                     *(tmp->elem) = data[data.size()-1]; <span class="comment">// copy the data</span>
+<a name="l00283"></a>00283                     __TBB_store_with_release(my_size, my_size-1);
+<a name="l00284"></a>00284                     itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
+<a name="l00285"></a>00285                     data.pop_back();
+<a name="l00286"></a>00286                 }
+<a name="l00287"></a>00287                 <span class="keywordflow">else</span> { <span class="comment">// extract top and push last element down heap</span>
+<a name="l00288"></a>00288                     *(tmp->elem) = data[0]; <span class="comment">// copy the data</span>
+<a name="l00289"></a>00289                     __TBB_store_with_release(my_size, my_size-1);
+<a name="l00290"></a>00290                     itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
+<a name="l00291"></a>00291                     reheap();
+<a name="l00292"></a>00292                 }
+<a name="l00293"></a>00293             }
+<a name="l00294"></a>00294         }
+<a name="l00295"></a>00295 
+<a name="l00296"></a>00296         <span class="comment">// heapify any leftover pushed elements before doing the next</span>
+<a name="l00297"></a>00297         <span class="comment">// batch of operations</span>
+<a name="l00298"></a>00298         <span class="keywordflow">if</span> (mark<data.size()) heapify();
+<a name="l00299"></a>00299         __TBB_ASSERT(mark == data.size(), NULL);
+<a name="l00300"></a>00300     }
+<a name="l00301"></a>00301 
+<a name="l00303"></a>00303     <span class="keywordtype">void</span> heapify() {
+<a name="l00304"></a>00304         <span class="keywordflow">if</span> (!mark && data.size()>0) mark = 1;
+<a name="l00305"></a>00305         <span class="keywordflow">for</span> (; mark<data.size(); ++mark) {
+<a name="l00306"></a>00306             <span class="comment">// for each unheapified element under size</span>
+<a name="l00307"></a>00307             <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> cur_pos = mark;
+<a name="l00308"></a>00308             <a class="code" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> to_place = data[mark];
+<a name="l00309"></a>00309             <span class="keywordflow">do</span> { <span class="comment">// push to_place up the heap</span>
+<a name="l00310"></a>00310                 <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> parent = (cur_pos-1)>>1;
+<a name="l00311"></a>00311                 <span class="keywordflow">if</span> (!compare(data[parent], to_place)) <span class="keywordflow">break</span>;
+<a name="l00312"></a>00312                 data[cur_pos] = data[parent];
+<a name="l00313"></a>00313                 cur_pos = parent;
+<a name="l00314"></a>00314             } <span class="keywordflow">while</span>( cur_pos );
+<a name="l00315"></a>00315             data[cur_pos] = to_place;
+<a name="l00316"></a>00316         }
+<a name="l00317"></a>00317     }
+<a name="l00318"></a>00318 
+<a name="l00320"></a>00320 
+<a name="l00321"></a>00321     <span class="keywordtype">void</span> reheap() {
+<a name="l00322"></a>00322         <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> cur_pos=0, child=1;
+<a name="l00323"></a>00323 
+<a name="l00324"></a>00324         <span class="keywordflow">while</span> (child < mark) {
+<a name="l00325"></a>00325             <a class="code" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> target = child;
+<a name="l00326"></a>00326             <span class="keywordflow">if</span> (child+1 < mark && compare(data[child], data[child+1]))
+<a name="l00327"></a>00327                 ++target;
+<a name="l00328"></a>00328             <span class="comment">// target now has the higher priority child</span>
+<a name="l00329"></a>00329             <span class="keywordflow">if</span> (compare(data[target], data[data.size()-1])) <span class="keywordflow">break</span>;
+<a name="l00330"></a>00330             data[cur_pos] = data[target];
+<a name="l00331"></a>00331             cur_pos = target;
+<a name="l00332"></a>00332             child = (cur_pos<<1)+1;
+<a name="l00333"></a>00333         }
+<a name="l00334"></a>00334         data[cur_pos] = data[data.size()-1];
+<a name="l00335"></a>00335         data.pop_back();
+<a name="l00336"></a>00336         <span class="keywordflow">if</span> (mark > data.size()) mark = data.size();
+<a name="l00337"></a>00337     }
+<a name="l00338"></a>00338 };
+<a name="l00339"></a>00339 
+<a name="l00340"></a>00340 } <span class="comment">// namespace interface5</span>
+<a name="l00341"></a>00341 
+<a name="l00342"></a>00342 <span class="keyword">using</span> interface5::concurrent_priority_queue;
+<a name="l00343"></a>00343 
+<a name="l00344"></a>00344 } <span class="comment">// namespace tbb</span>
+<a name="l00345"></a>00345 
+<a name="l00346"></a>00346 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_priority_queue_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00436.html b/doc/html/a00432.html
similarity index 76%
copy from doc/html/a00436.html
copy to doc/html/a00432.html
index 1c366bc..63aa4a7 100644
--- a/doc/html/a00436.html
+++ b/doc/html/a00432.html
@@ -42,7 +42,7 @@
 <a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_queue_H</span>
 <a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_queue_H</span>
 <a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "_concurrent_queue_internal.h"</span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "internal/_concurrent_queue_impl.h"</span>
 <a name="l00025"></a>00025 
 <a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
 <a name="l00027"></a>00027 
@@ -50,13 +50,13 @@
 <a name="l00029"></a>00029 
 <a name="l00031"></a>00031 
 <a name="l00034"></a>00034 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A = cache_aligned_allocator<T> > 
-<a name="l00035"></a><a class="code" href="a00236.html">00035</a> <span class="keyword">class </span><a class="code" href="a00236.html">concurrent_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3<T> {
+<a name="l00035"></a><a class="code" href="a00248.html">00035</a> <span class="keyword">class </span><a class="code" href="a00248.html">concurrent_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3<T> {
 <a name="l00036"></a>00036     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
 <a name="l00037"></a>00037 
 <a name="l00039"></a>00039     <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template rebind<char>::other page_allocator_type;
 <a name="l00040"></a>00040     page_allocator_type my_allocator;
 <a name="l00041"></a>00041 
-<a name="l00043"></a>00043     <span class="comment">/*overide*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> *allocate_block( size_t n ) {
+<a name="l00043"></a>00043     <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> *allocate_block( size_t n ) {
 <a name="l00044"></a>00044         <span class="keywordtype">void</span> *b = reinterpret_cast<void*>(my_allocator.allocate( n ));
 <a name="l00045"></a>00045         <span class="keywordflow">if</span>( !b )
 <a name="l00046"></a>00046             internal::throw_exception(internal::eid_bad_alloc); 
@@ -68,55 +68,55 @@
 <a name="l00053"></a>00053     }
 <a name="l00054"></a>00054 
 <a name="l00055"></a>00055 <span class="keyword">public</span>:
-<a name="l00057"></a><a class="code" href="a00236.html#682c3978d5cb0620000994f11c44a476">00057</a>     <span class="keyword">typedef</span> T <a class="code" href="a00236.html#682c3978d5cb0620000994f11c44a476">value_type</a>;
+<a name="l00057"></a><a class="code" href="a00248.html#682c3978d5cb0620000994f11c44a476">00057</a>     <span class="keyword">typedef</span> T <a class="code" href="a00248.html#682c3978d5cb0620000994f11c44a476">value_type</a>;
 <a name="l00058"></a>00058 
-<a name="l00060"></a><a class="code" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">00060</a>     <span class="keyword">typedef</span> T& <a class="code" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a>;
+<a name="l00060"></a><a class="code" href="a00248.html#a8d725c50a9834bb7af5b67c0aff92b8">00060</a>     <span class="keyword">typedef</span> T& <a class="code" href="a00248.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a>;
 <a name="l00061"></a>00061 
-<a name="l00063"></a><a class="code" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">00063</a>     <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a>;
+<a name="l00063"></a><a class="code" href="a00248.html#4d48e7ff93f81636bca2c74f7da34750">00063</a>     <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00248.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a>;
 <a name="l00064"></a>00064 
-<a name="l00066"></a><a class="code" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">00066</a>     <span class="keyword">typedef</span> size_t <a class="code" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a>;
+<a name="l00066"></a><a class="code" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">00066</a>     <span class="keyword">typedef</span> size_t <a class="code" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a>;
 <a name="l00067"></a>00067 
-<a name="l00069"></a><a class="code" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">00069</a>     <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a>;
+<a name="l00069"></a><a class="code" href="a00248.html#068576d16c7e4e05d52f9db7a45b5b65">00069</a>     <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00248.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a>;
 <a name="l00070"></a>00070 
-<a name="l00072"></a><a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">00072</a>     <span class="keyword">typedef</span> A <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>;
+<a name="l00072"></a><a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">00072</a>     <span class="keyword">typedef</span> A <a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a>;
 <a name="l00073"></a>00073 
-<a name="l00075"></a><a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">00075</a>     <span class="keyword">explicit</span> <a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(<span class="keyword">const</span> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) : 
+<a name="l00075"></a><a class="code" href="a00248.html#7c48a05a94a1f4f98fdfadfbef98ecf6">00075</a>     <span class="keyword">explicit</span> <a class="code" href="a00248.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(<span class="keyword">const</span> <a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) : 
 <a name="l00076"></a>00076         my_allocator( a )
 <a name="l00077"></a>00077     {
 <a name="l00078"></a>00078     }
 <a name="l00079"></a>00079 
 <a name="l00081"></a>00081     <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00082"></a><a class="code" href="a00236.html#25209656c84f2f9b030e2f9162713341">00082</a>     <a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
+<a name="l00082"></a><a class="code" href="a00248.html#25209656c84f2f9b030e2f9162713341">00082</a>     <a class="code" href="a00248.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
 <a name="l00083"></a>00083         my_allocator( a )
 <a name="l00084"></a>00084     {
 <a name="l00085"></a>00085         <span class="keywordflow">for</span>( ; begin != end; ++begin )
 <a name="l00086"></a>00086             this->internal_push(&*begin);
 <a name="l00087"></a>00087     }
 <a name="l00088"></a>00088     
-<a name="l00090"></a><a class="code" href="a00236.html#8a6b98ea11a867db8ac868f0113ca429">00090</a>     <a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00236.html">concurrent_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac" [...]
+<a name="l00090"></a><a class="code" href="a00248.html#8a6b98ea11a867db8ac868f0113ca429">00090</a>     <a class="code" href="a00248.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00248.html">concurrent_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac" [...]
 <a name="l00091"></a>00091         internal::concurrent_queue_base_v3<T>(), my_allocator( a )
 <a name="l00092"></a>00092     {
 <a name="l00093"></a>00093         this->assign( src );
 <a name="l00094"></a>00094     }
 <a name="l00095"></a>00095     
-<a name="l00097"></a>00097     <a class="code" href="a00236.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>();
+<a name="l00097"></a>00097     <a class="code" href="a00248.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>();
 <a name="l00098"></a>00098 
-<a name="l00100"></a><a class="code" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">00100</a>     <span class="keywordtype">void</span> <a class="code" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00100"></a><a class="code" href="a00248.html#73c47563ffcc4c2f6452f25a04ebe2e2">00100</a>     <span class="keywordtype">void</span> <a class="code" href="a00248.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>( <span class="keyword">const</span> T& source ) {
 <a name="l00101"></a>00101         this->internal_push( &source );
 <a name="l00102"></a>00102     }
 <a name="l00103"></a>00103 
 <a name="l00105"></a>00105 
-<a name="l00107"></a><a class="code" href="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">00107</a>     <span class="keywordtype">bool</span> <a class="code" href="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>( T& result ) {
+<a name="l00107"></a><a class="code" href="a00248.html#ae31ca0db34ef96ef1e74aa0d28c95f8">00107</a>     <span class="keywordtype">bool</span> <a class="code" href="a00248.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>( T& result ) {
 <a name="l00108"></a>00108         <span class="keywordflow">return</span> this->internal_try_pop( &result );
 <a name="l00109"></a>00109     }
 <a name="l00110"></a>00110 
-<a name="l00112"></a><a class="code" href="a00236.html#eaa35a5274606779802e9a669a706260">00112</a>     <a class="code" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> <a class="code" href="a00236.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_size();}
+<a name="l00112"></a><a class="code" href="a00248.html#eaa35a5274606779802e9a669a706260">00112</a>     <a class="code" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> <a class="code" href="a00248.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_size();}
 <a name="l00113"></a>00113 
-<a name="l00115"></a><a class="code" href="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">00115</a>     <span class="keywordtype">bool</span> <a class="code" href="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_empty();}
+<a name="l00115"></a><a class="code" href="a00248.html#f3f6fce0cfa2d581d6f3b47e0613ad64">00115</a>     <span class="keywordtype">bool</span> <a class="code" href="a00248.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_empty();}
 <a name="l00116"></a>00116 
-<a name="l00118"></a>00118     <span class="keywordtype">void</span> <a class="code" href="a00236.html#c32e8e84c0524155133b4aae32d2a827">clear</a>() ;
+<a name="l00118"></a>00118     <span class="keywordtype">void</span> <a class="code" href="a00248.html#c32e8e84c0524155133b4aae32d2a827">clear</a>() ;
 <a name="l00119"></a>00119 
-<a name="l00121"></a><a class="code" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">00121</a>     <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> <a class="code" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
+<a name="l00121"></a><a class="code" href="a00248.html#f034f70caef445fe8abc9113ec926a8d">00121</a>     <a class="code" href="a00248.html#5a3956341728eaa558d8827063718cac">allocator_type</a> <a class="code" href="a00248.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
 <a name="l00122"></a>00122 
 <a name="l00123"></a>00123     <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_queue,T> iterator;
 <a name="l00124"></a>00124     <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_queue,const T> const_iterator;
@@ -131,14 +131,14 @@
 <a name="l00133"></a>00133 } ;
 <a name="l00134"></a>00134 
 <a name="l00135"></a>00135 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00136"></a><a class="code" href="a00236.html#830b33753d6b149c366344e29b2edd8c">00136</a> <a class="code" href="a00236.html">concurrent_queue<T,A>::~concurrent_queue</a>() {
-<a name="l00137"></a>00137     <a class="code" href="a00236.html#c32e8e84c0524155133b4aae32d2a827">clear</a>();
+<a name="l00136"></a><a class="code" href="a00248.html#830b33753d6b149c366344e29b2edd8c">00136</a> <a class="code" href="a00248.html">concurrent_queue<T,A>::~concurrent_queue</a>() {
+<a name="l00137"></a>00137     <a class="code" href="a00248.html#c32e8e84c0524155133b4aae32d2a827">clear</a>();
 <a name="l00138"></a>00138     this->internal_finish_clear();
 <a name="l00139"></a>00139 }
 <a name="l00140"></a>00140 
 <a name="l00141"></a>00141 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00142"></a><a class="code" href="a00236.html#c32e8e84c0524155133b4aae32d2a827">00142</a> <span class="keywordtype">void</span> <a class="code" href="a00236.html">concurrent_queue<T,A>::clear</a>() {
-<a name="l00143"></a>00143     <span class="keywordflow">while</span>( !<a class="code" href="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() ) {
+<a name="l00142"></a><a class="code" href="a00248.html#c32e8e84c0524155133b4aae32d2a827">00142</a> <span class="keywordtype">void</span> <a class="code" href="a00248.html">concurrent_queue<T,A>::clear</a>() {
+<a name="l00143"></a>00143     <span class="keywordflow">while</span>( !<a class="code" href="a00248.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() ) {
 <a name="l00144"></a>00144         T value;
 <a name="l00145"></a>00145         this->internal_try_pop(&value);
 <a name="l00146"></a>00146     }
@@ -148,7 +148,7 @@
 <a name="l00150"></a>00150     
 <a name="l00152"></a>00152 
 <a name="l00157"></a>00157 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
-<a name="l00158"></a><a class="code" href="a00230.html">00158</a> <span class="keyword">class </span><a class="code" href="a00230.html">concurrent_bounded_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3 {
+<a name="l00158"></a><a class="code" href="a00242.html">00158</a> <span class="keyword">class </span><a class="code" href="a00242.html">concurrent_bounded_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3 {
 <a name="l00159"></a>00159     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
 <a name="l00160"></a>00160 
 <a name="l00162"></a>00162     <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template rebind<char>::other page_allocator_type;
@@ -182,7 +182,7 @@
 <a name="l00191"></a>00191         *static_cast<T*>(dst) = from;
 <a name="l00192"></a>00192     }
 <a name="l00193"></a>00193 
-<a name="l00194"></a>00194     <span class="comment">/*overide*/</span> <span class="keyword">virtual</span> page *allocate_page() {
+<a name="l00194"></a>00194     <span class="comment">/*override*/</span> <span class="keyword">virtual</span> page *allocate_page() {
 <a name="l00195"></a>00195         size_t n = <span class="keyword">sizeof</span>(padded_page) + (items_per_page-1)*<span class="keyword">sizeof</span>(T);
 <a name="l00196"></a>00196         page *p = reinterpret_cast<page*>(my_allocator.allocate( n ));
 <a name="l00197"></a>00197         <span class="keywordflow">if</span>( !p )
@@ -191,81 +191,81 @@
 <a name="l00200"></a>00200     }
 <a name="l00201"></a>00201 
 <a name="l00202"></a>00202     <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( page *p ) {
-<a name="l00203"></a>00203         size_t n = <span class="keyword">sizeof</span>(padded_page) + items_per_page*<span class="keyword">sizeof</span>(T);
+<a name="l00203"></a>00203         size_t n = <span class="keyword">sizeof</span>(padded_page) + (items_per_page-1)*<span class="keyword">sizeof</span>(T);
 <a name="l00204"></a>00204         my_allocator.deallocate( reinterpret_cast<char*>(p), n );
 <a name="l00205"></a>00205     }
 <a name="l00206"></a>00206 
 <a name="l00207"></a>00207 <span class="keyword">public</span>:
-<a name="l00209"></a><a class="code" href="a00230.html#98245517a931e5893f6601e66c51fc75">00209</a>     <span class="keyword">typedef</span> T <a class="code" href="a00230.html#98245517a931e5893f6601e66c51fc75">value_type</a>;
+<a name="l00209"></a><a class="code" href="a00242.html#98245517a931e5893f6601e66c51fc75">00209</a>     <span class="keyword">typedef</span> T <a class="code" href="a00242.html#98245517a931e5893f6601e66c51fc75">value_type</a>;
 <a name="l00210"></a>00210 
-<a name="l00212"></a><a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">00212</a>     <span class="keyword">typedef</span> A <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>;
+<a name="l00212"></a><a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">00212</a>     <span class="keyword">typedef</span> A <a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>;
 <a name="l00213"></a>00213 
-<a name="l00215"></a><a class="code" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">00215</a>     <span class="keyword">typedef</span> T& <a class="code" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a>;
+<a name="l00215"></a><a class="code" href="a00242.html#dcd44ca6a88c0dc7a847a47a10811f0c">00215</a>     <span class="keyword">typedef</span> T& <a class="code" href="a00242.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a>;
 <a name="l00216"></a>00216 
-<a name="l00218"></a><a class="code" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">00218</a>     <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a>;
+<a name="l00218"></a><a class="code" href="a00242.html#796713d0b9ba93a4721cbe13e4474068">00218</a>     <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00242.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a>;
 <a name="l00219"></a>00219 
 <a name="l00221"></a>00221 
-<a name="l00223"></a><a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">00223</a>     <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>;
+<a name="l00223"></a><a class="code" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">00223</a>     <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>;
 <a name="l00224"></a>00224 
-<a name="l00226"></a><a class="code" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">00226</a>     <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a>;
+<a name="l00226"></a><a class="code" href="a00242.html#4b45c91297e69515d83d5eef85ae1f49">00226</a>     <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00242.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a>;
 <a name="l00227"></a>00227 
-<a name="l00229"></a><a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">00229</a>     <span class="keyword">explicit</span> <a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(<span class="keyword">const</span> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) : 
+<a name="l00229"></a><a class="code" href="a00242.html#e3525226732963ff0f13e89d8e6dab5b">00229</a>     <span class="keyword">explicit</span> <a class="code" href="a00242.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(<span class="keyword">const</span> <a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) : 
 <a name="l00230"></a>00230         concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
 <a name="l00231"></a>00231     {
 <a name="l00232"></a>00232     }
 <a name="l00233"></a>00233 
-<a name="l00235"></a><a class="code" href="a00230.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">00235</a>     <a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( <span class="keyword">const</span> <a class="code" href="a00230.html">concurrent_bounded_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00230.html#2e2726fccf6d975dc [...]
+<a name="l00235"></a><a class="code" href="a00242.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">00235</a>     <a class="code" href="a00242.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( <span class="keyword">const</span> <a class="code" href="a00242.html">concurrent_bounded_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00242.html#2e2726fccf6d975dc [...]
 <a name="l00236"></a>00236         concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
 <a name="l00237"></a>00237     {
 <a name="l00238"></a>00238         assign( src );
 <a name="l00239"></a>00239     }
 <a name="l00240"></a>00240 
 <a name="l00242"></a>00242     <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00243"></a><a class="code" href="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">00243</a>     <a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
+<a name="l00243"></a><a class="code" href="a00242.html#a5e04dcd7db9fd9b583b4e7df832246a">00243</a>     <a class="code" href="a00242.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
 <a name="l00244"></a>00244         concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
 <a name="l00245"></a>00245     {
 <a name="l00246"></a>00246         <span class="keywordflow">for</span>( ; begin != end; ++begin )
 <a name="l00247"></a>00247             internal_push_if_not_full(&*begin);
 <a name="l00248"></a>00248     }
 <a name="l00249"></a>00249 
-<a name="l00251"></a>00251     <a class="code" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>();
+<a name="l00251"></a>00251     <a class="code" href="a00242.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>();
 <a name="l00252"></a>00252 
-<a name="l00254"></a><a class="code" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">00254</a>     <span class="keywordtype">void</span> <a class="code" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">push</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00254"></a><a class="code" href="a00242.html#ceb08c743b11ba88c878e73fff8af20b">00254</a>     <span class="keywordtype">void</span> <a class="code" href="a00242.html#ceb08c743b11ba88c878e73fff8af20b">push</a>( <span class="keyword">const</span> T& source ) {
 <a name="l00255"></a>00255         internal_push( &source );
 <a name="l00256"></a>00256     }
 <a name="l00257"></a>00257 
 <a name="l00259"></a>00259 
-<a name="l00260"></a><a class="code" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">00260</a>     <span class="keywordtype">void</span> <a class="code" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>( T& destination ) {
+<a name="l00260"></a><a class="code" href="a00242.html#41f4c6bd7a82ab070e840bbf81b0b123">00260</a>     <span class="keywordtype">void</span> <a class="code" href="a00242.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>( T& destination ) {
 <a name="l00261"></a>00261         internal_pop( &destination );
 <a name="l00262"></a>00262     }
 <a name="l00263"></a>00263 
 <a name="l00265"></a>00265 
-<a name="l00267"></a><a class="code" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">00267</a>     <span class="keywordtype">bool</span> <a class="code" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00267"></a><a class="code" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">00267</a>     <span class="keywordtype">bool</span> <a class="code" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( <span class="keyword">const</span> T& source ) {
 <a name="l00268"></a>00268         <span class="keywordflow">return</span> internal_push_if_not_full( &source );
 <a name="l00269"></a>00269     }
 <a name="l00270"></a>00270 
 <a name="l00272"></a>00272 
-<a name="l00274"></a><a class="code" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">00274</a>     <span class="keywordtype">bool</span> <a class="code" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( T& destination ) {
+<a name="l00274"></a><a class="code" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">00274</a>     <span class="keywordtype">bool</span> <a class="code" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( T& destination ) {
 <a name="l00275"></a>00275         <span class="keywordflow">return</span> internal_pop_if_present( &destination );
 <a name="l00276"></a>00276     }
 <a name="l00277"></a>00277 
 <a name="l00279"></a>00279 
-<a name="l00282"></a><a class="code" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">00282</a>     <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_size();}
+<a name="l00282"></a><a class="code" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">00282</a>     <a class="code" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_size();}
 <a name="l00283"></a>00283 
-<a name="l00285"></a><a class="code" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">00285</a>     <span class="keywordtype">bool</span> <a class="code" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_empty();}
+<a name="l00285"></a><a class="code" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">00285</a>     <span class="keywordtype">bool</span> <a class="code" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_empty();}
 <a name="l00286"></a>00286 
-<a name="l00288"></a><a class="code" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">00288</a>     <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>()<span class="keyword"> const </span>{
+<a name="l00288"></a><a class="code" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">00288</a>     <a class="code" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>()<span class="keyword"> const </span>{
 <a name="l00289"></a>00289         <span class="keywordflow">return</span> my_capacity;
 <a name="l00290"></a>00290     }
 <a name="l00291"></a>00291 
 <a name="l00293"></a>00293 
-<a name="l00295"></a><a class="code" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">00295</a>     <span class="keywordtype">void</span> <a class="code" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>( <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity ) {
+<a name="l00295"></a><a class="code" href="a00242.html#f3c6c934f85fd02aedbc83a16943193b">00295</a>     <span class="keywordtype">void</span> <a class="code" href="a00242.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>( <a class="code" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity ) {
 <a name="l00296"></a>00296         internal_set_capacity( new_capacity, <span class="keyword">sizeof</span>(T) );
 <a name="l00297"></a>00297     }
 <a name="l00298"></a>00298 
-<a name="l00300"></a><a class="code" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">00300</a>     <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> <a class="code" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
+<a name="l00300"></a><a class="code" href="a00242.html#415eb87e53b1c6a266de06ecbc490d16">00300</a>     <a class="code" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> <a class="code" href="a00242.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
 <a name="l00301"></a>00301 
-<a name="l00303"></a>00303     <span class="keywordtype">void</span> <a class="code" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>() ;
+<a name="l00303"></a>00303     <span class="keywordtype">void</span> <a class="code" href="a00242.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>() ;
 <a name="l00304"></a>00304 
 <a name="l00305"></a>00305     <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,T> iterator;
 <a name="l00306"></a>00306     <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,const T> const_iterator;
@@ -281,14 +281,14 @@
 <a name="l00316"></a>00316 }; 
 <a name="l00317"></a>00317 
 <a name="l00318"></a>00318 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00319"></a><a class="code" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">00319</a> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::~concurrent_bounded_queue</a>() {
-<a name="l00320"></a>00320     <a class="code" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>();
+<a name="l00319"></a><a class="code" href="a00242.html#acaf5b510dc0dfc7780b8c956cf773cf">00319</a> <a class="code" href="a00242.html">concurrent_bounded_queue<T,A>::~concurrent_bounded_queue</a>() {
+<a name="l00320"></a>00320     <a class="code" href="a00242.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>();
 <a name="l00321"></a>00321     internal_finish_clear();
 <a name="l00322"></a>00322 }
 <a name="l00323"></a>00323 
 <a name="l00324"></a>00324 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00325"></a><a class="code" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">00325</a> <span class="keywordtype">void</span> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::clear</a>() {
-<a name="l00326"></a>00326     <span class="keywordflow">while</span>( !<a class="code" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() ) {
+<a name="l00325"></a><a class="code" href="a00242.html#90b31e2954c6e4596c7900435a5f4bc1">00325</a> <span class="keywordtype">void</span> <a class="code" href="a00242.html">concurrent_bounded_queue<T,A>::clear</a>() {
+<a name="l00326"></a>00326     <span class="keywordflow">while</span>( !<a class="code" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() ) {
 <a name="l00327"></a>00327         T value;
 <a name="l00328"></a>00328         internal_pop_if_present(&value);
 <a name="l00329"></a>00329     }
@@ -298,40 +298,40 @@
 <a name="l00333"></a>00333 
 <a name="l00335"></a>00335 
 <a name="l00340"></a>00340 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> > 
-<a name="l00341"></a><a class="code" href="a00237.html">00341</a> <span class="keyword">class </span><a class="code" href="a00237.html">concurrent_queue</a>: <span class="keyword">public</span> <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A> {
+<a name="l00341"></a><a class="code" href="a00249.html">00341</a> <span class="keyword">class </span><a class="code" href="a00249.html">concurrent_queue</a>: <span class="keyword">public</span> <a class="code" href="a00242.html">concurrent_bounded_queue</a><T,A> {
 <a name="l00342"></a>00342 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
 <a name="l00343"></a>00343 <span class="preprocessor"></span>    <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
 <a name="l00344"></a>00344 <span class="preprocessor">#endif </span>
 <a name="l00345"></a>00345 <span class="preprocessor"></span>
 <a name="l00346"></a>00346 <span class="keyword">public</span>:
-<a name="l00348"></a><a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">00348</a>     <span class="keyword">explicit</span> <a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(<span class="keyword">const</span> A& a = A()) : 
-<a name="l00349"></a>00349         <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A>( a )
+<a name="l00348"></a><a class="code" href="a00249.html#aaf19bd7337b72f3131ece60f7315ef7">00348</a>     <span class="keyword">explicit</span> <a class="code" href="a00249.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(<span class="keyword">const</span> A& a = A()) : 
+<a name="l00349"></a>00349         <a class="code" href="a00242.html">concurrent_bounded_queue</a><T,A>( a )
 <a name="l00350"></a>00350     {
 <a name="l00351"></a>00351     }
 <a name="l00352"></a>00352 
-<a name="l00354"></a><a class="code" href="a00237.html#fc092b9082f233482f3513fc3bb670f7">00354</a>     <a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00237.html">concurrent_queue</a>& src, <span class="keyword">const</span> A& a = A()) : 
-<a name="l00355"></a>00355         <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A>( src, a )
+<a name="l00354"></a><a class="code" href="a00249.html#fc092b9082f233482f3513fc3bb670f7">00354</a>     <a class="code" href="a00249.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00249.html">concurrent_queue</a>& src, <span class="keyword">const</span> A& a = A()) : 
+<a name="l00355"></a>00355         <a class="code" href="a00242.html">concurrent_bounded_queue</a><T,A>( src, a )
 <a name="l00356"></a>00356     {
 <a name="l00357"></a>00357     }
 <a name="l00358"></a>00358 
 <a name="l00360"></a>00360     <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00361"></a><a class="code" href="a00237.html#9102b897776bd2d9e908e6604ff16b5f">00361</a>     <a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( InputIterator b <span class="comment">/*begin*/</span>, InputIterator e <span class="comment">/*end*/</span>, <span class="keyword">const</span> A& a = A()) :
-<a name="l00362"></a>00362         <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A>( b, e, a )
+<a name="l00361"></a><a class="code" href="a00249.html#9102b897776bd2d9e908e6604ff16b5f">00361</a>     <a class="code" href="a00249.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( InputIterator b <span class="comment">/*begin*/</span>, InputIterator e <span class="comment">/*end*/</span>, <span class="keyword">const</span> A& a = A()) :
+<a name="l00362"></a>00362         <a class="code" href="a00242.html">concurrent_bounded_queue</a><T,A>( b, e, a )
 <a name="l00363"></a>00363     {
 <a name="l00364"></a>00364     }
 <a name="l00365"></a>00365 
 <a name="l00367"></a>00367 
-<a name="l00369"></a><a class="code" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">00369</a>     <span class="keywordtype">bool</span> <a class="code" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00370"></a>00370         <span class="keywordflow">return</span> this-><a class="code" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( source );
+<a name="l00369"></a><a class="code" href="a00249.html#7c45561bafe71107d09b2bc1b8f4e681">00369</a>     <span class="keywordtype">bool</span> <a class="code" href="a00249.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>( <span class="keyword">const</span> T& source ) {
+<a name="l00370"></a>00370         <span class="keywordflow">return</span> this-><a class="code" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( source );
 <a name="l00371"></a>00371     }
 <a name="l00372"></a>00372 
 <a name="l00374"></a>00374 
-<a name="l00378"></a><a class="code" href="a00237.html#48da3536245318af6cb5fd58bac78039">00378</a>     <span class="keywordtype">bool</span> <a class="code" href="a00237.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>( T& destination ) {
-<a name="l00379"></a>00379         <span class="keywordflow">return</span> this-><a class="code" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( destination );
+<a name="l00378"></a><a class="code" href="a00249.html#48da3536245318af6cb5fd58bac78039">00378</a>     <span class="keywordtype">bool</span> <a class="code" href="a00249.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>( T& destination ) {
+<a name="l00379"></a>00379         <span class="keywordflow">return</span> this-><a class="code" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( destination );
 <a name="l00380"></a>00380     }
 <a name="l00381"></a>00381 
-<a name="l00382"></a>00382     <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::iterator</a> iterator;
-<a name="l00383"></a>00383     <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::const_iterator</a> const_iterator;
+<a name="l00382"></a>00382     <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00242.html">concurrent_bounded_queue<T,A>::iterator</a> iterator;
+<a name="l00383"></a>00383     <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00242.html">concurrent_bounded_queue<T,A>::const_iterator</a> const_iterator;
 <a name="l00384"></a>00384     <span class="comment">//</span>
 <a name="l00385"></a>00385     <span class="comment">//------------------------------------------------------------------------</span>
 <a name="l00386"></a>00386     <span class="comment">// The iterators are intended only for debugging.  They are slow and not thread safe.</span>
diff --git a/doc/html/a00433.html b/doc/html/a00433.html
deleted file mode 100644
index fb6f085..0000000
--- a/doc/html/a00433.html
+++ /dev/null
@@ -1,337 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_priority_queue.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>concurrent_priority_queue.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_priority_queue_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_priority_queue_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if !TBB_PREVIEW_CONCURRENT_PRIORITY_QUEUE</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#error Set TBB_PREVIEW_CONCURRENT_PRIORITY_QUEUE to include concurrent_priority_queue.h</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include "_aggregator_internal.h"</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#include <vector></span>
-<a name="l00035"></a>00035 <span class="preprocessor">#include <iterator></span>
-<a name="l00036"></a>00036 <span class="preprocessor">#include <functional></span>
-<a name="l00037"></a>00037 
-<a name="l00038"></a>00038 <span class="keyword">namespace </span>tbb {
-<a name="l00039"></a>00039 <span class="keyword">namespace </span>interface5 {
-<a name="l00040"></a>00040 
-<a name="l00041"></a>00041 <span class="keyword">using namespace </span>tbb::internal;
-<a name="l00042"></a>00042 
-<a name="l00044"></a>00044 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Compare=std::less<T>, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
-<a name="l00045"></a><a class="code" href="a00235.html">00045</a> <span class="keyword">class </span><a class="code" href="a00235.html">concurrent_priority_queue</a> {
-<a name="l00046"></a>00046  <span class="keyword">public</span>:
-<a name="l00048"></a><a class="code" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">00048</a>     <span class="keyword">typedef</span> T <a class="code" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a>;
-<a name="l00049"></a>00049 
-<a name="l00051"></a><a class="code" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">00051</a>     <span class="keyword">typedef</span> T& <a class="code" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a>;
-<a name="l00052"></a>00052 
-<a name="l00054"></a><a class="code" href="a00235.html#a4ded8601a434098605be0dcc4febc60">00054</a>     <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00235.html#a4ded8601a434098605be0dcc4febc60">const_reference</a>;
-<a name="l00055"></a>00055 
-<a name="l00057"></a><a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">00057</a>     <span class="keyword">typedef</span> size_t <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a>;
-<a name="l00058"></a>00058 
-<a name="l00060"></a><a class="code" href="a00235.html#77399bc76b3ecd60e33f7e35a5becd87">00060</a>     <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00235.html#77399bc76b3ecd60e33f7e35a5becd87">difference_type</a>;
-<a name="l00061"></a>00061 
-<a name="l00063"></a><a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">00063</a>     <span class="keyword">typedef</span> A <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>;
-<a name="l00064"></a>00064 
-<a name="l00066"></a><a class="code" href="a00235.html#eefa40599afe00ea393897d8f5662e65">00066</a>     <span class="keyword">explicit</span> <a class="code" href="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>()) : mark(0), data(a) {
-<a name="l00067"></a>00067         my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00068"></a>00068     }
-<a name="l00069"></a>00069 
-<a name="l00071"></a><a class="code" href="a00235.html#4555b4a55415a70024c4004b51e9f385">00071</a>     <span class="keyword">explicit</span> <a class="code" href="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> init_capacity, <span class="keyword">const</span> <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00 [...]
-<a name="l00072"></a>00072         data.reserve(init_capacity);
-<a name="l00073"></a>00073         my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00074"></a>00074     }
-<a name="l00075"></a>00075 
-<a name="l00077"></a>00077     <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00078"></a><a class="code" href="a00235.html#9147cb4207017c260a0c3929c12cd40f">00078</a>     <a class="code" href="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a = <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>()) : data(begin, end, a)
-<a name="l00079"></a>00079     {
-<a name="l00080"></a>00080         mark = data.size();
-<a name="l00081"></a>00081         my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00082"></a>00082         heapify();
-<a name="l00083"></a>00083     }
-<a name="l00084"></a>00084 
-<a name="l00086"></a>00086 
-<a name="l00088"></a><a class="code" href="a00235.html#509419e320f200456d89dc54a65140b3">00088</a>     <span class="keyword">explicit</span> <a class="code" href="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00235.html">concurrent_priority_queue</a>& src) : mark(src.mark), data(src.data.begin(), src.data.end(), src.data.<a class="code" href="a00235.html#d545d444fb0d16148f9b61fd89f9a337">get_alloc [...]
-<a name="l00089"></a>00089     {
-<a name="l00090"></a>00090         my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00091"></a>00091         heapify();
-<a name="l00092"></a>00092     }
-<a name="l00093"></a>00093 
-<a name="l00094"></a>00094     <a class="code" href="a00235.html#eefa40599afe00ea393897d8f5662e65">concurrent_priority_queue</a>(<span class="keyword">const</span> <a class="code" href="a00235.html">concurrent_priority_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a>& a) : mark(src.mark), data(src.data.begin(), src.data.end(), a)
-<a name="l00095"></a>00095     {
-<a name="l00096"></a>00096         my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00097"></a>00097         heapify();
-<a name="l00098"></a>00098     }
-<a name="l00099"></a>00099 
-<a name="l00101"></a>00101 
-<a name="l00103"></a><a class="code" href="a00235.html#2ab7f7808891027ac0f0f5b3a4be51e9">00103</a>     <a class="code" href="a00235.html">concurrent_priority_queue</a>& <a class="code" href="a00235.html#2ab7f7808891027ac0f0f5b3a4be51e9">operator=</a>(<span class="keyword">const</span> <a class="code" href="a00235.html">concurrent_priority_queue</a>& src) {
-<a name="l00104"></a>00104         <span class="keywordflow">if</span> (<span class="keyword">this</span> != &src) {
-<a name="l00105"></a>00105             std::vector<value_type, allocator_type>(src.<a class="code" href="a00235.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.begin(), src.<a class="code" href="a00235.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.end(), src.<a class="code" href="a00235.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>.get_allocator()).<a class="code" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(data);
-<a name="l00106"></a>00106             mark = src.<a class="code" href="a00235.html#7fcd8d21ea4228b6079a2f2723550af0">mark</a>;
-<a name="l00107"></a>00107         }
-<a name="l00108"></a>00108         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00109"></a>00109     }
-<a name="l00110"></a>00110 
-<a name="l00112"></a>00112 
-<a name="l00113"></a><a class="code" href="a00235.html#317c508fa92df218be5d014c26c09bb7">00113</a>     <span class="keywordtype">bool</span> <a class="code" href="a00235.html#317c508fa92df218be5d014c26c09bb7">empty</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data.empty(); }
-<a name="l00114"></a>00114 
-<a name="l00116"></a>00116 
-<a name="l00117"></a><a class="code" href="a00235.html#8b2ae25c61338c6fd59e94fe09822ba5">00117</a>     <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="code" href="a00235.html#8b2ae25c61338c6fd59e94fe09822ba5">size</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data.size(); }
-<a name="l00118"></a>00118 
-<a name="l00120"></a>00120 
-<a name="l00121"></a><a class="code" href="a00235.html#e5d6a0aca1579ecebb716bbe53514963">00121</a>     <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> <a class="code" href="a00235.html#e5d6a0aca1579ecebb716bbe53514963">capacity</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data.capacity(); }
-<a name="l00122"></a>00122 
-<a name="l00124"></a><a class="code" href="a00235.html#d905af7b8f6defff562f5ae9c3275763">00124</a>     <span class="keywordtype">void</span> <a class="code" href="a00235.html#d905af7b8f6defff562f5ae9c3275763">push</a>(<a class="code" href="a00235.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> elem) {
-<a name="l00125"></a>00125         cpq_operation op_data(elem, PUSH_OP);
-<a name="l00126"></a>00126         my_aggregator.execute(&op_data);
-<a name="l00127"></a>00127         <span class="keywordflow">if</span> (op_data.status == FAILED) <span class="comment">// exception thrown</span>
-<a name="l00128"></a>00128             throw_exception(eid_bad_alloc);
-<a name="l00129"></a>00129     }
-<a name="l00130"></a>00130 
-<a name="l00132"></a>00132 
-<a name="l00134"></a><a class="code" href="a00235.html#e036461a29cc40902a2bb79abf9f5146">00134</a>     <span class="keywordtype">bool</span> <a class="code" href="a00235.html#e036461a29cc40902a2bb79abf9f5146">try_pop</a>(<a class="code" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">reference</a> elem) {
-<a name="l00135"></a>00135         cpq_operation op_data(POP_OP);
-<a name="l00136"></a>00136         op_data.elem = &elem;
-<a name="l00137"></a>00137         my_aggregator.execute(&op_data);
-<a name="l00138"></a>00138         <span class="keywordflow">return</span> op_data.status==SUCCEEDED;
-<a name="l00139"></a>00139     }
-<a name="l00140"></a>00140 
-<a name="l00142"></a><a class="code" href="a00235.html#e7c59f011c4cca83ff210aefe7c9d868">00142</a>     <span class="keywordtype">void</span> <a class="code" href="a00235.html#e7c59f011c4cca83ff210aefe7c9d868">reserve</a>(<a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> new_cap) {
-<a name="l00143"></a>00143         cpq_operation op_data(RESERVE_OP);
-<a name="l00144"></a>00144         op_data.sz = new_cap;
-<a name="l00145"></a>00145         my_aggregator.execute(&op_data);
-<a name="l00146"></a>00146         <span class="keywordflow">if</span> (op_data.status == FAILED) <span class="comment">// exception thrown</span>
-<a name="l00147"></a>00147             throw_exception(eid_bad_alloc);
-<a name="l00148"></a>00148     }
-<a name="l00149"></a>00149 
-<a name="l00151"></a>00151 
-<a name="l00153"></a><a class="code" href="a00235.html#0bdcdf7cde9fd369edca845bec34ca94">00153</a>     <span class="keywordtype">void</span> <a class="code" href="a00235.html#0bdcdf7cde9fd369edca845bec34ca94">clear</a>() {
-<a name="l00154"></a>00154         data.clear();
-<a name="l00155"></a>00155         mark = 0;
-<a name="l00156"></a>00156     }
-<a name="l00157"></a>00157 
-<a name="l00159"></a><a class="code" href="a00235.html#28d113288fc7e0c04c9053ec7de61368">00159</a>     <span class="keywordtype">void</span> <a class="code" href="a00235.html#28d113288fc7e0c04c9053ec7de61368">shrink_to_fit</a>() {
-<a name="l00160"></a>00160         std::vector<value_type, allocator_type>(data.begin(), data.end(), data.get_allocator()).<a class="code" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(data);
-<a name="l00161"></a>00161     }
-<a name="l00162"></a>00162 
-<a name="l00164"></a><a class="code" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">00164</a>     <span class="keywordtype">void</span> <a class="code" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">swap</a>(<a class="code" href="a00235.html">concurrent_priority_queue</a>& q) {
-<a name="l00165"></a>00165         data.swap(q.<a class="code" href="a00235.html#384fd94d6b4d4dfce7aa64b531be7545">data</a>);
-<a name="l00166"></a>00166         std::swap(mark, q.<a class="code" href="a00235.html#7fcd8d21ea4228b6079a2f2723550af0">mark</a>);
-<a name="l00167"></a>00167     }
-<a name="l00168"></a>00168 
-<a name="l00170"></a><a class="code" href="a00235.html#d545d444fb0d16148f9b61fd89f9a337">00170</a>     <a class="code" href="a00235.html#1712cb3a46bc1821fccc5e2cd83d5cd7">allocator_type</a> <a class="code" href="a00235.html#d545d444fb0d16148f9b61fd89f9a337">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> data.get_allocator(); }
-<a name="l00171"></a>00171 
-<a name="l00172"></a>00172  <span class="keyword">private</span>:
-<a name="l00173"></a>00173     <span class="keyword">enum</span> operation_type {INVALID_OP, PUSH_OP, POP_OP, RESERVE_OP};
-<a name="l00174"></a>00174     <span class="keyword">enum</span> operation_status { WAIT=0, SUCCEEDED, FAILED };
-<a name="l00175"></a>00175 
-<a name="l00176"></a>00176     <span class="keyword">class </span>cpq_operation : <span class="keyword">public</span> aggregated_operation<cpq_operation> {
-<a name="l00177"></a>00177      <span class="keyword">public</span>:
-<a name="l00178"></a>00178         operation_type type;
-<a name="l00179"></a>00179         <span class="keyword">union </span>{
-<a name="l00180"></a>00180             <a class="code" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> *elem;
-<a name="l00181"></a>00181             <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> sz;
-<a name="l00182"></a>00182         };
-<a name="l00183"></a>00183         cpq_operation(<a class="code" href="a00235.html#a4ded8601a434098605be0dcc4febc60">const_reference</a> e, operation_type t) :
-<a name="l00184"></a>00184             type(t), elem(const_cast<<a class="code" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a>*>(&e)) {}
-<a name="l00185"></a>00185         cpq_operation(operation_type t) : type(t) {}
-<a name="l00186"></a>00186     };
-<a name="l00187"></a>00187 
-<a name="l00188"></a>00188     <span class="keyword">class </span>my_functor_t {
-<a name="l00189"></a>00189         concurrent_priority_queue<T, Compare, A> *cpq;
-<a name="l00190"></a>00190      <span class="keyword">public</span>:
-<a name="l00191"></a>00191         my_functor_t() {}
-<a name="l00192"></a>00192         my_functor_t(concurrent_priority_queue<T, Compare, A> *cpq_) : cpq(cpq_) {}
-<a name="l00193"></a>00193         <span class="keywordtype">void</span> operator()(cpq_operation* op_list) {
-<a name="l00194"></a>00194             cpq->handle_operations(op_list);
-<a name="l00195"></a>00195         }
-<a name="l00196"></a>00196     };
-<a name="l00197"></a>00197 
-<a name="l00198"></a>00198     aggregator< my_functor_t, cpq_operation> my_aggregator;
-<a name="l00200"></a>00200     <span class="keywordtype">char</span> padding1[NFS_MaxLineSize - <span class="keyword">sizeof</span>(aggregator< my_functor_t, cpq_operation >)];
-<a name="l00202"></a>00202     <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> mark;
-<a name="l00203"></a>00203     Compare compare;
-<a name="l00205"></a>00205     <span class="keywordtype">char</span> padding2[NFS_MaxLineSize - <span class="keyword">sizeof</span>(<a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a>) - <span class="keyword">sizeof</span>(Compare)];
-<a name="l00207"></a>00207 
-<a name="l00225"></a>00225     std::vector<value_type, allocator_type> data;
-<a name="l00226"></a>00226 
-<a name="l00227"></a>00227     <span class="keywordtype">void</span> handle_operations(cpq_operation *op_list) {
-<a name="l00228"></a>00228         cpq_operation *tmp, *pop_list=NULL;
-<a name="l00229"></a>00229 
-<a name="l00230"></a>00230         __TBB_ASSERT(mark == data.size(), NULL);
-<a name="l00231"></a>00231 
-<a name="l00232"></a>00232         <span class="comment">// first pass processes all constant time operations: pushes,</span>
-<a name="l00233"></a>00233         <span class="comment">// tops, some pops. Also reserve.</span>
-<a name="l00234"></a>00234         <span class="keywordflow">while</span> (op_list) {
-<a name="l00235"></a>00235             <span class="comment">// ITT note: &(op_list->status) tag is used to cover accesses to op_list</span>
-<a name="l00236"></a>00236             <span class="comment">// node. This thread is going to handle the operation, and so will acquire it</span>
-<a name="l00237"></a>00237             <span class="comment">// and perform the associated operation w/o triggering a race condition; the</span>
-<a name="l00238"></a>00238             <span class="comment">// thread that created the operation is waiting on the status field, so when</span>
-<a name="l00239"></a>00239             <span class="comment">// this thread is done with the operation, it will perform a</span>
-<a name="l00240"></a>00240             <span class="comment">// store_with_release to give control back to the waiting thread in</span>
-<a name="l00241"></a>00241             <span class="comment">// aggregator::insert_operation.</span>
-<a name="l00242"></a>00242             call_itt_notify(acquired, &(op_list->status));
-<a name="l00243"></a>00243             __TBB_ASSERT(op_list->type != INVALID_OP, NULL);
-<a name="l00244"></a>00244             tmp = op_list;
-<a name="l00245"></a>00245             op_list = itt_hide_load_word(op_list->next);
-<a name="l00246"></a>00246             <span class="keywordflow">if</span> (tmp->type == PUSH_OP) {
-<a name="l00247"></a>00247                 __TBB_TRY {
-<a name="l00248"></a>00248                     data.push_back(*(tmp->elem));
-<a name="l00249"></a>00249                     itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00250"></a>00250                 } __TBB_CATCH(...) {
-<a name="l00251"></a>00251                     itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
-<a name="l00252"></a>00252                 }
-<a name="l00253"></a>00253             }
-<a name="l00254"></a>00254             <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tmp->type == POP_OP) {
-<a name="l00255"></a>00255                 <span class="keywordflow">if</span> (mark < data.size() &&
-<a name="l00256"></a>00256                     compare(data[0], data[data.size()-1])) {
-<a name="l00257"></a>00257                     <span class="comment">// there are newly pushed elems and the last one</span>
-<a name="l00258"></a>00258                     <span class="comment">// is higher than top</span>
-<a name="l00259"></a>00259                     *(tmp->elem) = data[data.size()-1]; <span class="comment">// copy the data</span>
-<a name="l00260"></a>00260                     itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00261"></a>00261                     data.pop_back();
-<a name="l00262"></a>00262                     __TBB_ASSERT(mark<=data.size(), NULL);
-<a name="l00263"></a>00263                 }
-<a name="l00264"></a>00264                 <span class="keywordflow">else</span> { <span class="comment">// no convenient item to pop; postpone</span>
-<a name="l00265"></a>00265                     itt_hide_store_word(tmp->next, pop_list);
-<a name="l00266"></a>00266                     pop_list = tmp;
-<a name="l00267"></a>00267                 }
-<a name="l00268"></a>00268             }
-<a name="l00269"></a>00269             <span class="keywordflow">else</span> {
-<a name="l00270"></a>00270                 __TBB_ASSERT(tmp->type == RESERVE_OP, NULL);
-<a name="l00271"></a>00271                 __TBB_TRY {
-<a name="l00272"></a>00272                     data.reserve(tmp->sz);
-<a name="l00273"></a>00273                     itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00274"></a>00274                 } __TBB_CATCH(...) {
-<a name="l00275"></a>00275                     itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
-<a name="l00276"></a>00276                 }
-<a name="l00277"></a>00277             }
-<a name="l00278"></a>00278         }
-<a name="l00279"></a>00279 
-<a name="l00280"></a>00280         <span class="comment">// second pass processes pop operations</span>
-<a name="l00281"></a>00281         <span class="keywordflow">while</span> (pop_list) {
-<a name="l00282"></a>00282             tmp = pop_list;
-<a name="l00283"></a>00283             pop_list = itt_hide_load_word(pop_list->next);
-<a name="l00284"></a>00284             __TBB_ASSERT(tmp->type == POP_OP, NULL);
-<a name="l00285"></a>00285             <span class="keywordflow">if</span> (data.empty()) {
-<a name="l00286"></a>00286                 itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
-<a name="l00287"></a>00287             }
-<a name="l00288"></a>00288             <span class="keywordflow">else</span> {
-<a name="l00289"></a>00289                 __TBB_ASSERT(mark<=data.size(), NULL);
-<a name="l00290"></a>00290                 <span class="keywordflow">if</span> (mark < data.size() &&
-<a name="l00291"></a>00291                     compare(data[0], data[data.size()-1])) {
-<a name="l00292"></a>00292                     <span class="comment">// there are newly pushed elems and the last one is</span>
-<a name="l00293"></a>00293                     <span class="comment">// higher than top</span>
-<a name="l00294"></a>00294                     *(tmp->elem) = data[data.size()-1]; <span class="comment">// copy the data</span>
-<a name="l00295"></a>00295                     itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00296"></a>00296                     data.pop_back();
-<a name="l00297"></a>00297                 }
-<a name="l00298"></a>00298                 <span class="keywordflow">else</span> { <span class="comment">// extract top and push last element down heap</span>
-<a name="l00299"></a>00299                     *(tmp->elem) = data[0]; <span class="comment">// copy the data</span>
-<a name="l00300"></a>00300                     itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-<a name="l00301"></a>00301                     reheap();
-<a name="l00302"></a>00302                 }
-<a name="l00303"></a>00303             }
-<a name="l00304"></a>00304         }
-<a name="l00305"></a>00305 
-<a name="l00306"></a>00306         <span class="comment">// heapify any leftover pushed elements before doing the next</span>
-<a name="l00307"></a>00307         <span class="comment">// batch of operations</span>
-<a name="l00308"></a>00308         <span class="keywordflow">if</span> (mark<data.size()) heapify();
-<a name="l00309"></a>00309         __TBB_ASSERT(mark == data.size(), NULL);
-<a name="l00310"></a>00310     }
-<a name="l00311"></a>00311 
-<a name="l00313"></a>00313     <span class="keywordtype">void</span> heapify() {
-<a name="l00314"></a>00314         <span class="keywordflow">if</span> (!mark) mark = 1;
-<a name="l00315"></a>00315         <span class="keywordflow">for</span> (; mark<data.size(); ++mark) {
-<a name="l00316"></a>00316             <span class="comment">// for each unheapified element under size</span>
-<a name="l00317"></a>00317             <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> cur_pos = mark;
-<a name="l00318"></a>00318             <a class="code" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">value_type</a> to_place = data[mark];
-<a name="l00319"></a>00319             <span class="keywordflow">do</span> { <span class="comment">// push to_place up the heap</span>
-<a name="l00320"></a>00320                 <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> parent = (cur_pos-1)>>1;
-<a name="l00321"></a>00321                 <span class="keywordflow">if</span> (!compare(data[parent], to_place)) <span class="keywordflow">break</span>;
-<a name="l00322"></a>00322                 data[cur_pos] = data[parent];
-<a name="l00323"></a>00323                 cur_pos = parent;
-<a name="l00324"></a>00324             } <span class="keywordflow">while</span>( cur_pos );
-<a name="l00325"></a>00325             data[cur_pos] = to_place;
-<a name="l00326"></a>00326         }
-<a name="l00327"></a>00327     }
-<a name="l00328"></a>00328 
-<a name="l00330"></a>00330 
-<a name="l00331"></a>00331     <span class="keywordtype">void</span> reheap() {
-<a name="l00332"></a>00332         <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> cur_pos=0, child=1;
-<a name="l00333"></a>00333 
-<a name="l00334"></a>00334         <span class="keywordflow">while</span> (child < mark) {
-<a name="l00335"></a>00335             <a class="code" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">size_type</a> target = child;
-<a name="l00336"></a>00336             <span class="keywordflow">if</span> (child+1 < mark && compare(data[child], data[child+1]))
-<a name="l00337"></a>00337                 ++target;
-<a name="l00338"></a>00338             <span class="comment">// target now has the higher priority child</span>
-<a name="l00339"></a>00339             <span class="keywordflow">if</span> (compare(data[target], data[data.size()-1])) <span class="keywordflow">break</span>;
-<a name="l00340"></a>00340             data[cur_pos] = data[target];
-<a name="l00341"></a>00341             cur_pos = target;
-<a name="l00342"></a>00342             child = (cur_pos<<1)+1;
-<a name="l00343"></a>00343         }
-<a name="l00344"></a>00344         data[cur_pos] = data[data.size()-1];
-<a name="l00345"></a>00345         data.pop_back();
-<a name="l00346"></a>00346         <span class="keywordflow">if</span> (mark > data.size()) mark = data.size();
-<a name="l00347"></a>00347     }
-<a name="l00348"></a>00348 };
-<a name="l00349"></a>00349 
-<a name="l00350"></a>00350 } <span class="comment">// namespace interface5</span>
-<a name="l00351"></a>00351 
-<a name="l00352"></a>00352 <span class="keyword">using</span> interface5::concurrent_priority_queue;
-<a name="l00353"></a>00353 
-<a name="l00354"></a>00354 } <span class="comment">// namespace tbb</span>
-<a name="l00355"></a>00355 
-<a name="l00356"></a>00356 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_priority_queue_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00436.html b/doc/html/a00436.html
index 1c366bc..27ab313 100644
--- a/doc/html/a00436.html
+++ b/doc/html/a00436.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_queue.h Source File</title>
+<title>concurrent_unordered_map.h Source File</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -19,7 +19,7 @@
     <li><a href="files.html"><span>File List</span></a></li>
     <li><a href="globals.html"><span>File Members</span></a></li>
   </ul></div>
-<h1>concurrent_queue.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>concurrent_unordered_map.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
 <a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
 <a name="l00003"></a>00003 <span class="comment"></span>
 <a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
@@ -39,321 +39,206 @@
 <a name="l00018"></a>00018 <span class="comment">    writing.</span>
 <a name="l00019"></a>00019 <span class="comment">*/</span>
 <a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_queue_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_queue_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "_concurrent_queue_internal.h"</span>
-<a name="l00025"></a>00025 
-<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
-<a name="l00027"></a>00027 
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>strict_ppl {
-<a name="l00029"></a>00029 
+<a name="l00021"></a>00021 <span class="comment">/* Container implementations in this header are based on PPL implementations</span>
+<a name="l00022"></a>00022 <span class="comment">   provided by Microsoft. */</span>
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="preprocessor">#ifndef __TBB_concurrent_unordered_map_H</span>
+<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_unordered_map_H</span>
+<a name="l00026"></a>00026 <span class="preprocessor"></span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include "internal/_concurrent_unordered_impl.h"</span>
+<a name="l00028"></a>00028 
+<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb
+<a name="l00030"></a>00030 {
 <a name="l00031"></a>00031 
-<a name="l00034"></a>00034 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> A = cache_aligned_allocator<T> > 
-<a name="l00035"></a><a class="code" href="a00236.html">00035</a> <span class="keyword">class </span><a class="code" href="a00236.html">concurrent_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3<T> {
-<a name="l00036"></a>00036     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
-<a name="l00037"></a>00037 
-<a name="l00039"></a>00039     <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template rebind<char>::other page_allocator_type;
-<a name="l00040"></a>00040     page_allocator_type my_allocator;
-<a name="l00041"></a>00041 
-<a name="l00043"></a>00043     <span class="comment">/*overide*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> *allocate_block( size_t n ) {
-<a name="l00044"></a>00044         <span class="keywordtype">void</span> *b = reinterpret_cast<void*>(my_allocator.allocate( n ));
-<a name="l00045"></a>00045         <span class="keywordflow">if</span>( !b )
-<a name="l00046"></a>00046             internal::throw_exception(internal::eid_bad_alloc); 
-<a name="l00047"></a>00047         <span class="keywordflow">return</span> b;
-<a name="l00048"></a>00048     }
-<a name="l00049"></a>00049 
-<a name="l00051"></a>00051     <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_block( <span class="keywordtype">void</span> *b, size_t n ) {
-<a name="l00052"></a>00052         my_allocator.deallocate( reinterpret_cast<char*>(b), n );
-<a name="l00053"></a>00053     }
-<a name="l00054"></a>00054 
-<a name="l00055"></a>00055 <span class="keyword">public</span>:
-<a name="l00057"></a><a class="code" href="a00236.html#682c3978d5cb0620000994f11c44a476">00057</a>     <span class="keyword">typedef</span> T <a class="code" href="a00236.html#682c3978d5cb0620000994f11c44a476">value_type</a>;
-<a name="l00058"></a>00058 
-<a name="l00060"></a><a class="code" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">00060</a>     <span class="keyword">typedef</span> T& <a class="code" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a>;
-<a name="l00061"></a>00061 
-<a name="l00063"></a><a class="code" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">00063</a>     <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a>;
-<a name="l00064"></a>00064 
-<a name="l00066"></a><a class="code" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">00066</a>     <span class="keyword">typedef</span> size_t <a class="code" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a>;
-<a name="l00067"></a>00067 
-<a name="l00069"></a><a class="code" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">00069</a>     <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a>;
-<a name="l00070"></a>00070 
-<a name="l00072"></a><a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">00072</a>     <span class="keyword">typedef</span> A <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>;
-<a name="l00073"></a>00073 
-<a name="l00075"></a><a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">00075</a>     <span class="keyword">explicit</span> <a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(<span class="keyword">const</span> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) : 
-<a name="l00076"></a>00076         my_allocator( a )
-<a name="l00077"></a>00077     {
-<a name="l00078"></a>00078     }
-<a name="l00079"></a>00079 
-<a name="l00081"></a>00081     <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00082"></a><a class="code" href="a00236.html#25209656c84f2f9b030e2f9162713341">00082</a>     <a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
-<a name="l00083"></a>00083         my_allocator( a )
-<a name="l00084"></a>00084     {
-<a name="l00085"></a>00085         <span class="keywordflow">for</span>( ; begin != end; ++begin )
-<a name="l00086"></a>00086             this->internal_push(&*begin);
-<a name="l00087"></a>00087     }
-<a name="l00088"></a>00088     
-<a name="l00090"></a><a class="code" href="a00236.html#8a6b98ea11a867db8ac868f0113ca429">00090</a>     <a class="code" href="a00236.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00236.html">concurrent_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a>& a = <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac" [...]
-<a name="l00091"></a>00091         internal::concurrent_queue_base_v3<T>(), my_allocator( a )
-<a name="l00092"></a>00092     {
-<a name="l00093"></a>00093         this->assign( src );
-<a name="l00094"></a>00094     }
-<a name="l00095"></a>00095     
-<a name="l00097"></a>00097     <a class="code" href="a00236.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>();
-<a name="l00098"></a>00098 
-<a name="l00100"></a><a class="code" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">00100</a>     <span class="keywordtype">void</span> <a class="code" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00101"></a>00101         this->internal_push( &source );
-<a name="l00102"></a>00102     }
-<a name="l00103"></a>00103 
+<a name="l00032"></a>00032 <span class="keyword">namespace </span>interface5 {
+<a name="l00033"></a>00033 
+<a name="l00034"></a>00034 <span class="comment">// Template class for hash map traits</span>
+<a name="l00035"></a>00035 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> Hash_compare, <span class="keyword">typename</span> Allocator, <span class="keywordtype">bool</span> Allow_multimapping>
+<a name="l00036"></a>00036 <span class="keyword">class </span>concurrent_unordered_map_traits
+<a name="l00037"></a>00037 {
+<a name="l00038"></a>00038 <span class="keyword">protected</span>:
+<a name="l00039"></a>00039     <span class="keyword">typedef</span> std::pair<const Key, T> value_type;
+<a name="l00040"></a>00040     <span class="keyword">typedef</span> Key key_type;
+<a name="l00041"></a>00041     <span class="keyword">typedef</span> Hash_compare hash_compare;
+<a name="l00042"></a>00042     <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<value_type>::other allocator_type;
+<a name="l00043"></a>00043     <span class="keyword">enum</span> { allow_multimapping = Allow_multimapping };
+<a name="l00044"></a>00044 
+<a name="l00045"></a>00045     concurrent_unordered_map_traits() : my_hash_compare() {}
+<a name="l00046"></a>00046     concurrent_unordered_map_traits(<span class="keyword">const</span> hash_compare& hc) : my_hash_compare(hc) {}
+<a name="l00047"></a>00047 
+<a name="l00048"></a>00048     <span class="keyword">class </span>value_compare : <span class="keyword">public</span> std::binary_function<value_type, value_type, bool>
+<a name="l00049"></a>00049     {
+<a name="l00050"></a>00050         <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_unordered_map_traits<Key, T, Hash_compare, Allocator, Allow_multimapping>;
+<a name="l00051"></a>00051 
+<a name="l00052"></a>00052     <span class="keyword">public</span>:
+<a name="l00053"></a>00053         <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> value_type& left, <span class="keyword">const</span> value_type& right)<span class="keyword"> const</span>
+<a name="l00054"></a>00054 <span class="keyword">        </span>{
+<a name="l00055"></a>00055             <span class="keywordflow">return</span> (my_hash_compare(left.first, right.first));
+<a name="l00056"></a>00056         }
+<a name="l00057"></a>00057 
+<a name="l00058"></a>00058         value_compare(<span class="keyword">const</span> hash_compare& comparator) : my_hash_compare(comparator) {}
+<a name="l00059"></a>00059 
+<a name="l00060"></a>00060     <span class="keyword">protected</span>:
+<a name="l00061"></a>00061         hash_compare my_hash_compare;    <span class="comment">// the comparator predicate for keys</span>
+<a name="l00062"></a>00062     };
+<a name="l00063"></a>00063 
+<a name="l00064"></a>00064     <span class="keyword">template</span><<span class="keyword">class</span> Type1, <span class="keyword">class</span> Type2>
+<a name="l00065"></a>00065     <span class="keyword">static</span> <span class="keyword">const</span> Key& get_key(<span class="keyword">const</span> std::pair<Type1, Type2>& value) {
+<a name="l00066"></a>00066         <span class="keywordflow">return</span> (value.first);
+<a name="l00067"></a>00067     }
+<a name="l00068"></a>00068 
+<a name="l00069"></a>00069     hash_compare my_hash_compare; <span class="comment">// the comparator predicate for keys</span>
+<a name="l00070"></a>00070 };
+<a name="l00071"></a>00071 
+<a name="l00072"></a>00072 <span class="keyword">template</span> <<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> Hasher = tbb::tbb_hash<Key>, <span class="keyword">typename</span> Key_equality = std::equal_to<Key>, <span class="keyword">typename</span> Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >
+<a name="l00073"></a>00073 <span class="keyword">class </span>concurrent_unordered_map : <span class="keyword">public</span> internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >
+<a name="l00074"></a>00074 {
+<a name="l00075"></a>00075     <span class="comment">// Base type definitions</span>
+<a name="l00076"></a>00076     <span class="keyword">typedef</span> internal::hash_compare<Key, Hasher, Key_equality> hash_compare;
+<a name="l00077"></a>00077     <span class="keyword">typedef</span> internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, hash_compare, Allocator, false> > base_type;
+<a name="l00078"></a>00078     <span class="keyword">typedef</span> concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, <span class="keyword">false</span>> traits_type;
+<a name="l00079"></a>00079     <span class="keyword">using</span> traits_type::my_hash_compare;
+<a name="l00080"></a>00080 <span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
+<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="keyword">public</span>:
+<a name="l00082"></a>00082 <span class="preprocessor">#endif</span>
+<a name="l00083"></a>00083 <span class="preprocessor"></span>    <span class="keyword">using</span> traits_type::allow_multimapping;
+<a name="l00084"></a>00084 <span class="keyword">public</span>:
+<a name="l00085"></a>00085     <span class="keyword">using</span> base_type::end;
+<a name="l00086"></a>00086     <span class="keyword">using</span> base_type::find;
+<a name="l00087"></a>00087     <span class="keyword">using</span> base_type::insert;
+<a name="l00088"></a>00088 
+<a name="l00089"></a>00089     <span class="comment">// Type definitions</span>
+<a name="l00090"></a>00090     <span class="keyword">typedef</span> Key key_type;
+<a name="l00091"></a>00091     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::value_type value_type;
+<a name="l00092"></a>00092     <span class="keyword">typedef</span> T mapped_type;
+<a name="l00093"></a>00093     <span class="keyword">typedef</span> Hasher hasher;
+<a name="l00094"></a>00094     <span class="keyword">typedef</span> Key_equality key_equal;
+<a name="l00095"></a>00095     <span class="keyword">typedef</span> hash_compare key_compare;
+<a name="l00096"></a>00096 
+<a name="l00097"></a>00097     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::allocator_type allocator_type;
+<a name="l00098"></a>00098     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::pointer pointer;
+<a name="l00099"></a>00099     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_pointer const_pointer;
+<a name="l00100"></a>00100     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::reference reference;
+<a name="l00101"></a>00101     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_reference const_reference;
+<a name="l00102"></a>00102 
+<a name="l00103"></a>00103     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::size_type size_type;
+<a name="l00104"></a>00104     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::difference_type difference_type;
 <a name="l00105"></a>00105 
-<a name="l00107"></a><a class="code" href="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">00107</a>     <span class="keywordtype">bool</span> <a class="code" href="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>( T& result ) {
-<a name="l00108"></a>00108         <span class="keywordflow">return</span> this->internal_try_pop( &result );
-<a name="l00109"></a>00109     }
+<a name="l00106"></a>00106     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator iterator;
+<a name="l00107"></a>00107     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_iterator;
+<a name="l00108"></a>00108     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator local_iterator;
+<a name="l00109"></a>00109     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_local_iterator;
 <a name="l00110"></a>00110 
-<a name="l00112"></a><a class="code" href="a00236.html#eaa35a5274606779802e9a669a706260">00112</a>     <a class="code" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> <a class="code" href="a00236.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_size();}
-<a name="l00113"></a>00113 
-<a name="l00115"></a><a class="code" href="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">00115</a>     <span class="keywordtype">bool</span> <a class="code" href="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->internal_empty();}
-<a name="l00116"></a>00116 
-<a name="l00118"></a>00118     <span class="keywordtype">void</span> <a class="code" href="a00236.html#c32e8e84c0524155133b4aae32d2a827">clear</a>() ;
-<a name="l00119"></a>00119 
-<a name="l00121"></a><a class="code" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">00121</a>     <a class="code" href="a00236.html#5a3956341728eaa558d8827063718cac">allocator_type</a> <a class="code" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00122"></a>00122 
-<a name="l00123"></a>00123     <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_queue,T> iterator;
-<a name="l00124"></a>00124     <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_queue,const T> const_iterator;
-<a name="l00125"></a>00125 
-<a name="l00126"></a>00126     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00127"></a>00127     <span class="comment">// The iterators are intended only for debugging.  They are slow and not thread safe.</span>
-<a name="l00128"></a>00128     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00129"></a>00129     iterator unsafe_begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>);}
-<a name="l00130"></a>00130     iterator unsafe_end() {<span class="keywordflow">return</span> iterator();}
-<a name="l00131"></a>00131     const_iterator unsafe_begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>);}
-<a name="l00132"></a>00132     const_iterator unsafe_end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator();}
-<a name="l00133"></a>00133 } ;
+<a name="l00111"></a>00111     <span class="comment">// Construction/destruction/copying</span>
+<a name="l00112"></a>00112     <span class="keyword">explicit</span> concurrent_unordered_map(size_type n_of_buckets = 8, <span class="keyword">const</span> hasher& a_hasher = hasher(),
+<a name="l00113"></a>00113         <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
+<a name="l00114"></a>00114         : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
+<a name="l00115"></a>00115     {
+<a name="l00116"></a>00116     }
+<a name="l00117"></a>00117 
+<a name="l00118"></a>00118     concurrent_unordered_map(<span class="keyword">const</span> Allocator& a) : base_type(8, key_compare(), a)
+<a name="l00119"></a>00119     {
+<a name="l00120"></a>00120     }
+<a name="l00121"></a>00121 
+<a name="l00122"></a>00122     <span class="keyword">template</span> <<span class="keyword">typename</span> Iterator>
+<a name="l00123"></a>00123     concurrent_unordered_map(Iterator first, Iterator last, size_type n_of_buckets = 8, <span class="keyword">const</span> hasher& a_hasher = hasher(),
+<a name="l00124"></a>00124         <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
+<a name="l00125"></a>00125         : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
+<a name="l00126"></a>00126     {
+<a name="l00127"></a>00127         <span class="keywordflow">for</span> (; first != last; ++first)
+<a name="l00128"></a>00128             base_type::insert(*first);
+<a name="l00129"></a>00129     }
+<a name="l00130"></a>00130 
+<a name="l00131"></a>00131     concurrent_unordered_map(<span class="keyword">const</span> concurrent_unordered_map& table) : base_type(table)
+<a name="l00132"></a>00132     {
+<a name="l00133"></a>00133     }
 <a name="l00134"></a>00134 
-<a name="l00135"></a>00135 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00136"></a><a class="code" href="a00236.html#830b33753d6b149c366344e29b2edd8c">00136</a> <a class="code" href="a00236.html">concurrent_queue<T,A>::~concurrent_queue</a>() {
-<a name="l00137"></a>00137     <a class="code" href="a00236.html#c32e8e84c0524155133b4aae32d2a827">clear</a>();
-<a name="l00138"></a>00138     this->internal_finish_clear();
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140 
-<a name="l00141"></a>00141 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00142"></a><a class="code" href="a00236.html#c32e8e84c0524155133b4aae32d2a827">00142</a> <span class="keywordtype">void</span> <a class="code" href="a00236.html">concurrent_queue<T,A>::clear</a>() {
-<a name="l00143"></a>00143     <span class="keywordflow">while</span>( !<a class="code" href="a00236.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() ) {
-<a name="l00144"></a>00144         T value;
-<a name="l00145"></a>00145         this->internal_try_pop(&value);
-<a name="l00146"></a>00146     }
-<a name="l00147"></a>00147 }
-<a name="l00148"></a>00148 
-<a name="l00149"></a>00149 } <span class="comment">// namespace strict_ppl</span>
-<a name="l00150"></a>00150     
-<a name="l00152"></a>00152 
-<a name="l00157"></a>00157 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
-<a name="l00158"></a><a class="code" href="a00230.html">00158</a> <span class="keyword">class </span><a class="code" href="a00230.html">concurrent_bounded_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3 {
-<a name="l00159"></a>00159     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
+<a name="l00135"></a>00135     concurrent_unordered_map(<span class="keyword">const</span> concurrent_unordered_map& table, <span class="keyword">const</span> Allocator& a)
+<a name="l00136"></a>00136         : base_type(table, a)
+<a name="l00137"></a>00137     {
+<a name="l00138"></a>00138     }
+<a name="l00139"></a>00139 
+<a name="l00140"></a>00140     concurrent_unordered_map& operator=(<span class="keyword">const</span> concurrent_unordered_map& table)
+<a name="l00141"></a>00141     {
+<a name="l00142"></a>00142         base_type::operator=(table);
+<a name="l00143"></a>00143         <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
+<a name="l00144"></a>00144     }
+<a name="l00145"></a>00145 
+<a name="l00146"></a>00146     iterator unsafe_erase(const_iterator where)
+<a name="l00147"></a>00147     {
+<a name="l00148"></a>00148         <span class="keywordflow">return</span> base_type::unsafe_erase(where);
+<a name="l00149"></a>00149     }
+<a name="l00150"></a>00150 
+<a name="l00151"></a>00151     size_type unsafe_erase(<span class="keyword">const</span> key_type& key)
+<a name="l00152"></a>00152     {
+<a name="l00153"></a>00153         <span class="keywordflow">return</span> base_type::unsafe_erase(key);
+<a name="l00154"></a>00154     }
+<a name="l00155"></a>00155 
+<a name="l00156"></a>00156     iterator unsafe_erase(const_iterator first, const_iterator last)
+<a name="l00157"></a>00157     {
+<a name="l00158"></a>00158         <span class="keywordflow">return</span> base_type::unsafe_erase(first, last);
+<a name="l00159"></a>00159     }
 <a name="l00160"></a>00160 
-<a name="l00162"></a>00162     <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template rebind<char>::other page_allocator_type;
-<a name="l00163"></a>00163     page_allocator_type my_allocator;
-<a name="l00164"></a>00164 
-<a name="l00165"></a>00165     <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_queue_base_v3::padded_page<T> padded_page;
-<a name="l00166"></a>00166  
-<a name="l00168"></a>00168     <span class="keyword">class </span>destroyer: internal::no_copy {
-<a name="l00169"></a>00169         T& my_value;
-<a name="l00170"></a>00170     <span class="keyword">public</span>:
-<a name="l00171"></a>00171         destroyer( T& value ) : my_value(value) {}
-<a name="l00172"></a>00172         ~destroyer() {my_value.~T();}          
-<a name="l00173"></a>00173     };
-<a name="l00174"></a>00174 
-<a name="l00175"></a>00175     T& get_ref( page& p, size_t index ) {
-<a name="l00176"></a>00176         __TBB_ASSERT( index<items_per_page, NULL );
-<a name="l00177"></a>00177         <span class="keywordflow">return</span> (&static_cast<padded_page*>(static_cast<void*>(&p))->last)[index];
-<a name="l00178"></a>00178     }
-<a name="l00179"></a>00179 
-<a name="l00180"></a>00180     <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_item( page& dst, size_t index, <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) {
-<a name="l00181"></a>00181         <span class="keyword">new</span>( &get_ref(dst,index) ) T(*static_cast<const T*>(src)); 
-<a name="l00182"></a>00182     }
-<a name="l00183"></a>00183 
-<a name="l00184"></a>00184     <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_page_item( page& dst, size_t dindex, <span class="keyword">const</span> page& src, size_t sindex ) {
-<a name="l00185"></a>00185         <span class="keyword">new</span>( &get_ref(dst,dindex) ) T( get_ref( const_cast<page&>(src), sindex ) );
-<a name="l00186"></a>00186     }
-<a name="l00187"></a>00187 
-<a name="l00188"></a>00188     <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> assign_and_destroy_item( <span class="keywordtype">void</span>* dst, page& src, size_t index ) {
-<a name="l00189"></a>00189         T& from = get_ref(src,index);
-<a name="l00190"></a>00190         destroyer d(from);
-<a name="l00191"></a>00191         *static_cast<T*>(dst) = from;
-<a name="l00192"></a>00192     }
-<a name="l00193"></a>00193 
-<a name="l00194"></a>00194     <span class="comment">/*overide*/</span> <span class="keyword">virtual</span> page *allocate_page() {
-<a name="l00195"></a>00195         size_t n = <span class="keyword">sizeof</span>(padded_page) + (items_per_page-1)*<span class="keyword">sizeof</span>(T);
-<a name="l00196"></a>00196         page *p = reinterpret_cast<page*>(my_allocator.allocate( n ));
-<a name="l00197"></a>00197         <span class="keywordflow">if</span>( !p )
-<a name="l00198"></a>00198             internal::throw_exception(internal::eid_bad_alloc); 
-<a name="l00199"></a>00199         <span class="keywordflow">return</span> p;
-<a name="l00200"></a>00200     }
-<a name="l00201"></a>00201 
-<a name="l00202"></a>00202     <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( page *p ) {
-<a name="l00203"></a>00203         size_t n = <span class="keyword">sizeof</span>(padded_page) + items_per_page*<span class="keyword">sizeof</span>(T);
-<a name="l00204"></a>00204         my_allocator.deallocate( reinterpret_cast<char*>(p), n );
-<a name="l00205"></a>00205     }
-<a name="l00206"></a>00206 
-<a name="l00207"></a>00207 <span class="keyword">public</span>:
-<a name="l00209"></a><a class="code" href="a00230.html#98245517a931e5893f6601e66c51fc75">00209</a>     <span class="keyword">typedef</span> T <a class="code" href="a00230.html#98245517a931e5893f6601e66c51fc75">value_type</a>;
-<a name="l00210"></a>00210 
-<a name="l00212"></a><a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">00212</a>     <span class="keyword">typedef</span> A <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>;
+<a name="l00161"></a>00161     <span class="keywordtype">void</span> swap(concurrent_unordered_map& table)
+<a name="l00162"></a>00162     {
+<a name="l00163"></a>00163         base_type::swap(table);
+<a name="l00164"></a>00164     }
+<a name="l00165"></a>00165 
+<a name="l00166"></a>00166     <span class="comment">// Observers</span>
+<a name="l00167"></a>00167     hasher hash_function()<span class="keyword"> const</span>
+<a name="l00168"></a>00168 <span class="keyword">    </span>{
+<a name="l00169"></a>00169         <span class="keywordflow">return</span> my_hash_compare.my_hash_object;
+<a name="l00170"></a>00170     }
+<a name="l00171"></a>00171 
+<a name="l00172"></a>00172     key_equal key_eq()<span class="keyword"> const</span>
+<a name="l00173"></a>00173 <span class="keyword">    </span>{
+<a name="l00174"></a>00174         <span class="keywordflow">return</span> my_hash_compare.my_key_compare_object;
+<a name="l00175"></a>00175     }
+<a name="l00176"></a>00176 
+<a name="l00177"></a>00177     mapped_type& operator[](<span class="keyword">const</span> key_type& key)
+<a name="l00178"></a>00178     {
+<a name="l00179"></a>00179         iterator where = find(key);
+<a name="l00180"></a>00180 
+<a name="l00181"></a>00181         <span class="keywordflow">if</span> (where == end())
+<a name="l00182"></a>00182         {
+<a name="l00183"></a>00183             where = insert(std::pair<key_type, mapped_type>(key, mapped_type())).first;
+<a name="l00184"></a>00184         }
+<a name="l00185"></a>00185 
+<a name="l00186"></a>00186         <span class="keywordflow">return</span> ((*where).second);
+<a name="l00187"></a>00187     }
+<a name="l00188"></a>00188 
+<a name="l00189"></a>00189     mapped_type& at(<span class="keyword">const</span> key_type& key)
+<a name="l00190"></a>00190     {
+<a name="l00191"></a>00191         iterator where = find(key);
+<a name="l00192"></a>00192 
+<a name="l00193"></a>00193         <span class="keywordflow">if</span> (where == end())
+<a name="l00194"></a>00194         {
+<a name="l00195"></a>00195             tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
+<a name="l00196"></a>00196         }
+<a name="l00197"></a>00197 
+<a name="l00198"></a>00198         <span class="keywordflow">return</span> ((*where).second);
+<a name="l00199"></a>00199     }
+<a name="l00200"></a>00200 
+<a name="l00201"></a>00201     <span class="keyword">const</span> mapped_type& at(<span class="keyword">const</span> key_type& key)<span class="keyword"> const</span>
+<a name="l00202"></a>00202 <span class="keyword">    </span>{
+<a name="l00203"></a>00203         const_iterator where = find(key);
+<a name="l00204"></a>00204 
+<a name="l00205"></a>00205         <span class="keywordflow">if</span> (where == end())
+<a name="l00206"></a>00206         {
+<a name="l00207"></a>00207             tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
+<a name="l00208"></a>00208         }
+<a name="l00209"></a>00209 
+<a name="l00210"></a>00210         <span class="keywordflow">return</span> ((*where).second);
+<a name="l00211"></a>00211     }
+<a name="l00212"></a>00212 };
 <a name="l00213"></a>00213 
-<a name="l00215"></a><a class="code" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">00215</a>     <span class="keyword">typedef</span> T& <a class="code" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a>;
-<a name="l00216"></a>00216 
-<a name="l00218"></a><a class="code" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">00218</a>     <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a>;
+<a name="l00214"></a>00214 } <span class="comment">// namespace interface5</span>
+<a name="l00215"></a>00215 
+<a name="l00216"></a>00216 <span class="keyword">using</span> interface5::concurrent_unordered_map;
+<a name="l00217"></a>00217 
+<a name="l00218"></a>00218 } <span class="comment">// namespace tbb</span>
 <a name="l00219"></a>00219 
-<a name="l00221"></a>00221 
-<a name="l00223"></a><a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">00223</a>     <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>;
-<a name="l00224"></a>00224 
-<a name="l00226"></a><a class="code" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">00226</a>     <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a>;
-<a name="l00227"></a>00227 
-<a name="l00229"></a><a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">00229</a>     <span class="keyword">explicit</span> <a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(<span class="keyword">const</span> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) : 
-<a name="l00230"></a>00230         concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
-<a name="l00231"></a>00231     {
-<a name="l00232"></a>00232     }
-<a name="l00233"></a>00233 
-<a name="l00235"></a><a class="code" href="a00230.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">00235</a>     <a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( <span class="keyword">const</span> <a class="code" href="a00230.html">concurrent_bounded_queue</a>& src, <span class="keyword">const</span> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00230.html#2e2726fccf6d975dc [...]
-<a name="l00236"></a>00236         concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
-<a name="l00237"></a>00237     {
-<a name="l00238"></a>00238         assign( src );
-<a name="l00239"></a>00239     }
-<a name="l00240"></a>00240 
-<a name="l00242"></a>00242     <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00243"></a><a class="code" href="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">00243</a>     <a class="code" href="a00230.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>& a = <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
-<a name="l00244"></a>00244         concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
-<a name="l00245"></a>00245     {
-<a name="l00246"></a>00246         <span class="keywordflow">for</span>( ; begin != end; ++begin )
-<a name="l00247"></a>00247             internal_push_if_not_full(&*begin);
-<a name="l00248"></a>00248     }
-<a name="l00249"></a>00249 
-<a name="l00251"></a>00251     <a class="code" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>();
-<a name="l00252"></a>00252 
-<a name="l00254"></a><a class="code" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">00254</a>     <span class="keywordtype">void</span> <a class="code" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">push</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00255"></a>00255         internal_push( &source );
-<a name="l00256"></a>00256     }
-<a name="l00257"></a>00257 
-<a name="l00259"></a>00259 
-<a name="l00260"></a><a class="code" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">00260</a>     <span class="keywordtype">void</span> <a class="code" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>( T& destination ) {
-<a name="l00261"></a>00261         internal_pop( &destination );
-<a name="l00262"></a>00262     }
-<a name="l00263"></a>00263 
-<a name="l00265"></a>00265 
-<a name="l00267"></a><a class="code" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">00267</a>     <span class="keywordtype">bool</span> <a class="code" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00268"></a>00268         <span class="keywordflow">return</span> internal_push_if_not_full( &source );
-<a name="l00269"></a>00269     }
-<a name="l00270"></a>00270 
-<a name="l00272"></a>00272 
-<a name="l00274"></a><a class="code" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">00274</a>     <span class="keywordtype">bool</span> <a class="code" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( T& destination ) {
-<a name="l00275"></a>00275         <span class="keywordflow">return</span> internal_pop_if_present( &destination );
-<a name="l00276"></a>00276     }
-<a name="l00277"></a>00277 
-<a name="l00279"></a>00279 
-<a name="l00282"></a><a class="code" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">00282</a>     <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_size();}
-<a name="l00283"></a>00283 
-<a name="l00285"></a><a class="code" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">00285</a>     <span class="keywordtype">bool</span> <a class="code" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_empty();}
-<a name="l00286"></a>00286 
-<a name="l00288"></a><a class="code" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">00288</a>     <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>()<span class="keyword"> const </span>{
-<a name="l00289"></a>00289         <span class="keywordflow">return</span> my_capacity;
-<a name="l00290"></a>00290     }
-<a name="l00291"></a>00291 
-<a name="l00293"></a>00293 
-<a name="l00295"></a><a class="code" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">00295</a>     <span class="keywordtype">void</span> <a class="code" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>( <a class="code" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity ) {
-<a name="l00296"></a>00296         internal_set_capacity( new_capacity, <span class="keyword">sizeof</span>(T) );
-<a name="l00297"></a>00297     }
-<a name="l00298"></a>00298 
-<a name="l00300"></a><a class="code" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">00300</a>     <a class="code" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> <a class="code" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00301"></a>00301 
-<a name="l00303"></a>00303     <span class="keywordtype">void</span> <a class="code" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>() ;
-<a name="l00304"></a>00304 
-<a name="l00305"></a>00305     <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,T> iterator;
-<a name="l00306"></a>00306     <span class="keyword">typedef</span> internal::concurrent_queue_iterator<concurrent_bounded_queue,const T> const_iterator;
-<a name="l00307"></a>00307 
-<a name="l00308"></a>00308     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00309"></a>00309     <span class="comment">// The iterators are intended only for debugging.  They are slow and not thread safe.</span>
-<a name="l00310"></a>00310     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00311"></a>00311     iterator unsafe_begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>);}
-<a name="l00312"></a>00312     iterator unsafe_end() {<span class="keywordflow">return</span> iterator();}
-<a name="l00313"></a>00313     const_iterator unsafe_begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>);}
-<a name="l00314"></a>00314     const_iterator unsafe_end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator();}
-<a name="l00315"></a>00315 
-<a name="l00316"></a>00316 }; 
-<a name="l00317"></a>00317 
-<a name="l00318"></a>00318 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00319"></a><a class="code" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">00319</a> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::~concurrent_bounded_queue</a>() {
-<a name="l00320"></a>00320     <a class="code" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>();
-<a name="l00321"></a>00321     internal_finish_clear();
-<a name="l00322"></a>00322 }
-<a name="l00323"></a>00323 
-<a name="l00324"></a>00324 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00325"></a><a class="code" href="a00230.html#90b31e2954c6e4596c7900435a5f4bc1">00325</a> <span class="keywordtype">void</span> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::clear</a>() {
-<a name="l00326"></a>00326     <span class="keywordflow">while</span>( !<a class="code" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() ) {
-<a name="l00327"></a>00327         T value;
-<a name="l00328"></a>00328         internal_pop_if_present(&value);
-<a name="l00329"></a>00329     }
-<a name="l00330"></a>00330 }
-<a name="l00331"></a>00331 
-<a name="l00332"></a>00332 <span class="keyword">namespace </span>deprecated {
-<a name="l00333"></a>00333 
-<a name="l00335"></a>00335 
-<a name="l00340"></a>00340 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> > 
-<a name="l00341"></a><a class="code" href="a00237.html">00341</a> <span class="keyword">class </span><a class="code" href="a00237.html">concurrent_queue</a>: <span class="keyword">public</span> <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A> {
-<a name="l00342"></a>00342 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
-<a name="l00343"></a>00343 <span class="preprocessor"></span>    <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
-<a name="l00344"></a>00344 <span class="preprocessor">#endif </span>
-<a name="l00345"></a>00345 <span class="preprocessor"></span>
-<a name="l00346"></a>00346 <span class="keyword">public</span>:
-<a name="l00348"></a><a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">00348</a>     <span class="keyword">explicit</span> <a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(<span class="keyword">const</span> A& a = A()) : 
-<a name="l00349"></a>00349         <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A>( a )
-<a name="l00350"></a>00350     {
-<a name="l00351"></a>00351     }
-<a name="l00352"></a>00352 
-<a name="l00354"></a><a class="code" href="a00237.html#fc092b9082f233482f3513fc3bb670f7">00354</a>     <a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00237.html">concurrent_queue</a>& src, <span class="keyword">const</span> A& a = A()) : 
-<a name="l00355"></a>00355         <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A>( src, a )
-<a name="l00356"></a>00356     {
-<a name="l00357"></a>00357     }
-<a name="l00358"></a>00358 
-<a name="l00360"></a>00360     <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator>
-<a name="l00361"></a><a class="code" href="a00237.html#9102b897776bd2d9e908e6604ff16b5f">00361</a>     <a class="code" href="a00237.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( InputIterator b <span class="comment">/*begin*/</span>, InputIterator e <span class="comment">/*end*/</span>, <span class="keyword">const</span> A& a = A()) :
-<a name="l00362"></a>00362         <a class="code" href="a00230.html">concurrent_bounded_queue</a><T,A>( b, e, a )
-<a name="l00363"></a>00363     {
-<a name="l00364"></a>00364     }
-<a name="l00365"></a>00365 
-<a name="l00367"></a>00367 
-<a name="l00369"></a><a class="code" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">00369</a>     <span class="keywordtype">bool</span> <a class="code" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>( <span class="keyword">const</span> T& source ) {
-<a name="l00370"></a>00370         <span class="keywordflow">return</span> this-><a class="code" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( source );
-<a name="l00371"></a>00371     }
-<a name="l00372"></a>00372 
-<a name="l00374"></a>00374 
-<a name="l00378"></a><a class="code" href="a00237.html#48da3536245318af6cb5fd58bac78039">00378</a>     <span class="keywordtype">bool</span> <a class="code" href="a00237.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>( T& destination ) {
-<a name="l00379"></a>00379         <span class="keywordflow">return</span> this-><a class="code" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( destination );
-<a name="l00380"></a>00380     }
-<a name="l00381"></a>00381 
-<a name="l00382"></a>00382     <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::iterator</a> iterator;
-<a name="l00383"></a>00383     <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00230.html">concurrent_bounded_queue<T,A>::const_iterator</a> const_iterator;
-<a name="l00384"></a>00384     <span class="comment">//</span>
-<a name="l00385"></a>00385     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00386"></a>00386     <span class="comment">// The iterators are intended only for debugging.  They are slow and not thread safe.</span>
-<a name="l00387"></a>00387     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00388"></a>00388     iterator begin() {<span class="keywordflow">return</span> this->unsafe_begin();}
-<a name="l00389"></a>00389     iterator end() {<span class="keywordflow">return</span> this->unsafe_end();}
-<a name="l00390"></a>00390     const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->unsafe_begin();}
-<a name="l00391"></a>00391     const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this->unsafe_end();}
-<a name="l00392"></a>00392 }; 
-<a name="l00393"></a>00393 
-<a name="l00394"></a>00394 }
-<a name="l00395"></a>00395     
-<a name="l00396"></a>00396 
-<a name="l00397"></a>00397 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00398"></a>00398 <span class="preprocessor"></span><span class="keyword">using</span> deprecated::concurrent_queue;
-<a name="l00399"></a>00399 <span class="preprocessor">#else</span>
-<a name="l00400"></a>00400 <span class="preprocessor"></span><span class="keyword">using</span> strict_ppl::concurrent_queue;    
-<a name="l00401"></a>00401 <span class="preprocessor">#endif</span>
-<a name="l00402"></a>00402 <span class="preprocessor"></span>
-<a name="l00403"></a>00403 } <span class="comment">// namespace tbb</span>
-<a name="l00404"></a>00404 
-<a name="l00405"></a>00405 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_queue_H */</span>
+<a name="l00220"></a>00220 <span class="preprocessor">#endif// __TBB_concurrent_unordered_map_H</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00437.html b/doc/html/a00437.html
deleted file mode 100644
index d686a92..0000000
--- a/doc/html/a00437.html
+++ /dev/null
@@ -1,263 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_unordered_map.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>concurrent_unordered_map.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="comment">/* Container implementations in this header are based on PPL implementations</span>
-<a name="l00022"></a>00022 <span class="comment">   provided by Microsoft. */</span>
-<a name="l00023"></a>00023 
-<a name="l00024"></a>00024 <span class="preprocessor">#ifndef __TBB_concurrent_unordered_map_H</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_unordered_map_H</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "_concurrent_unordered_internal.h"</span>
-<a name="l00028"></a>00028 
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb
-<a name="l00030"></a>00030 {
-<a name="l00031"></a>00031 
-<a name="l00032"></a>00032 <span class="comment">// Template class for hash compare</span>
-<a name="l00033"></a>00033 <span class="keyword">template</span><<span class="keyword">typename</span> Key>
-<a name="l00034"></a>00034 <span class="keyword">class </span>tbb_hash
-<a name="l00035"></a>00035 {
-<a name="l00036"></a>00036 <span class="keyword">public</span>:
-<a name="l00037"></a>00037     tbb_hash() {}
-<a name="l00038"></a>00038 
-<a name="l00039"></a>00039     size_t operator()(<span class="keyword">const</span> Key& key)<span class="keyword"> const</span>
-<a name="l00040"></a>00040 <span class="keyword">    </span>{
-<a name="l00041"></a>00041         <span class="keywordflow">return</span> tbb_hasher(key);
-<a name="l00042"></a>00042     }
-<a name="l00043"></a>00043 };
-<a name="l00044"></a>00044 
-<a name="l00045"></a>00045 <span class="keyword">namespace </span>interface5 {
-<a name="l00046"></a>00046 
-<a name="l00047"></a>00047 <span class="comment">// Template class for hash map traits</span>
-<a name="l00048"></a>00048 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> Hash_compare, <span class="keyword">typename</span> Allocator, <span class="keywordtype">bool</span> Allow_multimapping>
-<a name="l00049"></a>00049 <span class="keyword">class </span>concurrent_unordered_map_traits
-<a name="l00050"></a>00050 {
-<a name="l00051"></a>00051 <span class="keyword">protected</span>:
-<a name="l00052"></a>00052     <span class="keyword">typedef</span> std::pair<const Key, T> value_type;
-<a name="l00053"></a>00053     <span class="keyword">typedef</span> Key key_type;
-<a name="l00054"></a>00054     <span class="keyword">typedef</span> Hash_compare hash_compare;
-<a name="l00055"></a>00055     <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<value_type>::other allocator_type;
-<a name="l00056"></a>00056     <span class="keyword">enum</span> { allow_multimapping = Allow_multimapping };
-<a name="l00057"></a>00057 
-<a name="l00058"></a>00058     concurrent_unordered_map_traits() : my_hash_compare() {}
-<a name="l00059"></a>00059     concurrent_unordered_map_traits(<span class="keyword">const</span> hash_compare& hc) : my_hash_compare(hc) {}
-<a name="l00060"></a>00060 
-<a name="l00061"></a>00061     <span class="keyword">class </span>value_compare : <span class="keyword">public</span> std::binary_function<value_type, value_type, bool>
-<a name="l00062"></a>00062     {
-<a name="l00063"></a>00063         <span class="keyword">friend</span> <span class="keyword">class </span>concurrent_unordered_map_traits<Key, T, Hash_compare, Allocator, Allow_multimapping>;
-<a name="l00064"></a>00064 
-<a name="l00065"></a>00065     <span class="keyword">public</span>:
-<a name="l00066"></a>00066         <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> value_type& left, <span class="keyword">const</span> value_type& right)<span class="keyword"> const</span>
-<a name="l00067"></a>00067 <span class="keyword">        </span>{
-<a name="l00068"></a>00068             <span class="keywordflow">return</span> (my_hash_compare(left.first, right.first));
-<a name="l00069"></a>00069         }
-<a name="l00070"></a>00070 
-<a name="l00071"></a>00071         value_compare(<span class="keyword">const</span> hash_compare& comparator) : my_hash_compare(comparator) {}
-<a name="l00072"></a>00072 
-<a name="l00073"></a>00073     <span class="keyword">protected</span>:
-<a name="l00074"></a>00074         hash_compare my_hash_compare;    <span class="comment">// the comparator predicate for keys</span>
-<a name="l00075"></a>00075     };
-<a name="l00076"></a>00076 
-<a name="l00077"></a>00077     <span class="keyword">template</span><<span class="keyword">class</span> Type1, <span class="keyword">class</span> Type2>
-<a name="l00078"></a>00078     <span class="keyword">static</span> <span class="keyword">const</span> Key& get_key(<span class="keyword">const</span> std::pair<Type1, Type2>& value) {
-<a name="l00079"></a>00079         <span class="keywordflow">return</span> (value.first);
-<a name="l00080"></a>00080     }
-<a name="l00081"></a>00081 
-<a name="l00082"></a>00082     hash_compare my_hash_compare; <span class="comment">// the comparator predicate for keys</span>
-<a name="l00083"></a>00083 };
-<a name="l00084"></a>00084 
-<a name="l00085"></a>00085 <span class="keyword">template</span> <<span class="keyword">typename</span> Key, <span class="keyword">typename</span> T, <span class="keyword">typename</span> Hasher = tbb_hash<Key>, <span class="keyword">typename</span> Key_equality = std::equal_to<Key>, <span class="keyword">typename</span> Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >
-<a name="l00086"></a>00086 <span class="keyword">class </span>concurrent_unordered_map : <span class="keyword">public</span> internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >
-<a name="l00087"></a>00087 {
-<a name="l00088"></a>00088     <span class="comment">// Base type definitions</span>
-<a name="l00089"></a>00089     <span class="keyword">typedef</span> internal::hash_compare<Key, Hasher, Key_equality> hash_compare;
-<a name="l00090"></a>00090     <span class="keyword">typedef</span> internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, hash_compare, Allocator, false> > base_type;
-<a name="l00091"></a>00091     <span class="keyword">typedef</span> concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, <span class="keyword">false</span>> traits_type;
-<a name="l00092"></a>00092     <span class="keyword">using</span> traits_type::my_hash_compare;
-<a name="l00093"></a>00093 <span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
-<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="keyword">public</span>:
-<a name="l00095"></a>00095 <span class="preprocessor">#endif</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span>    <span class="keyword">using</span> traits_type::allow_multimapping;
-<a name="l00097"></a>00097 <span class="keyword">public</span>:
-<a name="l00098"></a>00098     <span class="keyword">using</span> base_type::end;
-<a name="l00099"></a>00099     <span class="keyword">using</span> base_type::find;
-<a name="l00100"></a>00100     <span class="keyword">using</span> base_type::insert;
-<a name="l00101"></a>00101 
-<a name="l00102"></a>00102     <span class="comment">// Type definitions</span>
-<a name="l00103"></a>00103     <span class="keyword">typedef</span> Key key_type;
-<a name="l00104"></a>00104     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::value_type value_type;
-<a name="l00105"></a>00105     <span class="keyword">typedef</span> T mapped_type;
-<a name="l00106"></a>00106     <span class="keyword">typedef</span> Hasher hasher;
-<a name="l00107"></a>00107     <span class="keyword">typedef</span> Key_equality key_equal;
-<a name="l00108"></a>00108     <span class="keyword">typedef</span> hash_compare key_compare;
-<a name="l00109"></a>00109 
-<a name="l00110"></a>00110     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::allocator_type allocator_type;
-<a name="l00111"></a>00111     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::pointer pointer;
-<a name="l00112"></a>00112     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_pointer const_pointer;
-<a name="l00113"></a>00113     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::reference reference;
-<a name="l00114"></a>00114     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_reference const_reference;
-<a name="l00115"></a>00115 
-<a name="l00116"></a>00116     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::size_type size_type;
-<a name="l00117"></a>00117     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::difference_type difference_type;
-<a name="l00118"></a>00118 
-<a name="l00119"></a>00119     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator iterator;
-<a name="l00120"></a>00120     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_iterator;
-<a name="l00121"></a>00121     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator local_iterator;
-<a name="l00122"></a>00122     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_local_iterator;
-<a name="l00123"></a>00123 
-<a name="l00124"></a>00124     <span class="comment">// Construction/destruction/copying</span>
-<a name="l00125"></a>00125     <span class="keyword">explicit</span> concurrent_unordered_map(size_type n_of_buckets = 8, <span class="keyword">const</span> hasher& a_hasher = hasher(),
-<a name="l00126"></a>00126         <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00127"></a>00127         : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
-<a name="l00128"></a>00128     {
-<a name="l00129"></a>00129     }
-<a name="l00130"></a>00130 
-<a name="l00131"></a>00131     concurrent_unordered_map(<span class="keyword">const</span> Allocator& a) : base_type(8, key_compare(), a)
-<a name="l00132"></a>00132     {
-<a name="l00133"></a>00133     }
-<a name="l00134"></a>00134 
-<a name="l00135"></a>00135     <span class="keyword">template</span> <<span class="keyword">typename</span> Iterator>
-<a name="l00136"></a>00136     concurrent_unordered_map(Iterator first, Iterator last, size_type n_of_buckets = 8, <span class="keyword">const</span> hasher& a_hasher = hasher(),
-<a name="l00137"></a>00137         <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00138"></a>00138         : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
-<a name="l00139"></a>00139     {
-<a name="l00140"></a>00140         <span class="keywordflow">for</span> (; first != last; ++first)
-<a name="l00141"></a>00141             base_type::insert(*first);
-<a name="l00142"></a>00142     }
-<a name="l00143"></a>00143 
-<a name="l00144"></a>00144     concurrent_unordered_map(<span class="keyword">const</span> concurrent_unordered_map& table) : base_type(table)
-<a name="l00145"></a>00145     {
-<a name="l00146"></a>00146     }
-<a name="l00147"></a>00147 
-<a name="l00148"></a>00148     concurrent_unordered_map(<span class="keyword">const</span> concurrent_unordered_map& table, <span class="keyword">const</span> Allocator& a)
-<a name="l00149"></a>00149         : base_type(table, a)
-<a name="l00150"></a>00150     {
-<a name="l00151"></a>00151     }
-<a name="l00152"></a>00152 
-<a name="l00153"></a>00153     concurrent_unordered_map& operator=(<span class="keyword">const</span> concurrent_unordered_map& table)
-<a name="l00154"></a>00154     {
-<a name="l00155"></a>00155         base_type::operator=(table);
-<a name="l00156"></a>00156         <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
-<a name="l00157"></a>00157     }
-<a name="l00158"></a>00158 
-<a name="l00159"></a>00159     iterator unsafe_erase(const_iterator where)
-<a name="l00160"></a>00160     {
-<a name="l00161"></a>00161         <span class="keywordflow">return</span> base_type::unsafe_erase(where);
-<a name="l00162"></a>00162     }
-<a name="l00163"></a>00163 
-<a name="l00164"></a>00164     size_type unsafe_erase(<span class="keyword">const</span> key_type& key)
-<a name="l00165"></a>00165     {
-<a name="l00166"></a>00166         <span class="keywordflow">return</span> base_type::unsafe_erase(key);
-<a name="l00167"></a>00167     }
-<a name="l00168"></a>00168 
-<a name="l00169"></a>00169     iterator unsafe_erase(const_iterator first, const_iterator last)
-<a name="l00170"></a>00170     {
-<a name="l00171"></a>00171         <span class="keywordflow">return</span> base_type::unsafe_erase(first, last);
-<a name="l00172"></a>00172     }
-<a name="l00173"></a>00173 
-<a name="l00174"></a>00174     <span class="keywordtype">void</span> swap(concurrent_unordered_map& table)
-<a name="l00175"></a>00175     {
-<a name="l00176"></a>00176         base_type::swap(table);
-<a name="l00177"></a>00177     }
-<a name="l00178"></a>00178 
-<a name="l00179"></a>00179     <span class="comment">// Observers</span>
-<a name="l00180"></a>00180     hasher hash_function()<span class="keyword"> const</span>
-<a name="l00181"></a>00181 <span class="keyword">    </span>{
-<a name="l00182"></a>00182         <span class="keywordflow">return</span> my_hash_compare.my_hash_object;
-<a name="l00183"></a>00183     }
-<a name="l00184"></a>00184 
-<a name="l00185"></a>00185     key_equal key_eq()<span class="keyword"> const</span>
-<a name="l00186"></a>00186 <span class="keyword">    </span>{
-<a name="l00187"></a>00187         <span class="keywordflow">return</span> my_hash_compare.my_key_compare_object;
-<a name="l00188"></a>00188     }
-<a name="l00189"></a>00189 
-<a name="l00190"></a>00190     mapped_type& operator[](<span class="keyword">const</span> key_type& key)
-<a name="l00191"></a>00191     {
-<a name="l00192"></a>00192         iterator where = find(key);
-<a name="l00193"></a>00193 
-<a name="l00194"></a>00194         <span class="keywordflow">if</span> (where == end())
-<a name="l00195"></a>00195         {
-<a name="l00196"></a>00196             where = insert(std::pair<key_type, mapped_type>(key, mapped_type())).first;
-<a name="l00197"></a>00197         }
-<a name="l00198"></a>00198 
-<a name="l00199"></a>00199         <span class="keywordflow">return</span> ((*where).second);
-<a name="l00200"></a>00200     }
-<a name="l00201"></a>00201 
-<a name="l00202"></a>00202     mapped_type& at(<span class="keyword">const</span> key_type& key)
-<a name="l00203"></a>00203     {
-<a name="l00204"></a>00204         iterator where = find(key);
-<a name="l00205"></a>00205 
-<a name="l00206"></a>00206         <span class="keywordflow">if</span> (where == end())
-<a name="l00207"></a>00207         {
-<a name="l00208"></a>00208             tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
-<a name="l00209"></a>00209         }
-<a name="l00210"></a>00210 
-<a name="l00211"></a>00211         <span class="keywordflow">return</span> ((*where).second);
-<a name="l00212"></a>00212     }
-<a name="l00213"></a>00213 
-<a name="l00214"></a>00214     <span class="keyword">const</span> mapped_type& at(<span class="keyword">const</span> key_type& key)<span class="keyword"> const</span>
-<a name="l00215"></a>00215 <span class="keyword">    </span>{
-<a name="l00216"></a>00216         const_iterator where = find(key);
-<a name="l00217"></a>00217 
-<a name="l00218"></a>00218         <span class="keywordflow">if</span> (where == end())
-<a name="l00219"></a>00219         {
-<a name="l00220"></a>00220             tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
-<a name="l00221"></a>00221         }
-<a name="l00222"></a>00222 
-<a name="l00223"></a>00223         <span class="keywordflow">return</span> ((*where).second);
-<a name="l00224"></a>00224     }
-<a name="l00225"></a>00225 };
-<a name="l00226"></a>00226 
-<a name="l00227"></a>00227 } <span class="comment">// namespace interface5</span>
-<a name="l00228"></a>00228 
-<a name="l00229"></a>00229 <span class="keyword">using</span> interface5::concurrent_unordered_map;
-<a name="l00230"></a>00230 
-<a name="l00231"></a>00231 } <span class="comment">// namespace tbb</span>
-<a name="l00232"></a>00232 
-<a name="l00233"></a>00233 <span class="preprocessor">#endif// __TBB_concurrent_unordered_map_H</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00440.html b/doc/html/a00440.html
new file mode 100644
index 0000000..d332046
--- /dev/null
+++ b/doc/html/a00440.html
@@ -0,0 +1,199 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>concurrent_unordered_set.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="files.html"><span>File List</span></a></li>
+    <li><a href="globals.html"><span>File Members</span></a></li>
+  </ul></div>
+<h1>concurrent_unordered_set.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
+<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment">    writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020 
+<a name="l00021"></a>00021 <span class="comment">/* Container implementations in this header are based on PPL implementations</span>
+<a name="l00022"></a>00022 <span class="comment">   provided by Microsoft. */</span>
+<a name="l00023"></a>00023 
+<a name="l00024"></a>00024 <span class="preprocessor">#ifndef __TBB_concurrent_unordered_set_H</span>
+<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_unordered_set_H</span>
+<a name="l00026"></a>00026 <span class="preprocessor"></span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include "internal/_concurrent_unordered_impl.h"</span>
+<a name="l00028"></a>00028 
+<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb
+<a name="l00030"></a>00030 {
+<a name="l00031"></a>00031 
+<a name="l00032"></a>00032 <span class="keyword">namespace </span>interface5 {
+<a name="l00033"></a>00033 
+<a name="l00034"></a>00034 <span class="comment">// Template class for hash set traits</span>
+<a name="l00035"></a>00035 <span class="keyword">template</span><<span class="keyword">typename</span> Key, <span class="keyword">typename</span> Hash_compare, <span class="keyword">typename</span> Allocator, <span class="keywordtype">bool</span> Allow_multimapping>
+<a name="l00036"></a>00036 <span class="keyword">class </span>concurrent_unordered_set_traits
+<a name="l00037"></a>00037 {
+<a name="l00038"></a>00038 <span class="keyword">protected</span>:
+<a name="l00039"></a>00039     <span class="keyword">typedef</span> Key value_type;
+<a name="l00040"></a>00040     <span class="keyword">typedef</span> Key key_type;
+<a name="l00041"></a>00041     <span class="keyword">typedef</span> Hash_compare hash_compare;
+<a name="l00042"></a>00042     <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind<value_type>::other allocator_type;
+<a name="l00043"></a>00043     <span class="keyword">enum</span> { allow_multimapping = Allow_multimapping };
+<a name="l00044"></a>00044 
+<a name="l00045"></a>00045     concurrent_unordered_set_traits() : my_hash_compare() {}
+<a name="l00046"></a>00046     concurrent_unordered_set_traits(<span class="keyword">const</span> hash_compare& hc) : my_hash_compare(hc) {}
+<a name="l00047"></a>00047 
+<a name="l00048"></a>00048     <span class="keyword">typedef</span> hash_compare value_compare;
+<a name="l00049"></a>00049 
+<a name="l00050"></a>00050     <span class="keyword">static</span> <span class="keyword">const</span> Key& get_key(<span class="keyword">const</span> value_type& value) {
+<a name="l00051"></a>00051         <span class="keywordflow">return</span> value;
+<a name="l00052"></a>00052     }
+<a name="l00053"></a>00053 
+<a name="l00054"></a>00054     hash_compare my_hash_compare; <span class="comment">// the comparator predicate for keys</span>
+<a name="l00055"></a>00055 };
+<a name="l00056"></a>00056 
+<a name="l00057"></a>00057 <span class="keyword">template</span> <<span class="keyword">typename</span> Key, <span class="keyword">typename</span> Hasher = tbb::tbb_hash<Key>, <span class="keyword">typename</span> Key_equality = std::equal_to<Key>, <span class="keyword">typename</span> Allocator = tbb::tbb_allocator<Key> >
+<a name="l00058"></a>00058 <span class="keyword">class </span>concurrent_unordered_set : <span class="keyword">public</span> internal::concurrent_unordered_base< concurrent_unordered_set_traits<Key, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >
+<a name="l00059"></a>00059 {
+<a name="l00060"></a>00060     <span class="comment">// Base type definitions</span>
+<a name="l00061"></a>00061     <span class="keyword">typedef</span> internal::hash_compare<Key, Hasher, Key_equality> hash_compare;
+<a name="l00062"></a>00062     <span class="keyword">typedef</span> internal::concurrent_unordered_base< concurrent_unordered_set_traits<Key, hash_compare, Allocator, false> > base_type;
+<a name="l00063"></a>00063     <span class="keyword">typedef</span> concurrent_unordered_set_traits<Key, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, <span class="keyword">false</span>> traits_type;
+<a name="l00064"></a>00064     <span class="keyword">using</span> traits_type::my_hash_compare;
+<a name="l00065"></a>00065 <span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
+<a name="l00066"></a>00066 <span class="preprocessor"></span><span class="keyword">public</span>:
+<a name="l00067"></a>00067 <span class="preprocessor">#endif</span>
+<a name="l00068"></a>00068 <span class="preprocessor"></span>    <span class="keyword">using</span> traits_type::allow_multimapping;
+<a name="l00069"></a>00069 <span class="keyword">public</span>:
+<a name="l00070"></a>00070     <span class="keyword">using</span> base_type::end;
+<a name="l00071"></a>00071     <span class="keyword">using</span> base_type::find;
+<a name="l00072"></a>00072     <span class="keyword">using</span> base_type::insert;
+<a name="l00073"></a>00073 
+<a name="l00074"></a>00074     <span class="comment">// Type definitions</span>
+<a name="l00075"></a>00075     <span class="keyword">typedef</span> Key key_type;
+<a name="l00076"></a>00076     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::value_type value_type;
+<a name="l00077"></a>00077     <span class="keyword">typedef</span> Key mapped_type;
+<a name="l00078"></a>00078     <span class="keyword">typedef</span> Hasher hasher;
+<a name="l00079"></a>00079     <span class="keyword">typedef</span> Key_equality key_equal;
+<a name="l00080"></a>00080     <span class="keyword">typedef</span> hash_compare key_compare;
+<a name="l00081"></a>00081 
+<a name="l00082"></a>00082     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::allocator_type allocator_type;
+<a name="l00083"></a>00083     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::pointer pointer;
+<a name="l00084"></a>00084     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_pointer const_pointer;
+<a name="l00085"></a>00085     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::reference reference;
+<a name="l00086"></a>00086     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_reference const_reference;
+<a name="l00087"></a>00087 
+<a name="l00088"></a>00088     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::size_type size_type;
+<a name="l00089"></a>00089     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::difference_type difference_type;
+<a name="l00090"></a>00090 
+<a name="l00091"></a>00091     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator iterator;
+<a name="l00092"></a>00092     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_iterator;
+<a name="l00093"></a>00093     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::iterator local_iterator;
+<a name="l00094"></a>00094     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::const_iterator const_local_iterator;
+<a name="l00095"></a>00095 
+<a name="l00096"></a>00096     <span class="comment">// Construction/destruction/copying</span>
+<a name="l00097"></a>00097     <span class="keyword">explicit</span> concurrent_unordered_set(size_type n_of_buckets = 8, <span class="keyword">const</span> hasher& a_hasher = hasher(),
+<a name="l00098"></a>00098         <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
+<a name="l00099"></a>00099         : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
+<a name="l00100"></a>00100     {
+<a name="l00101"></a>00101     }
+<a name="l00102"></a>00102 
+<a name="l00103"></a>00103     concurrent_unordered_set(<span class="keyword">const</span> Allocator& a) : base_type(8, key_compare(), a)
+<a name="l00104"></a>00104     {
+<a name="l00105"></a>00105     }
+<a name="l00106"></a>00106 
+<a name="l00107"></a>00107     <span class="keyword">template</span> <<span class="keyword">typename</span> Iterator>
+<a name="l00108"></a>00108     concurrent_unordered_set(Iterator first, Iterator last, size_type n_of_buckets = 8, <span class="keyword">const</span> hasher& a_hasher = hasher(),
+<a name="l00109"></a>00109         <span class="keyword">const</span> key_equal& a_keyeq = key_equal(), <span class="keyword">const</span> allocator_type& a = allocator_type())
+<a name="l00110"></a>00110         : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
+<a name="l00111"></a>00111     {
+<a name="l00112"></a>00112         <span class="keywordflow">for</span> (; first != last; ++first)
+<a name="l00113"></a>00113             base_type::insert(*first);
+<a name="l00114"></a>00114     }
+<a name="l00115"></a>00115 
+<a name="l00116"></a>00116     concurrent_unordered_set(<span class="keyword">const</span> concurrent_unordered_set& table) : base_type(table)
+<a name="l00117"></a>00117     {
+<a name="l00118"></a>00118     }
+<a name="l00119"></a>00119 
+<a name="l00120"></a>00120     concurrent_unordered_set(<span class="keyword">const</span> concurrent_unordered_set& table, <span class="keyword">const</span> Allocator& a)
+<a name="l00121"></a>00121         : base_type(table, a)
+<a name="l00122"></a>00122     {
+<a name="l00123"></a>00123     }
+<a name="l00124"></a>00124 
+<a name="l00125"></a>00125     concurrent_unordered_set& operator=(<span class="keyword">const</span> concurrent_unordered_set& table)
+<a name="l00126"></a>00126     {
+<a name="l00127"></a>00127         base_type::operator=(table);
+<a name="l00128"></a>00128         <span class="keywordflow">return</span> (*<span class="keyword">this</span>);
+<a name="l00129"></a>00129     }
+<a name="l00130"></a>00130 
+<a name="l00131"></a>00131     iterator unsafe_erase(const_iterator where)
+<a name="l00132"></a>00132     {
+<a name="l00133"></a>00133         <span class="keywordflow">return</span> base_type::unsafe_erase(where);
+<a name="l00134"></a>00134     }
+<a name="l00135"></a>00135 
+<a name="l00136"></a>00136     size_type unsafe_erase(<span class="keyword">const</span> key_type& key)
+<a name="l00137"></a>00137     {
+<a name="l00138"></a>00138         <span class="keywordflow">return</span> base_type::unsafe_erase(key);
+<a name="l00139"></a>00139     }
+<a name="l00140"></a>00140 
+<a name="l00141"></a>00141     iterator unsafe_erase(const_iterator first, const_iterator last)
+<a name="l00142"></a>00142     {
+<a name="l00143"></a>00143         <span class="keywordflow">return</span> base_type::unsafe_erase(first, last);
+<a name="l00144"></a>00144     }
+<a name="l00145"></a>00145 
+<a name="l00146"></a>00146     <span class="keywordtype">void</span> swap(concurrent_unordered_set& table)
+<a name="l00147"></a>00147     {
+<a name="l00148"></a>00148         base_type::swap(table);
+<a name="l00149"></a>00149     }
+<a name="l00150"></a>00150 
+<a name="l00151"></a>00151     <span class="comment">// Observers</span>
+<a name="l00152"></a>00152     hasher hash_function()<span class="keyword"> const</span>
+<a name="l00153"></a>00153 <span class="keyword">    </span>{
+<a name="l00154"></a>00154         <span class="keywordflow">return</span> my_hash_compare.my_hash_object;
+<a name="l00155"></a>00155     }
+<a name="l00156"></a>00156 
+<a name="l00157"></a>00157     key_equal key_eq()<span class="keyword"> const</span>
+<a name="l00158"></a>00158 <span class="keyword">    </span>{
+<a name="l00159"></a>00159         <span class="keywordflow">return</span> my_hash_compare.my_key_compare_object;
+<a name="l00160"></a>00160     }
+<a name="l00161"></a>00161 };
+<a name="l00162"></a>00162 
+<a name="l00163"></a>00163 } <span class="comment">// namespace interface5</span>
+<a name="l00164"></a>00164 
+<a name="l00165"></a>00165 <span class="keyword">using</span> interface5::concurrent_unordered_set;
+<a name="l00166"></a>00166 
+<a name="l00167"></a>00167 } <span class="comment">// namespace tbb</span>
+<a name="l00168"></a>00168 
+<a name="l00169"></a>00169 <span class="preprocessor">#endif// __TBB_concurrent_unordered_set_H</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00442.html b/doc/html/a00442.html
deleted file mode 100644
index 976fb09..0000000
--- a/doc/html/a00442.html
+++ /dev/null
@@ -1,926 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>concurrent_vector.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>concurrent_vector.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_vector_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_vector_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_exception.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "tbb_machine.h"</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include <new></span>
-<a name="l00032"></a>00032 
-<a name="l00033"></a>00033 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span>    <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00035"></a>00035 <span class="preprocessor">    #pragma warning (push)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4530)</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span>
-<a name="l00039"></a>00039 <span class="preprocessor">#include <algorithm></span>
-<a name="l00040"></a>00040 <span class="preprocessor">#include <iterator></span>
-<a name="l00041"></a>00041 
-<a name="l00042"></a>00042 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span>
-<a name="l00046"></a>00046 <span class="preprocessor">#if _MSC_VER==1500 && !__INTEL_COMPILER</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span>    <span class="comment">// VS2008/VC9 seems to have an issue; limits pull in math.h</span>
-<a name="l00048"></a>00048 <span class="preprocessor">    #pragma warning( push )</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning( disable: 4985 )</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#include <limits></span> <span class="comment">/* std::numeric_limits */</span>
-<a name="l00052"></a>00052 <span class="preprocessor">#if _MSC_VER==1500 && !__INTEL_COMPILER</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning( pop )</span>
-<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span>
-<a name="l00056"></a>00056 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span>    <span class="comment">// Workaround for overzealous compiler warnings in /Wp64 mode</span>
-<a name="l00058"></a>00058 <span class="preprocessor">    #pragma warning (push)</span>
-<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4267)</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span>
-<a name="l00062"></a>00062 <span class="keyword">namespace </span>tbb {
-<a name="l00063"></a>00063 
-<a name="l00064"></a>00064 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
-<a name="l00065"></a>00065 <span class="keyword">class </span>concurrent_vector;
-<a name="l00066"></a>00066 
-<a name="l00068"></a>00068 <span class="keyword">namespace </span>internal {
-<a name="l00069"></a>00069 
-<a name="l00071"></a>00071     <span class="keyword">static</span> <span class="keywordtype">void</span> *<span class="keyword">const</span> vector_allocation_error_flag = reinterpret_cast<void*>(size_t(63));
-<a name="l00072"></a>00072 
-<a name="l00074"></a>00074 
-<a name="l00075"></a>00075     <span class="keyword">class </span>concurrent_vector_base_v3 {
-<a name="l00076"></a>00076     <span class="keyword">protected</span>:
-<a name="l00077"></a>00077 
-<a name="l00078"></a>00078         <span class="comment">// Basic types declarations</span>
-<a name="l00079"></a>00079         <span class="keyword">typedef</span> size_t segment_index_t;
-<a name="l00080"></a>00080         <span class="keyword">typedef</span> size_t size_type;
-<a name="l00081"></a>00081 
-<a name="l00082"></a>00082         <span class="comment">// Using enumerations due to Mac linking problems of static const variables</span>
-<a name="l00083"></a>00083         <span class="keyword">enum</span> {
-<a name="l00084"></a>00084             <span class="comment">// Size constants</span>
-<a name="l00085"></a>00085             default_initial_segments = 1, <span class="comment">// 2 initial items</span>
-<a name="l00087"></a>00087 <span class="comment"></span>            pointers_per_short_table = 3, <span class="comment">// to fit into 8 words of entire structure</span>
-<a name="l00088"></a>00088             pointers_per_long_table = <span class="keyword">sizeof</span>(segment_index_t) * 8 <span class="comment">// one segment per bit</span>
-<a name="l00089"></a>00089         };
-<a name="l00090"></a>00090 
-<a name="l00091"></a>00091         <span class="comment">// Segment pointer. Can be zero-initialized</span>
-<a name="l00092"></a>00092         <span class="keyword">struct </span>segment_t {
-<a name="l00093"></a>00093             <span class="keywordtype">void</span>* array;
-<a name="l00094"></a>00094 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00095"></a>00095 <span class="preprocessor"></span>            ~segment_t() {
-<a name="l00096"></a>00096                 __TBB_ASSERT( array <= internal::vector_allocation_error_flag, <span class="stringliteral">"should have been freed by clear"</span> );
-<a name="l00097"></a>00097             }
-<a name="l00098"></a>00098 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00099"></a>00099         };
-<a name="l00100"></a>00100  
-<a name="l00101"></a>00101         <span class="comment">// Data fields</span>
-<a name="l00102"></a>00102 
-<a name="l00104"></a>00104         <span class="keywordtype">void</span>* (*vector_allocator_ptr)(concurrent_vector_base_v3 &, size_t);
-<a name="l00105"></a>00105 
-<a name="l00107"></a>00107         atomic<size_type> my_first_block;
-<a name="l00108"></a>00108 
-<a name="l00110"></a>00110         atomic<size_type> my_early_size;
-<a name="l00111"></a>00111 
-<a name="l00113"></a>00113         atomic<segment_t*> my_segment;
-<a name="l00114"></a>00114 
-<a name="l00116"></a>00116         segment_t my_storage[pointers_per_short_table];
-<a name="l00117"></a>00117 
-<a name="l00118"></a>00118         <span class="comment">// Methods</span>
-<a name="l00119"></a>00119 
-<a name="l00120"></a>00120         concurrent_vector_base_v3() {
-<a name="l00121"></a>00121             my_early_size = 0;
-<a name="l00122"></a>00122             my_first_block = 0; <span class="comment">// here is not default_initial_segments</span>
-<a name="l00123"></a>00123             <span class="keywordflow">for</span>( segment_index_t i = 0; i < pointers_per_short_table; i++)
-<a name="l00124"></a>00124                 my_storage[i].array = NULL;
-<a name="l00125"></a>00125             my_segment = my_storage;
-<a name="l00126"></a>00126         }
-<a name="l00127"></a>00127         __TBB_EXPORTED_METHOD ~concurrent_vector_base_v3();
-<a name="l00128"></a>00128 
-<a name="l00129"></a>00129         <span class="keyword">static</span> segment_index_t segment_index_of( size_type index ) {
-<a name="l00130"></a>00130             <span class="keywordflow">return</span> segment_index_t( __TBB_Log2( index|1 ) );
-<a name="l00131"></a>00131         }
-<a name="l00132"></a>00132 
-<a name="l00133"></a>00133         <span class="keyword">static</span> segment_index_t segment_base( segment_index_t k ) {
-<a name="l00134"></a>00134             <span class="keywordflow">return</span> (segment_index_t(1)<<k & ~segment_index_t(1));
-<a name="l00135"></a>00135         }
-<a name="l00136"></a>00136 
-<a name="l00137"></a>00137         <span class="keyword">static</span> <span class="keyword">inline</span> segment_index_t segment_base_index_of( segment_index_t &index ) {
-<a name="l00138"></a>00138             segment_index_t k = segment_index_of( index );
-<a name="l00139"></a>00139             index -= segment_base(k);
-<a name="l00140"></a>00140             <span class="keywordflow">return</span> k;
-<a name="l00141"></a>00141         }
-<a name="l00142"></a>00142 
-<a name="l00143"></a>00143         <span class="keyword">static</span> size_type segment_size( segment_index_t k ) {
-<a name="l00144"></a>00144             <span class="keywordflow">return</span> segment_index_t(1)<<k; <span class="comment">// fake value for k==0</span>
-<a name="l00145"></a>00145         }
-<a name="l00146"></a>00146 
-<a name="l00148"></a>00148         <span class="keyword">typedef</span> void (__TBB_EXPORTED_FUNC *internal_array_op1)(<span class="keywordtype">void</span>* begin, size_type n );
-<a name="l00149"></a>00149 
-<a name="l00151"></a>00151         <span class="keyword">typedef</span> void (__TBB_EXPORTED_FUNC *internal_array_op2)(<span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
-<a name="l00152"></a>00152 
-<a name="l00154"></a>00154         <span class="keyword">struct </span>internal_segments_table {
-<a name="l00155"></a>00155             segment_index_t first_block;
-<a name="l00156"></a>00156             <span class="keywordtype">void</span>* table[pointers_per_long_table];
-<a name="l00157"></a>00157         };
-<a name="l00158"></a>00158 
-<a name="l00159"></a>00159         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_reserve( size_type n, size_type element_size, size_type max_size );
-<a name="l00160"></a>00160         size_type __TBB_EXPORTED_METHOD internal_capacity() <span class="keyword">const</span>;
-<a name="l00161"></a>00161         <span class="keywordtype">void</span> internal_grow( size_type start, size_type finish, size_type element_size, internal_array_op2 init, <span class="keyword">const</span> <span class="keywordtype">void</span> *src );
-<a name="l00162"></a>00162         size_type __TBB_EXPORTED_METHOD internal_grow_by( size_type delta, size_type element_size, internal_array_op2 init, <span class="keyword">const</span> <span class="keywordtype">void</span> *src );
-<a name="l00163"></a>00163         <span class="keywordtype">void</span>* __TBB_EXPORTED_METHOD internal_push_back( size_type element_size, size_type& index );
-<a name="l00164"></a>00164         segment_index_t __TBB_EXPORTED_METHOD internal_clear( internal_array_op1 destroy );
-<a name="l00165"></a>00165         <span class="keywordtype">void</span>* __TBB_EXPORTED_METHOD internal_compact( size_type element_size, <span class="keywordtype">void</span> *table, internal_array_op1 destroy, internal_array_op2 copy );
-<a name="l00166"></a>00166         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_copy( <span class="keyword">const</span> concurrent_vector_base_v3& src, size_type element_size, internal_array_op2 copy );
-<a name="l00167"></a>00167         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_assign( <span class="keyword">const</span> concurrent_vector_base_v3& src, size_type element_size,
-<a name="l00168"></a>00168                               internal_array_op1 destroy, internal_array_op2 assign, internal_array_op2 copy );
-<a name="l00170"></a>00170         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_throw_exception(size_type) <span class="keyword">const</span>;
-<a name="l00171"></a>00171         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_swap(concurrent_vector_base_v3& v);
-<a name="l00172"></a>00172 
-<a name="l00173"></a>00173         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_resize( size_type n, size_type element_size, size_type max_size, <span class="keyword">const</span> <span class="keywordtype">void</span> *src,
-<a name="l00174"></a>00174                                                     internal_array_op1 destroy, internal_array_op2 init );
-<a name="l00175"></a>00175         size_type __TBB_EXPORTED_METHOD internal_grow_to_at_least_with_result( size_type new_size, size_type element_size, internal_array_op2 init, <span class="keyword">const</span> <span class="keywordtype">void</span> *src );
-<a name="l00176"></a>00176 
-<a name="l00178"></a>00178         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_grow_to_at_least( size_type new_size, size_type element_size, internal_array_op2 init, <span class="keyword">const</span> <span class="keywordtype">void</span> *src );
-<a name="l00179"></a>00179 <span class="keyword">private</span>:
-<a name="l00181"></a>00181         <span class="keyword">class </span>helper;
-<a name="l00182"></a>00182         <span class="keyword">friend</span> <span class="keyword">class </span>helper;
-<a name="l00183"></a>00183     };
-<a name="l00184"></a>00184     
-<a name="l00185"></a>00185     <span class="keyword">typedef</span> concurrent_vector_base_v3 concurrent_vector_base;
-<a name="l00186"></a>00186 
-<a name="l00188"></a>00188 
-<a name="l00190"></a>00190     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
-<a name="l00191"></a>00191     <span class="keyword">class </span>vector_iterator 
-<a name="l00192"></a>00192     {
-<a name="l00194"></a>00194         Container* my_vector;
-<a name="l00195"></a>00195 
-<a name="l00197"></a>00197         size_t my_index;
-<a name="l00198"></a>00198 
-<a name="l00200"></a>00200 
-<a name="l00201"></a>00201         <span class="keyword">mutable</span> Value* my_item;
-<a name="l00202"></a>00202 
-<a name="l00203"></a>00203         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T>
-<a name="l00204"></a>00204         <span class="keyword">friend</span> vector_iterator<C,T> operator+( ptrdiff_t offset, <span class="keyword">const</span> vector_iterator<C,T>& v );
-<a name="l00205"></a>00205 
-<a name="l00206"></a>00206         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00207"></a>00207         <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> vector_iterator<C,T>& i, <span class="keyword">const</span> vector_iterator<C,U>& j );
-<a name="l00208"></a>00208 
-<a name="l00209"></a>00209         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00210"></a>00210         <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<( const vector_iterator<C,T>& i, <span class="keyword">const</span> vector_iterator<C,U>& j );
-<a name="l00211"></a>00211 
-<a name="l00212"></a>00212         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00213"></a>00213         <span class="keyword">friend</span> ptrdiff_t operator-( <span class="keyword">const</span> vector_iterator<C,T>& i, <span class="keyword">const</span> vector_iterator<C,U>& j );
-<a name="l00214"></a>00214     
-<a name="l00215"></a>00215         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00216"></a>00216         <span class="keyword">friend</span> <span class="keyword">class </span>internal::vector_iterator;
-<a name="l00217"></a>00217 
-<a name="l00218"></a>00218 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
-<a name="l00219"></a>00219 <span class="preprocessor"></span>        <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00220"></a>00220         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00238.html">tbb::concurrent_vector</a>;
-<a name="l00221"></a>00221 <span class="preprocessor">#else</span>
-<a name="l00222"></a>00222 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
-<a name="l00223"></a>00223 <span class="preprocessor">#endif </span>
-<a name="l00224"></a>00224 <span class="preprocessor"></span>
-<a name="l00225"></a>00225         vector_iterator( <span class="keyword">const</span> Container& vector, size_t index, <span class="keywordtype">void</span> *ptr = 0 ) : 
-<a name="l00226"></a>00226             my_vector(const_cast<Container*>(&vector)), 
-<a name="l00227"></a>00227             my_index(index), 
-<a name="l00228"></a>00228             my_item(static_cast<Value*>(ptr))
-<a name="l00229"></a>00229         {}
-<a name="l00230"></a>00230 
-<a name="l00231"></a>00231     <span class="keyword">public</span>:
-<a name="l00233"></a>00233         vector_iterator() : my_vector(NULL), my_index(~size_t(0)), my_item(NULL) {}
-<a name="l00234"></a>00234 
-<a name="l00235"></a>00235         vector_iterator( <span class="keyword">const</span> vector_iterator<Container,typename Container::value_type>& other ) :
-<a name="l00236"></a>00236             my_vector(other.my_vector),
-<a name="l00237"></a>00237             my_index(other.my_index),
-<a name="l00238"></a>00238             my_item(other.my_item)
-<a name="l00239"></a>00239         {}
-<a name="l00240"></a>00240 
-<a name="l00241"></a>00241         vector_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00242"></a>00242             <span class="keywordflow">return</span> vector_iterator( *my_vector, my_index+offset );
-<a name="l00243"></a>00243         }
-<a name="l00244"></a>00244         vector_iterator &operator+=( ptrdiff_t offset ) {
-<a name="l00245"></a>00245             my_index+=offset;
-<a name="l00246"></a>00246             my_item = NULL;
-<a name="l00247"></a>00247             <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00248"></a>00248         }
-<a name="l00249"></a>00249         vector_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00250"></a>00250             <span class="keywordflow">return</span> vector_iterator( *my_vector, my_index-offset );
-<a name="l00251"></a>00251         }
-<a name="l00252"></a>00252         vector_iterator &operator-=( ptrdiff_t offset ) {
-<a name="l00253"></a>00253             my_index-=offset;
-<a name="l00254"></a>00254             my_item = NULL;
-<a name="l00255"></a>00255             <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00256"></a>00256         }
-<a name="l00257"></a>00257         Value& operator*()<span class="keyword"> const </span>{
-<a name="l00258"></a>00258             Value* item = my_item;
-<a name="l00259"></a>00259             <span class="keywordflow">if</span>( !item ) {
-<a name="l00260"></a>00260                 item = my_item = &my_vector->internal_subscript(my_index);
-<a name="l00261"></a>00261             }
-<a name="l00262"></a>00262             __TBB_ASSERT( item==&my_vector->internal_subscript(my_index), <span class="stringliteral">"corrupt cache"</span> );
-<a name="l00263"></a>00263             <span class="keywordflow">return</span> *item;
-<a name="l00264"></a>00264         }
-<a name="l00265"></a>00265         Value& <a class="code" href="a00238.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>( ptrdiff_t k )<span class="keyword"> const </span>{
-<a name="l00266"></a>00266             <span class="keywordflow">return</span> my_vector->internal_subscript(my_index+k);
-<a name="l00267"></a>00267         }
-<a name="l00268"></a>00268         Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00269"></a>00269 
-<a name="l00271"></a>00271         vector_iterator& operator++() {
-<a name="l00272"></a>00272             size_t k = ++my_index;
-<a name="l00273"></a>00273             <span class="keywordflow">if</span>( my_item ) {
-<a name="l00274"></a>00274                 <span class="comment">// Following test uses 2's-complement wizardry</span>
-<a name="l00275"></a>00275                 <span class="keywordflow">if</span>( (k& (k-2))==0 ) {
-<a name="l00276"></a>00276                     <span class="comment">// k is a power of two that is at least k-2</span>
-<a name="l00277"></a>00277                     my_item= NULL;
-<a name="l00278"></a>00278                 } <span class="keywordflow">else</span> {
-<a name="l00279"></a>00279                     ++my_item;
-<a name="l00280"></a>00280                 }
-<a name="l00281"></a>00281             }
-<a name="l00282"></a>00282             <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00283"></a>00283         }
-<a name="l00284"></a>00284 
-<a name="l00286"></a>00286         vector_iterator& operator--() {
-<a name="l00287"></a>00287             __TBB_ASSERT( my_index>0, <span class="stringliteral">"operator--() applied to iterator already at beginning of concurrent_vector"</span> ); 
-<a name="l00288"></a>00288             size_t k = my_index--;
-<a name="l00289"></a>00289             <span class="keywordflow">if</span>( my_item ) {
-<a name="l00290"></a>00290                 <span class="comment">// Following test uses 2's-complement wizardry</span>
-<a name="l00291"></a>00291                 <span class="keywordflow">if</span>( (k& (k-2))==0 ) {
-<a name="l00292"></a>00292                     <span class="comment">// k is a power of two that is at least k-2  </span>
-<a name="l00293"></a>00293                     my_item= NULL;
-<a name="l00294"></a>00294                 } <span class="keywordflow">else</span> {
-<a name="l00295"></a>00295                     --my_item;
-<a name="l00296"></a>00296                 }
-<a name="l00297"></a>00297             }
-<a name="l00298"></a>00298             <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00299"></a>00299         }
-<a name="l00300"></a>00300 
-<a name="l00302"></a>00302         vector_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00303"></a>00303             vector_iterator result = *<span class="keyword">this</span>;
-<a name="l00304"></a>00304             operator++();
-<a name="l00305"></a>00305             <span class="keywordflow">return</span> result;
-<a name="l00306"></a>00306         }
-<a name="l00307"></a>00307 
-<a name="l00309"></a>00309         vector_iterator operator--(<span class="keywordtype">int</span>) {
-<a name="l00310"></a>00310             vector_iterator result = *<span class="keyword">this</span>;
-<a name="l00311"></a>00311             operator--();
-<a name="l00312"></a>00312             <span class="keywordflow">return</span> result;
-<a name="l00313"></a>00313         }
-<a name="l00314"></a>00314 
-<a name="l00315"></a>00315         <span class="comment">// STL support</span>
-<a name="l00316"></a>00316 
-<a name="l00317"></a>00317         <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00318"></a>00318         <span class="keyword">typedef</span> Value value_type;
-<a name="l00319"></a>00319         <span class="keyword">typedef</span> Value* pointer;
-<a name="l00320"></a>00320         <span class="keyword">typedef</span> Value& reference;
-<a name="l00321"></a>00321         <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
-<a name="l00322"></a>00322     };
-<a name="l00323"></a>00323 
-<a name="l00324"></a>00324     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
-<a name="l00325"></a>00325     vector_iterator<Container,T> operator+( ptrdiff_t offset, <span class="keyword">const</span> vector_iterator<Container,T>& v ) {
-<a name="l00326"></a>00326         <span class="keywordflow">return</span> vector_iterator<Container,T>( *v.my_vector, v.my_index+offset );
-<a name="l00327"></a>00327     }
-<a name="l00328"></a>00328 
-<a name="l00329"></a>00329     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00330"></a>00330     <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00331"></a>00331         <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_vector == j.my_vector;
-<a name="l00332"></a>00332     }
-<a name="l00333"></a>00333 
-<a name="l00334"></a>00334     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00335"></a>00335     <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00336"></a>00336         <span class="keywordflow">return</span> !(i==j);
-<a name="l00337"></a>00337     }
-<a name="l00338"></a>00338 
-<a name="l00339"></a>00339     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00340"></a>00340     <span class="keywordtype">bool</span> operator<( const vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00341"></a>00341         <span class="keywordflow">return</span> i.my_index<j.my_index;
-<a name="l00342"></a>00342     }
-<a name="l00343"></a>00343 
-<a name="l00344"></a>00344     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00345"></a>00345     <span class="keywordtype">bool</span> operator>( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00346"></a>00346         <span class="keywordflow">return</span> j<i;
-<a name="l00347"></a>00347     }
-<a name="l00348"></a>00348 
-<a name="l00349"></a>00349     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00350"></a>00350     <span class="keywordtype">bool</span> operator>=( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00351"></a>00351         <span class="keywordflow">return</span> !(i<j);
-<a name="l00352"></a>00352     }
-<a name="l00353"></a>00353 
-<a name="l00354"></a>00354     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00355"></a>00355     <span class="keywordtype">bool</span> operator<=( const vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00356"></a>00356         <span class="keywordflow">return</span> !(j<i);
-<a name="l00357"></a>00357     }
-<a name="l00358"></a>00358 
-<a name="l00359"></a>00359     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00360"></a>00360     ptrdiff_t operator-( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
-<a name="l00361"></a>00361         <span class="keywordflow">return</span> ptrdiff_t(i.my_index)-ptrdiff_t(j.my_index);
-<a name="l00362"></a>00362     }
-<a name="l00363"></a>00363 
-<a name="l00364"></a>00364     <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00365"></a>00365     <span class="keyword">class </span>allocator_base {
-<a name="l00366"></a>00366     <span class="keyword">public</span>:
-<a name="l00367"></a>00367         <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template
-<a name="l00368"></a>00368             rebind<T>::other allocator_type;
-<a name="l00369"></a>00369         allocator_type my_allocator;
-<a name="l00370"></a>00370 
-<a name="l00371"></a>00371         allocator_base(<span class="keyword">const</span> allocator_type &a = allocator_type() ) : my_allocator(a) {}
-<a name="l00372"></a>00372     };
-<a name="l00373"></a>00373 
-<a name="l00374"></a>00374 } <span class="comment">// namespace internal</span>
-<a name="l00376"></a>00376 <span class="comment"></span>
-<a name="l00378"></a>00378 
-<a name="l00439"></a>00439 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00440"></a><a class="code" href="a00238.html">00440</a> <span class="keyword">class </span><a class="code" href="a00238.html">concurrent_vector</a>: <span class="keyword">protected</span> internal::allocator_base<T, A>,
-<a name="l00441"></a>00441                          <span class="keyword">private</span> internal::concurrent_vector_base {
-<a name="l00442"></a>00442 <span class="keyword">private</span>:
-<a name="l00443"></a>00443     <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00444"></a>00444     <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00221.html">blocked_range</a><I> {
-<a name="l00445"></a>00445     <span class="keyword">public</span>:
-<a name="l00446"></a>00446         <span class="keyword">typedef</span> T value_type;
-<a name="l00447"></a>00447         <span class="keyword">typedef</span> T& reference;
-<a name="l00448"></a>00448         <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00449"></a>00449         <span class="keyword">typedef</span> I iterator;
-<a name="l00450"></a>00450         <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00451"></a>00451         generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00221.html">blocked_range<I></a>(begin_,end_,grainsize_) {} 
-<a name="l00452"></a>00452         template<typename U>
-<a name="l00453"></a>00453         generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00221.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {} 
-<a name="l00454"></a>00454         generic_range_type( generic_range_type& r, <a class="code" href="a00290.html">split</a> ) : <a class="code" href="a00221.html">blocked_range<I></a>(r,<a class="code" href="a00290.html">split</a>()) {}
-<a name="l00455"></a>00455     };
-<a name="l00456"></a>00456 
-<a name="l00457"></a>00457     <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
-<a name="l00458"></a>00458     <span class="keyword">friend</span> <span class="keyword">class </span>internal::vector_iterator;
-<a name="l00459"></a>00459 <span class="keyword">public</span>:
-<a name="l00460"></a>00460     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00461"></a>00461     <span class="comment">// STL compatible types</span>
-<a name="l00462"></a>00462     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00463"></a>00463     <span class="keyword">typedef</span> internal::concurrent_vector_base_v3::size_type size_type;
-<a name="l00464"></a>00464     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_base<T, A>::allocator_type allocator_type;
-<a name="l00465"></a>00465 
-<a name="l00466"></a>00466     <span class="keyword">typedef</span> T value_type;
-<a name="l00467"></a>00467     <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00468"></a>00468     <span class="keyword">typedef</span> T& reference;
-<a name="l00469"></a>00469     <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00470"></a>00470     <span class="keyword">typedef</span> T *pointer;
-<a name="l00471"></a>00471     <span class="keyword">typedef</span> <span class="keyword">const</span> T *const_pointer;
-<a name="l00472"></a>00472 
-<a name="l00473"></a>00473     <span class="keyword">typedef</span> internal::vector_iterator<concurrent_vector,T> iterator;
-<a name="l00474"></a>00474     <span class="keyword">typedef</span> internal::vector_iterator<concurrent_vector,const T> const_iterator;
-<a name="l00475"></a>00475 
-<a name="l00476"></a>00476 <span class="preprocessor">#if !defined(_MSC_VER) || _CPPLIB_VER>=300 </span>
-<a name="l00477"></a>00477 <span class="preprocessor"></span>    <span class="comment">// Assume ISO standard definition of std::reverse_iterator</span>
-<a name="l00478"></a>00478     <span class="keyword">typedef</span> std::reverse_iterator<iterator> reverse_iterator;
-<a name="l00479"></a>00479     <span class="keyword">typedef</span> std::reverse_iterator<const_iterator> const_reverse_iterator;
-<a name="l00480"></a>00480 <span class="preprocessor">#else</span>
-<a name="l00481"></a>00481 <span class="preprocessor"></span>    <span class="comment">// Use non-standard std::reverse_iterator</span>
-<a name="l00482"></a>00482     <span class="keyword">typedef</span> std::reverse_iterator<iterator,T,T&,T*> reverse_iterator;
-<a name="l00483"></a>00483     <span class="keyword">typedef</span> std::reverse_iterator<const_iterator,T,const T&,const T*> const_reverse_iterator;
-<a name="l00484"></a>00484 <span class="preprocessor">#endif </span><span class="comment">/* defined(_MSC_VER) && (_MSC_VER<1300) */</span>
-<a name="l00485"></a>00485 
-<a name="l00486"></a>00486     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00487"></a>00487     <span class="comment">// Parallel algorithm support</span>
-<a name="l00488"></a>00488     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00489"></a>00489     <span class="keyword">typedef</span> generic_range_type<iterator> range_type;
-<a name="l00490"></a>00490     <span class="keyword">typedef</span> generic_range_type<const_iterator> const_range_type;
-<a name="l00491"></a>00491 
-<a name="l00492"></a>00492     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00493"></a>00493     <span class="comment">// STL compatible constructors & destructors</span>
-<a name="l00494"></a>00494     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00495"></a>00495 
-<a name="l00497"></a><a class="code" href="a00238.html#2c8ca9cabfcd30ad5943324c853664b5">00497</a>     <span class="keyword">explicit</span> <a class="code" href="a00238.html">concurrent_vector</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00498"></a>00498         : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
-<a name="l00499"></a>00499     {
-<a name="l00500"></a>00500         vector_allocator_ptr = &internal_allocator;
-<a name="l00501"></a>00501     }
-<a name="l00502"></a>00502 
-<a name="l00504"></a><a class="code" href="a00238.html#dd8a200b99a8088435a37934b58fe335">00504</a>     <a class="code" href="a00238.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00238.html">concurrent_vector</a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
-<a name="l00505"></a>00505         : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
-<a name="l00506"></a>00506     {
-<a name="l00507"></a>00507         vector_allocator_ptr = &internal_allocator;
-<a name="l00508"></a>00508         __TBB_TRY {
-<a name="l00509"></a>00509             internal_copy(vector, <span class="keyword">sizeof</span>(T), &copy_array);
-<a name="l00510"></a>00510         } __TBB_CATCH(...) {
-<a name="l00511"></a>00511             segment_t *table = my_segment;
-<a name="l00512"></a>00512             internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00513"></a>00513             __TBB_RETHROW();
-<a name="l00514"></a>00514         }
-<a name="l00515"></a>00515     }
-<a name="l00516"></a>00516 
-<a name="l00518"></a>00518     <span class="keyword">template</span><<span class="keyword">class</span> M>
-<a name="l00519"></a><a class="code" href="a00238.html#64432f13f7b29bfe4acfb5568f34f3a8">00519</a>     <a class="code" href="a00238.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00238.html">concurrent_vector<T, M></a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
-<a name="l00520"></a>00520         : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
-<a name="l00521"></a>00521     {
-<a name="l00522"></a>00522         vector_allocator_ptr = &internal_allocator;
-<a name="l00523"></a>00523         __TBB_TRY {
-<a name="l00524"></a>00524             internal_copy(vector.<a class="code" href="a00238.html#bb5ae659871478f1f5c68039e1273e12">internal_vector_base</a>(), <span class="keyword">sizeof</span>(T), &copy_array);
-<a name="l00525"></a>00525         } __TBB_CATCH(...) {
-<a name="l00526"></a>00526             segment_t *table = my_segment;
-<a name="l00527"></a>00527             internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00528"></a>00528             __TBB_RETHROW();
-<a name="l00529"></a>00529         }
-<a name="l00530"></a>00530     }
-<a name="l00531"></a>00531 
-<a name="l00533"></a><a class="code" href="a00238.html#2a2e261dfe1cab3f73f7b1a94137cfca">00533</a>     <span class="keyword">explicit</span> <a class="code" href="a00238.html">concurrent_vector</a>(size_type n)
-<a name="l00534"></a>00534     {
-<a name="l00535"></a>00535         vector_allocator_ptr = &internal_allocator;
-<a name="l00536"></a>00536         __TBB_TRY {
-<a name="l00537"></a>00537             internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
-<a name="l00538"></a>00538         } __TBB_CATCH(...) {
-<a name="l00539"></a>00539             segment_t *table = my_segment;
-<a name="l00540"></a>00540             internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00541"></a>00541             __TBB_RETHROW();
-<a name="l00542"></a>00542         }
-<a name="l00543"></a>00543     }
-<a name="l00544"></a>00544 
-<a name="l00546"></a><a class="code" href="a00238.html#3883a8a908b44e249a57f454de3f55d8">00546</a>     <a class="code" href="a00238.html">concurrent_vector</a>(size_type n, const_reference t, <span class="keyword">const</span> allocator_type& a = allocator_type())
-<a name="l00547"></a>00547         : internal::allocator_base<T, A>(a)
-<a name="l00548"></a>00548     {
-<a name="l00549"></a>00549         vector_allocator_ptr = &internal_allocator;
-<a name="l00550"></a>00550         __TBB_TRY {
-<a name="l00551"></a>00551             internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
-<a name="l00552"></a>00552         } __TBB_CATCH(...) {
-<a name="l00553"></a>00553             segment_t *table = my_segment;
-<a name="l00554"></a>00554             internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00555"></a>00555             __TBB_RETHROW();
-<a name="l00556"></a>00556         }
-<a name="l00557"></a>00557     }
-<a name="l00558"></a>00558 
-<a name="l00560"></a>00560     <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00561"></a><a class="code" href="a00238.html#4450de83c5862ea4bcd9443fd7e67419">00561</a>     <a class="code" href="a00238.html">concurrent_vector</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
-<a name="l00562"></a>00562         : internal::allocator_base<T, A>(a)
-<a name="l00563"></a>00563     {
-<a name="l00564"></a>00564         vector_allocator_ptr = &internal_allocator;
-<a name="l00565"></a>00565         __TBB_TRY {
-<a name="l00566"></a>00566             internal_assign_range(first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
-<a name="l00567"></a>00567         } __TBB_CATCH(...) {
-<a name="l00568"></a>00568             segment_t *table = my_segment;
-<a name="l00569"></a>00569             internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00570"></a>00570             __TBB_RETHROW();
-<a name="l00571"></a>00571         }
-<a name="l00572"></a>00572     }
-<a name="l00573"></a>00573 
-<a name="l00575"></a><a class="code" href="a00238.html#691f0f3cda3e489c37a657016e375eaf">00575</a>     <a class="code" href="a00238.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00238.html">concurrent_vector</a>& vector ) {
-<a name="l00576"></a>00576         <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector )
-<a name="l00577"></a>00577             internal_assign(vector, <span class="keyword">sizeof</span>(T), &destroy_array, &assign_array, &copy_array);
-<a name="l00578"></a>00578         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00579"></a>00579     }
-<a name="l00580"></a>00580 
-<a name="l00582"></a>00582     <span class="keyword">template</span><<span class="keyword">class</span> M>
-<a name="l00583"></a><a class="code" href="a00238.html#19f4ab88a01b0fd056af3bba463e7bd6">00583</a>     <a class="code" href="a00238.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00238.html">concurrent_vector<T, M></a>& vector ) {
-<a name="l00584"></a>00584         <span class="keywordflow">if</span>( static_cast<void*>( <span class="keyword">this</span> ) != static_cast<const void*>( &vector ) )
-<a name="l00585"></a>00585             internal_assign(vector.internal_vector_base(),
-<a name="l00586"></a>00586                 <span class="keyword">sizeof</span>(T), &destroy_array, &assign_array, &copy_array);
-<a name="l00587"></a>00587         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00588"></a>00588     }
-<a name="l00589"></a>00589 
-<a name="l00590"></a>00590     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00591"></a>00591     <span class="comment">// Concurrent operations</span>
-<a name="l00592"></a>00592     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00594"></a>00594 <span class="comment"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00595"></a>00595 <span class="preprocessor"></span>
-<a name="l00596"></a><a class="code" href="a00238.html#30484e3959892fd5392fa93c873c31f0">00596</a>     size_type grow_by( size_type delta ) {
-<a name="l00597"></a>00597         <span class="keywordflow">return</span> delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array, NULL ) : my_early_size;
-<a name="l00598"></a>00598     }
-<a name="l00599"></a>00599 <span class="preprocessor">#else</span>
-<a name="l00600"></a>00600 <span class="preprocessor"></span>
-<a name="l00601"></a><a class="code" href="a00238.html#c8177b1865270ea68aa1ab9148e5e35e">00601</a>     iterator grow_by( size_type delta ) {
-<a name="l00602"></a>00602         <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array, NULL ) : my_early_size);
-<a name="l00603"></a>00603     }
-<a name="l00604"></a>00604 <span class="preprocessor">#endif</span>
-<a name="l00605"></a>00605 <span class="preprocessor"></span>
-<a name="l00607"></a>00607 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00608"></a>00608 <span class="preprocessor"></span>
-<a name="l00609"></a><a class="code" href="a00238.html#38274ab3f772ecba600c7daca7690102">00609</a>     size_type grow_by( size_type delta, const_reference t ) {
-<a name="l00610"></a>00610         <span class="keywordflow">return</span> delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array_by, static_cast<const void*>(&t) ) : my_early_size;
-<a name="l00611"></a>00611     }
-<a name="l00612"></a>00612 <span class="preprocessor">#else</span>
-<a name="l00613"></a>00613 <span class="preprocessor"></span>
-<a name="l00614"></a><a class="code" href="a00238.html#473a59a4c9308b93411b898b3110d26c">00614</a>     iterator grow_by( size_type delta, const_reference t ) {
-<a name="l00615"></a>00615         <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array_by, static_cast<const void*>(&t) ) : my_early_size);
-<a name="l00616"></a>00616     }
-<a name="l00617"></a>00617 <span class="preprocessor">#endif</span>
-<a name="l00618"></a>00618 <span class="preprocessor"></span>
-<a name="l00620"></a>00620 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00621"></a>00621 <span class="preprocessor"></span>
-<a name="l00623"></a><a class="code" href="a00238.html#47fe588214dd5fa06ab6e8ab78d83874">00623</a>     <span class="keywordtype">void</span> grow_to_at_least( size_type n ) {
-<a name="l00624"></a>00624         <span class="keywordflow">if</span>( n ) internal_grow_to_at_least_with_result( n, <span class="keyword">sizeof</span>(T), &initialize_array, NULL );
-<a name="l00625"></a>00625     };
-<a name="l00626"></a>00626 <span class="preprocessor">#else</span>
-<a name="l00627"></a>00627 <span class="preprocessor"></span>
-<a name="l00631"></a><a class="code" href="a00238.html#a7e3b67c8ccab16d0aecc80899ae799d">00631</a>     iterator grow_to_at_least( size_type n ) {
-<a name="l00632"></a>00632         size_type m=0;
-<a name="l00633"></a>00633         <span class="keywordflow">if</span>( n ) {
-<a name="l00634"></a>00634             m = internal_grow_to_at_least_with_result( n, <span class="keyword">sizeof</span>(T), &initialize_array, NULL );
-<a name="l00635"></a>00635             <span class="keywordflow">if</span>( m>n ) m=n;
-<a name="l00636"></a>00636         }
-<a name="l00637"></a>00637         <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, m);
-<a name="l00638"></a>00638     };
-<a name="l00639"></a>00639 <span class="preprocessor">#endif</span>
-<a name="l00640"></a>00640 <span class="preprocessor"></span>
-<a name="l00642"></a>00642 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00643"></a><a class="code" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">00643</a> <span class="preprocessor"></span>    size_type push_back( const_reference item )
-<a name="l00644"></a>00644 <span class="preprocessor">#else</span>
-<a name="l00645"></a>00645 <span class="preprocessor"></span>
-<a name="l00646"></a>00646     iterator push_back( const_reference item )
-<a name="l00647"></a>00647 <span class="preprocessor">#endif</span>
-<a name="l00648"></a>00648 <span class="preprocessor"></span>    {
-<a name="l00649"></a>00649         size_type k;
-<a name="l00650"></a>00650         <span class="keywordtype">void</span> *ptr = internal_push_back(<span class="keyword">sizeof</span>(T),k);
-<a name="l00651"></a>00651         internal_loop_guide loop(1, ptr);
-<a name="l00652"></a>00652         loop.init(&item);
-<a name="l00653"></a>00653 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00654"></a>00654 <span class="preprocessor"></span>        <span class="keywordflow">return</span> k;
-<a name="l00655"></a>00655 <span class="preprocessor">#else</span>
-<a name="l00656"></a>00656 <span class="preprocessor"></span>        <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, k, ptr);
-<a name="l00657"></a>00657 <span class="preprocessor">#endif</span>
-<a name="l00658"></a>00658 <span class="preprocessor"></span>    }
-<a name="l00659"></a>00659 
-<a name="l00661"></a>00661 
-<a name="l00663"></a><a class="code" href="a00238.html#4c52f2950bb1832886bd4458eb09d7eb">00663</a>     reference operator[]( size_type index ) {
-<a name="l00664"></a>00664         <span class="keywordflow">return</span> internal_subscript(index);
-<a name="l00665"></a>00665     }
-<a name="l00666"></a>00666 
-<a name="l00668"></a><a class="code" href="a00238.html#c6fade5c732cc95274d1d8277ea619d1">00668</a>     const_reference operator[]( size_type index )<span class="keyword"> const </span>{
-<a name="l00669"></a>00669         <span class="keywordflow">return</span> internal_subscript(index);
-<a name="l00670"></a>00670     }
-<a name="l00671"></a>00671 
-<a name="l00673"></a><a class="code" href="a00238.html#0c073ca43e787c7cbf7b0e26d2221748">00673</a>     reference at( size_type index ) {
-<a name="l00674"></a>00674         <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
-<a name="l00675"></a>00675     }
-<a name="l00676"></a>00676 
-<a name="l00678"></a><a class="code" href="a00238.html#23e14a38af748edff96a7adc3a0f1c58">00678</a>     const_reference at( size_type index )<span class="keyword"> const </span>{
-<a name="l00679"></a>00679         <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
-<a name="l00680"></a>00680     }
-<a name="l00681"></a>00681 
-<a name="l00683"></a><a class="code" href="a00238.html#a4c6ffff3bf08b92939aa2fc516edfba">00683</a>     range_type range( size_t grainsize = 1) {
-<a name="l00684"></a>00684         <span class="keywordflow">return</span> range_type( begin(), end(), grainsize );
-<a name="l00685"></a>00685     }
-<a name="l00686"></a>00686 
-<a name="l00688"></a><a class="code" href="a00238.html#3d09ccfb581b879ae64203741035e193">00688</a>     const_range_type range( size_t grainsize = 1 )<span class="keyword"> const </span>{
-<a name="l00689"></a>00689         <span class="keywordflow">return</span> const_range_type( begin(), end(), grainsize );
-<a name="l00690"></a>00690     }
-<a name="l00691"></a>00691     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00692"></a>00692     <span class="comment">// Capacity</span>
-<a name="l00693"></a>00693     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00695"></a><a class="code" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">00695</a> <span class="comment"></span>    size_type size()<span class="keyword"> const </span>{
-<a name="l00696"></a>00696         size_type sz = my_early_size, cp = internal_capacity();
-<a name="l00697"></a>00697         <span class="keywordflow">return</span> cp < sz ? cp : sz;
-<a name="l00698"></a>00698     }
-<a name="l00699"></a>00699 
-<a name="l00701"></a><a class="code" href="a00238.html#c6426cb93cf20d3af40f3c90f1f0481a">00701</a>     <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_early_size;}
-<a name="l00702"></a>00702 
-<a name="l00704"></a><a class="code" href="a00238.html#3ed6b9ae7217af5103d974045b6f5cd5">00704</a>     size_type capacity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_capacity();}
-<a name="l00705"></a>00705 
-<a name="l00707"></a>00707 
-<a name="l00709"></a><a class="code" href="a00238.html#5a0ce05026994b010018f72cfdeb72c1">00709</a>     <span class="keywordtype">void</span> reserve( size_type n ) {
-<a name="l00710"></a>00710         <span class="keywordflow">if</span>( n )
-<a name="l00711"></a>00711             internal_reserve(n, <span class="keyword">sizeof</span>(T), max_size());
-<a name="l00712"></a>00712     }
-<a name="l00713"></a>00713 
-<a name="l00715"></a><a class="code" href="a00238.html#8dfb0cb0eef96d440b4dcf801807a718">00715</a>     <span class="keywordtype">void</span> resize( size_type n ) {
-<a name="l00716"></a>00716         internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
-<a name="l00717"></a>00717     }
-<a name="l00718"></a>00718     
-<a name="l00720"></a><a class="code" href="a00238.html#98ce6b2c6d2622f0c030b46dfac3880c">00720</a>     <span class="keywordtype">void</span> resize( size_type n, const_reference t ) {
-<a name="l00721"></a>00721         internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
-<a name="l00722"></a>00722     }
-<a name="l00723"></a>00723    
-<a name="l00724"></a>00724 <span class="preprocessor">#if TBB_DEPRECATED </span>
-<a name="l00726"></a><a class="code" href="a00238.html#1693d1da41b1a8235871be9c6633be35">00726</a> <span class="preprocessor">    void compact() {shrink_to_fit();}</span>
-<a name="l00727"></a>00727 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
-<a name="l00728"></a>00728 
-<a name="l00730"></a>00730     <span class="keywordtype">void</span> shrink_to_fit();
-<a name="l00731"></a>00731 
-<a name="l00733"></a><a class="code" href="a00238.html#2c248a017f0576df3e7cd99627836fd6">00733</a>     size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (~size_type(0))/<span class="keyword">sizeof</span>(T);}
-<a name="l00734"></a>00734 
-<a name="l00735"></a>00735     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00736"></a>00736     <span class="comment">// STL support</span>
-<a name="l00737"></a>00737     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00738"></a>00738 
-<a name="l00740"></a><a class="code" href="a00238.html#730b23a251ecb6d37f692fb22f38e029">00740</a>     iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0);}
-<a name="l00742"></a><a class="code" href="a00238.html#c0b51160e5a764982ec97a455f94f2c6">00742</a>     iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,size());}
-<a name="l00744"></a><a class="code" href="a00238.html#78a06182276ff758788d4c0623ae0d71">00744</a>     const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
-<a name="l00746"></a><a class="code" href="a00238.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">00746</a>     const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
-<a name="l00748"></a><a class="code" href="a00238.html#f88fcf1c920693c39bd9709db33c199f">00748</a>     const_iterator cbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
-<a name="l00750"></a><a class="code" href="a00238.html#0c15a5d0f1cf75d687dabba07da1d46b">00750</a>     const_iterator cend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
-<a name="l00752"></a><a class="code" href="a00238.html#5e220926d09236d98f04fe0721e5f9a1">00752</a>     reverse_iterator rbegin() {<span class="keywordflow">return</span> reverse_iterator(end());}
-<a name="l00754"></a><a class="code" href="a00238.html#290119a4eb43cd6a9e98fa17016ba3c2">00754</a>     reverse_iterator rend() {<span class="keywordflow">return</span> reverse_iterator(begin());}
-<a name="l00756"></a><a class="code" href="a00238.html#9f9c103e18d5f212703805354074ad44">00756</a>     const_reverse_iterator rbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
-<a name="l00758"></a><a class="code" href="a00238.html#d438b9b32ea3a8ffb703015b6dce055b">00758</a>     const_reverse_iterator rend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
-<a name="l00760"></a><a class="code" href="a00238.html#db78a1d28c9c966050e8a2926d834a33">00760</a>     const_reverse_iterator crbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
-<a name="l00762"></a><a class="code" href="a00238.html#fff9cece89438587997ebedf93c5e962">00762</a>     const_reverse_iterator crend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
-<a name="l00764"></a><a class="code" href="a00238.html#15181759c0bfa2ddce5d10c7550e0002">00764</a>     reference front() {
-<a name="l00765"></a>00765         __TBB_ASSERT( size()>0, NULL);
-<a name="l00766"></a>00766         <span class="keywordflow">return</span> static_cast<T*>(my_segment[0].array)[0];
-<a name="l00767"></a>00767     }
-<a name="l00769"></a><a class="code" href="a00238.html#502615a858eb9fa0390ee59169065e90">00769</a>     const_reference front()<span class="keyword"> const </span>{
-<a name="l00770"></a>00770         __TBB_ASSERT( size()>0, NULL);
-<a name="l00771"></a>00771         <span class="keywordflow">return</span> static_cast<const T*>(my_segment[0].array)[0];
-<a name="l00772"></a>00772     }
-<a name="l00774"></a><a class="code" href="a00238.html#41ce48d6015a1a2812d41cf620ec3476">00774</a>     reference back() {
-<a name="l00775"></a>00775         __TBB_ASSERT( size()>0, NULL);
-<a name="l00776"></a>00776         <span class="keywordflow">return</span> internal_subscript( size()-1 );
-<a name="l00777"></a>00777     }
-<a name="l00779"></a><a class="code" href="a00238.html#bd518e204107d07fd08d0ec5bdfd383d">00779</a>     const_reference back()<span class="keyword"> const </span>{
-<a name="l00780"></a>00780         __TBB_ASSERT( size()>0, NULL);
-<a name="l00781"></a>00781         <span class="keywordflow">return</span> internal_subscript( size()-1 );
-<a name="l00782"></a>00782     }
-<a name="l00784"></a><a class="code" href="a00238.html#2fdba8e90de6a4d2300222236d46758e">00784</a>     allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
-<a name="l00785"></a>00785 
-<a name="l00787"></a><a class="code" href="a00238.html#423e5aa15e0e3309ad86d026fd85f6f6">00787</a>     <span class="keywordtype">void</span> assign(size_type n, const_reference t) {
-<a name="l00788"></a>00788         clear();
-<a name="l00789"></a>00789         internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
-<a name="l00790"></a>00790     }
-<a name="l00791"></a>00791 
-<a name="l00793"></a>00793     <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00794"></a><a class="code" href="a00238.html#93a06b3112cb804f42f40efb5e7387b4">00794</a>     <span class="keywordtype">void</span> assign(I first, I last) {
-<a name="l00795"></a>00795         clear(); internal_assign_range( first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
-<a name="l00796"></a>00796     }
-<a name="l00797"></a>00797 
-<a name="l00799"></a><a class="code" href="a00238.html#96c9c4bd968ed3edb8dd276854d2dae0">00799</a>     <span class="keywordtype">void</span> swap(<a class="code" href="a00238.html">concurrent_vector</a> &vector) {
-<a name="l00800"></a>00800         <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector ) {
-<a name="l00801"></a>00801             concurrent_vector_base_v3::internal_swap(static_cast<concurrent_vector_base_v3&>(vector));
-<a name="l00802"></a>00802             std::swap(this->my_allocator, vector.my_allocator);
-<a name="l00803"></a>00803         }
-<a name="l00804"></a>00804     }
-<a name="l00805"></a>00805 
-<a name="l00807"></a>00807 
-<a name="l00808"></a><a class="code" href="a00238.html#26f937a359a66b6aae904c3cd9a3c444">00808</a>     <span class="keywordtype">void</span> clear() {
-<a name="l00809"></a>00809         internal_clear(&destroy_array);
-<a name="l00810"></a>00810     }
-<a name="l00811"></a>00811 
-<a name="l00813"></a><a class="code" href="a00238.html#da2444b28bb840d38f60d0030333a5fc">00813</a>     ~<a class="code" href="a00238.html">concurrent_vector</a>() {
-<a name="l00814"></a>00814         segment_t *table = my_segment;
-<a name="l00815"></a>00815         internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
-<a name="l00816"></a>00816         <span class="comment">// base class destructor call should be then</span>
-<a name="l00817"></a>00817     }
-<a name="l00818"></a>00818 
-<a name="l00819"></a>00819     <span class="keyword">const</span> internal::concurrent_vector_base_v3 &internal_vector_base()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
-<a name="l00820"></a>00820 <span class="keyword">private</span>:
-<a name="l00822"></a>00822     <span class="keyword">static</span> <span class="keywordtype">void</span> *internal_allocator(internal::concurrent_vector_base_v3 &vb, size_t k) {
-<a name="l00823"></a>00823         <span class="keywordflow">return</span> static_cast<concurrent_vector<T, A>&>(vb).my_allocator.allocate(k);
-<a name="l00824"></a>00824     }
-<a name="l00826"></a>00826     <span class="keywordtype">void</span> internal_free_segments(<span class="keywordtype">void</span> *table[], segment_index_t k, segment_index_t first_block);
-<a name="l00827"></a>00827 
-<a name="l00829"></a>00829     T& internal_subscript( size_type index ) <span class="keyword">const</span>;
-<a name="l00830"></a>00830 
-<a name="l00832"></a>00832     T& internal_subscript_with_exceptions( size_type index ) <span class="keyword">const</span>;
-<a name="l00833"></a>00833 
-<a name="l00835"></a>00835     <span class="keywordtype">void</span> internal_assign_n(size_type n, const_pointer p) {
-<a name="l00836"></a>00836         internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(p), &destroy_array, p? &initialize_array_by : &initialize_array );
-<a name="l00837"></a>00837     }
-<a name="l00838"></a>00838 
-<a name="l00840"></a>00840     <span class="keyword">template</span><<span class="keywordtype">bool</span> B> <span class="keyword">class </span>is_integer_tag;
-<a name="l00841"></a>00841 
-<a name="l00843"></a>00843     <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00844"></a>00844     <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<true> *) {
-<a name="l00845"></a>00845         internal_assign_n(static_cast<size_type>(first), &static_cast<T&>(last));
-<a name="l00846"></a>00846     }
-<a name="l00848"></a>00848     <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00849"></a>00849     <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<false> *) {
-<a name="l00850"></a>00850         internal_assign_iterators(first, last);
-<a name="l00851"></a>00851     }
-<a name="l00853"></a>00853     <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00854"></a>00854     <span class="keywordtype">void</span> internal_assign_iterators(I first, I last);
-<a name="l00855"></a>00855 
-<a name="l00857"></a>00857     <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC initialize_array( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span>*, size_type n );
-<a name="l00858"></a>00858 
-<a name="l00860"></a>00860     <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC initialize_array_by( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
-<a name="l00861"></a>00861 
-<a name="l00863"></a>00863     <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC copy_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
-<a name="l00864"></a>00864 
-<a name="l00866"></a>00866     <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC assign_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
-<a name="l00867"></a>00867 
-<a name="l00869"></a>00869     <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC destroy_array( <span class="keywordtype">void</span>* begin, size_type n );
-<a name="l00870"></a>00870 
-<a name="l00872"></a>00872     <span class="keyword">class </span>internal_loop_guide : internal::no_copy {
-<a name="l00873"></a>00873     <span class="keyword">public</span>:
-<a name="l00874"></a>00874         <span class="keyword">const</span> pointer array;
-<a name="l00875"></a>00875         <span class="keyword">const</span> size_type n;
-<a name="l00876"></a>00876         size_type i;
-<a name="l00877"></a>00877         internal_loop_guide(size_type ntrials, <span class="keywordtype">void</span> *ptr)
-<a name="l00878"></a>00878             : array(static_cast<pointer>(ptr)), n(ntrials), i(0) {}
-<a name="l00879"></a>00879         <span class="keywordtype">void</span> init() {   <span class="keywordflow">for</span>(; i < n; ++i) <span class="keyword">new</span>( &array[i] ) T(); }
-<a name="l00880"></a>00880         <span class="keywordtype">void</span> init(<span class="keyword">const</span> <span class="keywordtype">void</span> *src) { <span class="keywordflow">for</span>(; i < n; ++i) new( &array[i] ) T(*static_cast<const T*>(src)); }
-<a name="l00881"></a>00881         <span class="keywordtype">void</span> copy(<span class="keyword">const</span> <span class="keywordtype">void</span> *src) { <span class="keywordflow">for</span>(; i < n; ++i) new( &array[i] ) T(static_cast<const T*>(src)[i]); }
-<a name="l00882"></a>00882         <span class="keywordtype">void</span> assign(<span class="keyword">const</span> <span class="keywordtype">void</span> *src) { <span class="keywordflow">for</span>(; i < n; ++i) array[i] = static_cast<const T*>(src)[i]; }
-<a name="l00883"></a>00883         <span class="keyword">template</span><<span class="keyword">class</span> I> <span class="keywordtype">void</span> iterate(I &src) { <span class="keywordflow">for</span>(; i < n; ++i, ++src) <span class="keyword">new</span>( &array[i] ) T( *src ); }
-<a name="l00884"></a>00884         ~internal_loop_guide() {
-<a name="l00885"></a>00885             <span class="keywordflow">if</span>(i < n) <span class="comment">// if exception raised, do zerroing on the rest of items</span>
-<a name="l00886"></a>00886                 std::memset(array+i, 0, (n-i)*<span class="keyword">sizeof</span>(value_type));
-<a name="l00887"></a>00887         }
-<a name="l00888"></a>00888     };
-<a name="l00889"></a>00889 };
-<a name="l00890"></a>00890 
-<a name="l00891"></a>00891 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
-<a name="l00892"></a>00892 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (push)</span>
-<a name="l00893"></a>00893 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (disable: 4701) // potentially uninitialized local variable "old"</span>
-<a name="l00894"></a>00894 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00895"></a>00895 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00896"></a><a class="code" href="a00238.html#03c6f4cf66532bf4cc907ee738a9a186">00896</a> <span class="keywordtype">void</span> <a class="code" href="a00238.html">concurrent_vector<T, A>::shrink_to_fit</a>() {
-<a name="l00897"></a>00897     internal_segments_table old;
-<a name="l00898"></a>00898     __TBB_TRY {
-<a name="l00899"></a>00899         <span class="keywordflow">if</span>( internal_compact( <span class="keyword">sizeof</span>(T), &old, &destroy_array, &copy_array ) )
-<a name="l00900"></a>00900             internal_free_segments( old.table, pointers_per_long_table, old.first_block ); <span class="comment">// free joined and unnecessary segments</span>
-<a name="l00901"></a>00901     } __TBB_CATCH(...) {
-<a name="l00902"></a>00902         <span class="keywordflow">if</span>( old.first_block ) <span class="comment">// free segment allocated for compacting. Only for support of exceptions in ctor of user T[ype]</span>
-<a name="l00903"></a>00903             internal_free_segments( old.table, 1, old.first_block );
-<a name="l00904"></a>00904         __TBB_RETHROW();
-<a name="l00905"></a>00905     }
-<a name="l00906"></a>00906 }
-<a name="l00907"></a>00907 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
-<a name="l00908"></a>00908 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (pop)</span>
-<a name="l00909"></a>00909 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4701 is back </span>
-<a name="l00910"></a>00910 <span class="preprocessor"></span>
-<a name="l00911"></a>00911 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00912"></a>00912 <span class="keywordtype">void</span> <a class="code" href="a00238.html">concurrent_vector<T, A>::internal_free_segments</a>(<span class="keywordtype">void</span> *table[], segment_index_t k, segment_index_t first_block) {
-<a name="l00913"></a>00913     <span class="comment">// Free the arrays</span>
-<a name="l00914"></a>00914     <span class="keywordflow">while</span>( k > first_block ) {
-<a name="l00915"></a>00915         --k;
-<a name="l00916"></a>00916         T* array = static_cast<T*>(table[k]);
-<a name="l00917"></a>00917         table[k] = NULL;
-<a name="l00918"></a>00918         <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
-<a name="l00919"></a>00919             this->my_allocator.deallocate( array, segment_size(k) );
-<a name="l00920"></a>00920     }
-<a name="l00921"></a>00921     T* array = static_cast<T*>(table[0]);
-<a name="l00922"></a>00922     <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) {
-<a name="l00923"></a>00923         __TBB_ASSERT( first_block > 0, NULL );
-<a name="l00924"></a>00924         <span class="keywordflow">while</span>(k > 0) table[--k] = NULL;
-<a name="l00925"></a>00925         this->my_allocator.deallocate( array, segment_size(first_block) );
-<a name="l00926"></a>00926     }
-<a name="l00927"></a>00927 }
-<a name="l00928"></a>00928 
-<a name="l00929"></a>00929 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00930"></a>00930 T& concurrent_vector<T, A>::internal_subscript( size_type index )<span class="keyword"> const </span>{
-<a name="l00931"></a>00931     __TBB_ASSERT( index < my_early_size, <span class="stringliteral">"index out of bounds"</span> );
-<a name="l00932"></a>00932     size_type j = index;
-<a name="l00933"></a>00933     segment_index_t k = segment_base_index_of( j );
-<a name="l00934"></a>00934     __TBB_ASSERT( (segment_t*)my_segment != my_storage || k < pointers_per_short_table, <span class="stringliteral">"index is being allocated"</span> );
-<a name="l00935"></a>00935     <span class="comment">// no need in __TBB_load_with_acquire since thread works in own space or gets </span>
-<a name="l00936"></a>00936     T* array = static_cast<T*>( tbb::internal::itt_hide_load_word(my_segment[k].array));
-<a name="l00937"></a>00937     __TBB_ASSERT( array != internal::vector_allocation_error_flag, <span class="stringliteral">"the instance is broken by bad allocation. Use at() instead"</span> );
-<a name="l00938"></a>00938     __TBB_ASSERT( array, <span class="stringliteral">"index is being allocated"</span> );
-<a name="l00939"></a>00939     <span class="keywordflow">return</span> array[j];
-<a name="l00940"></a>00940 }
-<a name="l00941"></a>00941 
-<a name="l00942"></a>00942 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00943"></a>00943 T& concurrent_vector<T, A>::internal_subscript_with_exceptions( size_type index )<span class="keyword"> const </span>{
-<a name="l00944"></a>00944     <span class="keywordflow">if</span>( index >= my_early_size )
-<a name="l00945"></a>00945         internal::throw_exception(internal::eid_out_of_range); <span class="comment">// throw std::out_of_range</span>
-<a name="l00946"></a>00946     size_type j = index;
-<a name="l00947"></a>00947     segment_index_t k = segment_base_index_of( j );
-<a name="l00948"></a>00948     <span class="keywordflow">if</span>( (segment_t*)my_segment == my_storage && k >= pointers_per_short_table )
-<a name="l00949"></a>00949         internal::throw_exception(internal::eid_segment_range_error); <span class="comment">// throw std::range_error</span>
-<a name="l00950"></a>00950     <span class="keywordtype">void</span> *array = my_segment[k].array; <span class="comment">// no need in __TBB_load_with_acquire</span>
-<a name="l00951"></a>00951     <span class="keywordflow">if</span>( array <= internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
-<a name="l00952"></a>00952         internal::throw_exception(internal::eid_index_range_error); <span class="comment">// throw std::range_error</span>
-<a name="l00953"></a>00953     <span class="keywordflow">return</span> static_cast<T*>(array)[j];
-<a name="l00954"></a>00954 }
-<a name="l00955"></a>00955 
-<a name="l00956"></a>00956 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A> <span class="keyword">template</span><<span class="keyword">class</span> I>
-<a name="l00957"></a>00957 <span class="keywordtype">void</span> concurrent_vector<T, A>::internal_assign_iterators(I first, I last) {
-<a name="l00958"></a>00958     __TBB_ASSERT(my_early_size == 0, NULL);
-<a name="l00959"></a>00959     size_type n = std::distance(first, last);
-<a name="l00960"></a>00960     <span class="keywordflow">if</span>( !n ) <span class="keywordflow">return</span>;
-<a name="l00961"></a>00961     internal_reserve(n, <span class="keyword">sizeof</span>(T), <a class="code" href="a00238.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>());
-<a name="l00962"></a>00962     my_early_size = n;
-<a name="l00963"></a>00963     segment_index_t k = 0;
-<a name="l00964"></a>00964     size_type sz = segment_size( my_first_block );
-<a name="l00965"></a>00965     <span class="keywordflow">while</span>( sz < n ) {
-<a name="l00966"></a>00966         internal_loop_guide loop(sz, my_segment[k].array);
-<a name="l00967"></a>00967         loop.iterate(first);
-<a name="l00968"></a>00968         n -= sz;
-<a name="l00969"></a>00969         <span class="keywordflow">if</span>( !k ) k = my_first_block;
-<a name="l00970"></a>00970         <span class="keywordflow">else</span> { ++k; sz <<= 1; }
-<a name="l00971"></a>00971     }
-<a name="l00972"></a>00972     internal_loop_guide loop(n, my_segment[k].array);
-<a name="l00973"></a>00973     loop.iterate(first);
-<a name="l00974"></a>00974 }
-<a name="l00975"></a>00975 
-<a name="l00976"></a>00976 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00977"></a>00977 <span class="keywordtype">void</span> concurrent_vector<T, A>::initialize_array( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span> *, size_type n ) {
-<a name="l00978"></a>00978     internal_loop_guide loop(n, begin); loop.init();
-<a name="l00979"></a>00979 }
-<a name="l00980"></a>00980 
-<a name="l00981"></a>00981 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00982"></a>00982 <span class="keywordtype">void</span> concurrent_vector<T, A>::initialize_array_by( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span> *src, size_type n ) {
-<a name="l00983"></a>00983     internal_loop_guide loop(n, begin); loop.init(src);
-<a name="l00984"></a>00984 }
-<a name="l00985"></a>00985 
-<a name="l00986"></a>00986 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00987"></a>00987 <span class="keywordtype">void</span> concurrent_vector<T, A>::copy_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n ) {
-<a name="l00988"></a>00988     internal_loop_guide loop(n, dst); loop.copy(src);
-<a name="l00989"></a>00989 }
-<a name="l00990"></a>00990 
-<a name="l00991"></a>00991 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l00992"></a>00992 <span class="keywordtype">void</span> concurrent_vector<T, A>::assign_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n ) {
-<a name="l00993"></a>00993     internal_loop_guide loop(n, dst); loop.assign(src);
-<a name="l00994"></a>00994 }
-<a name="l00995"></a>00995 
-<a name="l00996"></a>00996 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
-<a name="l00997"></a>00997 <span class="preprocessor"></span>    <span class="comment">// Workaround for overzealous compiler warning</span>
-<a name="l00998"></a>00998 <span class="preprocessor">    #pragma warning (push)</span>
-<a name="l00999"></a>00999 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4189)</span>
-<a name="l01000"></a>01000 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l01001"></a>01001 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l01002"></a>01002 <span class="keywordtype">void</span> concurrent_vector<T, A>::destroy_array( <span class="keywordtype">void</span>* begin, size_type n ) {
-<a name="l01003"></a>01003     T* array = static_cast<T*>(begin);
-<a name="l01004"></a>01004     <span class="keywordflow">for</span>( size_type j=n; j>0; --j )
-<a name="l01005"></a>01005         array[j-1].~T(); <span class="comment">// destructors are supposed to not throw any exceptions</span>
-<a name="l01006"></a>01006 }
-<a name="l01007"></a>01007 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
-<a name="l01008"></a>01008 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
-<a name="l01009"></a>01009 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4189 is back </span>
-<a name="l01010"></a>01010 <span class="preprocessor"></span>
-<a name="l01011"></a>01011 <span class="comment">// concurrent_vector's template functions</span>
-<a name="l01012"></a>01012 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
-<a name="l01013"></a>01013 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b) {
-<a name="l01014"></a>01014     <span class="comment">// Simply:    return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin());</span>
-<a name="l01015"></a>01015     <span class="keywordflow">if</span>(a.size() != b.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01016"></a>01016     <span class="keyword">typename</span> concurrent_vector<T, A1>::const_iterator i(a.begin());
-<a name="l01017"></a>01017     <span class="keyword">typename</span> concurrent_vector<T, A2>::const_iterator j(b.begin());
-<a name="l01018"></a>01018     <span class="keywordflow">for</span>(; i != a.end(); ++i, ++j)
-<a name="l01019"></a>01019         <span class="keywordflow">if</span>( !(*i == *j) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01020"></a>01020     <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01021"></a>01021 }
-<a name="l01022"></a>01022 
-<a name="l01023"></a>01023 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
-<a name="l01024"></a>01024 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
-<a name="l01025"></a>01025 {    <span class="keywordflow">return</span> !(a == b); }
-<a name="l01026"></a>01026 
-<a name="l01027"></a>01027 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
-<a name="l01028"></a>01028 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator<(const concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
-<a name="l01029"></a>01029 {    <span class="keywordflow">return</span> (std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())); }
-<a name="l01030"></a>01030 
-<a name="l01031"></a>01031 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
-<a name="l01032"></a>01032 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator>(<span class="keyword">const</span> concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
-<a name="l01033"></a>01033 {    <span class="keywordflow">return</span> b < a; }
-<a name="l01034"></a>01034 
-<a name="l01035"></a>01035 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
-<a name="l01036"></a>01036 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator<=(const concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
-<a name="l01037"></a>01037 {    <span class="keywordflow">return</span> !(b < a); }
-<a name="l01038"></a>01038 
-<a name="l01039"></a>01039 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
-<a name="l01040"></a>01040 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator>=(<span class="keyword">const</span> concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
-<a name="l01041"></a>01041 {    <span class="keywordflow">return</span> !(a < b); }
-<a name="l01042"></a>01042 
-<a name="l01043"></a>01043 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
-<a name="l01044"></a>01044 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap(concurrent_vector<T, A> &a, concurrent_vector<T, A> &b)
-<a name="l01045"></a>01045 {    a.swap( b ); }
-<a name="l01046"></a>01046 
-<a name="l01047"></a>01047 } <span class="comment">// namespace tbb</span>
-<a name="l01048"></a>01048 
-<a name="l01049"></a>01049 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)</span>
-<a name="l01050"></a>01050 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
-<a name="l01051"></a>01051 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4267 is back</span>
-<a name="l01052"></a>01052 <span class="preprocessor"></span>
-<a name="l01053"></a>01053 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_vector_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00443.html b/doc/html/a00443.html
new file mode 100644
index 0000000..491e645
--- /dev/null
+++ b/doc/html/a00443.html
@@ -0,0 +1,927 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>concurrent_vector.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="files.html"><span>File List</span></a></li>
+    <li><a href="globals.html"><span>File Members</span></a></li>
+  </ul></div>
+<h1>concurrent_vector.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
+<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment">    writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020 
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_vector_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_vector_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_exception.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
+<a name="l00028"></a>00028 <span class="preprocessor">#include "blocked_range.h"</span>
+<a name="l00029"></a>00029 <span class="preprocessor">#include "tbb_machine.h"</span>
+<a name="l00030"></a>00030 <span class="preprocessor">#include "tbb_profiling.h"</span>
+<a name="l00031"></a>00031 <span class="preprocessor">#include <new></span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include <cstring></span>   <span class="comment">// for memset()</span>
+<a name="l00033"></a>00033 
+<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span>    <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
+<a name="l00036"></a>00036 <span class="preprocessor">    #pragma warning (push)</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4530)</span>
+<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span>
+<a name="l00040"></a>00040 <span class="preprocessor">#include <algorithm></span>
+<a name="l00041"></a>00041 <span class="preprocessor">#include <iterator></span>
+<a name="l00042"></a>00042 
+<a name="l00043"></a>00043 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
+<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
+<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00046"></a>00046 <span class="preprocessor"></span>
+<a name="l00047"></a>00047 <span class="preprocessor">#if _MSC_VER==1500 && !__INTEL_COMPILER</span>
+<a name="l00048"></a>00048 <span class="preprocessor"></span>    <span class="comment">// VS2008/VC9 seems to have an issue; limits pull in math.h</span>
+<a name="l00049"></a>00049 <span class="preprocessor">    #pragma warning( push )</span>
+<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning( disable: 4985 )</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#include <limits></span> <span class="comment">/* std::numeric_limits */</span>
+<a name="l00053"></a>00053 <span class="preprocessor">#if _MSC_VER==1500 && !__INTEL_COMPILER</span>
+<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning( pop )</span>
+<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00056"></a>00056 <span class="preprocessor"></span>
+<a name="l00057"></a>00057 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)</span>
+<a name="l00058"></a>00058 <span class="preprocessor"></span>    <span class="comment">// Workaround for overzealous compiler warnings in /Wp64 mode</span>
+<a name="l00059"></a>00059 <span class="preprocessor">    #pragma warning (push)</span>
+<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4267)</span>
+<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00062"></a>00062 <span class="preprocessor"></span>
+<a name="l00063"></a>00063 <span class="keyword">namespace </span>tbb {
+<a name="l00064"></a>00064 
+<a name="l00065"></a>00065 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator<T> >
+<a name="l00066"></a>00066 <span class="keyword">class </span>concurrent_vector;
+<a name="l00067"></a>00067 
+<a name="l00069"></a>00069 <span class="keyword">namespace </span>internal {
+<a name="l00070"></a>00070 
+<a name="l00072"></a>00072     <span class="keyword">static</span> <span class="keywordtype">void</span> *<span class="keyword">const</span> vector_allocation_error_flag = reinterpret_cast<void*>(size_t(63));
+<a name="l00073"></a>00073 
+<a name="l00075"></a>00075 
+<a name="l00076"></a>00076     <span class="keyword">class </span>concurrent_vector_base_v3 {
+<a name="l00077"></a>00077     <span class="keyword">protected</span>:
+<a name="l00078"></a>00078 
+<a name="l00079"></a>00079         <span class="comment">// Basic types declarations</span>
+<a name="l00080"></a>00080         <span class="keyword">typedef</span> size_t segment_index_t;
+<a name="l00081"></a>00081         <span class="keyword">typedef</span> size_t size_type;
+<a name="l00082"></a>00082 
+<a name="l00083"></a>00083         <span class="comment">// Using enumerations due to Mac linking problems of static const variables</span>
+<a name="l00084"></a>00084         <span class="keyword">enum</span> {
+<a name="l00085"></a>00085             <span class="comment">// Size constants</span>
+<a name="l00086"></a>00086             default_initial_segments = 1, <span class="comment">// 2 initial items</span>
+<a name="l00088"></a>00088 <span class="comment"></span>            pointers_per_short_table = 3, <span class="comment">// to fit into 8 words of entire structure</span>
+<a name="l00089"></a>00089             pointers_per_long_table = <span class="keyword">sizeof</span>(segment_index_t) * 8 <span class="comment">// one segment per bit</span>
+<a name="l00090"></a>00090         };
+<a name="l00091"></a>00091 
+<a name="l00092"></a>00092         <span class="comment">// Segment pointer. Can be zero-initialized</span>
+<a name="l00093"></a>00093         <span class="keyword">struct </span>segment_t {
+<a name="l00094"></a>00094             <span class="keywordtype">void</span>* array;
+<a name="l00095"></a>00095 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00096"></a>00096 <span class="preprocessor"></span>            ~segment_t() {
+<a name="l00097"></a>00097                 __TBB_ASSERT( array <= internal::vector_allocation_error_flag, <span class="stringliteral">"should have been freed by clear"</span> );
+<a name="l00098"></a>00098             }
+<a name="l00099"></a>00099 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00100"></a>00100         };
+<a name="l00101"></a>00101  
+<a name="l00102"></a>00102         <span class="comment">// Data fields</span>
+<a name="l00103"></a>00103 
+<a name="l00105"></a>00105         <span class="keywordtype">void</span>* (*vector_allocator_ptr)(concurrent_vector_base_v3 &, size_t);
+<a name="l00106"></a>00106 
+<a name="l00108"></a>00108         atomic<size_type> my_first_block;
+<a name="l00109"></a>00109 
+<a name="l00111"></a>00111         atomic<size_type> my_early_size;
+<a name="l00112"></a>00112 
+<a name="l00114"></a>00114         atomic<segment_t*> my_segment;
+<a name="l00115"></a>00115 
+<a name="l00117"></a>00117         segment_t my_storage[pointers_per_short_table];
+<a name="l00118"></a>00118 
+<a name="l00119"></a>00119         <span class="comment">// Methods</span>
+<a name="l00120"></a>00120 
+<a name="l00121"></a>00121         concurrent_vector_base_v3() {
+<a name="l00122"></a>00122             my_early_size = 0;
+<a name="l00123"></a>00123             my_first_block = 0; <span class="comment">// here is not default_initial_segments</span>
+<a name="l00124"></a>00124             <span class="keywordflow">for</span>( segment_index_t i = 0; i < pointers_per_short_table; i++)
+<a name="l00125"></a>00125                 my_storage[i].array = NULL;
+<a name="l00126"></a>00126             my_segment = my_storage;
+<a name="l00127"></a>00127         }
+<a name="l00128"></a>00128         __TBB_EXPORTED_METHOD ~concurrent_vector_base_v3();
+<a name="l00129"></a>00129 
+<a name="l00130"></a>00130         <span class="keyword">static</span> segment_index_t segment_index_of( size_type index ) {
+<a name="l00131"></a>00131             <span class="keywordflow">return</span> segment_index_t( __TBB_Log2( index|1 ) );
+<a name="l00132"></a>00132         }
+<a name="l00133"></a>00133 
+<a name="l00134"></a>00134         <span class="keyword">static</span> segment_index_t segment_base( segment_index_t k ) {
+<a name="l00135"></a>00135             <span class="keywordflow">return</span> (segment_index_t(1)<<k & ~segment_index_t(1));
+<a name="l00136"></a>00136         }
+<a name="l00137"></a>00137 
+<a name="l00138"></a>00138         <span class="keyword">static</span> <span class="keyword">inline</span> segment_index_t segment_base_index_of( segment_index_t &index ) {
+<a name="l00139"></a>00139             segment_index_t k = segment_index_of( index );
+<a name="l00140"></a>00140             index -= segment_base(k);
+<a name="l00141"></a>00141             <span class="keywordflow">return</span> k;
+<a name="l00142"></a>00142         }
+<a name="l00143"></a>00143 
+<a name="l00144"></a>00144         <span class="keyword">static</span> size_type segment_size( segment_index_t k ) {
+<a name="l00145"></a>00145             <span class="keywordflow">return</span> segment_index_t(1)<<k; <span class="comment">// fake value for k==0</span>
+<a name="l00146"></a>00146         }
+<a name="l00147"></a>00147 
+<a name="l00149"></a>00149         <span class="keyword">typedef</span> void (__TBB_EXPORTED_FUNC *internal_array_op1)(<span class="keywordtype">void</span>* begin, size_type n );
+<a name="l00150"></a>00150 
+<a name="l00152"></a>00152         <span class="keyword">typedef</span> void (__TBB_EXPORTED_FUNC *internal_array_op2)(<span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
+<a name="l00153"></a>00153 
+<a name="l00155"></a>00155         <span class="keyword">struct </span>internal_segments_table {
+<a name="l00156"></a>00156             segment_index_t first_block;
+<a name="l00157"></a>00157             <span class="keywordtype">void</span>* table[pointers_per_long_table];
+<a name="l00158"></a>00158         };
+<a name="l00159"></a>00159 
+<a name="l00160"></a>00160         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_reserve( size_type n, size_type element_size, size_type max_size );
+<a name="l00161"></a>00161         size_type __TBB_EXPORTED_METHOD internal_capacity() <span class="keyword">const</span>;
+<a name="l00162"></a>00162         <span class="keywordtype">void</span> internal_grow( size_type start, size_type finish, size_type element_size, internal_array_op2 init, <span class="keyword">const</span> <span class="keywordtype">void</span> *src );
+<a name="l00163"></a>00163         size_type __TBB_EXPORTED_METHOD internal_grow_by( size_type delta, size_type element_size, internal_array_op2 init, <span class="keyword">const</span> <span class="keywordtype">void</span> *src );
+<a name="l00164"></a>00164         <span class="keywordtype">void</span>* __TBB_EXPORTED_METHOD internal_push_back( size_type element_size, size_type& index );
+<a name="l00165"></a>00165         segment_index_t __TBB_EXPORTED_METHOD internal_clear( internal_array_op1 destroy );
+<a name="l00166"></a>00166         <span class="keywordtype">void</span>* __TBB_EXPORTED_METHOD internal_compact( size_type element_size, <span class="keywordtype">void</span> *table, internal_array_op1 destroy, internal_array_op2 copy );
+<a name="l00167"></a>00167         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_copy( <span class="keyword">const</span> concurrent_vector_base_v3& src, size_type element_size, internal_array_op2 copy );
+<a name="l00168"></a>00168         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_assign( <span class="keyword">const</span> concurrent_vector_base_v3& src, size_type element_size,
+<a name="l00169"></a>00169                               internal_array_op1 destroy, internal_array_op2 assign, internal_array_op2 copy );
+<a name="l00171"></a>00171         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_throw_exception(size_type) <span class="keyword">const</span>;
+<a name="l00172"></a>00172         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_swap(concurrent_vector_base_v3& v);
+<a name="l00173"></a>00173 
+<a name="l00174"></a>00174         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_resize( size_type n, size_type element_size, size_type max_size, <span class="keyword">const</span> <span class="keywordtype">void</span> *src,
+<a name="l00175"></a>00175                                                     internal_array_op1 destroy, internal_array_op2 init );
+<a name="l00176"></a>00176         size_type __TBB_EXPORTED_METHOD internal_grow_to_at_least_with_result( size_type new_size, size_type element_size, internal_array_op2 init, <span class="keyword">const</span> <span class="keywordtype">void</span> *src );
+<a name="l00177"></a>00177 
+<a name="l00179"></a>00179         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_grow_to_at_least( size_type new_size, size_type element_size, internal_array_op2 init, <span class="keyword">const</span> <span class="keywordtype">void</span> *src );
+<a name="l00180"></a>00180 <span class="keyword">private</span>:
+<a name="l00182"></a>00182         <span class="keyword">class </span>helper;
+<a name="l00183"></a>00183         <span class="keyword">friend</span> <span class="keyword">class </span>helper;
+<a name="l00184"></a>00184     };
+<a name="l00185"></a>00185     
+<a name="l00186"></a>00186     <span class="keyword">typedef</span> concurrent_vector_base_v3 concurrent_vector_base;
+<a name="l00187"></a>00187 
+<a name="l00189"></a>00189 
+<a name="l00191"></a>00191     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value>
+<a name="l00192"></a>00192     <span class="keyword">class </span>vector_iterator 
+<a name="l00193"></a>00193     {
+<a name="l00195"></a>00195         Container* my_vector;
+<a name="l00196"></a>00196 
+<a name="l00198"></a>00198         size_t my_index;
+<a name="l00199"></a>00199 
+<a name="l00201"></a>00201 
+<a name="l00202"></a>00202         <span class="keyword">mutable</span> Value* my_item;
+<a name="l00203"></a>00203 
+<a name="l00204"></a>00204         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T>
+<a name="l00205"></a>00205         <span class="keyword">friend</span> vector_iterator<C,T> operator+( ptrdiff_t offset, <span class="keyword">const</span> vector_iterator<C,T>& v );
+<a name="l00206"></a>00206 
+<a name="l00207"></a>00207         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00208"></a>00208         <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> vector_iterator<C,T>& i, <span class="keyword">const</span> vector_iterator<C,U>& j );
+<a name="l00209"></a>00209 
+<a name="l00210"></a>00210         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00211"></a>00211         <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<( const vector_iterator<C,T>& i, <span class="keyword">const</span> vector_iterator<C,U>& j );
+<a name="l00212"></a>00212 
+<a name="l00213"></a>00213         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00214"></a>00214         <span class="keyword">friend</span> ptrdiff_t operator-( <span class="keyword">const</span> vector_iterator<C,T>& i, <span class="keyword">const</span> vector_iterator<C,U>& j );
+<a name="l00215"></a>00215     
+<a name="l00216"></a>00216         <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
+<a name="l00217"></a>00217         <span class="keyword">friend</span> <span class="keyword">class </span>internal::vector_iterator;
+<a name="l00218"></a>00218 
+<a name="l00219"></a>00219 <span class="preprocessor">#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)</span>
+<a name="l00220"></a>00220 <span class="preprocessor"></span>        <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00221"></a>00221         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00250.html">tbb::concurrent_vector</a>;
+<a name="l00222"></a>00222 <span class="preprocessor">#else</span>
+<a name="l00223"></a>00223 <span class="preprocessor"></span><span class="keyword">public</span>: <span class="comment">// workaround for MSVC</span>
+<a name="l00224"></a>00224 <span class="preprocessor">#endif </span>
+<a name="l00225"></a>00225 <span class="preprocessor"></span>
+<a name="l00226"></a>00226         vector_iterator( <span class="keyword">const</span> Container& vector, size_t index, <span class="keywordtype">void</span> *ptr = 0 ) : 
+<a name="l00227"></a>00227             my_vector(const_cast<Container*>(&vector)), 
+<a name="l00228"></a>00228             my_index(index), 
+<a name="l00229"></a>00229             my_item(static_cast<Value*>(ptr))
+<a name="l00230"></a>00230         {}
+<a name="l00231"></a>00231 
+<a name="l00232"></a>00232     <span class="keyword">public</span>:
+<a name="l00234"></a>00234         vector_iterator() : my_vector(NULL), my_index(~size_t(0)), my_item(NULL) {}
+<a name="l00235"></a>00235 
+<a name="l00236"></a>00236         vector_iterator( <span class="keyword">const</span> vector_iterator<Container,typename Container::value_type>& other ) :
+<a name="l00237"></a>00237             my_vector(other.my_vector),
+<a name="l00238"></a>00238             my_index(other.my_index),
+<a name="l00239"></a>00239             my_item(other.my_item)
+<a name="l00240"></a>00240         {}
+<a name="l00241"></a>00241 
+<a name="l00242"></a>00242         vector_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
+<a name="l00243"></a>00243             <span class="keywordflow">return</span> vector_iterator( *my_vector, my_index+offset );
+<a name="l00244"></a>00244         }
+<a name="l00245"></a>00245         vector_iterator &operator+=( ptrdiff_t offset ) {
+<a name="l00246"></a>00246             my_index+=offset;
+<a name="l00247"></a>00247             my_item = NULL;
+<a name="l00248"></a>00248             <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00249"></a>00249         }
+<a name="l00250"></a>00250         vector_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
+<a name="l00251"></a>00251             <span class="keywordflow">return</span> vector_iterator( *my_vector, my_index-offset );
+<a name="l00252"></a>00252         }
+<a name="l00253"></a>00253         vector_iterator &operator-=( ptrdiff_t offset ) {
+<a name="l00254"></a>00254             my_index-=offset;
+<a name="l00255"></a>00255             my_item = NULL;
+<a name="l00256"></a>00256             <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00257"></a>00257         }
+<a name="l00258"></a>00258         Value& operator*()<span class="keyword"> const </span>{
+<a name="l00259"></a>00259             Value* item = my_item;
+<a name="l00260"></a>00260             <span class="keywordflow">if</span>( !item ) {
+<a name="l00261"></a>00261                 item = my_item = &my_vector->internal_subscript(my_index);
+<a name="l00262"></a>00262             }
+<a name="l00263"></a>00263             __TBB_ASSERT( item==&my_vector->internal_subscript(my_index), <span class="stringliteral">"corrupt cache"</span> );
+<a name="l00264"></a>00264             <span class="keywordflow">return</span> *item;
+<a name="l00265"></a>00265         }
+<a name="l00266"></a>00266         Value& <a class="code" href="a00250.html#4c52f2950bb1832886bd4458eb09d7eb">operator[]</a>( ptrdiff_t k )<span class="keyword"> const </span>{
+<a name="l00267"></a>00267             <span class="keywordflow">return</span> my_vector->internal_subscript(my_index+k);
+<a name="l00268"></a>00268         }
+<a name="l00269"></a>00269         Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
+<a name="l00270"></a>00270 
+<a name="l00272"></a>00272         vector_iterator& operator++() {
+<a name="l00273"></a>00273             size_t k = ++my_index;
+<a name="l00274"></a>00274             <span class="keywordflow">if</span>( my_item ) {
+<a name="l00275"></a>00275                 <span class="comment">// Following test uses 2's-complement wizardry</span>
+<a name="l00276"></a>00276                 <span class="keywordflow">if</span>( (k& (k-2))==0 ) {
+<a name="l00277"></a>00277                     <span class="comment">// k is a power of two that is at least k-2</span>
+<a name="l00278"></a>00278                     my_item= NULL;
+<a name="l00279"></a>00279                 } <span class="keywordflow">else</span> {
+<a name="l00280"></a>00280                     ++my_item;
+<a name="l00281"></a>00281                 }
+<a name="l00282"></a>00282             }
+<a name="l00283"></a>00283             <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00284"></a>00284         }
+<a name="l00285"></a>00285 
+<a name="l00287"></a>00287         vector_iterator& operator--() {
+<a name="l00288"></a>00288             __TBB_ASSERT( my_index>0, <span class="stringliteral">"operator--() applied to iterator already at beginning of concurrent_vector"</span> ); 
+<a name="l00289"></a>00289             size_t k = my_index--;
+<a name="l00290"></a>00290             <span class="keywordflow">if</span>( my_item ) {
+<a name="l00291"></a>00291                 <span class="comment">// Following test uses 2's-complement wizardry</span>
+<a name="l00292"></a>00292                 <span class="keywordflow">if</span>( (k& (k-2))==0 ) {
+<a name="l00293"></a>00293                     <span class="comment">// k is a power of two that is at least k-2  </span>
+<a name="l00294"></a>00294                     my_item= NULL;
+<a name="l00295"></a>00295                 } <span class="keywordflow">else</span> {
+<a name="l00296"></a>00296                     --my_item;
+<a name="l00297"></a>00297                 }
+<a name="l00298"></a>00298             }
+<a name="l00299"></a>00299             <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00300"></a>00300         }
+<a name="l00301"></a>00301 
+<a name="l00303"></a>00303         vector_iterator operator++(<span class="keywordtype">int</span>) {
+<a name="l00304"></a>00304             vector_iterator result = *<span class="keyword">this</span>;
+<a name="l00305"></a>00305             operator++();
+<a name="l00306"></a>00306             <span class="keywordflow">return</span> result;
+<a name="l00307"></a>00307         }
+<a name="l00308"></a>00308 
+<a name="l00310"></a>00310         vector_iterator operator--(<span class="keywordtype">int</span>) {
+<a name="l00311"></a>00311             vector_iterator result = *<span class="keyword">this</span>;
+<a name="l00312"></a>00312             operator--();
+<a name="l00313"></a>00313             <span class="keywordflow">return</span> result;
+<a name="l00314"></a>00314         }
+<a name="l00315"></a>00315 
+<a name="l00316"></a>00316         <span class="comment">// STL support</span>
+<a name="l00317"></a>00317 
+<a name="l00318"></a>00318         <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00319"></a>00319         <span class="keyword">typedef</span> Value value_type;
+<a name="l00320"></a>00320         <span class="keyword">typedef</span> Value* pointer;
+<a name="l00321"></a>00321         <span class="keyword">typedef</span> Value& reference;
+<a name="l00322"></a>00322         <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
+<a name="l00323"></a>00323     };
+<a name="l00324"></a>00324 
+<a name="l00325"></a>00325     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
+<a name="l00326"></a>00326     vector_iterator<Container,T> operator+( ptrdiff_t offset, <span class="keyword">const</span> vector_iterator<Container,T>& v ) {
+<a name="l00327"></a>00327         <span class="keywordflow">return</span> vector_iterator<Container,T>( *v.my_vector, v.my_index+offset );
+<a name="l00328"></a>00328     }
+<a name="l00329"></a>00329 
+<a name="l00330"></a>00330     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00331"></a>00331     <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
+<a name="l00332"></a>00332         <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_vector == j.my_vector;
+<a name="l00333"></a>00333     }
+<a name="l00334"></a>00334 
+<a name="l00335"></a>00335     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00336"></a>00336     <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
+<a name="l00337"></a>00337         <span class="keywordflow">return</span> !(i==j);
+<a name="l00338"></a>00338     }
+<a name="l00339"></a>00339 
+<a name="l00340"></a>00340     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00341"></a>00341     <span class="keywordtype">bool</span> operator<( const vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
+<a name="l00342"></a>00342         <span class="keywordflow">return</span> i.my_index<j.my_index;
+<a name="l00343"></a>00343     }
+<a name="l00344"></a>00344 
+<a name="l00345"></a>00345     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00346"></a>00346     <span class="keywordtype">bool</span> operator>( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
+<a name="l00347"></a>00347         <span class="keywordflow">return</span> j<i;
+<a name="l00348"></a>00348     }
+<a name="l00349"></a>00349 
+<a name="l00350"></a>00350     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00351"></a>00351     <span class="keywordtype">bool</span> operator>=( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
+<a name="l00352"></a>00352         <span class="keywordflow">return</span> !(i<j);
+<a name="l00353"></a>00353     }
+<a name="l00354"></a>00354 
+<a name="l00355"></a>00355     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00356"></a>00356     <span class="keywordtype">bool</span> operator<=( const vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
+<a name="l00357"></a>00357         <span class="keywordflow">return</span> !(j<i);
+<a name="l00358"></a>00358     }
+<a name="l00359"></a>00359 
+<a name="l00360"></a>00360     <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00361"></a>00361     ptrdiff_t operator-( <span class="keyword">const</span> vector_iterator<Container,T>& i, <span class="keyword">const</span> vector_iterator<Container,U>& j ) {
+<a name="l00362"></a>00362         <span class="keywordflow">return</span> ptrdiff_t(i.my_index)-ptrdiff_t(j.my_index);
+<a name="l00363"></a>00363     }
+<a name="l00364"></a>00364 
+<a name="l00365"></a>00365     <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00366"></a>00366     <span class="keyword">class </span>allocator_base {
+<a name="l00367"></a>00367     <span class="keyword">public</span>:
+<a name="l00368"></a>00368         <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template
+<a name="l00369"></a>00369             rebind<T>::other allocator_type;
+<a name="l00370"></a>00370         allocator_type my_allocator;
+<a name="l00371"></a>00371 
+<a name="l00372"></a>00372         allocator_base(<span class="keyword">const</span> allocator_type &a = allocator_type() ) : my_allocator(a) {}
+<a name="l00373"></a>00373     };
+<a name="l00374"></a>00374 
+<a name="l00375"></a>00375 } <span class="comment">// namespace internal</span>
+<a name="l00377"></a>00377 <span class="comment"></span>
+<a name="l00379"></a>00379 
+<a name="l00440"></a>00440 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00441"></a><a class="code" href="a00250.html">00441</a> <span class="keyword">class </span><a class="code" href="a00250.html">concurrent_vector</a>: <span class="keyword">protected</span> internal::allocator_base<T, A>,
+<a name="l00442"></a>00442                          <span class="keyword">private</span> internal::concurrent_vector_base {
+<a name="l00443"></a>00443 <span class="keyword">private</span>:
+<a name="l00444"></a>00444     <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00445"></a>00445     <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00233.html">blocked_range</a><I> {
+<a name="l00446"></a>00446     <span class="keyword">public</span>:
+<a name="l00447"></a>00447         <span class="keyword">typedef</span> T value_type;
+<a name="l00448"></a>00448         <span class="keyword">typedef</span> T& reference;
+<a name="l00449"></a>00449         <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
+<a name="l00450"></a>00450         <span class="keyword">typedef</span> I iterator;
+<a name="l00451"></a>00451         <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00452"></a>00452         generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00233.html">blocked_range<I></a>(begin_,end_,grainsize_) {} 
+<a name="l00453"></a>00453         template<typename U>
+<a name="l00454"></a>00454         generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00233.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {} 
+<a name="l00455"></a>00455         generic_range_type( generic_range_type& r, <a class="code" href="a00309.html">split</a> ) : <a class="code" href="a00233.html">blocked_range<I></a>(r,<a class="code" href="a00309.html">split</a>()) {}
+<a name="l00456"></a>00456     };
+<a name="l00457"></a>00457 
+<a name="l00458"></a>00458     <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U>
+<a name="l00459"></a>00459     <span class="keyword">friend</span> <span class="keyword">class </span>internal::vector_iterator;
+<a name="l00460"></a>00460 <span class="keyword">public</span>:
+<a name="l00461"></a>00461     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00462"></a>00462     <span class="comment">// STL compatible types</span>
+<a name="l00463"></a>00463     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00464"></a>00464     <span class="keyword">typedef</span> internal::concurrent_vector_base_v3::size_type size_type;
+<a name="l00465"></a>00465     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_base<T, A>::allocator_type allocator_type;
+<a name="l00466"></a>00466 
+<a name="l00467"></a>00467     <span class="keyword">typedef</span> T value_type;
+<a name="l00468"></a>00468     <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00469"></a>00469     <span class="keyword">typedef</span> T& reference;
+<a name="l00470"></a>00470     <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
+<a name="l00471"></a>00471     <span class="keyword">typedef</span> T *pointer;
+<a name="l00472"></a>00472     <span class="keyword">typedef</span> <span class="keyword">const</span> T *const_pointer;
+<a name="l00473"></a>00473 
+<a name="l00474"></a>00474     <span class="keyword">typedef</span> internal::vector_iterator<concurrent_vector,T> iterator;
+<a name="l00475"></a>00475     <span class="keyword">typedef</span> internal::vector_iterator<concurrent_vector,const T> const_iterator;
+<a name="l00476"></a>00476 
+<a name="l00477"></a>00477 <span class="preprocessor">#if !defined(_MSC_VER) || _CPPLIB_VER>=300 </span>
+<a name="l00478"></a>00478 <span class="preprocessor"></span>    <span class="comment">// Assume ISO standard definition of std::reverse_iterator</span>
+<a name="l00479"></a>00479     <span class="keyword">typedef</span> std::reverse_iterator<iterator> reverse_iterator;
+<a name="l00480"></a>00480     <span class="keyword">typedef</span> std::reverse_iterator<const_iterator> const_reverse_iterator;
+<a name="l00481"></a>00481 <span class="preprocessor">#else</span>
+<a name="l00482"></a>00482 <span class="preprocessor"></span>    <span class="comment">// Use non-standard std::reverse_iterator</span>
+<a name="l00483"></a>00483     <span class="keyword">typedef</span> std::reverse_iterator<iterator,T,T&,T*> reverse_iterator;
+<a name="l00484"></a>00484     <span class="keyword">typedef</span> std::reverse_iterator<const_iterator,T,const T&,const T*> const_reverse_iterator;
+<a name="l00485"></a>00485 <span class="preprocessor">#endif </span><span class="comment">/* defined(_MSC_VER) && (_MSC_VER<1300) */</span>
+<a name="l00486"></a>00486 
+<a name="l00487"></a>00487     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00488"></a>00488     <span class="comment">// Parallel algorithm support</span>
+<a name="l00489"></a>00489     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00490"></a>00490     <span class="keyword">typedef</span> generic_range_type<iterator> range_type;
+<a name="l00491"></a>00491     <span class="keyword">typedef</span> generic_range_type<const_iterator> const_range_type;
+<a name="l00492"></a>00492 
+<a name="l00493"></a>00493     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00494"></a>00494     <span class="comment">// STL compatible constructors & destructors</span>
+<a name="l00495"></a>00495     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00496"></a>00496 
+<a name="l00498"></a><a class="code" href="a00250.html#2c8ca9cabfcd30ad5943324c853664b5">00498</a>     <span class="keyword">explicit</span> <a class="code" href="a00250.html">concurrent_vector</a>(<span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00499"></a>00499         : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
+<a name="l00500"></a>00500     {
+<a name="l00501"></a>00501         vector_allocator_ptr = &internal_allocator;
+<a name="l00502"></a>00502     }
+<a name="l00503"></a>00503 
+<a name="l00505"></a><a class="code" href="a00250.html#dd8a200b99a8088435a37934b58fe335">00505</a>     <a class="code" href="a00250.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00250.html">concurrent_vector</a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
+<a name="l00506"></a>00506         : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
+<a name="l00507"></a>00507     {
+<a name="l00508"></a>00508         vector_allocator_ptr = &internal_allocator;
+<a name="l00509"></a>00509         __TBB_TRY {
+<a name="l00510"></a>00510             internal_copy(vector, <span class="keyword">sizeof</span>(T), &copy_array);
+<a name="l00511"></a>00511         } __TBB_CATCH(...) {
+<a name="l00512"></a>00512             segment_t *table = my_segment;
+<a name="l00513"></a>00513             internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+<a name="l00514"></a>00514             __TBB_RETHROW();
+<a name="l00515"></a>00515         }
+<a name="l00516"></a>00516     }
+<a name="l00517"></a>00517 
+<a name="l00519"></a>00519     <span class="keyword">template</span><<span class="keyword">class</span> M>
+<a name="l00520"></a><a class="code" href="a00250.html#64432f13f7b29bfe4acfb5568f34f3a8">00520</a>     <a class="code" href="a00250.html">concurrent_vector</a>( <span class="keyword">const</span> <a class="code" href="a00250.html">concurrent_vector<T, M></a>& vector, <span class="keyword">const</span> allocator_type& a = allocator_type() )
+<a name="l00521"></a>00521         : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()
+<a name="l00522"></a>00522     {
+<a name="l00523"></a>00523         vector_allocator_ptr = &internal_allocator;
+<a name="l00524"></a>00524         __TBB_TRY {
+<a name="l00525"></a>00525             internal_copy(vector.<a class="code" href="a00250.html#bb5ae659871478f1f5c68039e1273e12">internal_vector_base</a>(), <span class="keyword">sizeof</span>(T), &copy_array);
+<a name="l00526"></a>00526         } __TBB_CATCH(...) {
+<a name="l00527"></a>00527             segment_t *table = my_segment;
+<a name="l00528"></a>00528             internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+<a name="l00529"></a>00529             __TBB_RETHROW();
+<a name="l00530"></a>00530         }
+<a name="l00531"></a>00531     }
+<a name="l00532"></a>00532 
+<a name="l00534"></a><a class="code" href="a00250.html#2a2e261dfe1cab3f73f7b1a94137cfca">00534</a>     <span class="keyword">explicit</span> <a class="code" href="a00250.html">concurrent_vector</a>(size_type n)
+<a name="l00535"></a>00535     {
+<a name="l00536"></a>00536         vector_allocator_ptr = &internal_allocator;
+<a name="l00537"></a>00537         __TBB_TRY {
+<a name="l00538"></a>00538             internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
+<a name="l00539"></a>00539         } __TBB_CATCH(...) {
+<a name="l00540"></a>00540             segment_t *table = my_segment;
+<a name="l00541"></a>00541             internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+<a name="l00542"></a>00542             __TBB_RETHROW();
+<a name="l00543"></a>00543         }
+<a name="l00544"></a>00544     }
+<a name="l00545"></a>00545 
+<a name="l00547"></a><a class="code" href="a00250.html#3883a8a908b44e249a57f454de3f55d8">00547</a>     <a class="code" href="a00250.html">concurrent_vector</a>(size_type n, const_reference t, <span class="keyword">const</span> allocator_type& a = allocator_type())
+<a name="l00548"></a>00548         : internal::allocator_base<T, A>(a)
+<a name="l00549"></a>00549     {
+<a name="l00550"></a>00550         vector_allocator_ptr = &internal_allocator;
+<a name="l00551"></a>00551         __TBB_TRY {
+<a name="l00552"></a>00552             internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
+<a name="l00553"></a>00553         } __TBB_CATCH(...) {
+<a name="l00554"></a>00554             segment_t *table = my_segment;
+<a name="l00555"></a>00555             internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+<a name="l00556"></a>00556             __TBB_RETHROW();
+<a name="l00557"></a>00557         }
+<a name="l00558"></a>00558     }
+<a name="l00559"></a>00559 
+<a name="l00561"></a>00561     <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00562"></a><a class="code" href="a00250.html#4450de83c5862ea4bcd9443fd7e67419">00562</a>     <a class="code" href="a00250.html">concurrent_vector</a>(I first, I last, <span class="keyword">const</span> allocator_type &a = allocator_type())
+<a name="l00563"></a>00563         : internal::allocator_base<T, A>(a)
+<a name="l00564"></a>00564     {
+<a name="l00565"></a>00565         vector_allocator_ptr = &internal_allocator;
+<a name="l00566"></a>00566         __TBB_TRY {
+<a name="l00567"></a>00567             internal_assign_range(first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
+<a name="l00568"></a>00568         } __TBB_CATCH(...) {
+<a name="l00569"></a>00569             segment_t *table = my_segment;
+<a name="l00570"></a>00570             internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+<a name="l00571"></a>00571             __TBB_RETHROW();
+<a name="l00572"></a>00572         }
+<a name="l00573"></a>00573     }
+<a name="l00574"></a>00574 
+<a name="l00576"></a><a class="code" href="a00250.html#691f0f3cda3e489c37a657016e375eaf">00576</a>     <a class="code" href="a00250.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00250.html">concurrent_vector</a>& vector ) {
+<a name="l00577"></a>00577         <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector )
+<a name="l00578"></a>00578             internal_assign(vector, <span class="keyword">sizeof</span>(T), &destroy_array, &assign_array, &copy_array);
+<a name="l00579"></a>00579         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00580"></a>00580     }
+<a name="l00581"></a>00581 
+<a name="l00583"></a>00583     <span class="keyword">template</span><<span class="keyword">class</span> M>
+<a name="l00584"></a><a class="code" href="a00250.html#19f4ab88a01b0fd056af3bba463e7bd6">00584</a>     <a class="code" href="a00250.html">concurrent_vector</a>& operator=( <span class="keyword">const</span> <a class="code" href="a00250.html">concurrent_vector<T, M></a>& vector ) {
+<a name="l00585"></a>00585         <span class="keywordflow">if</span>( static_cast<void*>( <span class="keyword">this</span> ) != static_cast<const void*>( &vector ) )
+<a name="l00586"></a>00586             internal_assign(vector.internal_vector_base(),
+<a name="l00587"></a>00587                 <span class="keyword">sizeof</span>(T), &destroy_array, &assign_array, &copy_array);
+<a name="l00588"></a>00588         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00589"></a>00589     }
+<a name="l00590"></a>00590 
+<a name="l00591"></a>00591     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00592"></a>00592     <span class="comment">// Concurrent operations</span>
+<a name="l00593"></a>00593     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00595"></a>00595 <span class="comment"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00596"></a>00596 <span class="preprocessor"></span>
+<a name="l00597"></a><a class="code" href="a00250.html#30484e3959892fd5392fa93c873c31f0">00597</a>     size_type grow_by( size_type delta ) {
+<a name="l00598"></a>00598         <span class="keywordflow">return</span> delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array, NULL ) : my_early_size;
+<a name="l00599"></a>00599     }
+<a name="l00600"></a>00600 <span class="preprocessor">#else</span>
+<a name="l00601"></a>00601 <span class="preprocessor"></span>
+<a name="l00602"></a><a class="code" href="a00250.html#c8177b1865270ea68aa1ab9148e5e35e">00602</a>     iterator grow_by( size_type delta ) {
+<a name="l00603"></a>00603         <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array, NULL ) : my_early_size);
+<a name="l00604"></a>00604     }
+<a name="l00605"></a>00605 <span class="preprocessor">#endif</span>
+<a name="l00606"></a>00606 <span class="preprocessor"></span>
+<a name="l00608"></a>00608 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00609"></a>00609 <span class="preprocessor"></span>
+<a name="l00610"></a><a class="code" href="a00250.html#38274ab3f772ecba600c7daca7690102">00610</a>     size_type grow_by( size_type delta, const_reference t ) {
+<a name="l00611"></a>00611         <span class="keywordflow">return</span> delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array_by, static_cast<const void*>(&t) ) : my_early_size;
+<a name="l00612"></a>00612     }
+<a name="l00613"></a>00613 <span class="preprocessor">#else</span>
+<a name="l00614"></a>00614 <span class="preprocessor"></span>
+<a name="l00615"></a><a class="code" href="a00250.html#473a59a4c9308b93411b898b3110d26c">00615</a>     iterator grow_by( size_type delta, const_reference t ) {
+<a name="l00616"></a>00616         <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, delta ? internal_grow_by( delta, <span class="keyword">sizeof</span>(T), &initialize_array_by, static_cast<const void*>(&t) ) : my_early_size);
+<a name="l00617"></a>00617     }
+<a name="l00618"></a>00618 <span class="preprocessor">#endif</span>
+<a name="l00619"></a>00619 <span class="preprocessor"></span>
+<a name="l00621"></a>00621 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00622"></a>00622 <span class="preprocessor"></span>
+<a name="l00624"></a><a class="code" href="a00250.html#47fe588214dd5fa06ab6e8ab78d83874">00624</a>     <span class="keywordtype">void</span> grow_to_at_least( size_type n ) {
+<a name="l00625"></a>00625         <span class="keywordflow">if</span>( n ) internal_grow_to_at_least_with_result( n, <span class="keyword">sizeof</span>(T), &initialize_array, NULL );
+<a name="l00626"></a>00626     };
+<a name="l00627"></a>00627 <span class="preprocessor">#else</span>
+<a name="l00628"></a>00628 <span class="preprocessor"></span>
+<a name="l00632"></a><a class="code" href="a00250.html#a7e3b67c8ccab16d0aecc80899ae799d">00632</a>     iterator grow_to_at_least( size_type n ) {
+<a name="l00633"></a>00633         size_type m=0;
+<a name="l00634"></a>00634         <span class="keywordflow">if</span>( n ) {
+<a name="l00635"></a>00635             m = internal_grow_to_at_least_with_result( n, <span class="keyword">sizeof</span>(T), &initialize_array, NULL );
+<a name="l00636"></a>00636             <span class="keywordflow">if</span>( m>n ) m=n;
+<a name="l00637"></a>00637         }
+<a name="l00638"></a>00638         <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, m);
+<a name="l00639"></a>00639     };
+<a name="l00640"></a>00640 <span class="preprocessor">#endif</span>
+<a name="l00641"></a>00641 <span class="preprocessor"></span>
+<a name="l00643"></a>00643 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00644"></a><a class="code" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">00644</a> <span class="preprocessor"></span>    size_type push_back( const_reference item )
+<a name="l00645"></a>00645 <span class="preprocessor">#else</span>
+<a name="l00646"></a>00646 <span class="preprocessor"></span>
+<a name="l00647"></a>00647     iterator push_back( const_reference item )
+<a name="l00648"></a>00648 <span class="preprocessor">#endif</span>
+<a name="l00649"></a>00649 <span class="preprocessor"></span>    {
+<a name="l00650"></a>00650         size_type k;
+<a name="l00651"></a>00651         <span class="keywordtype">void</span> *ptr = internal_push_back(<span class="keyword">sizeof</span>(T),k);
+<a name="l00652"></a>00652         internal_loop_guide loop(1, ptr);
+<a name="l00653"></a>00653         loop.init(&item);
+<a name="l00654"></a>00654 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00655"></a>00655 <span class="preprocessor"></span>        <span class="keywordflow">return</span> k;
+<a name="l00656"></a>00656 <span class="preprocessor">#else</span>
+<a name="l00657"></a>00657 <span class="preprocessor"></span>        <span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>, k, ptr);
+<a name="l00658"></a>00658 <span class="preprocessor">#endif</span>
+<a name="l00659"></a>00659 <span class="preprocessor"></span>    }
+<a name="l00660"></a>00660 
+<a name="l00662"></a>00662 
+<a name="l00664"></a><a class="code" href="a00250.html#4c52f2950bb1832886bd4458eb09d7eb">00664</a>     reference operator[]( size_type index ) {
+<a name="l00665"></a>00665         <span class="keywordflow">return</span> internal_subscript(index);
+<a name="l00666"></a>00666     }
+<a name="l00667"></a>00667 
+<a name="l00669"></a><a class="code" href="a00250.html#c6fade5c732cc95274d1d8277ea619d1">00669</a>     const_reference operator[]( size_type index )<span class="keyword"> const </span>{
+<a name="l00670"></a>00670         <span class="keywordflow">return</span> internal_subscript(index);
+<a name="l00671"></a>00671     }
+<a name="l00672"></a>00672 
+<a name="l00674"></a><a class="code" href="a00250.html#0c073ca43e787c7cbf7b0e26d2221748">00674</a>     reference at( size_type index ) {
+<a name="l00675"></a>00675         <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
+<a name="l00676"></a>00676     }
+<a name="l00677"></a>00677 
+<a name="l00679"></a><a class="code" href="a00250.html#23e14a38af748edff96a7adc3a0f1c58">00679</a>     const_reference at( size_type index )<span class="keyword"> const </span>{
+<a name="l00680"></a>00680         <span class="keywordflow">return</span> internal_subscript_with_exceptions(index);
+<a name="l00681"></a>00681     }
+<a name="l00682"></a>00682 
+<a name="l00684"></a><a class="code" href="a00250.html#a4c6ffff3bf08b92939aa2fc516edfba">00684</a>     range_type range( size_t grainsize = 1) {
+<a name="l00685"></a>00685         <span class="keywordflow">return</span> range_type( begin(), end(), grainsize );
+<a name="l00686"></a>00686     }
+<a name="l00687"></a>00687 
+<a name="l00689"></a><a class="code" href="a00250.html#3d09ccfb581b879ae64203741035e193">00689</a>     const_range_type range( size_t grainsize = 1 )<span class="keyword"> const </span>{
+<a name="l00690"></a>00690         <span class="keywordflow">return</span> const_range_type( begin(), end(), grainsize );
+<a name="l00691"></a>00691     }
+<a name="l00692"></a>00692     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00693"></a>00693     <span class="comment">// Capacity</span>
+<a name="l00694"></a>00694     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00696"></a><a class="code" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">00696</a> <span class="comment"></span>    size_type size()<span class="keyword"> const </span>{
+<a name="l00697"></a>00697         size_type sz = my_early_size, cp = internal_capacity();
+<a name="l00698"></a>00698         <span class="keywordflow">return</span> cp < sz ? cp : sz;
+<a name="l00699"></a>00699     }
+<a name="l00700"></a>00700 
+<a name="l00702"></a><a class="code" href="a00250.html#c6426cb93cf20d3af40f3c90f1f0481a">00702</a>     <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !my_early_size;}
+<a name="l00703"></a>00703 
+<a name="l00705"></a><a class="code" href="a00250.html#3ed6b9ae7217af5103d974045b6f5cd5">00705</a>     size_type capacity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_capacity();}
+<a name="l00706"></a>00706 
+<a name="l00708"></a>00708 
+<a name="l00710"></a><a class="code" href="a00250.html#5a0ce05026994b010018f72cfdeb72c1">00710</a>     <span class="keywordtype">void</span> reserve( size_type n ) {
+<a name="l00711"></a>00711         <span class="keywordflow">if</span>( n )
+<a name="l00712"></a>00712             internal_reserve(n, <span class="keyword">sizeof</span>(T), max_size());
+<a name="l00713"></a>00713     }
+<a name="l00714"></a>00714 
+<a name="l00716"></a><a class="code" href="a00250.html#8dfb0cb0eef96d440b4dcf801807a718">00716</a>     <span class="keywordtype">void</span> resize( size_type n ) {
+<a name="l00717"></a>00717         internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), NULL, &destroy_array, &initialize_array );
+<a name="l00718"></a>00718     }
+<a name="l00719"></a>00719     
+<a name="l00721"></a><a class="code" href="a00250.html#98ce6b2c6d2622f0c030b46dfac3880c">00721</a>     <span class="keywordtype">void</span> resize( size_type n, const_reference t ) {
+<a name="l00722"></a>00722         internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
+<a name="l00723"></a>00723     }
+<a name="l00724"></a>00724    
+<a name="l00725"></a>00725 <span class="preprocessor">#if TBB_DEPRECATED </span>
+<a name="l00727"></a><a class="code" href="a00250.html#1693d1da41b1a8235871be9c6633be35">00727</a> <span class="preprocessor">    void compact() {shrink_to_fit();}</span>
+<a name="l00728"></a>00728 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
+<a name="l00729"></a>00729 
+<a name="l00731"></a>00731     <span class="keywordtype">void</span> shrink_to_fit();
+<a name="l00732"></a>00732 
+<a name="l00734"></a><a class="code" href="a00250.html#2c248a017f0576df3e7cd99627836fd6">00734</a>     size_type max_size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (~size_type(0))/<span class="keyword">sizeof</span>(T);}
+<a name="l00735"></a>00735 
+<a name="l00736"></a>00736     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00737"></a>00737     <span class="comment">// STL support</span>
+<a name="l00738"></a>00738     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00739"></a>00739 
+<a name="l00741"></a><a class="code" href="a00250.html#730b23a251ecb6d37f692fb22f38e029">00741</a>     iterator begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,0);}
+<a name="l00743"></a><a class="code" href="a00250.html#c0b51160e5a764982ec97a455f94f2c6">00743</a>     iterator end() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>,size());}
+<a name="l00745"></a><a class="code" href="a00250.html#78a06182276ff758788d4c0623ae0d71">00745</a>     const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
+<a name="l00747"></a><a class="code" href="a00250.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">00747</a>     const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
+<a name="l00749"></a><a class="code" href="a00250.html#f88fcf1c920693c39bd9709db33c199f">00749</a>     const_iterator cbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,0);}
+<a name="l00751"></a><a class="code" href="a00250.html#0c15a5d0f1cf75d687dabba07da1d46b">00751</a>     const_iterator cend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>,size());}
+<a name="l00753"></a><a class="code" href="a00250.html#5e220926d09236d98f04fe0721e5f9a1">00753</a>     reverse_iterator rbegin() {<span class="keywordflow">return</span> reverse_iterator(end());}
+<a name="l00755"></a><a class="code" href="a00250.html#290119a4eb43cd6a9e98fa17016ba3c2">00755</a>     reverse_iterator rend() {<span class="keywordflow">return</span> reverse_iterator(begin());}
+<a name="l00757"></a><a class="code" href="a00250.html#9f9c103e18d5f212703805354074ad44">00757</a>     const_reverse_iterator rbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
+<a name="l00759"></a><a class="code" href="a00250.html#d438b9b32ea3a8ffb703015b6dce055b">00759</a>     const_reverse_iterator rend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
+<a name="l00761"></a><a class="code" href="a00250.html#db78a1d28c9c966050e8a2926d834a33">00761</a>     const_reverse_iterator crbegin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(end());}
+<a name="l00763"></a><a class="code" href="a00250.html#fff9cece89438587997ebedf93c5e962">00763</a>     const_reverse_iterator crend()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_reverse_iterator(begin());}
+<a name="l00765"></a><a class="code" href="a00250.html#15181759c0bfa2ddce5d10c7550e0002">00765</a>     reference front() {
+<a name="l00766"></a>00766         __TBB_ASSERT( size()>0, NULL);
+<a name="l00767"></a>00767         <span class="keywordflow">return</span> static_cast<T*>(my_segment[0].array)[0];
+<a name="l00768"></a>00768     }
+<a name="l00770"></a><a class="code" href="a00250.html#502615a858eb9fa0390ee59169065e90">00770</a>     const_reference front()<span class="keyword"> const </span>{
+<a name="l00771"></a>00771         __TBB_ASSERT( size()>0, NULL);
+<a name="l00772"></a>00772         <span class="keywordflow">return</span> static_cast<const T*>(my_segment[0].array)[0];
+<a name="l00773"></a>00773     }
+<a name="l00775"></a><a class="code" href="a00250.html#41ce48d6015a1a2812d41cf620ec3476">00775</a>     reference back() {
+<a name="l00776"></a>00776         __TBB_ASSERT( size()>0, NULL);
+<a name="l00777"></a>00777         <span class="keywordflow">return</span> internal_subscript( size()-1 );
+<a name="l00778"></a>00778     }
+<a name="l00780"></a><a class="code" href="a00250.html#bd518e204107d07fd08d0ec5bdfd383d">00780</a>     const_reference back()<span class="keyword"> const </span>{
+<a name="l00781"></a>00781         __TBB_ASSERT( size()>0, NULL);
+<a name="l00782"></a>00782         <span class="keywordflow">return</span> internal_subscript( size()-1 );
+<a name="l00783"></a>00783     }
+<a name="l00785"></a><a class="code" href="a00250.html#2fdba8e90de6a4d2300222236d46758e">00785</a>     allocator_type get_allocator()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this->my_allocator; }
+<a name="l00786"></a>00786 
+<a name="l00788"></a><a class="code" href="a00250.html#423e5aa15e0e3309ad86d026fd85f6f6">00788</a>     <span class="keywordtype">void</span> assign(size_type n, const_reference t) {
+<a name="l00789"></a>00789         clear();
+<a name="l00790"></a>00790         internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );
+<a name="l00791"></a>00791     }
+<a name="l00792"></a>00792 
+<a name="l00794"></a>00794     <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00795"></a><a class="code" href="a00250.html#93a06b3112cb804f42f40efb5e7387b4">00795</a>     <span class="keywordtype">void</span> assign(I first, I last) {
+<a name="l00796"></a>00796         clear(); internal_assign_range( first, last, <span class="keyword">static_cast</span><is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );
+<a name="l00797"></a>00797     }
+<a name="l00798"></a>00798 
+<a name="l00800"></a><a class="code" href="a00250.html#96c9c4bd968ed3edb8dd276854d2dae0">00800</a>     <span class="keywordtype">void</span> swap(<a class="code" href="a00250.html">concurrent_vector</a> &vector) {
+<a name="l00801"></a>00801         <span class="keywordflow">if</span>( <span class="keyword">this</span> != &vector ) {
+<a name="l00802"></a>00802             concurrent_vector_base_v3::internal_swap(static_cast<concurrent_vector_base_v3&>(vector));
+<a name="l00803"></a>00803             std::swap(this->my_allocator, vector.my_allocator);
+<a name="l00804"></a>00804         }
+<a name="l00805"></a>00805     }
+<a name="l00806"></a>00806 
+<a name="l00808"></a>00808 
+<a name="l00809"></a><a class="code" href="a00250.html#26f937a359a66b6aae904c3cd9a3c444">00809</a>     <span class="keywordtype">void</span> clear() {
+<a name="l00810"></a>00810         internal_clear(&destroy_array);
+<a name="l00811"></a>00811     }
+<a name="l00812"></a>00812 
+<a name="l00814"></a><a class="code" href="a00250.html#da2444b28bb840d38f60d0030333a5fc">00814</a>     ~<a class="code" href="a00250.html">concurrent_vector</a>() {
+<a name="l00815"></a>00815         segment_t *table = my_segment;
+<a name="l00816"></a>00816         internal_free_segments( reinterpret_cast<void**>(table), internal_clear(&destroy_array), my_first_block );
+<a name="l00817"></a>00817         <span class="comment">// base class destructor call should be then</span>
+<a name="l00818"></a>00818     }
+<a name="l00819"></a>00819 
+<a name="l00820"></a>00820     <span class="keyword">const</span> internal::concurrent_vector_base_v3 &internal_vector_base()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
+<a name="l00821"></a>00821 <span class="keyword">private</span>:
+<a name="l00823"></a>00823     <span class="keyword">static</span> <span class="keywordtype">void</span> *internal_allocator(internal::concurrent_vector_base_v3 &vb, size_t k) {
+<a name="l00824"></a>00824         <span class="keywordflow">return</span> static_cast<concurrent_vector<T, A>&>(vb).my_allocator.allocate(k);
+<a name="l00825"></a>00825     }
+<a name="l00827"></a>00827     <span class="keywordtype">void</span> internal_free_segments(<span class="keywordtype">void</span> *table[], segment_index_t k, segment_index_t first_block);
+<a name="l00828"></a>00828 
+<a name="l00830"></a>00830     T& internal_subscript( size_type index ) <span class="keyword">const</span>;
+<a name="l00831"></a>00831 
+<a name="l00833"></a>00833     T& internal_subscript_with_exceptions( size_type index ) <span class="keyword">const</span>;
+<a name="l00834"></a>00834 
+<a name="l00836"></a>00836     <span class="keywordtype">void</span> internal_assign_n(size_type n, const_pointer p) {
+<a name="l00837"></a>00837         internal_resize( n, <span class="keyword">sizeof</span>(T), max_size(), static_cast<const void*>(p), &destroy_array, p? &initialize_array_by : &initialize_array );
+<a name="l00838"></a>00838     }
+<a name="l00839"></a>00839 
+<a name="l00841"></a>00841     <span class="keyword">template</span><<span class="keywordtype">bool</span> B> <span class="keyword">class </span>is_integer_tag;
+<a name="l00842"></a>00842 
+<a name="l00844"></a>00844     <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00845"></a>00845     <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<true> *) {
+<a name="l00846"></a>00846         internal_assign_n(static_cast<size_type>(first), &static_cast<T&>(last));
+<a name="l00847"></a>00847     }
+<a name="l00849"></a>00849     <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00850"></a>00850     <span class="keywordtype">void</span> internal_assign_range(I first, I last, is_integer_tag<false> *) {
+<a name="l00851"></a>00851         internal_assign_iterators(first, last);
+<a name="l00852"></a>00852     }
+<a name="l00854"></a>00854     <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00855"></a>00855     <span class="keywordtype">void</span> internal_assign_iterators(I first, I last);
+<a name="l00856"></a>00856 
+<a name="l00858"></a>00858     <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC initialize_array( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span>*, size_type n );
+<a name="l00859"></a>00859 
+<a name="l00861"></a>00861     <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC initialize_array_by( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
+<a name="l00862"></a>00862 
+<a name="l00864"></a>00864     <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC copy_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
+<a name="l00865"></a>00865 
+<a name="l00867"></a>00867     <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC assign_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n );
+<a name="l00868"></a>00868 
+<a name="l00870"></a>00870     <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC destroy_array( <span class="keywordtype">void</span>* begin, size_type n );
+<a name="l00871"></a>00871 
+<a name="l00873"></a>00873     <span class="keyword">class </span>internal_loop_guide : internal::no_copy {
+<a name="l00874"></a>00874     <span class="keyword">public</span>:
+<a name="l00875"></a>00875         <span class="keyword">const</span> pointer array;
+<a name="l00876"></a>00876         <span class="keyword">const</span> size_type n;
+<a name="l00877"></a>00877         size_type i;
+<a name="l00878"></a>00878         internal_loop_guide(size_type ntrials, <span class="keywordtype">void</span> *ptr)
+<a name="l00879"></a>00879             : array(static_cast<pointer>(ptr)), n(ntrials), i(0) {}
+<a name="l00880"></a>00880         <span class="keywordtype">void</span> init() {   <span class="keywordflow">for</span>(; i < n; ++i) <span class="keyword">new</span>( &array[i] ) T(); }
+<a name="l00881"></a>00881         <span class="keywordtype">void</span> init(<span class="keyword">const</span> <span class="keywordtype">void</span> *src) { <span class="keywordflow">for</span>(; i < n; ++i) new( &array[i] ) T(*static_cast<const T*>(src)); }
+<a name="l00882"></a>00882         <span class="keywordtype">void</span> copy(<span class="keyword">const</span> <span class="keywordtype">void</span> *src) { <span class="keywordflow">for</span>(; i < n; ++i) new( &array[i] ) T(static_cast<const T*>(src)[i]); }
+<a name="l00883"></a>00883         <span class="keywordtype">void</span> assign(<span class="keyword">const</span> <span class="keywordtype">void</span> *src) { <span class="keywordflow">for</span>(; i < n; ++i) array[i] = static_cast<const T*>(src)[i]; }
+<a name="l00884"></a>00884         <span class="keyword">template</span><<span class="keyword">class</span> I> <span class="keywordtype">void</span> iterate(I &src) { <span class="keywordflow">for</span>(; i < n; ++i, ++src) <span class="keyword">new</span>( &array[i] ) T( *src ); }
+<a name="l00885"></a>00885         ~internal_loop_guide() {
+<a name="l00886"></a>00886             <span class="keywordflow">if</span>(i < n) <span class="comment">// if exception raised, do zerroing on the rest of items</span>
+<a name="l00887"></a>00887                 std::memset(array+i, 0, (n-i)*<span class="keyword">sizeof</span>(value_type));
+<a name="l00888"></a>00888         }
+<a name="l00889"></a>00889     };
+<a name="l00890"></a>00890 };
+<a name="l00891"></a>00891 
+<a name="l00892"></a>00892 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
+<a name="l00893"></a>00893 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (push)</span>
+<a name="l00894"></a>00894 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (disable: 4701) // potentially uninitialized local variable "old"</span>
+<a name="l00895"></a>00895 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00896"></a>00896 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00897"></a><a class="code" href="a00250.html#03c6f4cf66532bf4cc907ee738a9a186">00897</a> <span class="keywordtype">void</span> <a class="code" href="a00250.html">concurrent_vector<T, A>::shrink_to_fit</a>() {
+<a name="l00898"></a>00898     internal_segments_table old;
+<a name="l00899"></a>00899     __TBB_TRY {
+<a name="l00900"></a>00900         <span class="keywordflow">if</span>( internal_compact( <span class="keyword">sizeof</span>(T), &old, &destroy_array, &copy_array ) )
+<a name="l00901"></a>00901             internal_free_segments( old.table, pointers_per_long_table, old.first_block ); <span class="comment">// free joined and unnecessary segments</span>
+<a name="l00902"></a>00902     } __TBB_CATCH(...) {
+<a name="l00903"></a>00903         <span class="keywordflow">if</span>( old.first_block ) <span class="comment">// free segment allocated for compacting. Only for support of exceptions in ctor of user T[ype]</span>
+<a name="l00904"></a>00904             internal_free_segments( old.table, 1, old.first_block );
+<a name="l00905"></a>00905         __TBB_RETHROW();
+<a name="l00906"></a>00906     }
+<a name="l00907"></a>00907 }
+<a name="l00908"></a>00908 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
+<a name="l00909"></a>00909 <span class="preprocessor"></span><span class="preprocessor">#pragma warning (pop)</span>
+<a name="l00910"></a>00910 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4701 is back </span>
+<a name="l00911"></a>00911 <span class="preprocessor"></span>
+<a name="l00912"></a>00912 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00913"></a>00913 <span class="keywordtype">void</span> <a class="code" href="a00250.html">concurrent_vector<T, A>::internal_free_segments</a>(<span class="keywordtype">void</span> *table[], segment_index_t k, segment_index_t first_block) {
+<a name="l00914"></a>00914     <span class="comment">// Free the arrays</span>
+<a name="l00915"></a>00915     <span class="keywordflow">while</span>( k > first_block ) {
+<a name="l00916"></a>00916         --k;
+<a name="l00917"></a>00917         T* array = static_cast<T*>(table[k]);
+<a name="l00918"></a>00918         table[k] = NULL;
+<a name="l00919"></a>00919         <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
+<a name="l00920"></a>00920             this->my_allocator.deallocate( array, segment_size(k) );
+<a name="l00921"></a>00921     }
+<a name="l00922"></a>00922     T* array = static_cast<T*>(table[0]);
+<a name="l00923"></a>00923     <span class="keywordflow">if</span>( array > internal::vector_allocation_error_flag ) {
+<a name="l00924"></a>00924         __TBB_ASSERT( first_block > 0, NULL );
+<a name="l00925"></a>00925         <span class="keywordflow">while</span>(k > 0) table[--k] = NULL;
+<a name="l00926"></a>00926         this->my_allocator.deallocate( array, segment_size(first_block) );
+<a name="l00927"></a>00927     }
+<a name="l00928"></a>00928 }
+<a name="l00929"></a>00929 
+<a name="l00930"></a>00930 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00931"></a>00931 T& concurrent_vector<T, A>::internal_subscript( size_type index )<span class="keyword"> const </span>{
+<a name="l00932"></a>00932     __TBB_ASSERT( index < my_early_size, <span class="stringliteral">"index out of bounds"</span> );
+<a name="l00933"></a>00933     size_type j = index;
+<a name="l00934"></a>00934     segment_index_t k = segment_base_index_of( j );
+<a name="l00935"></a>00935     __TBB_ASSERT( (segment_t*)my_segment != my_storage || k < pointers_per_short_table, <span class="stringliteral">"index is being allocated"</span> );
+<a name="l00936"></a>00936     <span class="comment">// no need in __TBB_load_with_acquire since thread works in own space or gets </span>
+<a name="l00937"></a>00937     T* array = static_cast<T*>( tbb::internal::itt_hide_load_word(my_segment[k].array));
+<a name="l00938"></a>00938     __TBB_ASSERT( array != internal::vector_allocation_error_flag, <span class="stringliteral">"the instance is broken by bad allocation. Use at() instead"</span> );
+<a name="l00939"></a>00939     __TBB_ASSERT( array, <span class="stringliteral">"index is being allocated"</span> );
+<a name="l00940"></a>00940     <span class="keywordflow">return</span> array[j];
+<a name="l00941"></a>00941 }
+<a name="l00942"></a>00942 
+<a name="l00943"></a>00943 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00944"></a>00944 T& concurrent_vector<T, A>::internal_subscript_with_exceptions( size_type index )<span class="keyword"> const </span>{
+<a name="l00945"></a>00945     <span class="keywordflow">if</span>( index >= my_early_size )
+<a name="l00946"></a>00946         internal::throw_exception(internal::eid_out_of_range); <span class="comment">// throw std::out_of_range</span>
+<a name="l00947"></a>00947     size_type j = index;
+<a name="l00948"></a>00948     segment_index_t k = segment_base_index_of( j );
+<a name="l00949"></a>00949     <span class="keywordflow">if</span>( (segment_t*)my_segment == my_storage && k >= pointers_per_short_table )
+<a name="l00950"></a>00950         internal::throw_exception(internal::eid_segment_range_error); <span class="comment">// throw std::range_error</span>
+<a name="l00951"></a>00951     <span class="keywordtype">void</span> *array = my_segment[k].array; <span class="comment">// no need in __TBB_load_with_acquire</span>
+<a name="l00952"></a>00952     <span class="keywordflow">if</span>( array <= internal::vector_allocation_error_flag ) <span class="comment">// check for correct segment pointer</span>
+<a name="l00953"></a>00953         internal::throw_exception(internal::eid_index_range_error); <span class="comment">// throw std::range_error</span>
+<a name="l00954"></a>00954     <span class="keywordflow">return</span> static_cast<T*>(array)[j];
+<a name="l00955"></a>00955 }
+<a name="l00956"></a>00956 
+<a name="l00957"></a>00957 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A> <span class="keyword">template</span><<span class="keyword">class</span> I>
+<a name="l00958"></a>00958 <span class="keywordtype">void</span> concurrent_vector<T, A>::internal_assign_iterators(I first, I last) {
+<a name="l00959"></a>00959     __TBB_ASSERT(my_early_size == 0, NULL);
+<a name="l00960"></a>00960     size_type n = std::distance(first, last);
+<a name="l00961"></a>00961     <span class="keywordflow">if</span>( !n ) <span class="keywordflow">return</span>;
+<a name="l00962"></a>00962     internal_reserve(n, <span class="keyword">sizeof</span>(T), <a class="code" href="a00250.html#2c248a017f0576df3e7cd99627836fd6">max_size</a>());
+<a name="l00963"></a>00963     my_early_size = n;
+<a name="l00964"></a>00964     segment_index_t k = 0;
+<a name="l00965"></a>00965     size_type sz = segment_size( my_first_block );
+<a name="l00966"></a>00966     <span class="keywordflow">while</span>( sz < n ) {
+<a name="l00967"></a>00967         internal_loop_guide loop(sz, my_segment[k].array);
+<a name="l00968"></a>00968         loop.iterate(first);
+<a name="l00969"></a>00969         n -= sz;
+<a name="l00970"></a>00970         <span class="keywordflow">if</span>( !k ) k = my_first_block;
+<a name="l00971"></a>00971         <span class="keywordflow">else</span> { ++k; sz <<= 1; }
+<a name="l00972"></a>00972     }
+<a name="l00973"></a>00973     internal_loop_guide loop(n, my_segment[k].array);
+<a name="l00974"></a>00974     loop.iterate(first);
+<a name="l00975"></a>00975 }
+<a name="l00976"></a>00976 
+<a name="l00977"></a>00977 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00978"></a>00978 <span class="keywordtype">void</span> concurrent_vector<T, A>::initialize_array( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span> *, size_type n ) {
+<a name="l00979"></a>00979     internal_loop_guide loop(n, begin); loop.init();
+<a name="l00980"></a>00980 }
+<a name="l00981"></a>00981 
+<a name="l00982"></a>00982 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00983"></a>00983 <span class="keywordtype">void</span> concurrent_vector<T, A>::initialize_array_by( <span class="keywordtype">void</span>* begin, <span class="keyword">const</span> <span class="keywordtype">void</span> *src, size_type n ) {
+<a name="l00984"></a>00984     internal_loop_guide loop(n, begin); loop.init(src);
+<a name="l00985"></a>00985 }
+<a name="l00986"></a>00986 
+<a name="l00987"></a>00987 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00988"></a>00988 <span class="keywordtype">void</span> concurrent_vector<T, A>::copy_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n ) {
+<a name="l00989"></a>00989     internal_loop_guide loop(n, dst); loop.copy(src);
+<a name="l00990"></a>00990 }
+<a name="l00991"></a>00991 
+<a name="l00992"></a>00992 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l00993"></a>00993 <span class="keywordtype">void</span> concurrent_vector<T, A>::assign_array( <span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, size_type n ) {
+<a name="l00994"></a>00994     internal_loop_guide loop(n, dst); loop.assign(src);
+<a name="l00995"></a>00995 }
+<a name="l00996"></a>00996 
+<a name="l00997"></a>00997 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
+<a name="l00998"></a>00998 <span class="preprocessor"></span>    <span class="comment">// Workaround for overzealous compiler warning</span>
+<a name="l00999"></a>00999 <span class="preprocessor">    #pragma warning (push)</span>
+<a name="l01000"></a>01000 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4189)</span>
+<a name="l01001"></a>01001 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l01002"></a>01002 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l01003"></a>01003 <span class="keywordtype">void</span> concurrent_vector<T, A>::destroy_array( <span class="keywordtype">void</span>* begin, size_type n ) {
+<a name="l01004"></a>01004     T* array = static_cast<T*>(begin);
+<a name="l01005"></a>01005     <span class="keywordflow">for</span>( size_type j=n; j>0; --j )
+<a name="l01006"></a>01006         array[j-1].~T(); <span class="comment">// destructors are supposed to not throw any exceptions</span>
+<a name="l01007"></a>01007 }
+<a name="l01008"></a>01008 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) </span>
+<a name="l01009"></a>01009 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
+<a name="l01010"></a>01010 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4189 is back </span>
+<a name="l01011"></a>01011 <span class="preprocessor"></span>
+<a name="l01012"></a>01012 <span class="comment">// concurrent_vector's template functions</span>
+<a name="l01013"></a>01013 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
+<a name="l01014"></a>01014 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b) {
+<a name="l01015"></a>01015     <span class="comment">// Simply:    return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin());</span>
+<a name="l01016"></a>01016     <span class="keywordflow">if</span>(a.size() != b.size()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01017"></a>01017     <span class="keyword">typename</span> concurrent_vector<T, A1>::const_iterator i(a.begin());
+<a name="l01018"></a>01018     <span class="keyword">typename</span> concurrent_vector<T, A2>::const_iterator j(b.begin());
+<a name="l01019"></a>01019     <span class="keywordflow">for</span>(; i != a.end(); ++i, ++j)
+<a name="l01020"></a>01020         <span class="keywordflow">if</span>( !(*i == *j) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01021"></a>01021     <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01022"></a>01022 }
+<a name="l01023"></a>01023 
+<a name="l01024"></a>01024 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
+<a name="l01025"></a>01025 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
+<a name="l01026"></a>01026 {    <span class="keywordflow">return</span> !(a == b); }
+<a name="l01027"></a>01027 
+<a name="l01028"></a>01028 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
+<a name="l01029"></a>01029 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator<(const concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
+<a name="l01030"></a>01030 {    <span class="keywordflow">return</span> (std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())); }
+<a name="l01031"></a>01031 
+<a name="l01032"></a>01032 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
+<a name="l01033"></a>01033 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator>(<span class="keyword">const</span> concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
+<a name="l01034"></a>01034 {    <span class="keywordflow">return</span> b < a; }
+<a name="l01035"></a>01035 
+<a name="l01036"></a>01036 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
+<a name="l01037"></a>01037 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator<=(const concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
+<a name="l01038"></a>01038 {    <span class="keywordflow">return</span> !(b < a); }
+<a name="l01039"></a>01039 
+<a name="l01040"></a>01040 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A1, <span class="keyword">class</span> A2>
+<a name="l01041"></a>01041 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator>=(<span class="keyword">const</span> concurrent_vector<T, A1> &a, <span class="keyword">const</span> concurrent_vector<T, A2> &b)
+<a name="l01042"></a>01042 {    <span class="keywordflow">return</span> !(a < b); }
+<a name="l01043"></a>01043 
+<a name="l01044"></a>01044 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">class</span> A>
+<a name="l01045"></a>01045 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap(concurrent_vector<T, A> &a, concurrent_vector<T, A> &b)
+<a name="l01046"></a>01046 {    a.swap( b ); }
+<a name="l01047"></a>01047 
+<a name="l01048"></a>01048 } <span class="comment">// namespace tbb</span>
+<a name="l01049"></a>01049 
+<a name="l01050"></a>01050 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_Wp64)</span>
+<a name="l01051"></a>01051 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
+<a name="l01052"></a>01052 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4267 is back</span>
+<a name="l01053"></a>01053 <span class="preprocessor"></span>
+<a name="l01054"></a>01054 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_vector_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00451.html b/doc/html/a00452.html
similarity index 100%
rename from doc/html/a00451.html
rename to doc/html/a00452.html
diff --git a/doc/html/a00454.html b/doc/html/a00454.html
deleted file mode 100644
index ae76a92..0000000
--- a/doc/html/a00454.html
+++ /dev/null
@@ -1,967 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>enumerable_thread_specific.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>enumerable_thread_specific.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_enumerable_thread_specific_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_enumerable_thread_specific_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "concurrent_vector.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_thread.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include <string.h></span>  <span class="comment">// for memcpy</span>
-<a name="l00029"></a>00029 
-<a name="l00030"></a>00030 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_api.h"</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#else</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
-<a name="l00034"></a>00034 <span class="preprocessor">#endif</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span>
-<a name="l00036"></a>00036 <span class="keyword">namespace </span>tbb {
-<a name="l00037"></a>00037 
-<a name="l00039"></a><a class="code" href="a00362.html#a8622ae61b7e7737dac26542e181178e">00039</a> <span class="keyword">enum</span> <a class="code" href="a00362.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { ets_key_per_instance, ets_no_key };
-<a name="l00040"></a>00040 
-<a name="l00041"></a>00041 <span class="keyword">namespace </span>interface6 {
-<a name="l00042"></a>00042  
-<a name="l00044"></a>00044     <span class="keyword">namespace </span>internal { 
-<a name="l00045"></a>00045 
-<a name="l00046"></a>00046         <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00047"></a>00047         <span class="keyword">class </span>ets_base: tbb::internal::no_copy {
-<a name="l00048"></a>00048         <span class="keyword">protected</span>:
-<a name="l00049"></a>00049 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span>            <span class="keyword">typedef</span> DWORD key_type;
-<a name="l00051"></a>00051 <span class="preprocessor">#else</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span>            <span class="keyword">typedef</span> pthread_t key_type;
-<a name="l00053"></a>00053 <span class="preprocessor">#endif</span>
-<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span>        <span class="keyword">public</span>:
-<a name="l00056"></a>00056 <span class="preprocessor">#endif</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span>            <span class="keyword">struct </span>slot;
-<a name="l00058"></a>00058 
-<a name="l00059"></a>00059             <span class="keyword">struct </span>array {
-<a name="l00060"></a>00060                 array* next;
-<a name="l00061"></a>00061                 size_t lg_size;
-<a name="l00062"></a>00062                 slot& at( size_t k ) {
-<a name="l00063"></a>00063                     <span class="keywordflow">return</span> ((slot*)(<span class="keywordtype">void</span>*)(<span class="keyword">this</span>+1))[k];
-<a name="l00064"></a>00064                 }
-<a name="l00065"></a>00065                 size_t size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (size_t)1<<lg_size;}
-<a name="l00066"></a>00066                 size_t mask()<span class="keyword"> const </span>{<span class="keywordflow">return</span> size()-1;}
-<a name="l00067"></a>00067                 size_t start( size_t h )<span class="keyword"> const </span>{
-<a name="l00068"></a>00068                     <span class="keywordflow">return</span> h>>(8*<span class="keyword">sizeof</span>(size_t)-lg_size);
-<a name="l00069"></a>00069                 }
-<a name="l00070"></a>00070             };
-<a name="l00071"></a>00071             <span class="keyword">struct </span>slot {
-<a name="l00072"></a>00072                 key_type key;
-<a name="l00073"></a>00073                 <span class="keywordtype">void</span>* ptr;
-<a name="l00074"></a>00074                 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !key;}
-<a name="l00075"></a>00075                 <span class="keywordtype">bool</span> match( key_type k )<span class="keyword"> const </span>{<span class="keywordflow">return</span> key==k;}
-<a name="l00076"></a>00076                 <span class="keywordtype">bool</span> claim( key_type k ) {
-<a name="l00077"></a>00077                     __TBB_ASSERT(<span class="keyword">sizeof</span>(<a class="code" href="a00216.html">tbb::atomic<key_type></a>)==<span class="keyword">sizeof</span>(key_type), NULL);
-<a name="l00078"></a>00078                     <span class="keywordflow">return</span> tbb::internal::punned_cast<tbb::atomic<key_type>*>(&key)->compare_and_swap(k,0)==0;
-<a name="l00079"></a>00079                 }
-<a name="l00080"></a>00080             };
-<a name="l00081"></a>00081 <span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
-<a name="l00082"></a>00082 <span class="preprocessor"></span>        <span class="keyword">protected</span>:
-<a name="l00083"></a>00083 <span class="preprocessor">#endif</span>
-<a name="l00084"></a>00084 <span class="preprocessor"></span>        
-<a name="l00085"></a>00085             <span class="keyword">static</span> key_type key_of_current_thread() {
-<a name="l00086"></a>00086                tbb::tbb_thread::id <span class="keywordtype">id</span> = tbb::this_tbb_thread::get_id();
-<a name="l00087"></a>00087                key_type k;
-<a name="l00088"></a>00088                memcpy( &k, &<span class="keywordtype">id</span>, <span class="keyword">sizeof</span>(k) );
-<a name="l00089"></a>00089                <span class="keywordflow">return</span> k;
-<a name="l00090"></a>00090             }
-<a name="l00091"></a>00091 
-<a name="l00093"></a>00093 
-<a name="l00095"></a>00095             atomic<array*> my_root;
-<a name="l00096"></a>00096             atomic<size_t> my_count;
-<a name="l00097"></a>00097             <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
-<a name="l00098"></a>00098             <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_array(size_t _size) = 0;  <span class="comment">// _size in bytes</span>
-<a name="l00099"></a>00099             <span class="keyword">virtual</span> <span class="keywordtype">void</span> free_array(<span class="keywordtype">void</span>* ptr, size_t _size) = 0; <span class="comment">// _size in bytes</span>
-<a name="l00100"></a>00100             array* allocate( size_t lg_size ) {
-<a name="l00101"></a>00101                 size_t n = 1<<lg_size;  
-<a name="l00102"></a>00102                 array* a = static_cast<array*>(create_array( <span class="keyword">sizeof</span>(array)+n*<span class="keyword">sizeof</span>(slot) ));
-<a name="l00103"></a>00103                 a->lg_size = lg_size;
-<a name="l00104"></a>00104                 std::memset( a+1, 0, n*<span class="keyword">sizeof</span>(slot) );
-<a name="l00105"></a>00105                 <span class="keywordflow">return</span> a;
-<a name="l00106"></a>00106             }
-<a name="l00107"></a>00107             <span class="keywordtype">void</span> free(array* a) {
-<a name="l00108"></a>00108                 size_t n = 1<<(a->lg_size);  
-<a name="l00109"></a>00109                 free_array( (<span class="keywordtype">void</span> *)a, size_t(<span class="keyword">sizeof</span>(array)+n*<span class="keyword">sizeof</span>(slot)) );
-<a name="l00110"></a>00110             }
-<a name="l00111"></a>00111             <span class="keyword">static</span> size_t hash( key_type k ) {
-<a name="l00112"></a>00112                 <span class="comment">// Multiplicative hashing.  Client should use *upper* bits.</span>
-<a name="l00113"></a>00113                 <span class="comment">// casts required for Mac gcc4.* compiler</span>
-<a name="l00114"></a>00114 <span class="preprocessor">#if __TBB_WORDSIZE == 4</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span>                <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B9;
-<a name="l00116"></a>00116 <span class="preprocessor">#else</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span>                <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B97F4A7C15;
-<a name="l00118"></a>00118 <span class="preprocessor">#endif </span>
-<a name="l00119"></a>00119 <span class="preprocessor"></span>            } 
-<a name="l00120"></a>00120         
-<a name="l00121"></a>00121             ets_base() {my_root=NULL; my_count=0;}
-<a name="l00122"></a>00122             <span class="keyword">virtual</span> ~ets_base();  <span class="comment">// g++ complains if this is not virtual...</span>
-<a name="l00123"></a>00123             <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists );
-<a name="l00124"></a>00124             <span class="keywordtype">void</span> table_clear();
-<a name="l00125"></a>00125             slot& table_find( key_type k ) {
-<a name="l00126"></a>00126                 size_t h = hash(k);
-<a name="l00127"></a>00127                 array* r = my_root;
-<a name="l00128"></a>00128                 size_t mask = r->mask();
-<a name="l00129"></a>00129                 <span class="keywordflow">for</span>(size_t i = r->start(h);;i=(i+1)&mask) {
-<a name="l00130"></a>00130                     slot& s = r->at(i);
-<a name="l00131"></a>00131                     <span class="keywordflow">if</span>( s.empty() || s.match(k) )
-<a name="l00132"></a>00132                         <span class="keywordflow">return</span> s;
-<a name="l00133"></a>00133                 }
-<a name="l00134"></a>00134             }
-<a name="l00135"></a>00135             <span class="keywordtype">void</span> table_reserve_for_copy( <span class="keyword">const</span> ets_base& other ) {
-<a name="l00136"></a>00136                 __TBB_ASSERT(!my_root,NULL);
-<a name="l00137"></a>00137                 __TBB_ASSERT(!my_count,NULL);
-<a name="l00138"></a>00138                 <span class="keywordflow">if</span>( other.my_root ) {
-<a name="l00139"></a>00139                     array* a = allocate(other.my_root->lg_size);
-<a name="l00140"></a>00140                     a->next = NULL;
-<a name="l00141"></a>00141                     my_root = a;
-<a name="l00142"></a>00142                     my_count = other.my_count;
-<a name="l00143"></a>00143                 }
-<a name="l00144"></a>00144             }
-<a name="l00145"></a>00145         };
-<a name="l00146"></a>00146 
-<a name="l00147"></a>00147         <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00148"></a>00148         ets_base<ETS_key_type>::~ets_base() {
-<a name="l00149"></a>00149             __TBB_ASSERT(!my_root, NULL);
-<a name="l00150"></a>00150         }
-<a name="l00151"></a>00151 
-<a name="l00152"></a>00152         <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00153"></a>00153         <span class="keywordtype">void</span> ets_base<ETS_key_type>::table_clear() {
-<a name="l00154"></a>00154             <span class="keywordflow">while</span>( array* r = my_root ) {
-<a name="l00155"></a>00155                 my_root = r->next;
-<a name="l00156"></a>00156                 free(r);
-<a name="l00157"></a>00157             }
-<a name="l00158"></a>00158             my_count = 0;
-<a name="l00159"></a>00159         }
-<a name="l00160"></a>00160                 
-<a name="l00161"></a>00161         <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
-<a name="l00162"></a>00162         <span class="keywordtype">void</span>* ets_base<ETS_key_type>::table_lookup( <span class="keywordtype">bool</span>& exists ) {
-<a name="l00163"></a>00163             <span class="keyword">const</span> key_type k = key_of_current_thread(); 
-<a name="l00164"></a>00164 
-<a name="l00165"></a>00165             __TBB_ASSERT(k!=0,NULL);
-<a name="l00166"></a>00166             <span class="keywordtype">void</span>* found;
-<a name="l00167"></a>00167             size_t h = hash(k);
-<a name="l00168"></a>00168             <span class="keywordflow">for</span>( array* r=my_root; r; r=r->next ) {
-<a name="l00169"></a>00169                 size_t mask=r->mask();
-<a name="l00170"></a>00170                 <span class="keywordflow">for</span>(size_t i = r->start(h); ;i=(i+1)&mask) {
-<a name="l00171"></a>00171                     slot& s = r->at(i);
-<a name="l00172"></a>00172                     <span class="keywordflow">if</span>( s.empty() ) <span class="keywordflow">break</span>;
-<a name="l00173"></a>00173                     <span class="keywordflow">if</span>( s.match(k) ) {
-<a name="l00174"></a>00174                         <span class="keywordflow">if</span>( r==my_root ) {
-<a name="l00175"></a>00175                             <span class="comment">// Success at top level</span>
-<a name="l00176"></a>00176                             exists = <span class="keyword">true</span>;
-<a name="l00177"></a>00177                             <span class="keywordflow">return</span> s.ptr;
-<a name="l00178"></a>00178                         } <span class="keywordflow">else</span> {
-<a name="l00179"></a>00179                             <span class="comment">// Success at some other level.  Need to insert at top level.</span>
-<a name="l00180"></a>00180                             exists = <span class="keyword">true</span>;
-<a name="l00181"></a>00181                             found = s.ptr;
-<a name="l00182"></a>00182                             <span class="keywordflow">goto</span> insert;
-<a name="l00183"></a>00183                         }
-<a name="l00184"></a>00184                     }
-<a name="l00185"></a>00185                 }
-<a name="l00186"></a>00186             }
-<a name="l00187"></a>00187             <span class="comment">// Key does not yet exist</span>
-<a name="l00188"></a>00188             exists = <span class="keyword">false</span>;
-<a name="l00189"></a>00189             found = create_local();
-<a name="l00190"></a>00190             {
-<a name="l00191"></a>00191                 size_t c = ++my_count;
-<a name="l00192"></a>00192                 array* r = my_root;
-<a name="l00193"></a>00193                 <span class="keywordflow">if</span>( !r || c>r->size()/2 ) {
-<a name="l00194"></a>00194                     size_t s = r ? r->lg_size : 2;
-<a name="l00195"></a>00195                     <span class="keywordflow">while</span>( c>size_t(1)<<(s-1) ) ++s;
-<a name="l00196"></a>00196                     array* a = allocate(s);
-<a name="l00197"></a>00197                     <span class="keywordflow">for</span>(;;) {
-<a name="l00198"></a>00198                         a->next = my_root;
-<a name="l00199"></a>00199                         array* new_r = my_root.compare_and_swap(a,r);
-<a name="l00200"></a>00200                         <span class="keywordflow">if</span>( new_r==r ) <span class="keywordflow">break</span>;
-<a name="l00201"></a>00201                         <span class="keywordflow">if</span>( new_r->lg_size>=s ) {
-<a name="l00202"></a>00202                             <span class="comment">// Another thread inserted an equal or  bigger array, so our array is superfluous.</span>
-<a name="l00203"></a>00203                             free(a);
-<a name="l00204"></a>00204                             <span class="keywordflow">break</span>;
-<a name="l00205"></a>00205                         }
-<a name="l00206"></a>00206                         r = new_r;
-<a name="l00207"></a>00207                     }
-<a name="l00208"></a>00208                 }
-<a name="l00209"></a>00209             }
-<a name="l00210"></a>00210         insert:
-<a name="l00211"></a>00211             <span class="comment">// Guaranteed to be room for it, and it is not present, so search for empty slot and grab it.</span>
-<a name="l00212"></a>00212             array* ir = my_root;
-<a name="l00213"></a>00213             size_t mask = ir->mask();
-<a name="l00214"></a>00214             <span class="keywordflow">for</span>(size_t i = ir->start(h);;i=(i+1)&mask) {
-<a name="l00215"></a>00215                 slot& s = ir->at(i);
-<a name="l00216"></a>00216                 <span class="keywordflow">if</span>( s.empty() ) {
-<a name="l00217"></a>00217                     <span class="keywordflow">if</span>( s.claim(k) ) {
-<a name="l00218"></a>00218                         s.ptr = found;
-<a name="l00219"></a>00219                         <span class="keywordflow">return</span> found;
-<a name="l00220"></a>00220                     }
-<a name="l00221"></a>00221                 }
-<a name="l00222"></a>00222             }
-<a name="l00223"></a>00223         }
-<a name="l00224"></a>00224 
-<a name="l00226"></a>00226         <span class="keyword">template</span> <>
-<a name="l00227"></a>00227         <span class="keyword">class </span>ets_base<ets_key_per_instance>: <span class="keyword">protected</span> ets_base<ets_no_key> {
-<a name="l00228"></a>00228             <span class="keyword">typedef</span> ets_base<ets_no_key> super;
-<a name="l00229"></a>00229 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00230"></a>00230 <span class="preprocessor"></span>            <span class="keyword">typedef</span> DWORD tls_key_t;
-<a name="l00231"></a>00231             <span class="keywordtype">void</span> create_key() { my_key = TlsAlloc(); }
-<a name="l00232"></a>00232             <span class="keywordtype">void</span> destroy_key() { TlsFree(my_key); }
-<a name="l00233"></a>00233             <span class="keywordtype">void</span> set_tls(<span class="keywordtype">void</span> * value) { TlsSetValue(my_key, (LPVOID)value); }
-<a name="l00234"></a>00234             <span class="keywordtype">void</span>* get_tls() { <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)TlsGetValue(my_key); }
-<a name="l00235"></a>00235 <span class="preprocessor">#else</span>
-<a name="l00236"></a>00236 <span class="preprocessor"></span>            <span class="keyword">typedef</span> pthread_key_t tls_key_t;
-<a name="l00237"></a>00237             <span class="keywordtype">void</span> create_key() { pthread_key_create(&my_key, NULL); }
-<a name="l00238"></a>00238             <span class="keywordtype">void</span> destroy_key() { pthread_key_delete(my_key); }
-<a name="l00239"></a>00239             <span class="keywordtype">void</span> set_tls( <span class="keywordtype">void</span> * value )<span class="keyword"> const </span>{ pthread_setspecific(my_key, value); }
-<a name="l00240"></a>00240             <span class="keywordtype">void</span>* get_tls()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pthread_getspecific(my_key); }
-<a name="l00241"></a>00241 <span class="preprocessor">#endif</span>
-<a name="l00242"></a>00242 <span class="preprocessor"></span>            tls_key_t my_key;
-<a name="l00243"></a>00243             <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
-<a name="l00244"></a>00244             <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_array(size_t _size) = 0;  <span class="comment">// _size in bytes</span>
-<a name="l00245"></a>00245             <span class="keyword">virtual</span> <span class="keywordtype">void</span> free_array(<span class="keywordtype">void</span>* ptr, size_t _size) = 0; <span class="comment">// size in bytes</span>
-<a name="l00246"></a>00246         <span class="keyword">public</span>:
-<a name="l00247"></a>00247             ets_base() {create_key();}
-<a name="l00248"></a>00248             ~ets_base() {destroy_key();}
-<a name="l00249"></a>00249             <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists ) {
-<a name="l00250"></a>00250                 <span class="keywordtype">void</span>* found = get_tls();
-<a name="l00251"></a>00251                 <span class="keywordflow">if</span>( found ) {
-<a name="l00252"></a>00252                     exists=<span class="keyword">true</span>;
-<a name="l00253"></a>00253                 } <span class="keywordflow">else</span> {
-<a name="l00254"></a>00254                     found = super::table_lookup(exists);
-<a name="l00255"></a>00255                     set_tls(found);
-<a name="l00256"></a>00256                 }
-<a name="l00257"></a>00257                 <span class="keywordflow">return</span> found; 
-<a name="l00258"></a>00258             }
-<a name="l00259"></a>00259             <span class="keywordtype">void</span> table_clear() {
-<a name="l00260"></a>00260                 destroy_key();
-<a name="l00261"></a>00261                 create_key(); 
-<a name="l00262"></a>00262                 super::table_clear();
-<a name="l00263"></a>00263             }
-<a name="l00264"></a>00264         };
-<a name="l00265"></a>00265 
-<a name="l00267"></a>00267         <span class="keyword">template</span>< <span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value >
-<a name="l00268"></a>00268         <span class="keyword">class </span>enumerable_thread_specific_iterator 
-<a name="l00269"></a>00269 #if defined(_WIN64) && defined(_MSC_VER) 
-<a name="l00270"></a>00270             <span class="comment">// Ensure that Microsoft's internal template function _Val_type works correctly.</span>
-<a name="l00271"></a>00271             : public std::iterator<std::random_access_iterator_tag,Value>
-<a name="l00272"></a>00272 #endif <span class="comment">/* defined(_WIN64) && defined(_MSC_VER) */</span>
-<a name="l00273"></a>00273         {
-<a name="l00275"></a>00275         
-<a name="l00276"></a>00276             Container *my_container;
-<a name="l00277"></a>00277             <span class="keyword">typename</span> Container::size_type my_index;
-<a name="l00278"></a>00278             <span class="keyword">mutable</span> Value *my_value;
-<a name="l00279"></a>00279         
-<a name="l00280"></a>00280             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T>
-<a name="l00281"></a>00281             <span class="keyword">friend</span> enumerable_thread_specific_iterator<C,T> operator+( ptrdiff_t offset, 
-<a name="l00282"></a>00282                                                                        <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& v );
-<a name="l00283"></a>00283         
-<a name="l00284"></a>00284             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00285"></a>00285             <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& i, 
-<a name="l00286"></a>00286                                     <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
-<a name="l00287"></a>00287         
-<a name="l00288"></a>00288             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00289"></a>00289             <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<C,T>& i, 
-<a name="l00290"></a>00290                                    <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
-<a name="l00291"></a>00291         
-<a name="l00292"></a>00292             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00293"></a>00293             <span class="keyword">friend</span> ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& i, <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
-<a name="l00294"></a>00294             
-<a name="l00295"></a>00295             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U> 
-<a name="l00296"></a>00296             <span class="keyword">friend</span> <span class="keyword">class </span>enumerable_thread_specific_iterator;
-<a name="l00297"></a>00297         
-<a name="l00298"></a>00298             <span class="keyword">public</span>:
-<a name="l00299"></a>00299         
-<a name="l00300"></a>00300             enumerable_thread_specific_iterator( <span class="keyword">const</span> Container &container, <span class="keyword">typename</span> Container::size_type index ) : 
-<a name="l00301"></a>00301                 my_container(&const_cast<Container &>(container)), my_index(index), my_value(NULL) {}
-<a name="l00302"></a>00302         
-<a name="l00304"></a>00304             enumerable_thread_specific_iterator() : my_container(NULL), my_index(0), my_value(NULL) {}
-<a name="l00305"></a>00305         
-<a name="l00306"></a>00306             <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00307"></a>00307             enumerable_thread_specific_iterator( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container, U>& other ) :
-<a name="l00308"></a>00308                     my_container( other.my_container ), my_index( other.my_index), my_value( const_cast<Value *>(other.my_value) ) {}
-<a name="l00309"></a>00309         
-<a name="l00310"></a>00310             enumerable_thread_specific_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00311"></a>00311                 <span class="keywordflow">return</span> enumerable_thread_specific_iterator(*my_container, my_index + offset);
-<a name="l00312"></a>00312             }
-<a name="l00313"></a>00313         
-<a name="l00314"></a>00314             enumerable_thread_specific_iterator &operator+=( ptrdiff_t offset ) {
-<a name="l00315"></a>00315                 my_index += offset;
-<a name="l00316"></a>00316                 my_value = NULL;
-<a name="l00317"></a>00317                 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00318"></a>00318             }
-<a name="l00319"></a>00319         
-<a name="l00320"></a>00320             enumerable_thread_specific_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
-<a name="l00321"></a>00321                 <span class="keywordflow">return</span> enumerable_thread_specific_iterator( *my_container, my_index-offset );
-<a name="l00322"></a>00322             }
-<a name="l00323"></a>00323         
-<a name="l00324"></a>00324             enumerable_thread_specific_iterator &operator-=( ptrdiff_t offset ) {
-<a name="l00325"></a>00325                 my_index -= offset;
-<a name="l00326"></a>00326                 my_value = NULL;
-<a name="l00327"></a>00327                 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00328"></a>00328             }
-<a name="l00329"></a>00329         
-<a name="l00330"></a>00330             Value& operator*()<span class="keyword"> const </span>{
-<a name="l00331"></a>00331                 Value* value = my_value;
-<a name="l00332"></a>00332                 <span class="keywordflow">if</span>( !value ) {
-<a name="l00333"></a>00333                     value = my_value = reinterpret_cast<Value *>(&(*my_container)[my_index].value);
-<a name="l00334"></a>00334                 }
-<a name="l00335"></a>00335                 __TBB_ASSERT( value==reinterpret_cast<Value *>(&(*my_container)[my_index].value), <span class="stringliteral">"corrupt cache"</span> );
-<a name="l00336"></a>00336                 <span class="keywordflow">return</span> *value;
-<a name="l00337"></a>00337             }
-<a name="l00338"></a>00338         
-<a name="l00339"></a>00339             Value& operator[]( ptrdiff_t k )<span class="keyword"> const </span>{
-<a name="l00340"></a>00340                <span class="keywordflow">return</span> (*my_container)[my_index + k].value;
-<a name="l00341"></a>00341             }
-<a name="l00342"></a>00342         
-<a name="l00343"></a>00343             Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
-<a name="l00344"></a>00344         
-<a name="l00345"></a>00345             enumerable_thread_specific_iterator& operator++() {
-<a name="l00346"></a>00346                 ++my_index;
-<a name="l00347"></a>00347                 my_value = NULL;
-<a name="l00348"></a>00348                 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00349"></a>00349             }
-<a name="l00350"></a>00350         
-<a name="l00351"></a>00351             enumerable_thread_specific_iterator& operator--() {
-<a name="l00352"></a>00352                 --my_index;
-<a name="l00353"></a>00353                 my_value = NULL;
-<a name="l00354"></a>00354                 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00355"></a>00355             }
-<a name="l00356"></a>00356         
-<a name="l00358"></a>00358             enumerable_thread_specific_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00359"></a>00359                 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
-<a name="l00360"></a>00360                 ++my_index;
-<a name="l00361"></a>00361                 my_value = NULL;
-<a name="l00362"></a>00362                 <span class="keywordflow">return</span> result;
-<a name="l00363"></a>00363             }
-<a name="l00364"></a>00364         
-<a name="l00366"></a>00366             enumerable_thread_specific_iterator operator--(<span class="keywordtype">int</span>) {
-<a name="l00367"></a>00367                 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
-<a name="l00368"></a>00368                 --my_index;
-<a name="l00369"></a>00369                 my_value = NULL;
-<a name="l00370"></a>00370                 <span class="keywordflow">return</span> result;
-<a name="l00371"></a>00371             }
-<a name="l00372"></a>00372         
-<a name="l00373"></a>00373             <span class="comment">// STL support</span>
-<a name="l00374"></a>00374             <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00375"></a>00375             <span class="keyword">typedef</span> Value value_type;
-<a name="l00376"></a>00376             <span class="keyword">typedef</span> Value* pointer;
-<a name="l00377"></a>00377             <span class="keyword">typedef</span> Value& reference;
-<a name="l00378"></a>00378             <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
-<a name="l00379"></a>00379         };
-<a name="l00380"></a>00380         
-<a name="l00381"></a>00381         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
-<a name="l00382"></a>00382         enumerable_thread_specific_iterator<Container,T> operator+( ptrdiff_t offset, 
-<a name="l00383"></a>00383                                                                     <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& v ) {
-<a name="l00384"></a>00384             <span class="keywordflow">return</span> enumerable_thread_specific_iterator<Container,T>( v.my_container, v.my_index + offset );
-<a name="l00385"></a>00385         }
-<a name="l00386"></a>00386         
-<a name="l00387"></a>00387         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00388"></a>00388         <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i, 
-<a name="l00389"></a>00389                          <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00390"></a>00390             <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_container == j.my_container;
-<a name="l00391"></a>00391         }
-<a name="l00392"></a>00392         
-<a name="l00393"></a>00393         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00394"></a>00394         <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i, 
-<a name="l00395"></a>00395                          <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00396"></a>00396             <span class="keywordflow">return</span> !(i==j);
-<a name="l00397"></a>00397         }
-<a name="l00398"></a>00398         
-<a name="l00399"></a>00399         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00400"></a>00400         <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<Container,T>& i, 
-<a name="l00401"></a>00401                         <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00402"></a>00402             <span class="keywordflow">return</span> i.my_index<j.my_index;
-<a name="l00403"></a>00403         }
-<a name="l00404"></a>00404         
-<a name="l00405"></a>00405         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00406"></a>00406         <span class="keywordtype">bool</span> operator>( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i, 
-<a name="l00407"></a>00407                         <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00408"></a>00408             <span class="keywordflow">return</span> j<i;
-<a name="l00409"></a>00409         }
-<a name="l00410"></a>00410         
-<a name="l00411"></a>00411         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00412"></a>00412         <span class="keywordtype">bool</span> operator>=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i, 
-<a name="l00413"></a>00413                          <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00414"></a>00414             <span class="keywordflow">return</span> !(i<j);
-<a name="l00415"></a>00415         }
-<a name="l00416"></a>00416         
-<a name="l00417"></a>00417         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00418"></a>00418         <span class="keywordtype">bool</span> operator<=( const enumerable_thread_specific_iterator<Container,T>& i, 
-<a name="l00419"></a>00419                          <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00420"></a>00420             <span class="keywordflow">return</span> !(j<i);
-<a name="l00421"></a>00421         }
-<a name="l00422"></a>00422         
-<a name="l00423"></a>00423         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00424"></a>00424         ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i, 
-<a name="l00425"></a>00425                              <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
-<a name="l00426"></a>00426             <span class="keywordflow">return</span> i.my_index-j.my_index;
-<a name="l00427"></a>00427         }
-<a name="l00428"></a>00428 
-<a name="l00429"></a>00429     <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> Value >
-<a name="l00430"></a>00430         <span class="keyword">class </span>segmented_iterator
-<a name="l00431"></a>00431 #if defined(_WIN64) && defined(_MSC_VER)
-<a name="l00432"></a>00432         : public std::iterator<std::input_iterator_tag, Value>
-<a name="l00433"></a>00433 #endif
-<a name="l00434"></a>00434         {
-<a name="l00435"></a>00435             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00436"></a>00436             <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> segmented_iterator<C,T>& i, <span class="keyword">const</span> segmented_iterator<C,U>& j);
-<a name="l00437"></a>00437 
-<a name="l00438"></a>00438             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00439"></a>00439             <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> segmented_iterator<C,T>& i, <span class="keyword">const</span> segmented_iterator<C,U>& j);
-<a name="l00440"></a>00440             
-<a name="l00441"></a>00441             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U> 
-<a name="l00442"></a>00442             <span class="keyword">friend</span> <span class="keyword">class </span>segmented_iterator;
-<a name="l00443"></a>00443 
-<a name="l00444"></a>00444             <span class="keyword">public</span>:
-<a name="l00445"></a>00445 
-<a name="l00446"></a>00446                 segmented_iterator() {my_segcont = NULL;}
-<a name="l00447"></a>00447 
-<a name="l00448"></a>00448                 segmented_iterator( <span class="keyword">const</span> SegmentedContainer& _segmented_container ) : 
-<a name="l00449"></a>00449                     my_segcont(const_cast<SegmentedContainer*>(&_segmented_container)),
-<a name="l00450"></a>00450                     outer_iter(my_segcont->end()) { }
-<a name="l00451"></a>00451 
-<a name="l00452"></a>00452                 ~segmented_iterator() {}
-<a name="l00453"></a>00453 
-<a name="l00454"></a>00454                 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::iterator outer_iterator;
-<a name="l00455"></a>00455                 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::value_type InnerContainer;
-<a name="l00456"></a>00456                 <span class="keyword">typedef</span> <span class="keyword">typename</span> InnerContainer::iterator inner_iterator;
-<a name="l00457"></a>00457 
-<a name="l00458"></a>00458                 <span class="comment">// STL support</span>
-<a name="l00459"></a>00459                 <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00460"></a>00460                 <span class="keyword">typedef</span> Value value_type;
-<a name="l00461"></a>00461                 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::size_type size_type;
-<a name="l00462"></a>00462                 <span class="keyword">typedef</span> Value* pointer;
-<a name="l00463"></a>00463                 <span class="keyword">typedef</span> Value& reference;
-<a name="l00464"></a>00464                 <span class="keyword">typedef</span> std::input_iterator_tag iterator_category;
-<a name="l00465"></a>00465 
-<a name="l00466"></a>00466                 <span class="comment">// Copy Constructor</span>
-<a name="l00467"></a>00467                 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00468"></a>00468                 segmented_iterator(<span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) :
-<a name="l00469"></a>00469                     my_segcont(other.my_segcont),
-<a name="l00470"></a>00470                     outer_iter(other.outer_iter),
-<a name="l00471"></a>00471                     <span class="comment">// can we assign a default-constructed iterator to inner if we're at the end?</span>
-<a name="l00472"></a>00472                     inner_iter(other.inner_iter)
-<a name="l00473"></a>00473                 {}
-<a name="l00474"></a>00474 
-<a name="l00475"></a>00475                 <span class="comment">// assignment</span>
-<a name="l00476"></a>00476                 <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00477"></a>00477                 segmented_iterator& operator=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) {
-<a name="l00478"></a>00478                     <span class="keywordflow">if</span>(<span class="keyword">this</span> != &other) {
-<a name="l00479"></a>00479                         my_segcont = other.my_segcont;
-<a name="l00480"></a>00480                         outer_iter = other.outer_iter;
-<a name="l00481"></a>00481                         <span class="keywordflow">if</span>(outer_iter != my_segcont->end()) inner_iter = other.inner_iter;
-<a name="l00482"></a>00482                     }
-<a name="l00483"></a>00483                     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00484"></a>00484                 }
-<a name="l00485"></a>00485 
-<a name="l00486"></a>00486                 <span class="comment">// allow assignment of outer iterator to segmented iterator.  Once it is</span>
-<a name="l00487"></a>00487                 <span class="comment">// assigned, move forward until a non-empty inner container is found or</span>
-<a name="l00488"></a>00488                 <span class="comment">// the end of the outer container is reached.</span>
-<a name="l00489"></a>00489                 segmented_iterator& operator=(<span class="keyword">const</span> outer_iterator& new_outer_iter) {
-<a name="l00490"></a>00490                     __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00491"></a>00491                     <span class="comment">// check that this iterator points to something inside the segmented container</span>
-<a name="l00492"></a>00492                     <span class="keywordflow">for</span>(outer_iter = new_outer_iter ;outer_iter!=my_segcont->end(); ++outer_iter) {
-<a name="l00493"></a>00493                         <span class="keywordflow">if</span>( !outer_iter->empty() ) {
-<a name="l00494"></a>00494                             inner_iter = outer_iter->begin();
-<a name="l00495"></a>00495                             <span class="keywordflow">break</span>;
-<a name="l00496"></a>00496                         }
-<a name="l00497"></a>00497                     }
-<a name="l00498"></a>00498                     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00499"></a>00499                 }
-<a name="l00500"></a>00500 
-<a name="l00501"></a>00501                 <span class="comment">// pre-increment</span>
-<a name="l00502"></a>00502                 segmented_iterator& operator++() {
-<a name="l00503"></a>00503                     advance_me();
-<a name="l00504"></a>00504                     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00505"></a>00505                 }
-<a name="l00506"></a>00506 
-<a name="l00507"></a>00507                 <span class="comment">// post-increment</span>
-<a name="l00508"></a>00508                 segmented_iterator operator++(<span class="keywordtype">int</span>) {
-<a name="l00509"></a>00509                     segmented_iterator tmp = *<span class="keyword">this</span>;
-<a name="l00510"></a>00510                     operator++();
-<a name="l00511"></a>00511                     <span class="keywordflow">return</span> tmp;
-<a name="l00512"></a>00512                 }
-<a name="l00513"></a>00513 
-<a name="l00514"></a>00514                 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
-<a name="l00515"></a>00515                     __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00516"></a>00516                     <span class="keywordflow">return</span> (outer_iter == other_outer &&
-<a name="l00517"></a>00517                             (outer_iter == my_segcont->end() || inner_iter == outer_iter->begin()));
-<a name="l00518"></a>00518                 }
-<a name="l00519"></a>00519 
-<a name="l00520"></a>00520                 <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
-<a name="l00521"></a>00521                     <span class="keywordflow">return</span> !operator==(other_outer);
-<a name="l00522"></a>00522 
-<a name="l00523"></a>00523                 }
-<a name="l00524"></a>00524 
-<a name="l00525"></a>00525                 <span class="comment">// (i)* RHS</span>
-<a name="l00526"></a>00526                 reference operator*()<span class="keyword"> const </span>{
-<a name="l00527"></a>00527                     __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00528"></a>00528                     __TBB_ASSERT(outer_iter != my_segcont->end(), <span class="stringliteral">"Dereferencing a pointer at end of container"</span>);
-<a name="l00529"></a>00529                     __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// should never happen</span>
-<a name="l00530"></a>00530                     <span class="keywordflow">return</span> *inner_iter;
-<a name="l00531"></a>00531                 }
-<a name="l00532"></a>00532 
-<a name="l00533"></a>00533                 <span class="comment">// i-></span>
-<a name="l00534"></a>00534                 pointer operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &operator*();}
-<a name="l00535"></a>00535 
-<a name="l00536"></a>00536             <span class="keyword">private</span>:
-<a name="l00537"></a>00537                 SegmentedContainer*             my_segcont;
-<a name="l00538"></a>00538                 outer_iterator outer_iter;
-<a name="l00539"></a>00539                 inner_iterator inner_iter;
-<a name="l00540"></a>00540 
-<a name="l00541"></a>00541                 <span class="keywordtype">void</span> advance_me() {
-<a name="l00542"></a>00542                     __TBB_ASSERT(my_segcont != NULL, NULL);
-<a name="l00543"></a>00543                     __TBB_ASSERT(outer_iter != my_segcont->end(), NULL); <span class="comment">// not true if there are no inner containers</span>
-<a name="l00544"></a>00544                     __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// not true if the inner containers are all empty.</span>
-<a name="l00545"></a>00545                     ++inner_iter;
-<a name="l00546"></a>00546                     <span class="keywordflow">while</span>(inner_iter == outer_iter->end() && ++outer_iter != my_segcont->end()) {
-<a name="l00547"></a>00547                         inner_iter = outer_iter->begin();
-<a name="l00548"></a>00548                     }
-<a name="l00549"></a>00549                 }
-<a name="l00550"></a>00550         };    <span class="comment">// segmented_iterator</span>
-<a name="l00551"></a>00551 
-<a name="l00552"></a>00552         <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00553"></a>00553         <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i, 
-<a name="l00554"></a>00554                          <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
-<a name="l00555"></a>00555             <span class="keywordflow">if</span>(i.my_segcont != j.my_segcont) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00556"></a>00556             <span class="keywordflow">if</span>(i.my_segcont == NULL) <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00557"></a>00557             <span class="keywordflow">if</span>(i.outer_iter != j.outer_iter) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00558"></a>00558             <span class="keywordflow">if</span>(i.outer_iter == i.my_segcont->end()) <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00559"></a>00559             <span class="keywordflow">return</span> i.inner_iter == j.inner_iter;
-<a name="l00560"></a>00560         }
-<a name="l00561"></a>00561 
-<a name="l00562"></a>00562         <span class="comment">// !=</span>
-<a name="l00563"></a>00563         <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00564"></a>00564         <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i, 
-<a name="l00565"></a>00565                          <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
-<a name="l00566"></a>00566             <span class="keywordflow">return</span> !(i==j);
-<a name="l00567"></a>00567         }
-<a name="l00568"></a>00568 
-<a name="l00569"></a>00569         <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00570"></a>00570         <span class="keyword">struct </span>destruct_only: tbb::internal::no_copy {
-<a name="l00571"></a>00571             <a class="code" href="a00215.html">tbb::aligned_space<T,1></a> value;
-<a name="l00572"></a>00572             ~destruct_only() {value.begin()[0].~T();}
-<a name="l00573"></a>00573         };
-<a name="l00574"></a>00574 
-<a name="l00575"></a>00575         <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00576"></a>00576         <span class="keyword">struct </span>construct_by_default: tbb::internal::no_assign {
-<a name="l00577"></a>00577             <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>*where) {<span class="keyword">new</span>(where) T();} <span class="comment">// C++ note: the () in T() ensure zero initialization.</span>
-<a name="l00578"></a>00578             construct_by_default( <span class="keywordtype">int</span> ) {}
-<a name="l00579"></a>00579         };
-<a name="l00580"></a>00580 
-<a name="l00581"></a>00581         <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00582"></a>00582         <span class="keyword">struct </span>construct_by_exemplar: tbb::internal::no_assign {
-<a name="l00583"></a>00583             <span class="keyword">const</span> T exemplar;
-<a name="l00584"></a>00584             <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>*where) {<span class="keyword">new</span>(where) T(exemplar);}
-<a name="l00585"></a>00585             construct_by_exemplar( <span class="keyword">const</span> T& t ) : exemplar(t) {}
-<a name="l00586"></a>00586         };
-<a name="l00587"></a>00587 
-<a name="l00588"></a>00588         <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Finit>
-<a name="l00589"></a>00589         <span class="keyword">struct </span>construct_by_finit: tbb::internal::no_assign {
-<a name="l00590"></a>00590             Finit f;
-<a name="l00591"></a>00591             <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) {<span class="keyword">new</span>(where) T(f());}
-<a name="l00592"></a>00592             construct_by_finit( <span class="keyword">const</span> Finit& f_ ) : f(f_) {}
-<a name="l00593"></a>00593         };
-<a name="l00594"></a>00594 
-<a name="l00595"></a>00595         <span class="comment">// storage for initialization function pointer</span>
-<a name="l00596"></a>00596         <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00597"></a>00597         <span class="keyword">class </span>callback_base {
-<a name="l00598"></a>00598         <span class="keyword">public</span>:
-<a name="l00599"></a>00599             <span class="comment">// Clone *this</span>
-<a name="l00600"></a>00600             <span class="keyword">virtual</span> callback_base* clone() = 0;
-<a name="l00601"></a>00601             <span class="comment">// Destruct and free *this</span>
-<a name="l00602"></a>00602             <span class="keyword">virtual</span> <span class="keywordtype">void</span> destroy() = 0;
-<a name="l00603"></a>00603             <span class="comment">// Need virtual destructor to satisfy GCC compiler warning</span>
-<a name="l00604"></a>00604             <span class="keyword">virtual</span> ~callback_base() { }
-<a name="l00605"></a>00605             <span class="comment">// Construct T at where</span>
-<a name="l00606"></a>00606             <span class="keyword">virtual</span> <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) = 0;
-<a name="l00607"></a>00607         };
-<a name="l00608"></a>00608 
-<a name="l00609"></a>00609         <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Constructor>
-<a name="l00610"></a>00610         <span class="keyword">class </span>callback_leaf: <span class="keyword">public</span> callback_base<T>, Constructor {
-<a name="l00611"></a>00611             <span class="keyword">template</span><<span class="keyword">typename</span> X> callback_leaf( <span class="keyword">const</span> X& x ) : Constructor(x) {}
-<a name="l00612"></a>00612 
-<a name="l00613"></a>00613             <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00296.html">tbb::tbb_allocator<callback_leaf></a> my_allocator_type;
-<a name="l00614"></a>00614 
-<a name="l00615"></a>00615             <span class="comment">/*override*/</span> callback_base<T>* clone() {
-<a name="l00616"></a>00616                 <span class="keywordtype">void</span>* where = my_allocator_type().allocate(1);
-<a name="l00617"></a>00617                 <span class="keywordflow">return</span> <span class="keyword">new</span>(where) callback_leaf(*<span class="keyword">this</span>);
-<a name="l00618"></a>00618             }
-<a name="l00619"></a>00619 
-<a name="l00620"></a>00620             <span class="comment">/*override*/</span> <span class="keywordtype">void</span> destroy() {
-<a name="l00621"></a>00621                 my_allocator_type().destroy(<span class="keyword">this</span>);
-<a name="l00622"></a>00622                 my_allocator_type().deallocate(<span class="keyword">this</span>,1);
-<a name="l00623"></a>00623             }
-<a name="l00624"></a>00624 
-<a name="l00625"></a>00625             <span class="comment">/*override*/</span> <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) {
-<a name="l00626"></a>00626                 Constructor::construct(where);
-<a name="l00627"></a>00627             }  
-<a name="l00628"></a>00628         <span class="keyword">public</span>:
-<a name="l00629"></a>00629             <span class="keyword">template</span><<span class="keyword">typename</span> X>
-<a name="l00630"></a>00630             <span class="keyword">static</span> callback_base<T>* make( <span class="keyword">const</span> X& x ) {
-<a name="l00631"></a>00631                 <span class="keywordtype">void</span>* where = my_allocator_type().allocate(1);
-<a name="l00632"></a>00632                 <span class="keywordflow">return</span> <span class="keyword">new</span>(where) callback_leaf(x);
-<a name="l00633"></a>00633             }
-<a name="l00634"></a>00634         };
-<a name="l00635"></a>00635 
-<a name="l00637"></a>00637 
-<a name="l00642"></a>00642         <span class="keyword">template</span><<span class="keyword">typename</span> U, size_t ModularSize>
-<a name="l00643"></a>00643         <span class="keyword">struct </span>ets_element {
-<a name="l00644"></a>00644             <span class="keywordtype">char</span> value[ModularSize==0 ? <span class="keyword">sizeof</span>(U) : <span class="keyword">sizeof</span>(U)+(tbb::internal::NFS_MaxLineSize-ModularSize)];
-<a name="l00645"></a>00645             <span class="keywordtype">void</span> unconstruct() {
-<a name="l00646"></a>00646                 tbb::internal::punned_cast<U*>(&value)->~U();
-<a name="l00647"></a>00647             }
-<a name="l00648"></a>00648         };
-<a name="l00649"></a>00649 
-<a name="l00650"></a>00650     } <span class="comment">// namespace internal</span>
-<a name="l00652"></a>00652 <span class="comment"></span>
-<a name="l00654"></a>00654 
-<a name="l00673"></a>00673     <span class="keyword">template</span> <<span class="keyword">typename</span> T, 
-<a name="l00674"></a>00674               <span class="keyword">typename</span> Allocator=cache_aligned_allocator<T>, 
-<a name="l00675"></a><a class="code" href="a00243.html">00675</a>               <a class="code" href="a00362.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> ETS_key_type=ets_no_key > 
-<a name="l00676"></a>00676     <span class="keyword">class </span><a class="code" href="a00243.html">enumerable_thread_specific</a>: internal::ets_base<ETS_key_type> { 
-<a name="l00677"></a>00677 
-<a name="l00678"></a>00678         <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A, ets_key_usage_type C> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00243.html">enumerable_thread_specific</a>;
-<a name="l00679"></a>00679     
-<a name="l00680"></a>00680         <span class="keyword">typedef</span> internal::ets_element<T,sizeof(T)%tbb::internal::NFS_MaxLineSize> padded_element;
-<a name="l00681"></a>00681 
-<a name="l00683"></a>00683         <span class="keyword">template</span><<span class="keyword">typename</span> I>
-<a name="l00684"></a>00684         <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00221.html">blocked_range</a><I> {
-<a name="l00685"></a>00685         <span class="keyword">public</span>:
-<a name="l00686"></a>00686             <span class="keyword">typedef</span> T value_type;
-<a name="l00687"></a>00687             <span class="keyword">typedef</span> T& reference;
-<a name="l00688"></a>00688             <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00689"></a>00689             <span class="keyword">typedef</span> I iterator;
-<a name="l00690"></a>00690             <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00691"></a>00691             generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00221.html">blocked_range<I></a>(begin_,end_,grainsize_) {} 
-<a name="l00692"></a>00692             template<typename U>
-<a name="l00693"></a>00693             generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00221.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {} 
-<a name="l00694"></a>00694             generic_range_type( generic_range_type& r, <a class="code" href="a00290.html">split</a> ) : <a class="code" href="a00221.html">blocked_range<I></a>(r,<a class="code" href="a00290.html">split</a>()) {}
-<a name="l00695"></a>00695         };
-<a name="l00696"></a>00696     
-<a name="l00697"></a>00697         <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< padded_element >::other padded_allocator_type;
-<a name="l00698"></a>00698         <span class="keyword">typedef</span> <a class="code" href="a00238.html">tbb::concurrent_vector< padded_element, padded_allocator_type ></a> <a class="code" href="a00238.html">internal_collection_type</a>;
-<a name="l00699"></a>00699         
-<a name="l00700"></a>00700         internal::callback_base<T> *my_construct_callback;
-<a name="l00701"></a>00701 
-<a name="l00702"></a>00702         internal_collection_type my_locals;
-<a name="l00703"></a>00703    
-<a name="l00704"></a>00704         <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_local() {
-<a name="l00705"></a>00705 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00706"></a>00706 <span class="preprocessor"></span>            <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
-<a name="l00707"></a>00707 <span class="preprocessor">#else</span>
-<a name="l00708"></a>00708 <span class="preprocessor"></span>            <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
-<a name="l00709"></a>00709 <span class="preprocessor">#endif</span>
-<a name="l00710"></a>00710 <span class="preprocessor"></span>            my_construct_callback->construct(lref);
-<a name="l00711"></a>00711             <span class="keywordflow">return</span> lref;
-<a name="l00712"></a>00712         } 
-<a name="l00713"></a>00713 
-<a name="l00714"></a>00714         <span class="keywordtype">void</span> unconstruct_locals() {
-<a name="l00715"></a>00715             <span class="keywordflow">for</span>(<span class="keyword">typename</span> internal_collection_type::iterator cvi = my_locals.<a class="code" href="a00238.html#730b23a251ecb6d37f692fb22f38e029">begin</a>(); cvi != my_locals.<a class="code" href="a00238.html#c0b51160e5a764982ec97a455f94f2c6">end</a>(); ++cvi) {
-<a name="l00716"></a>00716                 cvi->unconstruct();
-<a name="l00717"></a>00717             }
-<a name="l00718"></a>00718         }
-<a name="l00719"></a>00719 
-<a name="l00720"></a>00720         <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< uintptr_t >::other array_allocator_type;
-<a name="l00721"></a>00721 
-<a name="l00722"></a>00722         <span class="comment">// _size is in bytes</span>
-<a name="l00723"></a>00723         <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_array(size_t _size) {
-<a name="l00724"></a>00724             size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
-<a name="l00725"></a>00725             <span class="keywordflow">return</span> array_allocator_type().allocate(nelements);
-<a name="l00726"></a>00726         }
-<a name="l00727"></a>00727 
-<a name="l00728"></a>00728         <span class="comment">/*override*/</span> <span class="keywordtype">void</span> free_array( <span class="keywordtype">void</span>* _ptr, size_t _size) {
-<a name="l00729"></a>00729             size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
-<a name="l00730"></a>00730             array_allocator_type().deallocate( reinterpret_cast<uintptr_t *>(_ptr),nelements);
-<a name="l00731"></a>00731         }
-<a name="l00732"></a>00732    
-<a name="l00733"></a>00733     <span class="keyword">public</span>:
-<a name="l00734"></a>00734     
-<a name="l00736"></a>00736         <span class="keyword">typedef</span> Allocator allocator_type;
-<a name="l00737"></a>00737         <span class="keyword">typedef</span> T value_type;
-<a name="l00738"></a>00738         <span class="keyword">typedef</span> T& reference;
-<a name="l00739"></a>00739         <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
-<a name="l00740"></a>00740         <span class="keyword">typedef</span> T* pointer;
-<a name="l00741"></a>00741         <span class="keyword">typedef</span> <span class="keyword">const</span> T* const_pointer;
-<a name="l00742"></a>00742         <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::size_type size_type;
-<a name="l00743"></a>00743         <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::difference_type difference_type;
-<a name="l00744"></a>00744     
-<a name="l00745"></a>00745         <span class="comment">// Iterator types</span>
-<a name="l00746"></a>00746         <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, value_type > iterator;
-<a name="l00747"></a>00747         <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, const value_type > const_iterator;
-<a name="l00748"></a>00748 
-<a name="l00749"></a>00749         <span class="comment">// Parallel range types</span>
-<a name="l00750"></a>00750         <span class="keyword">typedef</span> generic_range_type< iterator > range_type;
-<a name="l00751"></a>00751         <span class="keyword">typedef</span> generic_range_type< const_iterator > const_range_type;
-<a name="l00752"></a>00752     
-<a name="l00754"></a>00754         <a class="code" href="a00243.html">enumerable_thread_specific</a>() : 
-<a name="l00755"></a>00755             my_construct_callback( internal::callback_leaf<T,internal::construct_by_default<T> >::make(<span class="comment">/*dummy argument*/</span>0) ) 
-<a name="l00756"></a>00756         {}
-<a name="l00757"></a>00757 
-<a name="l00759"></a><a class="code" href="a00243.html#8d4b456ff9d7b289c73254eccc11db45">00759</a>         <span class="keyword">template</span> <<span class="keyword">typename</span> Finit>
-<a name="l00760"></a>00760         <a class="code" href="a00243.html">enumerable_thread_specific</a>( Finit finit ) : 
-<a name="l00761"></a>00761             my_construct_callback( internal::callback_leaf<T,internal::construct_by_finit<T,Finit> >::make( finit ) ) 
-<a name="l00762"></a>00762         {}
-<a name="l00763"></a>00763     
-<a name="l00765"></a>00765         <a class="code" href="a00243.html">enumerable_thread_specific</a>(<span class="keyword">const</span> T& exemplar) : 
-<a name="l00766"></a>00766             my_construct_callback( internal::callback_leaf<T,internal::construct_by_exemplar<T> >::make( exemplar ) )
-<a name="l00767"></a>00767         {}
-<a name="l00768"></a>00768     
-<a name="l00770"></a>00770         ~<a class="code" href="a00243.html">enumerable_thread_specific</a>() { 
-<a name="l00771"></a>00771             my_construct_callback->destroy();
-<a name="l00772"></a>00772             this->clear();  <span class="comment">// deallocation before the derived class is finished destructing</span>
-<a name="l00773"></a>00773             <span class="comment">// So free(array *) is still accessible</span>
-<a name="l00774"></a>00774         }
-<a name="l00775"></a>00775       
-<a name="l00777"></a>00777         reference local() {
-<a name="l00778"></a>00778             <span class="keywordtype">bool</span> exists;
-<a name="l00779"></a>00779             <span class="keywordflow">return</span> local(exists);
-<a name="l00780"></a>00780         }
-<a name="l00781"></a>00781 
-<a name="l00783"></a>00783         reference local(<span class="keywordtype">bool</span>& exists)  {
-<a name="l00784"></a>00784             <span class="keywordtype">void</span>* ptr = this->table_lookup(exists);
-<a name="l00785"></a>00785             <span class="keywordflow">return</span> *(T*)ptr;
-<a name="l00786"></a>00786         }
-<a name="l00787"></a>00787 
-<a name="l00789"></a>00789         size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>(); }
-<a name="l00790"></a>00790     
-<a name="l00792"></a>00792         <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00238.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>(); }
-<a name="l00793"></a>00793     
-<a name="l00795"></a>00795         iterator begin() { <span class="keywordflow">return</span> iterator( my_locals, 0 ); }
-<a name="l00797"></a>00797         iterator end() { <span class="keywordflow">return</span> iterator(my_locals, my_locals.<a class="code" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() ); }
-<a name="l00798"></a>00798     
-<a name="l00800"></a>00800         const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, 0); }
-<a name="l00801"></a>00801     
-<a name="l00803"></a>00803         const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, my_locals.<a class="code" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()); }
-<a name="l00804"></a>00804 
-<a name="l00806"></a>00806         range_type range( size_t grainsize=1 ) { <span class="keywordflow">return</span> range_type( begin(), end(), grainsize ); } 
-<a name="l00807"></a>00807         
-<a name="l00809"></a>00809         const_range_type range( size_t grainsize=1 )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_range_type( begin(), end(), grainsize ); }
-<a name="l00810"></a>00810 
-<a name="l00812"></a>00812         <span class="keywordtype">void</span> clear() {
-<a name="l00813"></a>00813             unconstruct_locals();
-<a name="l00814"></a>00814             my_locals.<a class="code" href="a00238.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>();
-<a name="l00815"></a>00815             this->table_clear();
-<a name="l00816"></a>00816             <span class="comment">// callback is not destroyed</span>
-<a name="l00817"></a>00817             <span class="comment">// exemplar is not destroyed</span>
-<a name="l00818"></a>00818         }
-<a name="l00819"></a>00819 
-<a name="l00820"></a>00820     <span class="keyword">private</span>:
-<a name="l00821"></a>00821 
-<a name="l00822"></a>00822         <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00823"></a>00823         <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other);
-<a name="l00824"></a>00824 
-<a name="l00825"></a>00825     <span class="keyword">public</span>:
-<a name="l00826"></a>00826 
-<a name="l00827"></a>00827         <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
-<a name="l00828"></a>00828         enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other ) : internal::ets_base<ETS_key_type> ()
-<a name="l00829"></a>00829         {
-<a name="l00830"></a>00830             internal_copy(other);
-<a name="l00831"></a>00831         }
-<a name="l00832"></a>00832 
-<a name="l00833"></a>00833         enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific& other ) : internal::ets_base<ETS_key_type> ()
-<a name="l00834"></a>00834         {
-<a name="l00835"></a>00835             internal_copy(other);
-<a name="l00836"></a>00836         }
-<a name="l00837"></a>00837 
-<a name="l00838"></a>00838     <span class="keyword">private</span>:
-<a name="l00839"></a>00839 
-<a name="l00840"></a>00840         <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00841"></a>00841         enumerable_thread_specific &
-<a name="l00842"></a>00842         internal_assign(<span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
-<a name="l00843"></a>00843             <span class="keywordflow">if</span>(static_cast<void *>( <span class="keyword">this</span> ) != static_cast<const void *>( &other )) {
-<a name="l00844"></a>00844                 this->clear(); 
-<a name="l00845"></a>00845                 my_construct_callback->destroy();
-<a name="l00846"></a>00846                 my_construct_callback = 0;
-<a name="l00847"></a>00847                 internal_copy( other );
-<a name="l00848"></a>00848             }
-<a name="l00849"></a>00849             <span class="keywordflow">return</span> *<span class="keyword">this</span>;
-<a name="l00850"></a>00850         }
-<a name="l00851"></a>00851 
-<a name="l00852"></a>00852     <span class="keyword">public</span>:
-<a name="l00853"></a>00853 
-<a name="l00854"></a>00854         <span class="comment">// assignment</span>
-<a name="l00855"></a>00855         enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific& other) {
-<a name="l00856"></a>00856             <span class="keywordflow">return</span> internal_assign(other);
-<a name="l00857"></a>00857         }
-<a name="l00858"></a>00858 
-<a name="l00859"></a>00859         <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
-<a name="l00860"></a>00860         enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other)
-<a name="l00861"></a>00861         {
-<a name="l00862"></a>00862             <span class="keywordflow">return</span> internal_assign(other);
-<a name="l00863"></a>00863         }
-<a name="l00864"></a>00864 
-<a name="l00865"></a>00865         <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
-<a name="l00866"></a>00866         <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00867"></a>00867         T combine(combine_func_t f_combine) {
-<a name="l00868"></a>00868             <span class="keywordflow">if</span>(begin() == end()) {
-<a name="l00869"></a>00869                 internal::destruct_only<T> location;
-<a name="l00870"></a>00870                 my_construct_callback->construct(location.value.begin());
-<a name="l00871"></a>00871                 <span class="keywordflow">return</span> *location.value.begin();
-<a name="l00872"></a>00872             }
-<a name="l00873"></a>00873             const_iterator ci = begin();
-<a name="l00874"></a>00874             T my_result = *ci;
-<a name="l00875"></a>00875             <span class="keywordflow">while</span>(++ci != end()) 
-<a name="l00876"></a>00876                 my_result = f_combine( my_result, *ci );
-<a name="l00877"></a>00877             <span class="keywordflow">return</span> my_result;
-<a name="l00878"></a>00878         }
-<a name="l00879"></a>00879 
-<a name="l00880"></a>00880         <span class="comment">// combine_func_t has signature void(T) or void(const T&)</span>
-<a name="l00881"></a>00881         <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
-<a name="l00882"></a>00882         <span class="keywordtype">void</span> combine_each(combine_func_t f_combine) {
-<a name="l00883"></a>00883             <span class="keywordflow">for</span>(const_iterator ci = begin(); ci != end(); ++ci) {
-<a name="l00884"></a>00884                 f_combine( *ci );
-<a name="l00885"></a>00885             }
-<a name="l00886"></a>00886         }
-<a name="l00887"></a>00887 
-<a name="l00888"></a>00888     }; <span class="comment">// enumerable_thread_specific</span>
-<a name="l00889"></a>00889 
-<a name="l00890"></a>00890     <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Allocator, ets_key_usage_type ETS_key_type> 
-<a name="l00891"></a>00891     <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
-<a name="l00892"></a>00892     <span class="keywordtype">void</span> enumerable_thread_specific<T,Allocator,ETS_key_type>::internal_copy( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
-<a name="l00893"></a>00893         <span class="comment">// Initialize my_construct_callback first, so that it is valid even if rest of this routine throws an exception.</span>
-<a name="l00894"></a>00894         my_construct_callback = other.my_construct_callback->clone();
-<a name="l00895"></a>00895 
-<a name="l00896"></a>00896         <span class="keyword">typedef</span> internal::ets_base<ets_no_key> base;
-<a name="l00897"></a>00897         __TBB_ASSERT(my_locals.<a class="code" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()==0,NULL);
-<a name="l00898"></a>00898         this->table_reserve_for_copy( other );
-<a name="l00899"></a>00899         <span class="keywordflow">for</span>( base::array* r=other.my_root; r; r=r->next ) {
-<a name="l00900"></a>00900             <span class="keywordflow">for</span>( size_t i=0; i<r-><a class="code" href="a00221.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>(); ++i ) {
-<a name="l00901"></a>00901                 base::slot& s1 = r->at(i);
-<a name="l00902"></a>00902                 <span class="keywordflow">if</span>( !s1.empty() ) {
-<a name="l00903"></a>00903                     base::slot& s2 = this->table_find(s1.key);
-<a name="l00904"></a>00904                     <span class="keywordflow">if</span>( s2.empty() ) { 
-<a name="l00905"></a>00905 #<span class="keywordflow">if</span> TBB_DEPRECATED
-<a name="l00906"></a>00906                         <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
-<a name="l00907"></a>00907 <span class="preprocessor">#else</span>
-<a name="l00908"></a>00908 <span class="preprocessor"></span>                        <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
-<a name="l00909"></a>00909 <span class="preprocessor">#endif</span>
-<a name="l00910"></a>00910 <span class="preprocessor"></span>                        s2.ptr = <span class="keyword">new</span>(lref) T(*(U*)s1.ptr);
-<a name="l00911"></a>00911                         s2.key = s1.key;
-<a name="l00912"></a>00912                     } <span class="keywordflow">else</span> {
-<a name="l00913"></a>00913                         <span class="comment">// Skip the duplicate</span>
-<a name="l00914"></a>00914                     } 
-<a name="l00915"></a>00915                 }
-<a name="l00916"></a>00916             }
-<a name="l00917"></a>00917         }
-<a name="l00918"></a>00918     }
-<a name="l00919"></a>00919 
-<a name="l00920"></a>00920     <span class="keyword">template</span>< <span class="keyword">typename</span> Container >
-<a name="l00921"></a>00921     <span class="keyword">class </span>flattened2d {
-<a name="l00922"></a>00922 
-<a name="l00923"></a>00923         <span class="comment">// This intermediate typedef is to address issues with VC7.1 compilers</span>
-<a name="l00924"></a>00924         <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::value_type conval_type;
-<a name="l00925"></a>00925 
-<a name="l00926"></a>00926     <span class="keyword">public</span>:
-<a name="l00927"></a>00927 
-<a name="l00929"></a>00929         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::size_type size_type;
-<a name="l00930"></a>00930         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::difference_type difference_type;
-<a name="l00931"></a>00931         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::allocator_type allocator_type;
-<a name="l00932"></a>00932         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::value_type value_type;
-<a name="l00933"></a>00933         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::reference reference;
-<a name="l00934"></a>00934         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_reference const_reference;
-<a name="l00935"></a>00935         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::pointer pointer;
-<a name="l00936"></a>00936         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_pointer const_pointer;
-<a name="l00937"></a>00937 
-<a name="l00938"></a>00938         <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, value_type> iterator;
-<a name="l00939"></a>00939         <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, const value_type> const_iterator;
-<a name="l00940"></a>00940 
-<a name="l00941"></a>00941         flattened2d( <span class="keyword">const</span> Container &c, <span class="keyword">typename</span> Container::const_iterator b, <span class="keyword">typename</span> Container::const_iterator e ) : 
-<a name="l00942"></a>00942             my_container(const_cast<Container*>(&c)), my_begin(b), my_end(e) { }
-<a name="l00943"></a>00943 
-<a name="l00944"></a>00944         flattened2d( <span class="keyword">const</span> Container &c ) : 
-<a name="l00945"></a>00945             my_container(const_cast<Container*>(&c)), my_begin(c.begin()), my_end(c.end()) { }
-<a name="l00946"></a>00946 
-<a name="l00947"></a>00947         iterator begin() { <span class="keywordflow">return</span> iterator(*my_container) = my_begin; }
-<a name="l00948"></a>00948         iterator end() { <span class="keywordflow">return</span> iterator(*my_container) = my_end; }
-<a name="l00949"></a>00949         const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_begin; }
-<a name="l00950"></a>00950         const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_end; }
-<a name="l00951"></a>00951 
-<a name="l00952"></a>00952         size_type size()<span class="keyword"> const </span>{
-<a name="l00953"></a>00953             size_type tot_size = 0;
-<a name="l00954"></a>00954             <span class="keywordflow">for</span>(<span class="keyword">typename</span> Container::const_iterator i = my_begin; i != my_end; ++i) {
-<a name="l00955"></a>00955                 tot_size += i->size();
-<a name="l00956"></a>00956             }
-<a name="l00957"></a>00957             <span class="keywordflow">return</span> tot_size;
-<a name="l00958"></a>00958         }
-<a name="l00959"></a>00959 
-<a name="l00960"></a>00960     <span class="keyword">private</span>:
-<a name="l00961"></a>00961 
-<a name="l00962"></a>00962         Container *my_container;
-<a name="l00963"></a>00963         <span class="keyword">typename</span> Container::const_iterator my_begin;
-<a name="l00964"></a>00964         <span class="keyword">typename</span> Container::const_iterator my_end;
-<a name="l00965"></a>00965 
-<a name="l00966"></a>00966     };
-<a name="l00967"></a>00967 
-<a name="l00968"></a>00968     <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
-<a name="l00969"></a>00969     flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c, <span class="keyword">const</span> <span class="keyword">typename</span> Container::const_iterator b, <span class="keyword">const</span> <span class="keyword">typename</span> Container::const_iterator e) {
-<a name="l00970"></a>00970         <span class="keywordflow">return</span> flattened2d<Container>(c, b, e);
-<a name="l00971"></a>00971     }
-<a name="l00972"></a>00972 
-<a name="l00973"></a>00973     <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
-<a name="l00974"></a>00974     flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c) {
-<a name="l00975"></a>00975         <span class="keywordflow">return</span> flattened2d<Container>(c);
-<a name="l00976"></a>00976     }
-<a name="l00977"></a>00977 
-<a name="l00978"></a>00978 } <span class="comment">// interface6</span>
-<a name="l00979"></a>00979 
-<a name="l00980"></a>00980 <span class="keyword">namespace </span>internal {
-<a name="l00981"></a>00981 <span class="keyword">using</span> interface6::internal::segmented_iterator;
-<a name="l00982"></a>00982 }
-<a name="l00983"></a>00983 
-<a name="l00984"></a>00984 <span class="keyword">using</span> interface6::enumerable_thread_specific;
-<a name="l00985"></a>00985 <span class="keyword">using</span> interface6::flattened2d;
-<a name="l00986"></a>00986 <span class="keyword">using</span> interface6::flatten2d;
-<a name="l00987"></a>00987 
-<a name="l00988"></a>00988 } <span class="comment">// namespace tbb</span>
-<a name="l00989"></a>00989 
-<a name="l00990"></a>00990 <span class="preprocessor">#endif</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00455.html b/doc/html/a00455.html
new file mode 100644
index 0000000..c82dc24
--- /dev/null
+++ b/doc/html/a00455.html
@@ -0,0 +1,968 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>enumerable_thread_specific.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="files.html"><span>File List</span></a></li>
+    <li><a href="globals.html"><span>File Members</span></a></li>
+  </ul></div>
+<h1>enumerable_thread_specific.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
+<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment">    writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020 
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_enumerable_thread_specific_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_enumerable_thread_specific_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "concurrent_vector.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_thread.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include "tbb_allocator.h"</span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include "cache_aligned_allocator.h"</span>
+<a name="l00028"></a>00028 <span class="preprocessor">#include "aligned_space.h"</span>
+<a name="l00029"></a>00029 <span class="preprocessor">#include <string.h></span>  <span class="comment">// for memcpy</span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_api.h"</span>
+<a name="l00033"></a>00033 <span class="preprocessor">#else</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
+<a name="l00035"></a>00035 <span class="preprocessor">#endif</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span>
+<a name="l00037"></a>00037 <span class="keyword">namespace </span>tbb {
+<a name="l00038"></a>00038 
+<a name="l00040"></a><a class="code" href="a00383.html#a8622ae61b7e7737dac26542e181178e">00040</a> <span class="keyword">enum</span> <a class="code" href="a00383.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> { ets_key_per_instance, ets_no_key };
+<a name="l00041"></a>00041 
+<a name="l00042"></a>00042 <span class="keyword">namespace </span>interface6 {
+<a name="l00043"></a>00043  
+<a name="l00045"></a>00045     <span class="keyword">namespace </span>internal { 
+<a name="l00046"></a>00046 
+<a name="l00047"></a>00047         <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00048"></a>00048         <span class="keyword">class </span>ets_base: tbb::internal::no_copy {
+<a name="l00049"></a>00049         <span class="keyword">protected</span>:
+<a name="l00050"></a>00050 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span>            <span class="keyword">typedef</span> DWORD key_type;
+<a name="l00052"></a>00052 <span class="preprocessor">#else</span>
+<a name="l00053"></a>00053 <span class="preprocessor"></span>            <span class="keyword">typedef</span> pthread_t key_type;
+<a name="l00054"></a>00054 <span class="preprocessor">#endif</span>
+<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
+<a name="l00056"></a>00056 <span class="preprocessor"></span>        <span class="keyword">public</span>:
+<a name="l00057"></a>00057 <span class="preprocessor">#endif</span>
+<a name="l00058"></a>00058 <span class="preprocessor"></span>            <span class="keyword">struct </span>slot;
+<a name="l00059"></a>00059 
+<a name="l00060"></a>00060             <span class="keyword">struct </span>array {
+<a name="l00061"></a>00061                 array* next;
+<a name="l00062"></a>00062                 size_t lg_size;
+<a name="l00063"></a>00063                 slot& at( size_t k ) {
+<a name="l00064"></a>00064                     <span class="keywordflow">return</span> ((slot*)(<span class="keywordtype">void</span>*)(<span class="keyword">this</span>+1))[k];
+<a name="l00065"></a>00065                 }
+<a name="l00066"></a>00066                 size_t size()<span class="keyword"> const </span>{<span class="keywordflow">return</span> (size_t)1<<lg_size;}
+<a name="l00067"></a>00067                 size_t mask()<span class="keyword"> const </span>{<span class="keywordflow">return</span> size()-1;}
+<a name="l00068"></a>00068                 size_t start( size_t h )<span class="keyword"> const </span>{
+<a name="l00069"></a>00069                     <span class="keywordflow">return</span> h>>(8*<span class="keyword">sizeof</span>(size_t)-lg_size);
+<a name="l00070"></a>00070                 }
+<a name="l00071"></a>00071             };
+<a name="l00072"></a>00072             <span class="keyword">struct </span>slot {
+<a name="l00073"></a>00073                 key_type key;
+<a name="l00074"></a>00074                 <span class="keywordtype">void</span>* ptr;
+<a name="l00075"></a>00075                 <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !key;}
+<a name="l00076"></a>00076                 <span class="keywordtype">bool</span> match( key_type k )<span class="keyword"> const </span>{<span class="keywordflow">return</span> key==k;}
+<a name="l00077"></a>00077                 <span class="keywordtype">bool</span> claim( key_type k ) {
+<a name="l00078"></a>00078                     __TBB_ASSERT(<span class="keyword">sizeof</span>(<a class="code" href="a00228.html">tbb::atomic<key_type></a>)==<span class="keyword">sizeof</span>(key_type), NULL);
+<a name="l00079"></a>00079                     <span class="keywordflow">return</span> tbb::internal::punned_cast<tbb::atomic<key_type>*>(&key)->compare_and_swap(k,0)==0;
+<a name="l00080"></a>00080                 }
+<a name="l00081"></a>00081             };
+<a name="l00082"></a>00082 <span class="preprocessor">#if __TBB_GCC_3_3_PROTECTED_BROKEN</span>
+<a name="l00083"></a>00083 <span class="preprocessor"></span>        <span class="keyword">protected</span>:
+<a name="l00084"></a>00084 <span class="preprocessor">#endif</span>
+<a name="l00085"></a>00085 <span class="preprocessor"></span>        
+<a name="l00086"></a>00086             <span class="keyword">static</span> key_type key_of_current_thread() {
+<a name="l00087"></a>00087                tbb::tbb_thread::id <span class="keywordtype">id</span> = tbb::this_tbb_thread::get_id();
+<a name="l00088"></a>00088                key_type k;
+<a name="l00089"></a>00089                memcpy( &k, &<span class="keywordtype">id</span>, <span class="keyword">sizeof</span>(k) );
+<a name="l00090"></a>00090                <span class="keywordflow">return</span> k;
+<a name="l00091"></a>00091             }
+<a name="l00092"></a>00092 
+<a name="l00094"></a>00094 
+<a name="l00096"></a>00096             atomic<array*> my_root;
+<a name="l00097"></a>00097             atomic<size_t> my_count;
+<a name="l00098"></a>00098             <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
+<a name="l00099"></a>00099             <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_array(size_t _size) = 0;  <span class="comment">// _size in bytes</span>
+<a name="l00100"></a>00100             <span class="keyword">virtual</span> <span class="keywordtype">void</span> free_array(<span class="keywordtype">void</span>* ptr, size_t _size) = 0; <span class="comment">// _size in bytes</span>
+<a name="l00101"></a>00101             array* allocate( size_t lg_size ) {
+<a name="l00102"></a>00102                 size_t n = 1<<lg_size;  
+<a name="l00103"></a>00103                 array* a = static_cast<array*>(create_array( <span class="keyword">sizeof</span>(array)+n*<span class="keyword">sizeof</span>(slot) ));
+<a name="l00104"></a>00104                 a->lg_size = lg_size;
+<a name="l00105"></a>00105                 std::memset( a+1, 0, n*<span class="keyword">sizeof</span>(slot) );
+<a name="l00106"></a>00106                 <span class="keywordflow">return</span> a;
+<a name="l00107"></a>00107             }
+<a name="l00108"></a>00108             <span class="keywordtype">void</span> free(array* a) {
+<a name="l00109"></a>00109                 size_t n = 1<<(a->lg_size);  
+<a name="l00110"></a>00110                 free_array( (<span class="keywordtype">void</span> *)a, size_t(<span class="keyword">sizeof</span>(array)+n*<span class="keyword">sizeof</span>(slot)) );
+<a name="l00111"></a>00111             }
+<a name="l00112"></a>00112             <span class="keyword">static</span> size_t hash( key_type k ) {
+<a name="l00113"></a>00113                 <span class="comment">// Multiplicative hashing.  Client should use *upper* bits.</span>
+<a name="l00114"></a>00114                 <span class="comment">// casts required for Mac gcc4.* compiler</span>
+<a name="l00115"></a>00115 <span class="preprocessor">#if __TBB_WORDSIZE == 4</span>
+<a name="l00116"></a>00116 <span class="preprocessor"></span>                <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B9;
+<a name="l00117"></a>00117 <span class="preprocessor">#else</span>
+<a name="l00118"></a>00118 <span class="preprocessor"></span>                <span class="keywordflow">return</span> uintptr_t(k)*0x9E3779B97F4A7C15;
+<a name="l00119"></a>00119 <span class="preprocessor">#endif </span>
+<a name="l00120"></a>00120 <span class="preprocessor"></span>            } 
+<a name="l00121"></a>00121         
+<a name="l00122"></a>00122             ets_base() {my_root=NULL; my_count=0;}
+<a name="l00123"></a>00123             <span class="keyword">virtual</span> ~ets_base();  <span class="comment">// g++ complains if this is not virtual...</span>
+<a name="l00124"></a>00124             <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists );
+<a name="l00125"></a>00125             <span class="keywordtype">void</span> table_clear();
+<a name="l00126"></a>00126             slot& table_find( key_type k ) {
+<a name="l00127"></a>00127                 size_t h = hash(k);
+<a name="l00128"></a>00128                 array* r = my_root;
+<a name="l00129"></a>00129                 size_t mask = r->mask();
+<a name="l00130"></a>00130                 <span class="keywordflow">for</span>(size_t i = r->start(h);;i=(i+1)&mask) {
+<a name="l00131"></a>00131                     slot& s = r->at(i);
+<a name="l00132"></a>00132                     <span class="keywordflow">if</span>( s.empty() || s.match(k) )
+<a name="l00133"></a>00133                         <span class="keywordflow">return</span> s;
+<a name="l00134"></a>00134                 }
+<a name="l00135"></a>00135             }
+<a name="l00136"></a>00136             <span class="keywordtype">void</span> table_reserve_for_copy( <span class="keyword">const</span> ets_base& other ) {
+<a name="l00137"></a>00137                 __TBB_ASSERT(!my_root,NULL);
+<a name="l00138"></a>00138                 __TBB_ASSERT(!my_count,NULL);
+<a name="l00139"></a>00139                 <span class="keywordflow">if</span>( other.my_root ) {
+<a name="l00140"></a>00140                     array* a = allocate(other.my_root->lg_size);
+<a name="l00141"></a>00141                     a->next = NULL;
+<a name="l00142"></a>00142                     my_root = a;
+<a name="l00143"></a>00143                     my_count = other.my_count;
+<a name="l00144"></a>00144                 }
+<a name="l00145"></a>00145             }
+<a name="l00146"></a>00146         };
+<a name="l00147"></a>00147 
+<a name="l00148"></a>00148         <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00149"></a>00149         ets_base<ETS_key_type>::~ets_base() {
+<a name="l00150"></a>00150             __TBB_ASSERT(!my_root, NULL);
+<a name="l00151"></a>00151         }
+<a name="l00152"></a>00152 
+<a name="l00153"></a>00153         <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00154"></a>00154         <span class="keywordtype">void</span> ets_base<ETS_key_type>::table_clear() {
+<a name="l00155"></a>00155             <span class="keywordflow">while</span>( array* r = my_root ) {
+<a name="l00156"></a>00156                 my_root = r->next;
+<a name="l00157"></a>00157                 free(r);
+<a name="l00158"></a>00158             }
+<a name="l00159"></a>00159             my_count = 0;
+<a name="l00160"></a>00160         }
+<a name="l00161"></a>00161                 
+<a name="l00162"></a>00162         <span class="keyword">template</span><ets_key_usage_type ETS_key_type>
+<a name="l00163"></a>00163         <span class="keywordtype">void</span>* ets_base<ETS_key_type>::table_lookup( <span class="keywordtype">bool</span>& exists ) {
+<a name="l00164"></a>00164             <span class="keyword">const</span> key_type k = key_of_current_thread(); 
+<a name="l00165"></a>00165 
+<a name="l00166"></a>00166             __TBB_ASSERT(k!=0,NULL);
+<a name="l00167"></a>00167             <span class="keywordtype">void</span>* found;
+<a name="l00168"></a>00168             size_t h = hash(k);
+<a name="l00169"></a>00169             <span class="keywordflow">for</span>( array* r=my_root; r; r=r->next ) {
+<a name="l00170"></a>00170                 size_t mask=r->mask();
+<a name="l00171"></a>00171                 <span class="keywordflow">for</span>(size_t i = r->start(h); ;i=(i+1)&mask) {
+<a name="l00172"></a>00172                     slot& s = r->at(i);
+<a name="l00173"></a>00173                     <span class="keywordflow">if</span>( s.empty() ) <span class="keywordflow">break</span>;
+<a name="l00174"></a>00174                     <span class="keywordflow">if</span>( s.match(k) ) {
+<a name="l00175"></a>00175                         <span class="keywordflow">if</span>( r==my_root ) {
+<a name="l00176"></a>00176                             <span class="comment">// Success at top level</span>
+<a name="l00177"></a>00177                             exists = <span class="keyword">true</span>;
+<a name="l00178"></a>00178                             <span class="keywordflow">return</span> s.ptr;
+<a name="l00179"></a>00179                         } <span class="keywordflow">else</span> {
+<a name="l00180"></a>00180                             <span class="comment">// Success at some other level.  Need to insert at top level.</span>
+<a name="l00181"></a>00181                             exists = <span class="keyword">true</span>;
+<a name="l00182"></a>00182                             found = s.ptr;
+<a name="l00183"></a>00183                             <span class="keywordflow">goto</span> insert;
+<a name="l00184"></a>00184                         }
+<a name="l00185"></a>00185                     }
+<a name="l00186"></a>00186                 }
+<a name="l00187"></a>00187             }
+<a name="l00188"></a>00188             <span class="comment">// Key does not yet exist</span>
+<a name="l00189"></a>00189             exists = <span class="keyword">false</span>;
+<a name="l00190"></a>00190             found = create_local();
+<a name="l00191"></a>00191             {
+<a name="l00192"></a>00192                 size_t c = ++my_count;
+<a name="l00193"></a>00193                 array* r = my_root;
+<a name="l00194"></a>00194                 <span class="keywordflow">if</span>( !r || c>r->size()/2 ) {
+<a name="l00195"></a>00195                     size_t s = r ? r->lg_size : 2;
+<a name="l00196"></a>00196                     <span class="keywordflow">while</span>( c>size_t(1)<<(s-1) ) ++s;
+<a name="l00197"></a>00197                     array* a = allocate(s);
+<a name="l00198"></a>00198                     <span class="keywordflow">for</span>(;;) {
+<a name="l00199"></a>00199                         a->next = my_root;
+<a name="l00200"></a>00200                         array* new_r = my_root.compare_and_swap(a,r);
+<a name="l00201"></a>00201                         <span class="keywordflow">if</span>( new_r==r ) <span class="keywordflow">break</span>;
+<a name="l00202"></a>00202                         <span class="keywordflow">if</span>( new_r->lg_size>=s ) {
+<a name="l00203"></a>00203                             <span class="comment">// Another thread inserted an equal or  bigger array, so our array is superfluous.</span>
+<a name="l00204"></a>00204                             free(a);
+<a name="l00205"></a>00205                             <span class="keywordflow">break</span>;
+<a name="l00206"></a>00206                         }
+<a name="l00207"></a>00207                         r = new_r;
+<a name="l00208"></a>00208                     }
+<a name="l00209"></a>00209                 }
+<a name="l00210"></a>00210             }
+<a name="l00211"></a>00211         insert:
+<a name="l00212"></a>00212             <span class="comment">// Guaranteed to be room for it, and it is not present, so search for empty slot and grab it.</span>
+<a name="l00213"></a>00213             array* ir = my_root;
+<a name="l00214"></a>00214             size_t mask = ir->mask();
+<a name="l00215"></a>00215             <span class="keywordflow">for</span>(size_t i = ir->start(h);;i=(i+1)&mask) {
+<a name="l00216"></a>00216                 slot& s = ir->at(i);
+<a name="l00217"></a>00217                 <span class="keywordflow">if</span>( s.empty() ) {
+<a name="l00218"></a>00218                     <span class="keywordflow">if</span>( s.claim(k) ) {
+<a name="l00219"></a>00219                         s.ptr = found;
+<a name="l00220"></a>00220                         <span class="keywordflow">return</span> found;
+<a name="l00221"></a>00221                     }
+<a name="l00222"></a>00222                 }
+<a name="l00223"></a>00223             }
+<a name="l00224"></a>00224         }
+<a name="l00225"></a>00225 
+<a name="l00227"></a>00227         <span class="keyword">template</span> <>
+<a name="l00228"></a>00228         <span class="keyword">class </span>ets_base<ets_key_per_instance>: <span class="keyword">protected</span> ets_base<ets_no_key> {
+<a name="l00229"></a>00229             <span class="keyword">typedef</span> ets_base<ets_no_key> super;
+<a name="l00230"></a>00230 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00231"></a>00231 <span class="preprocessor"></span>            <span class="keyword">typedef</span> DWORD tls_key_t;
+<a name="l00232"></a>00232             <span class="keywordtype">void</span> create_key() { my_key = TlsAlloc(); }
+<a name="l00233"></a>00233             <span class="keywordtype">void</span> destroy_key() { TlsFree(my_key); }
+<a name="l00234"></a>00234             <span class="keywordtype">void</span> set_tls(<span class="keywordtype">void</span> * value) { TlsSetValue(my_key, (LPVOID)value); }
+<a name="l00235"></a>00235             <span class="keywordtype">void</span>* get_tls() { <span class="keywordflow">return</span> (<span class="keywordtype">void</span> *)TlsGetValue(my_key); }
+<a name="l00236"></a>00236 <span class="preprocessor">#else</span>
+<a name="l00237"></a>00237 <span class="preprocessor"></span>            <span class="keyword">typedef</span> pthread_key_t tls_key_t;
+<a name="l00238"></a>00238             <span class="keywordtype">void</span> create_key() { pthread_key_create(&my_key, NULL); }
+<a name="l00239"></a>00239             <span class="keywordtype">void</span> destroy_key() { pthread_key_delete(my_key); }
+<a name="l00240"></a>00240             <span class="keywordtype">void</span> set_tls( <span class="keywordtype">void</span> * value )<span class="keyword"> const </span>{ pthread_setspecific(my_key, value); }
+<a name="l00241"></a>00241             <span class="keywordtype">void</span>* get_tls()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pthread_getspecific(my_key); }
+<a name="l00242"></a>00242 <span class="preprocessor">#endif</span>
+<a name="l00243"></a>00243 <span class="preprocessor"></span>            tls_key_t my_key;
+<a name="l00244"></a>00244             <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_local() = 0;
+<a name="l00245"></a>00245             <span class="keyword">virtual</span> <span class="keywordtype">void</span>* create_array(size_t _size) = 0;  <span class="comment">// _size in bytes</span>
+<a name="l00246"></a>00246             <span class="keyword">virtual</span> <span class="keywordtype">void</span> free_array(<span class="keywordtype">void</span>* ptr, size_t _size) = 0; <span class="comment">// size in bytes</span>
+<a name="l00247"></a>00247         <span class="keyword">public</span>:
+<a name="l00248"></a>00248             ets_base() {create_key();}
+<a name="l00249"></a>00249             ~ets_base() {destroy_key();}
+<a name="l00250"></a>00250             <span class="keywordtype">void</span>* table_lookup( <span class="keywordtype">bool</span>& exists ) {
+<a name="l00251"></a>00251                 <span class="keywordtype">void</span>* found = get_tls();
+<a name="l00252"></a>00252                 <span class="keywordflow">if</span>( found ) {
+<a name="l00253"></a>00253                     exists=<span class="keyword">true</span>;
+<a name="l00254"></a>00254                 } <span class="keywordflow">else</span> {
+<a name="l00255"></a>00255                     found = super::table_lookup(exists);
+<a name="l00256"></a>00256                     set_tls(found);
+<a name="l00257"></a>00257                 }
+<a name="l00258"></a>00258                 <span class="keywordflow">return</span> found; 
+<a name="l00259"></a>00259             }
+<a name="l00260"></a>00260             <span class="keywordtype">void</span> table_clear() {
+<a name="l00261"></a>00261                 destroy_key();
+<a name="l00262"></a>00262                 create_key(); 
+<a name="l00263"></a>00263                 super::table_clear();
+<a name="l00264"></a>00264             }
+<a name="l00265"></a>00265         };
+<a name="l00266"></a>00266 
+<a name="l00268"></a>00268         <span class="keyword">template</span>< <span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value >
+<a name="l00269"></a>00269         <span class="keyword">class </span>enumerable_thread_specific_iterator 
+<a name="l00270"></a>00270 #if defined(_WIN64) && defined(_MSC_VER) 
+<a name="l00271"></a>00271             <span class="comment">// Ensure that Microsoft's internal template function _Val_type works correctly.</span>
+<a name="l00272"></a>00272             : public std::iterator<std::random_access_iterator_tag,Value>
+<a name="l00273"></a>00273 #endif <span class="comment">/* defined(_WIN64) && defined(_MSC_VER) */</span>
+<a name="l00274"></a>00274         {
+<a name="l00276"></a>00276         
+<a name="l00277"></a>00277             Container *my_container;
+<a name="l00278"></a>00278             <span class="keyword">typename</span> Container::size_type my_index;
+<a name="l00279"></a>00279             <span class="keyword">mutable</span> Value *my_value;
+<a name="l00280"></a>00280         
+<a name="l00281"></a>00281             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T>
+<a name="l00282"></a>00282             <span class="keyword">friend</span> enumerable_thread_specific_iterator<C,T> operator+( ptrdiff_t offset, 
+<a name="l00283"></a>00283                                                                        <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& v );
+<a name="l00284"></a>00284         
+<a name="l00285"></a>00285             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00286"></a>00286             <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& i, 
+<a name="l00287"></a>00287                                     <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
+<a name="l00288"></a>00288         
+<a name="l00289"></a>00289             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00290"></a>00290             <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<C,T>& i, 
+<a name="l00291"></a>00291                                    <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
+<a name="l00292"></a>00292         
+<a name="l00293"></a>00293             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00294"></a>00294             <span class="keyword">friend</span> ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<C,T>& i, <span class="keyword">const</span> enumerable_thread_specific_iterator<C,U>& j );
+<a name="l00295"></a>00295             
+<a name="l00296"></a>00296             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U> 
+<a name="l00297"></a>00297             <span class="keyword">friend</span> <span class="keyword">class </span>enumerable_thread_specific_iterator;
+<a name="l00298"></a>00298         
+<a name="l00299"></a>00299             <span class="keyword">public</span>:
+<a name="l00300"></a>00300         
+<a name="l00301"></a>00301             enumerable_thread_specific_iterator( <span class="keyword">const</span> Container &container, <span class="keyword">typename</span> Container::size_type index ) : 
+<a name="l00302"></a>00302                 my_container(&const_cast<Container &>(container)), my_index(index), my_value(NULL) {}
+<a name="l00303"></a>00303         
+<a name="l00305"></a>00305             enumerable_thread_specific_iterator() : my_container(NULL), my_index(0), my_value(NULL) {}
+<a name="l00306"></a>00306         
+<a name="l00307"></a>00307             <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00308"></a>00308             enumerable_thread_specific_iterator( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container, U>& other ) :
+<a name="l00309"></a>00309                     my_container( other.my_container ), my_index( other.my_index), my_value( const_cast<Value *>(other.my_value) ) {}
+<a name="l00310"></a>00310         
+<a name="l00311"></a>00311             enumerable_thread_specific_iterator operator+( ptrdiff_t offset )<span class="keyword"> const </span>{
+<a name="l00312"></a>00312                 <span class="keywordflow">return</span> enumerable_thread_specific_iterator(*my_container, my_index + offset);
+<a name="l00313"></a>00313             }
+<a name="l00314"></a>00314         
+<a name="l00315"></a>00315             enumerable_thread_specific_iterator &operator+=( ptrdiff_t offset ) {
+<a name="l00316"></a>00316                 my_index += offset;
+<a name="l00317"></a>00317                 my_value = NULL;
+<a name="l00318"></a>00318                 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00319"></a>00319             }
+<a name="l00320"></a>00320         
+<a name="l00321"></a>00321             enumerable_thread_specific_iterator operator-( ptrdiff_t offset )<span class="keyword"> const </span>{
+<a name="l00322"></a>00322                 <span class="keywordflow">return</span> enumerable_thread_specific_iterator( *my_container, my_index-offset );
+<a name="l00323"></a>00323             }
+<a name="l00324"></a>00324         
+<a name="l00325"></a>00325             enumerable_thread_specific_iterator &operator-=( ptrdiff_t offset ) {
+<a name="l00326"></a>00326                 my_index -= offset;
+<a name="l00327"></a>00327                 my_value = NULL;
+<a name="l00328"></a>00328                 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00329"></a>00329             }
+<a name="l00330"></a>00330         
+<a name="l00331"></a>00331             Value& operator*()<span class="keyword"> const </span>{
+<a name="l00332"></a>00332                 Value* value = my_value;
+<a name="l00333"></a>00333                 <span class="keywordflow">if</span>( !value ) {
+<a name="l00334"></a>00334                     value = my_value = reinterpret_cast<Value *>(&(*my_container)[my_index].value);
+<a name="l00335"></a>00335                 }
+<a name="l00336"></a>00336                 __TBB_ASSERT( value==reinterpret_cast<Value *>(&(*my_container)[my_index].value), <span class="stringliteral">"corrupt cache"</span> );
+<a name="l00337"></a>00337                 <span class="keywordflow">return</span> *value;
+<a name="l00338"></a>00338             }
+<a name="l00339"></a>00339         
+<a name="l00340"></a>00340             Value& operator[]( ptrdiff_t k )<span class="keyword"> const </span>{
+<a name="l00341"></a>00341                <span class="keywordflow">return</span> (*my_container)[my_index + k].value;
+<a name="l00342"></a>00342             }
+<a name="l00343"></a>00343         
+<a name="l00344"></a>00344             Value* operator->()<span class="keyword"> const </span>{<span class="keywordflow">return</span> &operator*();}
+<a name="l00345"></a>00345         
+<a name="l00346"></a>00346             enumerable_thread_specific_iterator& operator++() {
+<a name="l00347"></a>00347                 ++my_index;
+<a name="l00348"></a>00348                 my_value = NULL;
+<a name="l00349"></a>00349                 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00350"></a>00350             }
+<a name="l00351"></a>00351         
+<a name="l00352"></a>00352             enumerable_thread_specific_iterator& operator--() {
+<a name="l00353"></a>00353                 --my_index;
+<a name="l00354"></a>00354                 my_value = NULL;
+<a name="l00355"></a>00355                 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00356"></a>00356             }
+<a name="l00357"></a>00357         
+<a name="l00359"></a>00359             enumerable_thread_specific_iterator operator++(<span class="keywordtype">int</span>) {
+<a name="l00360"></a>00360                 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
+<a name="l00361"></a>00361                 ++my_index;
+<a name="l00362"></a>00362                 my_value = NULL;
+<a name="l00363"></a>00363                 <span class="keywordflow">return</span> result;
+<a name="l00364"></a>00364             }
+<a name="l00365"></a>00365         
+<a name="l00367"></a>00367             enumerable_thread_specific_iterator operator--(<span class="keywordtype">int</span>) {
+<a name="l00368"></a>00368                 enumerable_thread_specific_iterator result = *<span class="keyword">this</span>;
+<a name="l00369"></a>00369                 --my_index;
+<a name="l00370"></a>00370                 my_value = NULL;
+<a name="l00371"></a>00371                 <span class="keywordflow">return</span> result;
+<a name="l00372"></a>00372             }
+<a name="l00373"></a>00373         
+<a name="l00374"></a>00374             <span class="comment">// STL support</span>
+<a name="l00375"></a>00375             <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00376"></a>00376             <span class="keyword">typedef</span> Value value_type;
+<a name="l00377"></a>00377             <span class="keyword">typedef</span> Value* pointer;
+<a name="l00378"></a>00378             <span class="keyword">typedef</span> Value& reference;
+<a name="l00379"></a>00379             <span class="keyword">typedef</span> std::random_access_iterator_tag iterator_category;
+<a name="l00380"></a>00380         };
+<a name="l00381"></a>00381         
+<a name="l00382"></a>00382         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T>
+<a name="l00383"></a>00383         enumerable_thread_specific_iterator<Container,T> operator+( ptrdiff_t offset, 
+<a name="l00384"></a>00384                                                                     <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& v ) {
+<a name="l00385"></a>00385             <span class="keywordflow">return</span> enumerable_thread_specific_iterator<Container,T>( v.my_container, v.my_index + offset );
+<a name="l00386"></a>00386         }
+<a name="l00387"></a>00387         
+<a name="l00388"></a>00388         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00389"></a>00389         <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i, 
+<a name="l00390"></a>00390                          <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00391"></a>00391             <span class="keywordflow">return</span> i.my_index==j.my_index && i.my_container == j.my_container;
+<a name="l00392"></a>00392         }
+<a name="l00393"></a>00393         
+<a name="l00394"></a>00394         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00395"></a>00395         <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i, 
+<a name="l00396"></a>00396                          <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00397"></a>00397             <span class="keywordflow">return</span> !(i==j);
+<a name="l00398"></a>00398         }
+<a name="l00399"></a>00399         
+<a name="l00400"></a>00400         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00401"></a>00401         <span class="keywordtype">bool</span> operator<( const enumerable_thread_specific_iterator<Container,T>& i, 
+<a name="l00402"></a>00402                         <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00403"></a>00403             <span class="keywordflow">return</span> i.my_index<j.my_index;
+<a name="l00404"></a>00404         }
+<a name="l00405"></a>00405         
+<a name="l00406"></a>00406         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00407"></a>00407         <span class="keywordtype">bool</span> operator>( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i, 
+<a name="l00408"></a>00408                         <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00409"></a>00409             <span class="keywordflow">return</span> j<i;
+<a name="l00410"></a>00410         }
+<a name="l00411"></a>00411         
+<a name="l00412"></a>00412         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00413"></a>00413         <span class="keywordtype">bool</span> operator>=( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i, 
+<a name="l00414"></a>00414                          <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00415"></a>00415             <span class="keywordflow">return</span> !(i<j);
+<a name="l00416"></a>00416         }
+<a name="l00417"></a>00417         
+<a name="l00418"></a>00418         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00419"></a>00419         <span class="keywordtype">bool</span> operator<=( const enumerable_thread_specific_iterator<Container,T>& i, 
+<a name="l00420"></a>00420                          <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00421"></a>00421             <span class="keywordflow">return</span> !(j<i);
+<a name="l00422"></a>00422         }
+<a name="l00423"></a>00423         
+<a name="l00424"></a>00424         <span class="keyword">template</span><<span class="keyword">typename</span> Container, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00425"></a>00425         ptrdiff_t operator-( <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,T>& i, 
+<a name="l00426"></a>00426                              <span class="keyword">const</span> enumerable_thread_specific_iterator<Container,U>& j ) {
+<a name="l00427"></a>00427             <span class="keywordflow">return</span> i.my_index-j.my_index;
+<a name="l00428"></a>00428         }
+<a name="l00429"></a>00429 
+<a name="l00430"></a>00430     <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> Value >
+<a name="l00431"></a>00431         <span class="keyword">class </span>segmented_iterator
+<a name="l00432"></a>00432 #if defined(_WIN64) && defined(_MSC_VER)
+<a name="l00433"></a>00433         : public std::iterator<std::input_iterator_tag, Value>
+<a name="l00434"></a>00434 #endif
+<a name="l00435"></a>00435         {
+<a name="l00436"></a>00436             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00437"></a>00437             <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> segmented_iterator<C,T>& i, <span class="keyword">const</span> segmented_iterator<C,U>& j);
+<a name="l00438"></a>00438 
+<a name="l00439"></a>00439             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00440"></a>00440             <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> segmented_iterator<C,T>& i, <span class="keyword">const</span> segmented_iterator<C,U>& j);
+<a name="l00441"></a>00441             
+<a name="l00442"></a>00442             <span class="keyword">template</span><<span class="keyword">typename</span> C, <span class="keyword">typename</span> U> 
+<a name="l00443"></a>00443             <span class="keyword">friend</span> <span class="keyword">class </span>segmented_iterator;
+<a name="l00444"></a>00444 
+<a name="l00445"></a>00445             <span class="keyword">public</span>:
+<a name="l00446"></a>00446 
+<a name="l00447"></a>00447                 segmented_iterator() {my_segcont = NULL;}
+<a name="l00448"></a>00448 
+<a name="l00449"></a>00449                 segmented_iterator( <span class="keyword">const</span> SegmentedContainer& _segmented_container ) : 
+<a name="l00450"></a>00450                     my_segcont(const_cast<SegmentedContainer*>(&_segmented_container)),
+<a name="l00451"></a>00451                     outer_iter(my_segcont->end()) { }
+<a name="l00452"></a>00452 
+<a name="l00453"></a>00453                 ~segmented_iterator() {}
+<a name="l00454"></a>00454 
+<a name="l00455"></a>00455                 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::iterator outer_iterator;
+<a name="l00456"></a>00456                 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::value_type InnerContainer;
+<a name="l00457"></a>00457                 <span class="keyword">typedef</span> <span class="keyword">typename</span> InnerContainer::iterator inner_iterator;
+<a name="l00458"></a>00458 
+<a name="l00459"></a>00459                 <span class="comment">// STL support</span>
+<a name="l00460"></a>00460                 <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00461"></a>00461                 <span class="keyword">typedef</span> Value value_type;
+<a name="l00462"></a>00462                 <span class="keyword">typedef</span> <span class="keyword">typename</span> SegmentedContainer::size_type size_type;
+<a name="l00463"></a>00463                 <span class="keyword">typedef</span> Value* pointer;
+<a name="l00464"></a>00464                 <span class="keyword">typedef</span> Value& reference;
+<a name="l00465"></a>00465                 <span class="keyword">typedef</span> std::input_iterator_tag iterator_category;
+<a name="l00466"></a>00466 
+<a name="l00467"></a>00467                 <span class="comment">// Copy Constructor</span>
+<a name="l00468"></a>00468                 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00469"></a>00469                 segmented_iterator(<span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) :
+<a name="l00470"></a>00470                     my_segcont(other.my_segcont),
+<a name="l00471"></a>00471                     outer_iter(other.outer_iter),
+<a name="l00472"></a>00472                     <span class="comment">// can we assign a default-constructed iterator to inner if we're at the end?</span>
+<a name="l00473"></a>00473                     inner_iter(other.inner_iter)
+<a name="l00474"></a>00474                 {}
+<a name="l00475"></a>00475 
+<a name="l00476"></a>00476                 <span class="comment">// assignment</span>
+<a name="l00477"></a>00477                 <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00478"></a>00478                 segmented_iterator& operator=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer, U>& other) {
+<a name="l00479"></a>00479                     <span class="keywordflow">if</span>(<span class="keyword">this</span> != &other) {
+<a name="l00480"></a>00480                         my_segcont = other.my_segcont;
+<a name="l00481"></a>00481                         outer_iter = other.outer_iter;
+<a name="l00482"></a>00482                         <span class="keywordflow">if</span>(outer_iter != my_segcont->end()) inner_iter = other.inner_iter;
+<a name="l00483"></a>00483                     }
+<a name="l00484"></a>00484                     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00485"></a>00485                 }
+<a name="l00486"></a>00486 
+<a name="l00487"></a>00487                 <span class="comment">// allow assignment of outer iterator to segmented iterator.  Once it is</span>
+<a name="l00488"></a>00488                 <span class="comment">// assigned, move forward until a non-empty inner container is found or</span>
+<a name="l00489"></a>00489                 <span class="comment">// the end of the outer container is reached.</span>
+<a name="l00490"></a>00490                 segmented_iterator& operator=(<span class="keyword">const</span> outer_iterator& new_outer_iter) {
+<a name="l00491"></a>00491                     __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00492"></a>00492                     <span class="comment">// check that this iterator points to something inside the segmented container</span>
+<a name="l00493"></a>00493                     <span class="keywordflow">for</span>(outer_iter = new_outer_iter ;outer_iter!=my_segcont->end(); ++outer_iter) {
+<a name="l00494"></a>00494                         <span class="keywordflow">if</span>( !outer_iter->empty() ) {
+<a name="l00495"></a>00495                             inner_iter = outer_iter->begin();
+<a name="l00496"></a>00496                             <span class="keywordflow">break</span>;
+<a name="l00497"></a>00497                         }
+<a name="l00498"></a>00498                     }
+<a name="l00499"></a>00499                     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00500"></a>00500                 }
+<a name="l00501"></a>00501 
+<a name="l00502"></a>00502                 <span class="comment">// pre-increment</span>
+<a name="l00503"></a>00503                 segmented_iterator& operator++() {
+<a name="l00504"></a>00504                     advance_me();
+<a name="l00505"></a>00505                     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00506"></a>00506                 }
+<a name="l00507"></a>00507 
+<a name="l00508"></a>00508                 <span class="comment">// post-increment</span>
+<a name="l00509"></a>00509                 segmented_iterator operator++(<span class="keywordtype">int</span>) {
+<a name="l00510"></a>00510                     segmented_iterator tmp = *<span class="keyword">this</span>;
+<a name="l00511"></a>00511                     operator++();
+<a name="l00512"></a>00512                     <span class="keywordflow">return</span> tmp;
+<a name="l00513"></a>00513                 }
+<a name="l00514"></a>00514 
+<a name="l00515"></a>00515                 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
+<a name="l00516"></a>00516                     __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00517"></a>00517                     <span class="keywordflow">return</span> (outer_iter == other_outer &&
+<a name="l00518"></a>00518                             (outer_iter == my_segcont->end() || inner_iter == outer_iter->begin()));
+<a name="l00519"></a>00519                 }
+<a name="l00520"></a>00520 
+<a name="l00521"></a>00521                 <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> outer_iterator& other_outer)<span class="keyword"> const </span>{
+<a name="l00522"></a>00522                     <span class="keywordflow">return</span> !operator==(other_outer);
+<a name="l00523"></a>00523 
+<a name="l00524"></a>00524                 }
+<a name="l00525"></a>00525 
+<a name="l00526"></a>00526                 <span class="comment">// (i)* RHS</span>
+<a name="l00527"></a>00527                 reference operator*()<span class="keyword"> const </span>{
+<a name="l00528"></a>00528                     __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00529"></a>00529                     __TBB_ASSERT(outer_iter != my_segcont->end(), <span class="stringliteral">"Dereferencing a pointer at end of container"</span>);
+<a name="l00530"></a>00530                     __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// should never happen</span>
+<a name="l00531"></a>00531                     <span class="keywordflow">return</span> *inner_iter;
+<a name="l00532"></a>00532                 }
+<a name="l00533"></a>00533 
+<a name="l00534"></a>00534                 <span class="comment">// i-></span>
+<a name="l00535"></a>00535                 pointer operator->()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &operator*();}
+<a name="l00536"></a>00536 
+<a name="l00537"></a>00537             <span class="keyword">private</span>:
+<a name="l00538"></a>00538                 SegmentedContainer*             my_segcont;
+<a name="l00539"></a>00539                 outer_iterator outer_iter;
+<a name="l00540"></a>00540                 inner_iterator inner_iter;
+<a name="l00541"></a>00541 
+<a name="l00542"></a>00542                 <span class="keywordtype">void</span> advance_me() {
+<a name="l00543"></a>00543                     __TBB_ASSERT(my_segcont != NULL, NULL);
+<a name="l00544"></a>00544                     __TBB_ASSERT(outer_iter != my_segcont->end(), NULL); <span class="comment">// not true if there are no inner containers</span>
+<a name="l00545"></a>00545                     __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); <span class="comment">// not true if the inner containers are all empty.</span>
+<a name="l00546"></a>00546                     ++inner_iter;
+<a name="l00547"></a>00547                     <span class="keywordflow">while</span>(inner_iter == outer_iter->end() && ++outer_iter != my_segcont->end()) {
+<a name="l00548"></a>00548                         inner_iter = outer_iter->begin();
+<a name="l00549"></a>00549                     }
+<a name="l00550"></a>00550                 }
+<a name="l00551"></a>00551         };    <span class="comment">// segmented_iterator</span>
+<a name="l00552"></a>00552 
+<a name="l00553"></a>00553         <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00554"></a>00554         <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i, 
+<a name="l00555"></a>00555                          <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
+<a name="l00556"></a>00556             <span class="keywordflow">if</span>(i.my_segcont != j.my_segcont) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00557"></a>00557             <span class="keywordflow">if</span>(i.my_segcont == NULL) <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00558"></a>00558             <span class="keywordflow">if</span>(i.outer_iter != j.outer_iter) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00559"></a>00559             <span class="keywordflow">if</span>(i.outer_iter == i.my_segcont->end()) <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00560"></a>00560             <span class="keywordflow">return</span> i.inner_iter == j.inner_iter;
+<a name="l00561"></a>00561         }
+<a name="l00562"></a>00562 
+<a name="l00563"></a>00563         <span class="comment">// !=</span>
+<a name="l00564"></a>00564         <span class="keyword">template</span><<span class="keyword">typename</span> SegmentedContainer, <span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00565"></a>00565         <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> segmented_iterator<SegmentedContainer,T>& i, 
+<a name="l00566"></a>00566                          <span class="keyword">const</span> segmented_iterator<SegmentedContainer,U>& j ) {
+<a name="l00567"></a>00567             <span class="keywordflow">return</span> !(i==j);
+<a name="l00568"></a>00568         }
+<a name="l00569"></a>00569 
+<a name="l00570"></a>00570         <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00571"></a>00571         <span class="keyword">struct </span>destruct_only: tbb::internal::no_copy {
+<a name="l00572"></a>00572             <a class="code" href="a00227.html">tbb::aligned_space<T,1></a> value;
+<a name="l00573"></a>00573             ~destruct_only() {value.begin()[0].~T();}
+<a name="l00574"></a>00574         };
+<a name="l00575"></a>00575 
+<a name="l00576"></a>00576         <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00577"></a>00577         <span class="keyword">struct </span>construct_by_default: tbb::internal::no_assign {
+<a name="l00578"></a>00578             <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>*where) {<span class="keyword">new</span>(where) T();} <span class="comment">// C++ note: the () in T() ensure zero initialization.</span>
+<a name="l00579"></a>00579             construct_by_default( <span class="keywordtype">int</span> ) {}
+<a name="l00580"></a>00580         };
+<a name="l00581"></a>00581 
+<a name="l00582"></a>00582         <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00583"></a>00583         <span class="keyword">struct </span>construct_by_exemplar: tbb::internal::no_assign {
+<a name="l00584"></a>00584             <span class="keyword">const</span> T exemplar;
+<a name="l00585"></a>00585             <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>*where) {<span class="keyword">new</span>(where) T(exemplar);}
+<a name="l00586"></a>00586             construct_by_exemplar( <span class="keyword">const</span> T& t ) : exemplar(t) {}
+<a name="l00587"></a>00587         };
+<a name="l00588"></a>00588 
+<a name="l00589"></a>00589         <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> Finit>
+<a name="l00590"></a>00590         <span class="keyword">struct </span>construct_by_finit: tbb::internal::no_assign {
+<a name="l00591"></a>00591             Finit f;
+<a name="l00592"></a>00592             <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) {<span class="keyword">new</span>(where) T(f());}
+<a name="l00593"></a>00593             construct_by_finit( <span class="keyword">const</span> Finit& f_ ) : f(f_) {}
+<a name="l00594"></a>00594         };
+<a name="l00595"></a>00595 
+<a name="l00596"></a>00596         <span class="comment">// storage for initialization function pointer</span>
+<a name="l00597"></a>00597         <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00598"></a>00598         <span class="keyword">class </span>callback_base {
+<a name="l00599"></a>00599         <span class="keyword">public</span>:
+<a name="l00600"></a>00600             <span class="comment">// Clone *this</span>
+<a name="l00601"></a>00601             <span class="keyword">virtual</span> callback_base* clone() = 0;
+<a name="l00602"></a>00602             <span class="comment">// Destruct and free *this</span>
+<a name="l00603"></a>00603             <span class="keyword">virtual</span> <span class="keywordtype">void</span> destroy() = 0;
+<a name="l00604"></a>00604             <span class="comment">// Need virtual destructor to satisfy GCC compiler warning</span>
+<a name="l00605"></a>00605             <span class="keyword">virtual</span> ~callback_base() { }
+<a name="l00606"></a>00606             <span class="comment">// Construct T at where</span>
+<a name="l00607"></a>00607             <span class="keyword">virtual</span> <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) = 0;
+<a name="l00608"></a>00608         };
+<a name="l00609"></a>00609 
+<a name="l00610"></a>00610         <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Constructor>
+<a name="l00611"></a>00611         <span class="keyword">class </span>callback_leaf: <span class="keyword">public</span> callback_base<T>, Constructor {
+<a name="l00612"></a>00612             <span class="keyword">template</span><<span class="keyword">typename</span> X> callback_leaf( <span class="keyword">const</span> X& x ) : Constructor(x) {}
+<a name="l00613"></a>00613 
+<a name="l00614"></a>00614             <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00317.html">tbb::tbb_allocator<callback_leaf></a> my_allocator_type;
+<a name="l00615"></a>00615 
+<a name="l00616"></a>00616             <span class="comment">/*override*/</span> callback_base<T>* clone() {
+<a name="l00617"></a>00617                 <span class="keywordtype">void</span>* where = my_allocator_type().allocate(1);
+<a name="l00618"></a>00618                 <span class="keywordflow">return</span> <span class="keyword">new</span>(where) callback_leaf(*<span class="keyword">this</span>);
+<a name="l00619"></a>00619             }
+<a name="l00620"></a>00620 
+<a name="l00621"></a>00621             <span class="comment">/*override*/</span> <span class="keywordtype">void</span> destroy() {
+<a name="l00622"></a>00622                 my_allocator_type().destroy(<span class="keyword">this</span>);
+<a name="l00623"></a>00623                 my_allocator_type().deallocate(<span class="keyword">this</span>,1);
+<a name="l00624"></a>00624             }
+<a name="l00625"></a>00625 
+<a name="l00626"></a>00626             <span class="comment">/*override*/</span> <span class="keywordtype">void</span> construct(<span class="keywordtype">void</span>* where) {
+<a name="l00627"></a>00627                 Constructor::construct(where);
+<a name="l00628"></a>00628             }  
+<a name="l00629"></a>00629         <span class="keyword">public</span>:
+<a name="l00630"></a>00630             <span class="keyword">template</span><<span class="keyword">typename</span> X>
+<a name="l00631"></a>00631             <span class="keyword">static</span> callback_base<T>* make( <span class="keyword">const</span> X& x ) {
+<a name="l00632"></a>00632                 <span class="keywordtype">void</span>* where = my_allocator_type().allocate(1);
+<a name="l00633"></a>00633                 <span class="keywordflow">return</span> <span class="keyword">new</span>(where) callback_leaf(x);
+<a name="l00634"></a>00634             }
+<a name="l00635"></a>00635         };
+<a name="l00636"></a>00636 
+<a name="l00638"></a>00638 
+<a name="l00643"></a>00643         <span class="keyword">template</span><<span class="keyword">typename</span> U, size_t ModularSize>
+<a name="l00644"></a>00644         <span class="keyword">struct </span>ets_element {
+<a name="l00645"></a>00645             <span class="keywordtype">char</span> value[ModularSize==0 ? <span class="keyword">sizeof</span>(U) : <span class="keyword">sizeof</span>(U)+(tbb::internal::NFS_MaxLineSize-ModularSize)];
+<a name="l00646"></a>00646             <span class="keywordtype">void</span> unconstruct() {
+<a name="l00647"></a>00647                 tbb::internal::punned_cast<U*>(&value)->~U();
+<a name="l00648"></a>00648             }
+<a name="l00649"></a>00649         };
+<a name="l00650"></a>00650 
+<a name="l00651"></a>00651     } <span class="comment">// namespace internal</span>
+<a name="l00653"></a>00653 <span class="comment"></span>
+<a name="l00655"></a>00655 
+<a name="l00674"></a>00674     <span class="keyword">template</span> <<span class="keyword">typename</span> T, 
+<a name="l00675"></a>00675               <span class="keyword">typename</span> Allocator=cache_aligned_allocator<T>, 
+<a name="l00676"></a><a class="code" href="a00255.html">00676</a>               <a class="code" href="a00383.html#a8622ae61b7e7737dac26542e181178e">ets_key_usage_type</a> ETS_key_type=ets_no_key > 
+<a name="l00677"></a>00677     <span class="keyword">class </span><a class="code" href="a00255.html">enumerable_thread_specific</a>: internal::ets_base<ETS_key_type> { 
+<a name="l00678"></a>00678 
+<a name="l00679"></a>00679         <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A, ets_key_usage_type C> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00255.html">enumerable_thread_specific</a>;
+<a name="l00680"></a>00680     
+<a name="l00681"></a>00681         <span class="keyword">typedef</span> internal::ets_element<T,sizeof(T)%tbb::internal::NFS_MaxLineSize> padded_element;
+<a name="l00682"></a>00682 
+<a name="l00684"></a>00684         <span class="keyword">template</span><<span class="keyword">typename</span> I>
+<a name="l00685"></a>00685         <span class="keyword">class </span>generic_range_type: <span class="keyword">public</span> <a class="code" href="a00233.html">blocked_range</a><I> {
+<a name="l00686"></a>00686         <span class="keyword">public</span>:
+<a name="l00687"></a>00687             <span class="keyword">typedef</span> T value_type;
+<a name="l00688"></a>00688             <span class="keyword">typedef</span> T& reference;
+<a name="l00689"></a>00689             <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
+<a name="l00690"></a>00690             <span class="keyword">typedef</span> I iterator;
+<a name="l00691"></a>00691             <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00692"></a>00692             generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : <a class="code" href="a00233.html">blocked_range<I></a>(begin_,end_,grainsize_) {} 
+<a name="l00693"></a>00693             template<typename U>
+<a name="l00694"></a>00694             generic_range_type( <span class="keyword">const</span> generic_range_type<U>& r) : <a class="code" href="a00233.html">blocked_range<I></a>(r.begin(),r.end(),r.grainsize()) {} 
+<a name="l00695"></a>00695             generic_range_type( generic_range_type& r, <a class="code" href="a00309.html">split</a> ) : <a class="code" href="a00233.html">blocked_range<I></a>(r,<a class="code" href="a00309.html">split</a>()) {}
+<a name="l00696"></a>00696         };
+<a name="l00697"></a>00697     
+<a name="l00698"></a>00698         <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< padded_element >::other padded_allocator_type;
+<a name="l00699"></a>00699         <span class="keyword">typedef</span> <a class="code" href="a00250.html">tbb::concurrent_vector< padded_element, padded_allocator_type ></a> <a class="code" href="a00250.html">internal_collection_type</a>;
+<a name="l00700"></a>00700         
+<a name="l00701"></a>00701         internal::callback_base<T> *my_construct_callback;
+<a name="l00702"></a>00702 
+<a name="l00703"></a>00703         internal_collection_type my_locals;
+<a name="l00704"></a>00704    
+<a name="l00705"></a>00705         <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_local() {
+<a name="l00706"></a>00706 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00707"></a>00707 <span class="preprocessor"></span>            <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
+<a name="l00708"></a>00708 <span class="preprocessor">#else</span>
+<a name="l00709"></a>00709 <span class="preprocessor"></span>            <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
+<a name="l00710"></a>00710 <span class="preprocessor">#endif</span>
+<a name="l00711"></a>00711 <span class="preprocessor"></span>            my_construct_callback->construct(lref);
+<a name="l00712"></a>00712             <span class="keywordflow">return</span> lref;
+<a name="l00713"></a>00713         } 
+<a name="l00714"></a>00714 
+<a name="l00715"></a>00715         <span class="keywordtype">void</span> unconstruct_locals() {
+<a name="l00716"></a>00716             <span class="keywordflow">for</span>(<span class="keyword">typename</span> internal_collection_type::iterator cvi = my_locals.<a class="code" href="a00250.html#730b23a251ecb6d37f692fb22f38e029">begin</a>(); cvi != my_locals.<a class="code" href="a00250.html#c0b51160e5a764982ec97a455f94f2c6">end</a>(); ++cvi) {
+<a name="l00717"></a>00717                 cvi->unconstruct();
+<a name="l00718"></a>00718             }
+<a name="l00719"></a>00719         }
+<a name="l00720"></a>00720 
+<a name="l00721"></a>00721         <span class="keyword">typedef</span> <span class="keyword">typename</span> Allocator::template rebind< uintptr_t >::other array_allocator_type;
+<a name="l00722"></a>00722 
+<a name="l00723"></a>00723         <span class="comment">// _size is in bytes</span>
+<a name="l00724"></a>00724         <span class="comment">/*override*/</span> <span class="keywordtype">void</span>* create_array(size_t _size) {
+<a name="l00725"></a>00725             size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
+<a name="l00726"></a>00726             <span class="keywordflow">return</span> array_allocator_type().allocate(nelements);
+<a name="l00727"></a>00727         }
+<a name="l00728"></a>00728 
+<a name="l00729"></a>00729         <span class="comment">/*override*/</span> <span class="keywordtype">void</span> free_array( <span class="keywordtype">void</span>* _ptr, size_t _size) {
+<a name="l00730"></a>00730             size_t nelements = (_size + <span class="keyword">sizeof</span>(uintptr_t) -1) / <span class="keyword">sizeof</span>(uintptr_t);
+<a name="l00731"></a>00731             array_allocator_type().deallocate( reinterpret_cast<uintptr_t *>(_ptr),nelements);
+<a name="l00732"></a>00732         }
+<a name="l00733"></a>00733    
+<a name="l00734"></a>00734     <span class="keyword">public</span>:
+<a name="l00735"></a>00735     
+<a name="l00737"></a>00737         <span class="keyword">typedef</span> Allocator allocator_type;
+<a name="l00738"></a>00738         <span class="keyword">typedef</span> T value_type;
+<a name="l00739"></a>00739         <span class="keyword">typedef</span> T& reference;
+<a name="l00740"></a>00740         <span class="keyword">typedef</span> <span class="keyword">const</span> T& const_reference;
+<a name="l00741"></a>00741         <span class="keyword">typedef</span> T* pointer;
+<a name="l00742"></a>00742         <span class="keyword">typedef</span> <span class="keyword">const</span> T* const_pointer;
+<a name="l00743"></a>00743         <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::size_type size_type;
+<a name="l00744"></a>00744         <span class="keyword">typedef</span> <span class="keyword">typename</span> internal_collection_type::difference_type difference_type;
+<a name="l00745"></a>00745     
+<a name="l00746"></a>00746         <span class="comment">// Iterator types</span>
+<a name="l00747"></a>00747         <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, value_type > iterator;
+<a name="l00748"></a>00748         <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::enumerable_thread_specific_iterator< internal_collection_type, const value_type > const_iterator;
+<a name="l00749"></a>00749 
+<a name="l00750"></a>00750         <span class="comment">// Parallel range types</span>
+<a name="l00751"></a>00751         <span class="keyword">typedef</span> generic_range_type< iterator > range_type;
+<a name="l00752"></a>00752         <span class="keyword">typedef</span> generic_range_type< const_iterator > const_range_type;
+<a name="l00753"></a>00753     
+<a name="l00755"></a>00755         <a class="code" href="a00255.html">enumerable_thread_specific</a>() : 
+<a name="l00756"></a>00756             my_construct_callback( internal::callback_leaf<T,internal::construct_by_default<T> >::make(<span class="comment">/*dummy argument*/</span>0) ) 
+<a name="l00757"></a>00757         {}
+<a name="l00758"></a>00758 
+<a name="l00760"></a><a class="code" href="a00255.html#8d4b456ff9d7b289c73254eccc11db45">00760</a>         <span class="keyword">template</span> <<span class="keyword">typename</span> Finit>
+<a name="l00761"></a>00761         <a class="code" href="a00255.html">enumerable_thread_specific</a>( Finit finit ) : 
+<a name="l00762"></a>00762             my_construct_callback( internal::callback_leaf<T,internal::construct_by_finit<T,Finit> >::make( finit ) ) 
+<a name="l00763"></a>00763         {}
+<a name="l00764"></a>00764     
+<a name="l00766"></a>00766         <a class="code" href="a00255.html">enumerable_thread_specific</a>(<span class="keyword">const</span> T& exemplar) : 
+<a name="l00767"></a>00767             my_construct_callback( internal::callback_leaf<T,internal::construct_by_exemplar<T> >::make( exemplar ) )
+<a name="l00768"></a>00768         {}
+<a name="l00769"></a>00769     
+<a name="l00771"></a>00771         ~<a class="code" href="a00255.html">enumerable_thread_specific</a>() { 
+<a name="l00772"></a>00772             my_construct_callback->destroy();
+<a name="l00773"></a>00773             this->clear();  <span class="comment">// deallocation before the derived class is finished destructing</span>
+<a name="l00774"></a>00774             <span class="comment">// So free(array *) is still accessible</span>
+<a name="l00775"></a>00775         }
+<a name="l00776"></a>00776       
+<a name="l00778"></a>00778         reference local() {
+<a name="l00779"></a>00779             <span class="keywordtype">bool</span> exists;
+<a name="l00780"></a>00780             <span class="keywordflow">return</span> local(exists);
+<a name="l00781"></a>00781         }
+<a name="l00782"></a>00782 
+<a name="l00784"></a>00784         reference local(<span class="keywordtype">bool</span>& exists)  {
+<a name="l00785"></a>00785             <span class="keywordtype">void</span>* ptr = this->table_lookup(exists);
+<a name="l00786"></a>00786             <span class="keywordflow">return</span> *(T*)ptr;
+<a name="l00787"></a>00787         }
+<a name="l00788"></a>00788 
+<a name="l00790"></a>00790         size_type size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>(); }
+<a name="l00791"></a>00791     
+<a name="l00793"></a>00793         <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_locals.<a class="code" href="a00250.html#c6426cb93cf20d3af40f3c90f1f0481a">empty</a>(); }
+<a name="l00794"></a>00794     
+<a name="l00796"></a>00796         iterator begin() { <span class="keywordflow">return</span> iterator( my_locals, 0 ); }
+<a name="l00798"></a>00798         iterator end() { <span class="keywordflow">return</span> iterator(my_locals, my_locals.<a class="code" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>() ); }
+<a name="l00799"></a>00799     
+<a name="l00801"></a>00801         const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, 0); }
+<a name="l00802"></a>00802     
+<a name="l00804"></a>00804         const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(my_locals, my_locals.<a class="code" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()); }
+<a name="l00805"></a>00805 
+<a name="l00807"></a>00807         range_type range( size_t grainsize=1 ) { <span class="keywordflow">return</span> range_type( begin(), end(), grainsize ); } 
+<a name="l00808"></a>00808         
+<a name="l00810"></a>00810         const_range_type range( size_t grainsize=1 )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_range_type( begin(), end(), grainsize ); }
+<a name="l00811"></a>00811 
+<a name="l00813"></a>00813         <span class="keywordtype">void</span> clear() {
+<a name="l00814"></a>00814             unconstruct_locals();
+<a name="l00815"></a>00815             my_locals.<a class="code" href="a00250.html#26f937a359a66b6aae904c3cd9a3c444">clear</a>();
+<a name="l00816"></a>00816             this->table_clear();
+<a name="l00817"></a>00817             <span class="comment">// callback is not destroyed</span>
+<a name="l00818"></a>00818             <span class="comment">// exemplar is not destroyed</span>
+<a name="l00819"></a>00819         }
+<a name="l00820"></a>00820 
+<a name="l00821"></a>00821     <span class="keyword">private</span>:
+<a name="l00822"></a>00822 
+<a name="l00823"></a>00823         <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
+<a name="l00824"></a>00824         <span class="keywordtype">void</span> internal_copy( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other);
+<a name="l00825"></a>00825 
+<a name="l00826"></a>00826     <span class="keyword">public</span>:
+<a name="l00827"></a>00827 
+<a name="l00828"></a>00828         <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
+<a name="l00829"></a>00829         enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other ) : internal::ets_base<ETS_key_type> ()
+<a name="l00830"></a>00830         {
+<a name="l00831"></a>00831             internal_copy(other);
+<a name="l00832"></a>00832         }
+<a name="l00833"></a>00833 
+<a name="l00834"></a>00834         enumerable_thread_specific( <span class="keyword">const</span> enumerable_thread_specific& other ) : internal::ets_base<ETS_key_type> ()
+<a name="l00835"></a>00835         {
+<a name="l00836"></a>00836             internal_copy(other);
+<a name="l00837"></a>00837         }
+<a name="l00838"></a>00838 
+<a name="l00839"></a>00839     <span class="keyword">private</span>:
+<a name="l00840"></a>00840 
+<a name="l00841"></a>00841         <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
+<a name="l00842"></a>00842         enumerable_thread_specific &
+<a name="l00843"></a>00843         internal_assign(<span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
+<a name="l00844"></a>00844             <span class="keywordflow">if</span>(static_cast<void *>( <span class="keyword">this</span> ) != static_cast<const void *>( &other )) {
+<a name="l00845"></a>00845                 this->clear(); 
+<a name="l00846"></a>00846                 my_construct_callback->destroy();
+<a name="l00847"></a>00847                 my_construct_callback = 0;
+<a name="l00848"></a>00848                 internal_copy( other );
+<a name="l00849"></a>00849             }
+<a name="l00850"></a>00850             <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00851"></a>00851         }
+<a name="l00852"></a>00852 
+<a name="l00853"></a>00853     <span class="keyword">public</span>:
+<a name="l00854"></a>00854 
+<a name="l00855"></a>00855         <span class="comment">// assignment</span>
+<a name="l00856"></a>00856         enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific& other) {
+<a name="l00857"></a>00857             <span class="keywordflow">return</span> internal_assign(other);
+<a name="l00858"></a>00858         }
+<a name="l00859"></a>00859 
+<a name="l00860"></a>00860         <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> Alloc, ets_key_usage_type Cachetype>
+<a name="l00861"></a>00861         enumerable_thread_specific& operator=(<span class="keyword">const</span> enumerable_thread_specific<U, Alloc, Cachetype>& other)
+<a name="l00862"></a>00862         {
+<a name="l00863"></a>00863             <span class="keywordflow">return</span> internal_assign(other);
+<a name="l00864"></a>00864         }
+<a name="l00865"></a>00865 
+<a name="l00866"></a>00866         <span class="comment">// combine_func_t has signature T(T,T) or T(const T&, const T&)</span>
+<a name="l00867"></a>00867         <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
+<a name="l00868"></a>00868         T combine(combine_func_t f_combine) {
+<a name="l00869"></a>00869             <span class="keywordflow">if</span>(begin() == end()) {
+<a name="l00870"></a>00870                 internal::destruct_only<T> location;
+<a name="l00871"></a>00871                 my_construct_callback->construct(location.value.begin());
+<a name="l00872"></a>00872                 <span class="keywordflow">return</span> *location.value.begin();
+<a name="l00873"></a>00873             }
+<a name="l00874"></a>00874             const_iterator ci = begin();
+<a name="l00875"></a>00875             T my_result = *ci;
+<a name="l00876"></a>00876             <span class="keywordflow">while</span>(++ci != end()) 
+<a name="l00877"></a>00877                 my_result = f_combine( my_result, *ci );
+<a name="l00878"></a>00878             <span class="keywordflow">return</span> my_result;
+<a name="l00879"></a>00879         }
+<a name="l00880"></a>00880 
+<a name="l00881"></a>00881         <span class="comment">// combine_func_t has signature void(T) or void(const T&)</span>
+<a name="l00882"></a>00882         <span class="keyword">template</span> <<span class="keyword">typename</span> combine_func_t>
+<a name="l00883"></a>00883         <span class="keywordtype">void</span> combine_each(combine_func_t f_combine) {
+<a name="l00884"></a>00884             <span class="keywordflow">for</span>(const_iterator ci = begin(); ci != end(); ++ci) {
+<a name="l00885"></a>00885                 f_combine( *ci );
+<a name="l00886"></a>00886             }
+<a name="l00887"></a>00887         }
+<a name="l00888"></a>00888 
+<a name="l00889"></a>00889     }; <span class="comment">// enumerable_thread_specific</span>
+<a name="l00890"></a>00890 
+<a name="l00891"></a>00891     <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> Allocator, ets_key_usage_type ETS_key_type> 
+<a name="l00892"></a>00892     <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> A2, ets_key_usage_type C2>
+<a name="l00893"></a>00893     <span class="keywordtype">void</span> enumerable_thread_specific<T,Allocator,ETS_key_type>::internal_copy( <span class="keyword">const</span> enumerable_thread_specific<U, A2, C2>& other) {
+<a name="l00894"></a>00894         <span class="comment">// Initialize my_construct_callback first, so that it is valid even if rest of this routine throws an exception.</span>
+<a name="l00895"></a>00895         my_construct_callback = other.my_construct_callback->clone();
+<a name="l00896"></a>00896 
+<a name="l00897"></a>00897         <span class="keyword">typedef</span> internal::ets_base<ets_no_key> base;
+<a name="l00898"></a>00898         __TBB_ASSERT(my_locals.<a class="code" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">size</a>()==0,NULL);
+<a name="l00899"></a>00899         this->table_reserve_for_copy( other );
+<a name="l00900"></a>00900         <span class="keywordflow">for</span>( base::array* r=other.my_root; r; r=r->next ) {
+<a name="l00901"></a>00901             <span class="keywordflow">for</span>( size_t i=0; i<r-><a class="code" href="a00233.html#9eaa0b6beff1420f688570bbf6b8c462">size</a>(); ++i ) {
+<a name="l00902"></a>00902                 base::slot& s1 = r->at(i);
+<a name="l00903"></a>00903                 <span class="keywordflow">if</span>( !s1.empty() ) {
+<a name="l00904"></a>00904                     base::slot& s2 = this->table_find(s1.key);
+<a name="l00905"></a>00905                     <span class="keywordflow">if</span>( s2.empty() ) { 
+<a name="l00906"></a>00906 #<span class="keywordflow">if</span> TBB_DEPRECATED
+<a name="l00907"></a>00907                         <span class="keywordtype">void</span>* lref = &my_locals[my_locals.<a class="code" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element())];
+<a name="l00908"></a>00908 <span class="preprocessor">#else</span>
+<a name="l00909"></a>00909 <span class="preprocessor"></span>                        <span class="keywordtype">void</span>* lref = &*my_locals.<a class="code" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">push_back</a>(padded_element());
+<a name="l00910"></a>00910 <span class="preprocessor">#endif</span>
+<a name="l00911"></a>00911 <span class="preprocessor"></span>                        s2.ptr = <span class="keyword">new</span>(lref) T(*(U*)s1.ptr);
+<a name="l00912"></a>00912                         s2.key = s1.key;
+<a name="l00913"></a>00913                     } <span class="keywordflow">else</span> {
+<a name="l00914"></a>00914                         <span class="comment">// Skip the duplicate</span>
+<a name="l00915"></a>00915                     } 
+<a name="l00916"></a>00916                 }
+<a name="l00917"></a>00917             }
+<a name="l00918"></a>00918         }
+<a name="l00919"></a>00919     }
+<a name="l00920"></a>00920 
+<a name="l00921"></a>00921     <span class="keyword">template</span>< <span class="keyword">typename</span> Container >
+<a name="l00922"></a>00922     <span class="keyword">class </span>flattened2d {
+<a name="l00923"></a>00923 
+<a name="l00924"></a>00924         <span class="comment">// This intermediate typedef is to address issues with VC7.1 compilers</span>
+<a name="l00925"></a>00925         <span class="keyword">typedef</span> <span class="keyword">typename</span> Container::value_type conval_type;
+<a name="l00926"></a>00926 
+<a name="l00927"></a>00927     <span class="keyword">public</span>:
+<a name="l00928"></a>00928 
+<a name="l00930"></a>00930         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::size_type size_type;
+<a name="l00931"></a>00931         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::difference_type difference_type;
+<a name="l00932"></a>00932         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::allocator_type allocator_type;
+<a name="l00933"></a>00933         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::value_type value_type;
+<a name="l00934"></a>00934         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::reference reference;
+<a name="l00935"></a>00935         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_reference const_reference;
+<a name="l00936"></a>00936         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::pointer pointer;
+<a name="l00937"></a>00937         <span class="keyword">typedef</span> <span class="keyword">typename</span> conval_type::const_pointer const_pointer;
+<a name="l00938"></a>00938 
+<a name="l00939"></a>00939         <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, value_type> iterator;
+<a name="l00940"></a>00940         <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::segmented_iterator<Container, const value_type> const_iterator;
+<a name="l00941"></a>00941 
+<a name="l00942"></a>00942         flattened2d( <span class="keyword">const</span> Container &c, <span class="keyword">typename</span> Container::const_iterator b, <span class="keyword">typename</span> Container::const_iterator e ) : 
+<a name="l00943"></a>00943             my_container(const_cast<Container*>(&c)), my_begin(b), my_end(e) { }
+<a name="l00944"></a>00944 
+<a name="l00945"></a>00945         flattened2d( <span class="keyword">const</span> Container &c ) : 
+<a name="l00946"></a>00946             my_container(const_cast<Container*>(&c)), my_begin(c.begin()), my_end(c.end()) { }
+<a name="l00947"></a>00947 
+<a name="l00948"></a>00948         iterator begin() { <span class="keywordflow">return</span> iterator(*my_container) = my_begin; }
+<a name="l00949"></a>00949         iterator end() { <span class="keywordflow">return</span> iterator(*my_container) = my_end; }
+<a name="l00950"></a>00950         const_iterator begin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_begin; }
+<a name="l00951"></a>00951         const_iterator end()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(*my_container) = my_end; }
+<a name="l00952"></a>00952 
+<a name="l00953"></a>00953         size_type size()<span class="keyword"> const </span>{
+<a name="l00954"></a>00954             size_type tot_size = 0;
+<a name="l00955"></a>00955             <span class="keywordflow">for</span>(<span class="keyword">typename</span> Container::const_iterator i = my_begin; i != my_end; ++i) {
+<a name="l00956"></a>00956                 tot_size += i->size();
+<a name="l00957"></a>00957             }
+<a name="l00958"></a>00958             <span class="keywordflow">return</span> tot_size;
+<a name="l00959"></a>00959         }
+<a name="l00960"></a>00960 
+<a name="l00961"></a>00961     <span class="keyword">private</span>:
+<a name="l00962"></a>00962 
+<a name="l00963"></a>00963         Container *my_container;
+<a name="l00964"></a>00964         <span class="keyword">typename</span> Container::const_iterator my_begin;
+<a name="l00965"></a>00965         <span class="keyword">typename</span> Container::const_iterator my_end;
+<a name="l00966"></a>00966 
+<a name="l00967"></a>00967     };
+<a name="l00968"></a>00968 
+<a name="l00969"></a>00969     <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
+<a name="l00970"></a>00970     flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c, <span class="keyword">const</span> <span class="keyword">typename</span> Container::const_iterator b, <span class="keyword">const</span> <span class="keyword">typename</span> Container::const_iterator e) {
+<a name="l00971"></a>00971         <span class="keywordflow">return</span> flattened2d<Container>(c, b, e);
+<a name="l00972"></a>00972     }
+<a name="l00973"></a>00973 
+<a name="l00974"></a>00974     <span class="keyword">template</span> <<span class="keyword">typename</span> Container>
+<a name="l00975"></a>00975     flattened2d<Container> flatten2d(<span class="keyword">const</span> Container &c) {
+<a name="l00976"></a>00976         <span class="keywordflow">return</span> flattened2d<Container>(c);
+<a name="l00977"></a>00977     }
+<a name="l00978"></a>00978 
+<a name="l00979"></a>00979 } <span class="comment">// interface6</span>
+<a name="l00980"></a>00980 
+<a name="l00981"></a>00981 <span class="keyword">namespace </span>internal {
+<a name="l00982"></a>00982 <span class="keyword">using</span> interface6::internal::segmented_iterator;
+<a name="l00983"></a>00983 }
+<a name="l00984"></a>00984 
+<a name="l00985"></a>00985 <span class="keyword">using</span> interface6::enumerable_thread_specific;
+<a name="l00986"></a>00986 <span class="keyword">using</span> interface6::flattened2d;
+<a name="l00987"></a>00987 <span class="keyword">using</span> interface6::flatten2d;
+<a name="l00988"></a>00988 
+<a name="l00989"></a>00989 } <span class="comment">// namespace tbb</span>
+<a name="l00990"></a>00990 
+<a name="l00991"></a>00991 <span class="preprocessor">#endif</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00466.html b/doc/html/a00466.html
deleted file mode 100644
index 4cd8731..0000000
--- a/doc/html/a00466.html
+++ /dev/null
@@ -1,2522 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>graph.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>graph.h</h1><a href="a00326.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_graph_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_graph_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if !TBB_PREVIEW_GRAPH</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#error Set TBB_PREVIEW_GRAPH to include graph.h</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00030"></a>00030 <span class="preprocessor">#include "spin_mutex.h"</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include "null_mutex.h"</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include "null_rw_mutex.h"</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#include "task.h"</span>
-<a name="l00035"></a>00035 <span class="preprocessor">#include "concurrent_vector.h"</span>
-<a name="l00036"></a>00036 <span class="preprocessor">#include "_aggregator_internal.h"</span>
-<a name="l00037"></a>00037 
-<a name="l00038"></a>00038 <span class="comment">// use the VC10 or gcc version of tuple if it is available.</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#if TBB_IMPLEMENT_CPP0X && (!defined(_MSC_VER) || _MSC_VER < 1600)</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define TBB_PREVIEW_TUPLE 1</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#include "compat/tuple"</span>
-<a name="l00042"></a>00042 <span class="preprocessor">#else</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#include <tuple></span>
-<a name="l00044"></a>00044 <span class="preprocessor">#endif</span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span>
-<a name="l00046"></a>00046 <span class="preprocessor">#include<list></span>
-<a name="l00047"></a>00047 <span class="preprocessor">#include<queue></span>
-<a name="l00048"></a>00048 
-<a name="l00049"></a>00049 
-<a name="l00060"></a>00060 <span class="keyword">namespace </span>tbb {
-<a name="l00061"></a>00061 
-<a name="l00063"></a><a class="code" href="a00251.html">00063</a>     <span class="keyword">class </span><a class="code" href="a00251.html">graph_node</a> {
-<a name="l00064"></a>00064     <span class="keyword">public</span>:
-<a name="l00065"></a>00065         <span class="keyword">virtual</span> ~<a class="code" href="a00251.html">graph_node</a>() {} 
-<a name="l00066"></a>00066     }; 
-<a name="l00067"></a>00067 
-<a name="l00069"></a><a class="code" href="a00239.html">00069</a>     <span class="keyword">class </span><a class="code" href="a00239.html">continue_msg</a> {};
-<a name="l00070"></a>00070 
-<a name="l00071"></a>00071     <span class="keyword">template</span>< <span class="keyword">typename</span> T > <span class="keyword">class </span><a class="code" href="a00282.html">sender</a>;
-<a name="l00072"></a>00072     <span class="keyword">template</span>< <span class="keyword">typename</span> T > <span class="keyword">class </span><a class="code" href="a00277.html">receiver</a>;
-<a name="l00073"></a>00073     <span class="keyword">class </span><a class="code" href="a00241.html">continue_receiver</a>;
-<a name="l00074"></a>00074 
-<a name="l00076"></a>00076     <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l00077"></a><a class="code" href="a00282.html">00077</a>     <span class="keyword">class </span><a class="code" href="a00282.html">sender</a> {
-<a name="l00078"></a>00078     <span class="keyword">public</span>:
-<a name="l00080"></a><a class="code" href="a00282.html#d3aa21714dfc464e65a471816e38ea89">00080</a>         <span class="keyword">typedef</span> T <a class="code" href="a00282.html#d3aa21714dfc464e65a471816e38ea89">output_type</a>;
-<a name="l00081"></a>00081 
-<a name="l00083"></a><a class="code" href="a00282.html#c0746cda7dfd266f01acaf6cd5d4b77d">00083</a>         <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver<T></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l00084"></a>00084 
-<a name="l00085"></a>00085         <span class="keyword">virtual</span> ~<a class="code" href="a00282.html">sender</a>() {}
-<a name="l00086"></a>00086 
-<a name="l00088"></a>00088         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">register_successor</a>( <a class="code" href="a00282.html#c0746cda7dfd266f01acaf6cd5d4b77d">successor_type</a> &r ) = 0;
-<a name="l00089"></a>00089 
-<a name="l00091"></a>00091         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#3f345427e812e8741370308ff88f30bf">remove_successor</a>( <a class="code" href="a00282.html#c0746cda7dfd266f01acaf6cd5d4b77d">successor_type</a> &r ) = 0;
-<a name="l00092"></a>00092 
-<a name="l00094"></a><a class="code" href="a00282.html#bf8c9235810354f3353a899c982645de">00094</a>         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#bf8c9235810354f3353a899c982645de">try_get</a>( T & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00095"></a>00095 
-<a name="l00097"></a><a class="code" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">00097</a>         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">try_reserve</a>( T & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00098"></a>00098 
-<a name="l00100"></a><a class="code" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">00100</a>         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">try_release</a>( ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00101"></a>00101 
-<a name="l00103"></a><a class="code" href="a00282.html#add46946c4c7330422733432e4032fac">00103</a>         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#add46946c4c7330422733432e4032fac">try_consume</a>( ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00104"></a>00104 
-<a name="l00105"></a>00105     };
-<a name="l00106"></a>00106 
-<a name="l00107"></a>00107 
-<a name="l00109"></a>00109     <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l00110"></a><a class="code" href="a00277.html">00110</a>     <span class="keyword">class </span><a class="code" href="a00277.html">receiver</a> {
-<a name="l00111"></a>00111     <span class="keyword">public</span>:
-<a name="l00112"></a>00112 
-<a name="l00114"></a><a class="code" href="a00277.html#9cfd5ef0d67d5bbfb5f9a76d75e62765">00114</a>         <span class="keyword">typedef</span> T <a class="code" href="a00239.html">input_type</a>;
-<a name="l00115"></a>00115 
-<a name="l00117"></a><a class="code" href="a00277.html#c802c845b51c6d129153b684d33f7310">00117</a>         <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender<T></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l00118"></a>00118 
-<a name="l00120"></a><a class="code" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">00120</a>         <span class="keyword">virtual</span> <a class="code" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">~receiver</a>() {}
-<a name="l00121"></a>00121 
-<a name="l00123"></a>00123         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00277.html#6e5422b03b4570138f227b3d5d0073b8">try_put</a>( T t ) = 0;
-<a name="l00124"></a>00124 
-<a name="l00126"></a><a class="code" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">00126</a>         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">register_predecessor</a>( <a class="code" href="a00282.html">predecessor_type</a> & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00127"></a>00127 
-<a name="l00129"></a><a class="code" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">00129</a>         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>( <a class="code" href="a00282.html">predecessor_type</a> & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00130"></a>00130 
-<a name="l00131"></a>00131     };
-<a name="l00132"></a>00132 
-<a name="l00134"></a>00134 
-<a name="l00135"></a><a class="code" href="a00241.html">00135</a>     <span class="keyword">class </span><a class="code" href="a00241.html">continue_receiver</a> : <span class="keyword">public</span> <a class="code" href="a00277.html">receiver</a>< continue_msg > {
-<a name="l00136"></a>00136     <span class="keyword">public</span>:
-<a name="l00137"></a>00137 
-<a name="l00139"></a><a class="code" href="a00241.html#21acef0b97b53d92f637619012837b30">00139</a>         <span class="keyword">typedef</span> <a class="code" href="a00239.html">continue_msg</a> <a class="code" href="a00239.html">input_type</a>;
-<a name="l00140"></a>00140 
-<a name="l00142"></a><a class="code" href="a00241.html#52fa92968dd48560d59798ca7ba6a3a2">00142</a>         <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< continue_msg ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l00143"></a>00143 
-<a name="l00145"></a><a class="code" href="a00241.html#799d383813261426d881b10247caadba">00145</a>         <a class="code" href="a00241.html#799d383813261426d881b10247caadba">continue_receiver</a>( <span class="keywordtype">int</span> number_of_predecessors = 0 ) { 
-<a name="l00146"></a>00146             my_predecessor_count = number_of_predecessors;
-<a name="l00147"></a>00147             my_current_count = 0;
-<a name="l00148"></a>00148         }
-<a name="l00149"></a>00149 
-<a name="l00151"></a><a class="code" href="a00241.html#9a38edb7e1e3c9be4e3848145c51a617">00151</a>         <span class="keyword">virtual</span> <a class="code" href="a00241.html#9a38edb7e1e3c9be4e3848145c51a617">~continue_receiver</a>() { }
-<a name="l00152"></a>00152 
-<a name="l00154"></a><a class="code" href="a00241.html#b9fa9290cbb871f8780f9d69e1ec3b4e">00154</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00241.html#b9fa9290cbb871f8780f9d69e1ec3b4e">register_predecessor</a>( <a class="code" href="a00282.html">predecessor_type</a> & ) {
-<a name="l00155"></a>00155             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l00156"></a>00156             ++my_predecessor_count;
-<a name="l00157"></a>00157             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00158"></a>00158         }
-<a name="l00159"></a>00159 
-<a name="l00161"></a>00161 
-<a name="l00164"></a><a class="code" href="a00241.html#02411d8d13b380062548aff133752cc5">00164</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00241.html#02411d8d13b380062548aff133752cc5">remove_predecessor</a>( <a class="code" href="a00282.html">predecessor_type</a> & ) {
-<a name="l00165"></a>00165             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l00166"></a>00166             --my_predecessor_count;
-<a name="l00167"></a>00167             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00168"></a>00168         }
-<a name="l00169"></a>00169 
-<a name="l00171"></a>00171 
-<a name="l00173"></a><a class="code" href="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">00173</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">try_put</a>( <a class="code" href="a00239.html">input_type</a> ) {
-<a name="l00174"></a>00174             {
-<a name="l00175"></a>00175                 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l00176"></a>00176                 <span class="keywordflow">if</span> ( ++my_current_count < my_predecessor_count ) 
-<a name="l00177"></a>00177                     <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00178"></a>00178                 <span class="keywordflow">else</span>
-<a name="l00179"></a>00179                     my_current_count = 0;
-<a name="l00180"></a>00180             }
-<a name="l00181"></a>00181             <a class="code" href="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">execute</a>();
-<a name="l00182"></a>00182             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00183"></a>00183         }
-<a name="l00184"></a>00184 
-<a name="l00185"></a>00185     <span class="keyword">protected</span>:
-<a name="l00186"></a>00186 
-<a name="l00187"></a>00187         <a class="code" href="a00286.html">spin_mutex</a> my_mutex;
-<a name="l00188"></a>00188         <span class="keywordtype">int</span> my_predecessor_count;
-<a name="l00189"></a>00189         <span class="keywordtype">int</span> my_current_count;
-<a name="l00190"></a>00190 
-<a name="l00192"></a>00192 
-<a name="l00194"></a>00194         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">execute</a>() = 0;
-<a name="l00195"></a>00195 
-<a name="l00196"></a>00196     };
-<a name="l00197"></a>00197 
-<a name="l00199"></a>00199     <span class="keyword">namespace </span>internal {
-<a name="l00200"></a>00200 
-<a name="l00202"></a>00202         <span class="keyword">enum</span> node_state { node_state_idle=0, node_state_nonidle=1, node_state_inactive=2 };
-<a name="l00203"></a>00203 
-<a name="l00204"></a>00204 
-<a name="l00206"></a>00206         <span class="keyword">template</span>< <span class="keyword">typename</span> Output >
-<a name="l00207"></a>00207         <span class="keyword">class </span>source_body : no_assign   {
-<a name="l00208"></a>00208         <span class="keyword">public</span>:
-<a name="l00209"></a>00209             <span class="keyword">virtual</span> ~source_body() {}
-<a name="l00210"></a>00210             <span class="keyword">virtual</span> <span class="keywordtype">bool</span> operator()(Output &output) = 0;
-<a name="l00211"></a>00211         };
-<a name="l00212"></a>00212 
-<a name="l00214"></a>00214         <span class="keyword">template</span>< <span class="keyword">typename</span> Output, <span class="keyword">typename</span> Body>
-<a name="l00215"></a>00215         <span class="keyword">class </span>source_body_leaf : <span class="keyword">public</span> source_body<Output> {
-<a name="l00216"></a>00216         <span class="keyword">public</span>:
-<a name="l00217"></a>00217             source_body_leaf( Body _body ) : body(_body) { }
-<a name="l00218"></a>00218             <span class="comment">/*override */</span> <span class="keywordtype">bool</span> operator()(Output &output) { <span class="keywordflow">return</span> body( output ); }
-<a name="l00219"></a>00219         <span class="keyword">private</span>:
-<a name="l00220"></a>00220             Body body;
-<a name="l00221"></a>00221         };
-<a name="l00222"></a>00222 
-<a name="l00224"></a>00224         <span class="keyword">template</span>< <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output >
-<a name="l00225"></a>00225             <span class="keyword">class </span>function_body : no_assign {
-<a name="l00226"></a>00226         <span class="keyword">public</span>:
-<a name="l00227"></a>00227             <span class="keyword">virtual</span> ~function_body() {}
-<a name="l00228"></a>00228             <span class="keyword">virtual</span> Output operator()(Input input) = 0;
-<a name="l00229"></a>00229         };
-<a name="l00230"></a>00230 
-<a name="l00232"></a>00232         <span class="keyword">template</span> <<span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output, <span class="keyword">typename</span> B>
-<a name="l00233"></a>00233         <span class="keyword">class </span>function_body_leaf : <span class="keyword">public</span> function_body< Input, Output > {
-<a name="l00234"></a>00234         <span class="keyword">public</span>:
-<a name="l00235"></a>00235             function_body_leaf( B _body ) : body(_body) { }
-<a name="l00236"></a>00236             Output operator()(Input i) { <span class="keywordflow">return</span> body(i); }
-<a name="l00237"></a>00237 
-<a name="l00238"></a>00238         <span class="keyword">private</span>:
-<a name="l00239"></a>00239             B body;
-<a name="l00240"></a>00240         };
-<a name="l00241"></a>00241 
-<a name="l00243"></a>00243         <span class="keyword">template</span> <<span class="keyword">typename</span> B>
-<a name="l00244"></a>00244         <span class="keyword">class </span>function_body_leaf< continue_msg, continue_msg, B> : <span class="keyword">public</span> function_body< continue_msg, continue_msg > {
-<a name="l00245"></a>00245         <span class="keyword">public</span>:
-<a name="l00246"></a>00246             function_body_leaf( B _body ) : body(_body) { }
-<a name="l00247"></a>00247             continue_msg operator()( continue_msg i ) { 
-<a name="l00248"></a>00248                 body(i); 
-<a name="l00249"></a>00249                 <span class="keywordflow">return</span> i; 
-<a name="l00250"></a>00250             }
-<a name="l00251"></a>00251 
-<a name="l00252"></a>00252         <span class="keyword">private</span>:
-<a name="l00253"></a>00253             B body;
-<a name="l00254"></a>00254         };
-<a name="l00255"></a>00255 
-<a name="l00257"></a>00257         <span class="keyword">template</span> <<span class="keyword">typename</span> Input, <span class="keyword">typename</span> B>
-<a name="l00258"></a>00258         <span class="keyword">class </span>function_body_leaf< Input, continue_msg, B> : <span class="keyword">public</span> function_body< Input, continue_msg > {
-<a name="l00259"></a>00259         <span class="keyword">public</span>:
-<a name="l00260"></a>00260             function_body_leaf( B _body ) : body(_body) { }
-<a name="l00261"></a>00261             continue_msg operator()(Input i) { 
-<a name="l00262"></a>00262                 body(i); 
-<a name="l00263"></a>00263                 <span class="keywordflow">return</span> continue_msg();
-<a name="l00264"></a>00264             }
-<a name="l00265"></a>00265 
-<a name="l00266"></a>00266         <span class="keyword">private</span>:
-<a name="l00267"></a>00267             B body;
-<a name="l00268"></a>00268         };
-<a name="l00269"></a>00269 
-<a name="l00271"></a>00271         <span class="keyword">template</span> <<span class="keyword">typename</span> Output, <span class="keyword">typename</span> B>
-<a name="l00272"></a>00272         <span class="keyword">class </span>function_body_leaf< continue_msg, Output, B > : <span class="keyword">public</span> function_body< continue_msg, Output > {
-<a name="l00273"></a>00273         <span class="keyword">public</span>:
-<a name="l00274"></a>00274             function_body_leaf( B _body ) : body(_body) { }
-<a name="l00275"></a>00275             Output operator()(continue_msg i) { 
-<a name="l00276"></a>00276                 <span class="keywordflow">return</span> body(i); 
-<a name="l00277"></a>00277             }
-<a name="l00278"></a>00278 
-<a name="l00279"></a>00279         <span class="keyword">private</span>:
-<a name="l00280"></a>00280             B body;
-<a name="l00281"></a>00281         };
-<a name="l00282"></a>00282 
-<a name="l00284"></a>00284         <span class="keyword">template</span>< <span class="keyword">typename</span> NodeType >
-<a name="l00285"></a>00285         <span class="keyword">class </span>forward_task : <span class="keyword">public</span> task {
-<a name="l00286"></a>00286 
-<a name="l00287"></a>00287             NodeType &my_node;
-<a name="l00288"></a>00288 
-<a name="l00289"></a>00289         <span class="keyword">public</span>:
-<a name="l00290"></a>00290 
-<a name="l00291"></a>00291             forward_task( NodeType &n ) : my_node(n) {}
-<a name="l00292"></a>00292 
-<a name="l00293"></a>00293             task *execute() {
-<a name="l00294"></a>00294                 my_node.forward();
-<a name="l00295"></a>00295                 <span class="keywordflow">return</span> NULL;
-<a name="l00296"></a>00296             }
-<a name="l00297"></a>00297         };
-<a name="l00298"></a>00298 
-<a name="l00300"></a>00300         <span class="keyword">template</span>< <span class="keyword">typename</span> NodeType, <span class="keyword">typename</span> Input >
-<a name="l00301"></a>00301         <span class="keyword">class </span>apply_body_task : <span class="keyword">public</span> task {
-<a name="l00302"></a>00302 
-<a name="l00303"></a>00303             NodeType &my_node;
-<a name="l00304"></a>00304             Input my_input;
-<a name="l00305"></a>00305 
-<a name="l00306"></a>00306         <span class="keyword">public</span>:
-<a name="l00307"></a>00307 
-<a name="l00308"></a>00308             apply_body_task( NodeType &n, Input i ) : my_node(n), my_input(i) {}
-<a name="l00309"></a>00309 
-<a name="l00310"></a>00310             task *execute() {
-<a name="l00311"></a>00311                 my_node.apply_body( my_input );
-<a name="l00312"></a>00312                 <span class="keywordflow">return</span> NULL;
-<a name="l00313"></a>00313             }
-<a name="l00314"></a>00314         };
-<a name="l00315"></a>00315 
-<a name="l00317"></a>00317         <span class="keyword">template</span>< <span class="keyword">typename</span> NodeType >
-<a name="l00318"></a>00318         <span class="keyword">class </span>source_task : <span class="keyword">public</span> task {
-<a name="l00319"></a>00319 
-<a name="l00320"></a>00320             NodeType &my_node;
-<a name="l00321"></a>00321 
-<a name="l00322"></a>00322         <span class="keyword">public</span>:
-<a name="l00323"></a>00323 
-<a name="l00324"></a>00324             source_task( NodeType &n ) : my_node(n) {}
-<a name="l00325"></a>00325 
-<a name="l00326"></a>00326             task *execute() {
-<a name="l00327"></a>00327                 my_node.apply_body( );
-<a name="l00328"></a>00328                 <span class="keywordflow">return</span> NULL;
-<a name="l00329"></a>00329             }
-<a name="l00330"></a>00330         };
-<a name="l00331"></a>00331 
-<a name="l00333"></a>00333         <span class="keyword">template</span>< <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output >
-<a name="l00334"></a>00334         <span class="keyword">struct </span>empty_body {
-<a name="l00335"></a>00335            Output operator()( Input & )<span class="keyword"> const </span>{ <span class="keywordflow">return</span> Output(); } 
-<a name="l00336"></a>00336         };
-<a name="l00337"></a>00337 
-<a name="l00339"></a>00339         <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> M=spin_mutex >
-<a name="l00340"></a>00340         <span class="keyword">class </span>node_cache {
-<a name="l00341"></a>00341             <span class="keyword">public</span>:
-<a name="l00342"></a>00342 
-<a name="l00343"></a>00343             <span class="keyword">typedef</span> size_t size_type;
-<a name="l00344"></a>00344 
-<a name="l00345"></a>00345             <span class="keywordtype">bool</span> empty() {
-<a name="l00346"></a>00346                 <span class="keyword">typename</span> my_mutex_type::scoped_lock lock( my_mutex );
-<a name="l00347"></a>00347                 <span class="keywordflow">return</span> internal_empty();
-<a name="l00348"></a>00348             }
-<a name="l00349"></a>00349 
-<a name="l00350"></a>00350             <span class="keywordtype">void</span> add( T &n ) {
-<a name="l00351"></a>00351                 <span class="keyword">typename</span> my_mutex_type::scoped_lock lock( my_mutex );
-<a name="l00352"></a>00352                 internal_push(n);
-<a name="l00353"></a>00353             }
-<a name="l00354"></a>00354 
-<a name="l00355"></a>00355             <span class="keywordtype">void</span> remove( T &n ) {
-<a name="l00356"></a>00356                 <span class="keyword">typename</span> my_mutex_type::scoped_lock lock( my_mutex );
-<a name="l00357"></a>00357                 <span class="keywordflow">for</span> ( size_t i = internal_size(); i != 0; --i ) {
-<a name="l00358"></a>00358                     T &s = internal_pop();
-<a name="l00359"></a>00359                     <span class="keywordflow">if</span> ( &s != &n ) {
-<a name="l00360"></a>00360                         internal_push(s);
-<a name="l00361"></a>00361                     }
-<a name="l00362"></a>00362                 }
-<a name="l00363"></a>00363             }
-<a name="l00364"></a>00364 
-<a name="l00365"></a>00365         <span class="keyword">protected</span>:
-<a name="l00366"></a>00366 
-<a name="l00367"></a>00367             <span class="keyword">typedef</span> M my_mutex_type;
-<a name="l00368"></a>00368             my_mutex_type my_mutex;
-<a name="l00369"></a>00369             std::queue< T * > my_q;
-<a name="l00370"></a>00370 
-<a name="l00371"></a>00371             <span class="comment">// Assumes lock is held</span>
-<a name="l00372"></a>00372             <span class="keyword">inline</span> <span class="keywordtype">bool</span> internal_empty( )  {
-<a name="l00373"></a>00373                 <span class="keywordflow">return</span> my_q.empty();
-<a name="l00374"></a>00374             }
-<a name="l00375"></a>00375 
-<a name="l00376"></a>00376             <span class="comment">// Assumes lock is held</span>
-<a name="l00377"></a>00377             <span class="keyword">inline</span> size_type internal_size( )  {
-<a name="l00378"></a>00378                 <span class="keywordflow">return</span> my_q.size(); 
-<a name="l00379"></a>00379             }
-<a name="l00380"></a>00380 
-<a name="l00381"></a>00381             <span class="comment">// Assumes lock is held</span>
-<a name="l00382"></a>00382             <span class="keyword">inline</span> <span class="keywordtype">void</span> internal_push( T &n )  {
-<a name="l00383"></a>00383                 my_q.push(&n);
-<a name="l00384"></a>00384             }
-<a name="l00385"></a>00385 
-<a name="l00386"></a>00386             <span class="comment">// Assumes lock is held</span>
-<a name="l00387"></a>00387             <span class="keyword">inline</span> T &internal_pop() {
-<a name="l00388"></a>00388                 T *v = my_q.front();
-<a name="l00389"></a>00389                 my_q.pop();
-<a name="l00390"></a>00390                 <span class="keywordflow">return</span> *v;
-<a name="l00391"></a>00391             }
-<a name="l00392"></a>00392 
-<a name="l00393"></a>00393         };
-<a name="l00394"></a>00394 
-<a name="l00396"></a>00396         <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> M=spin_mutex >
-<a name="l00397"></a>00397         <span class="keyword">class </span>predecessor_cache : <span class="keyword">public</span> node_cache< sender<T>, M > {
-<a name="l00398"></a>00398             <span class="keyword">public</span>:
-<a name="l00399"></a>00399             <span class="keyword">typedef</span> M my_mutex_type;
-<a name="l00400"></a>00400             <span class="keyword">typedef</span> T output_type; 
-<a name="l00401"></a>00401             <span class="keyword">typedef</span> sender<output_type> predecessor_type;
-<a name="l00402"></a>00402             <span class="keyword">typedef</span> receiver<output_type> successor_type;
-<a name="l00403"></a>00403 
-<a name="l00404"></a>00404             predecessor_cache( ) : my_owner( NULL ) { }
-<a name="l00405"></a>00405 
-<a name="l00406"></a>00406             <span class="keywordtype">void</span> set_owner( successor_type *owner ) { my_owner = owner; }
-<a name="l00407"></a>00407 
-<a name="l00408"></a>00408             <span class="keywordtype">bool</span> get_item( output_type &v ) {
-<a name="l00409"></a>00409 
-<a name="l00410"></a>00410                 <span class="keywordtype">bool</span> msg = <span class="keyword">false</span>;
-<a name="l00411"></a>00411 
-<a name="l00412"></a>00412                 <span class="keywordflow">do</span> {
-<a name="l00413"></a>00413                     predecessor_type *src;
-<a name="l00414"></a>00414                     {
-<a name="l00415"></a>00415                         <span class="keyword">typename</span> my_mutex_type::scoped_lock lock(this->my_mutex);
-<a name="l00416"></a>00416                         <span class="keywordflow">if</span> ( this->internal_empty() ) {
-<a name="l00417"></a>00417                             <span class="keywordflow">break</span>;
-<a name="l00418"></a>00418                         }
-<a name="l00419"></a>00419                         src = &this->internal_pop();
-<a name="l00420"></a>00420                     }
-<a name="l00421"></a>00421 
-<a name="l00422"></a>00422                     <span class="comment">// Try to get from this sender</span>
-<a name="l00423"></a>00423                     msg = src->try_get( v );
-<a name="l00424"></a>00424 
-<a name="l00425"></a>00425                     <span class="keywordflow">if</span> (msg == <span class="keyword">false</span>) {
-<a name="l00426"></a>00426                         <span class="comment">// Relinquish ownership of the edge</span>
-<a name="l00427"></a>00427                         <span class="keywordflow">if</span> ( my_owner) 
-<a name="l00428"></a>00428                             src->register_successor( *my_owner );
-<a name="l00429"></a>00429                     } <span class="keywordflow">else</span> {
-<a name="l00430"></a>00430                         <span class="comment">// Retain ownership of the edge</span>
-<a name="l00431"></a>00431                         this->add(*src);
-<a name="l00432"></a>00432                     }
-<a name="l00433"></a>00433                 } <span class="keywordflow">while</span> ( msg == <span class="keyword">false</span> );
-<a name="l00434"></a>00434                 <span class="keywordflow">return</span> msg;
-<a name="l00435"></a>00435             }
-<a name="l00436"></a>00436 
-<a name="l00437"></a>00437         <span class="keyword">protected</span>:
-<a name="l00438"></a>00438             successor_type *my_owner;
-<a name="l00439"></a>00439         };
-<a name="l00440"></a>00440 
-<a name="l00442"></a>00442         <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> M=spin_mutex >
-<a name="l00443"></a>00443         <span class="keyword">class </span>reservable_predecessor_cache : <span class="keyword">public</span> predecessor_cache< T, M > {
-<a name="l00444"></a>00444         <span class="keyword">public</span>:
-<a name="l00445"></a>00445             <span class="keyword">typedef</span> M my_mutex_type;
-<a name="l00446"></a>00446             <span class="keyword">typedef</span> T output_type; 
-<a name="l00447"></a>00447             <span class="keyword">typedef</span> sender<T> predecessor_type;
-<a name="l00448"></a>00448             <span class="keyword">typedef</span> receiver<T> successor_type;
-<a name="l00449"></a>00449 
-<a name="l00450"></a>00450             reservable_predecessor_cache( ) : reserved_src(NULL) { }
-<a name="l00451"></a>00451 
-<a name="l00452"></a>00452             <span class="keywordtype">bool</span> 
-<a name="l00453"></a>00453             try_reserve( output_type &v ) {
-<a name="l00454"></a>00454                 <span class="keywordtype">bool</span> msg = <span class="keyword">false</span>;
-<a name="l00455"></a>00455 
-<a name="l00456"></a>00456                 <span class="keywordflow">do</span> {
-<a name="l00457"></a>00457                     {
-<a name="l00458"></a>00458                         <span class="keyword">typename</span> my_mutex_type::scoped_lock lock(this->my_mutex);
-<a name="l00459"></a>00459                         <span class="keywordflow">if</span> ( reserved_src || this->internal_empty() ) 
-<a name="l00460"></a>00460                             <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00461"></a>00461 
-<a name="l00462"></a>00462                         reserved_src = &this->internal_pop();
-<a name="l00463"></a>00463                     }
-<a name="l00464"></a>00464 
-<a name="l00465"></a>00465                     <span class="comment">// Try to get from this sender</span>
-<a name="l00466"></a>00466                     msg = reserved_src->try_reserve( v );
-<a name="l00467"></a>00467 
-<a name="l00468"></a>00468                     <span class="keywordflow">if</span> (msg == <span class="keyword">false</span>) {
-<a name="l00469"></a>00469                         <span class="keyword">typename</span> my_mutex_type::scoped_lock lock(this->my_mutex);
-<a name="l00470"></a>00470                         <span class="comment">// Relinquish ownership of the edge</span>
-<a name="l00471"></a>00471                         reserved_src->register_successor( *this->my_owner );
-<a name="l00472"></a>00472                         reserved_src = NULL;
-<a name="l00473"></a>00473                     } <span class="keywordflow">else</span> {
-<a name="l00474"></a>00474                         <span class="comment">// Retain ownership of the edge</span>
-<a name="l00475"></a>00475                         this->add( *reserved_src );
-<a name="l00476"></a>00476                     }
-<a name="l00477"></a>00477                 } <span class="keywordflow">while</span> ( msg == <span class="keyword">false</span> );
-<a name="l00478"></a>00478 
-<a name="l00479"></a>00479                 <span class="keywordflow">return</span> msg;
-<a name="l00480"></a>00480             }
-<a name="l00481"></a>00481 
-<a name="l00482"></a>00482             <span class="keywordtype">bool</span> 
-<a name="l00483"></a>00483             try_release( ) {
-<a name="l00484"></a>00484                 reserved_src->try_release( );
-<a name="l00485"></a>00485                 reserved_src = NULL;
-<a name="l00486"></a>00486                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00487"></a>00487             }
-<a name="l00488"></a>00488 
-<a name="l00489"></a>00489             <span class="keywordtype">bool</span> 
-<a name="l00490"></a>00490             try_consume( ) {
-<a name="l00491"></a>00491                 reserved_src->try_consume( );
-<a name="l00492"></a>00492                 reserved_src = NULL;
-<a name="l00493"></a>00493                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00494"></a>00494             }
-<a name="l00495"></a>00495 
-<a name="l00496"></a>00496         <span class="keyword">private</span>:
-<a name="l00497"></a>00497             predecessor_type *reserved_src;
-<a name="l00498"></a>00498         };
-<a name="l00499"></a>00499 
-<a name="l00500"></a>00500 
-<a name="l00502"></a>00502         <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> M=spin_rw_mutex >
-<a name="l00503"></a>00503         <span class="keyword">class </span>successor_cache : no_copy {
-<a name="l00504"></a>00504         <span class="keyword">protected</span>:
-<a name="l00505"></a>00505 
-<a name="l00506"></a>00506             <span class="keyword">typedef</span> M my_mutex_type;
-<a name="l00507"></a>00507             my_mutex_type my_mutex;
-<a name="l00508"></a>00508 
-<a name="l00509"></a>00509             <span class="keyword">typedef</span> std::list< receiver<T> * > my_successors_type;
-<a name="l00510"></a>00510             my_successors_type my_successors;
-<a name="l00511"></a>00511 
-<a name="l00512"></a>00512             sender<T> *my_owner;
-<a name="l00513"></a>00513 
-<a name="l00514"></a>00514         <span class="keyword">public</span>:
-<a name="l00515"></a>00515 
-<a name="l00516"></a>00516             successor_cache( ) : my_owner(NULL) {}
-<a name="l00517"></a>00517 
-<a name="l00518"></a>00518             <span class="keywordtype">void</span> set_owner( sender<T> *owner ) { my_owner = owner; }
-<a name="l00519"></a>00519 
-<a name="l00520"></a>00520             <span class="keyword">virtual</span> ~successor_cache() {}
-<a name="l00521"></a>00521 
-<a name="l00522"></a>00522             <span class="keywordtype">void</span> register_successor( receiver<T> &r ) {
-<a name="l00523"></a>00523                 <span class="keyword">typename</span> my_mutex_type::scoped_lock l(my_mutex, <span class="keyword">true</span>);
-<a name="l00524"></a>00524                 my_successors.push_back( &r ); 
-<a name="l00525"></a>00525             }
-<a name="l00526"></a>00526 
-<a name="l00527"></a>00527             <span class="keywordtype">void</span> remove_successor( receiver<T> &r ) {
-<a name="l00528"></a>00528                 <span class="keyword">typename</span> my_mutex_type::scoped_lock l(my_mutex, <span class="keyword">true</span>);
-<a name="l00529"></a>00529                 <span class="keywordflow">for</span> ( <span class="keyword">typename</span> my_successors_type::iterator i = my_successors.begin();
-<a name="l00530"></a>00530                       i != my_successors.end(); ++i ) { 
-<a name="l00531"></a>00531                     <span class="keywordflow">if</span> ( *i == & r ) { 
-<a name="l00532"></a>00532                         my_successors.erase(i);
-<a name="l00533"></a>00533                         <span class="keywordflow">break</span>;
-<a name="l00534"></a>00534                     }
-<a name="l00535"></a>00535                 }
-<a name="l00536"></a>00536             }
-<a name="l00537"></a>00537 
-<a name="l00538"></a>00538             <span class="keywordtype">bool</span> empty() { 
-<a name="l00539"></a>00539                 <span class="keyword">typename</span> my_mutex_type::scoped_lock l(my_mutex, <span class="keyword">false</span>);
-<a name="l00540"></a>00540                 <span class="keywordflow">return</span> my_successors.empty(); 
-<a name="l00541"></a>00541             }
-<a name="l00542"></a>00542 
-<a name="l00543"></a>00543             <span class="keyword">virtual</span> <span class="keywordtype">bool</span> try_put( T t ) = 0; 
-<a name="l00544"></a>00544          };
-<a name="l00545"></a>00545 
-<a name="l00547"></a>00547         <span class="keyword">template</span><>
-<a name="l00548"></a>00548         <span class="keyword">class </span>successor_cache< continue_msg > : no_copy {
-<a name="l00549"></a>00549         <span class="keyword">protected</span>:
-<a name="l00550"></a>00550 
-<a name="l00551"></a>00551             <span class="keyword">typedef</span> spin_rw_mutex my_mutex_type;
-<a name="l00552"></a>00552             my_mutex_type my_mutex;
-<a name="l00553"></a>00553 
-<a name="l00554"></a>00554             <span class="keyword">typedef</span> std::list< receiver<continue_msg> * > my_successors_type;
-<a name="l00555"></a>00555             my_successors_type my_successors;
-<a name="l00556"></a>00556 
-<a name="l00557"></a>00557             sender<continue_msg> *my_owner;
-<a name="l00558"></a>00558 
-<a name="l00559"></a>00559         <span class="keyword">public</span>:
-<a name="l00560"></a>00560 
-<a name="l00561"></a>00561             successor_cache( ) : my_owner(NULL) {}
-<a name="l00562"></a>00562 
-<a name="l00563"></a>00563             <span class="keywordtype">void</span> set_owner( sender<continue_msg> *owner ) { my_owner = owner; }
-<a name="l00564"></a>00564 
-<a name="l00565"></a>00565             <span class="keyword">virtual</span> ~successor_cache() {}
-<a name="l00566"></a>00566 
-<a name="l00567"></a>00567             <span class="keywordtype">void</span> register_successor( receiver<continue_msg> &r ) {
-<a name="l00568"></a>00568                 my_mutex_type::scoped_lock l(my_mutex, <span class="keyword">true</span>);
-<a name="l00569"></a>00569                 my_successors.push_back( &r ); 
-<a name="l00570"></a>00570                 <span class="keywordflow">if</span> ( my_owner )
-<a name="l00571"></a>00571                     r.register_predecessor( *my_owner );
-<a name="l00572"></a>00572             }
-<a name="l00573"></a>00573 
-<a name="l00574"></a>00574             <span class="keywordtype">void</span> remove_successor( receiver<continue_msg> &r ) {
-<a name="l00575"></a>00575                 my_mutex_type::scoped_lock l(my_mutex, <span class="keyword">true</span>);
-<a name="l00576"></a>00576                 <span class="keywordflow">for</span> ( my_successors_type::iterator i = my_successors.begin();
-<a name="l00577"></a>00577                       i != my_successors.end(); ++i ) { 
-<a name="l00578"></a>00578                     <span class="keywordflow">if</span> ( *i == & r ) { 
-<a name="l00579"></a>00579                         <span class="keywordflow">if</span> ( my_owner )
-<a name="l00580"></a>00580                             r.remove_predecessor( *my_owner );
-<a name="l00581"></a>00581                         my_successors.erase(i);
-<a name="l00582"></a>00582                         <span class="keywordflow">break</span>;
-<a name="l00583"></a>00583                     }
-<a name="l00584"></a>00584                 }
-<a name="l00585"></a>00585             }
-<a name="l00586"></a>00586 
-<a name="l00587"></a>00587             <span class="keywordtype">bool</span> empty() { 
-<a name="l00588"></a>00588                 my_mutex_type::scoped_lock l(my_mutex, <span class="keyword">false</span>);
-<a name="l00589"></a>00589                 <span class="keywordflow">return</span> my_successors.empty(); 
-<a name="l00590"></a>00590             }
-<a name="l00591"></a>00591 
-<a name="l00592"></a>00592             <span class="keyword">virtual</span> <span class="keywordtype">bool</span> try_put( continue_msg t ) = 0; 
-<a name="l00593"></a>00593 
-<a name="l00594"></a>00594          };
-<a name="l00595"></a>00595 
-<a name="l00597"></a>00597         <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> M=spin_rw_mutex>
-<a name="l00598"></a>00598         <span class="keyword">class </span>broadcast_cache : <span class="keyword">public</span> successor_cache<T, M> {
-<a name="l00599"></a>00599             <span class="keyword">typedef</span> M my_mutex_type;
-<a name="l00600"></a>00600             <span class="keyword">typedef</span> std::list< receiver<T> * > my_successors_type;
-<a name="l00601"></a>00601 
-<a name="l00602"></a>00602         <span class="keyword">public</span>:
-<a name="l00603"></a>00603 
-<a name="l00604"></a>00604             broadcast_cache( ) {}
-<a name="l00605"></a>00605 
-<a name="l00606"></a>00606             <span class="keywordtype">bool</span> try_put( T t ) {
-<a name="l00607"></a>00607                 <span class="keywordtype">bool</span> msg = <span class="keyword">false</span>;
-<a name="l00608"></a>00608                 <span class="keywordtype">bool</span> upgraded = <span class="keyword">false</span>;
-<a name="l00609"></a>00609                 <span class="keyword">typename</span> my_mutex_type::scoped_lock l(this->my_mutex, <span class="keyword">false</span>);
-<a name="l00610"></a>00610                 <span class="keyword">typename</span> my_successors_type::iterator i = this->my_successors.begin();
-<a name="l00611"></a>00611                 <span class="keywordflow">while</span> ( i != this->my_successors.end() ) {
-<a name="l00612"></a>00612                    <span class="keywordflow">if</span> ( (*i)->try_put( t ) == true ) {
-<a name="l00613"></a>00613                        ++i;
-<a name="l00614"></a>00614                        msg = <span class="keyword">true</span>;
-<a name="l00615"></a>00615                    } <span class="keywordflow">else</span> {
-<a name="l00616"></a>00616                       <span class="keywordflow">if</span> ( (*i)->register_predecessor(*this->my_owner) ) {
-<a name="l00617"></a>00617                           <span class="keywordflow">if</span> (!upgraded) {
-<a name="l00618"></a>00618                               l.upgrade_to_writer();
-<a name="l00619"></a>00619                               upgraded = <span class="keyword">true</span>;
-<a name="l00620"></a>00620                           }
-<a name="l00621"></a>00621                           i = this->my_successors.erase(i);
-<a name="l00622"></a>00622                       }
-<a name="l00623"></a>00623                       <span class="keywordflow">else</span> {
-<a name="l00624"></a>00624                           ++i;
-<a name="l00625"></a>00625                       }
-<a name="l00626"></a>00626                    }
-<a name="l00627"></a>00627                 }
-<a name="l00628"></a>00628                 <span class="keywordflow">return</span> msg;
-<a name="l00629"></a>00629             }
-<a name="l00630"></a>00630         };
-<a name="l00631"></a>00631 
-<a name="l00633"></a>00633         <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> M=spin_rw_mutex >
-<a name="l00634"></a>00634         <span class="keyword">class </span>round_robin_cache : <span class="keyword">public</span> successor_cache<T, M> {
-<a name="l00635"></a>00635             <span class="keyword">typedef</span> size_t size_type;
-<a name="l00636"></a>00636             <span class="keyword">typedef</span> M my_mutex_type;
-<a name="l00637"></a>00637             <span class="keyword">typedef</span> std::list< receiver<T> * > my_successors_type;
-<a name="l00638"></a>00638 
-<a name="l00639"></a>00639         <span class="keyword">public</span>:
-<a name="l00640"></a>00640 
-<a name="l00641"></a>00641             round_robin_cache( ) {}
-<a name="l00642"></a>00642 
-<a name="l00643"></a>00643             size_type size() {
-<a name="l00644"></a>00644                 <span class="keyword">typename</span> my_mutex_type::scoped_lock l(this->my_mutex, <span class="keyword">false</span>);
-<a name="l00645"></a>00645                 <span class="keywordflow">return</span> this->my_successors.size();
-<a name="l00646"></a>00646             }
-<a name="l00647"></a>00647 
-<a name="l00648"></a>00648             <span class="keywordtype">bool</span> try_put( T t ) {
-<a name="l00649"></a>00649                 <span class="keywordtype">bool</span> upgraded = <span class="keyword">false</span>;
-<a name="l00650"></a>00650                 <span class="keyword">typename</span> my_mutex_type::scoped_lock l(this->my_mutex, <span class="keyword">false</span>);
-<a name="l00651"></a>00651                 <span class="keyword">typename</span> my_successors_type::iterator i = this->my_successors.begin();
-<a name="l00652"></a>00652                 <span class="keywordflow">while</span> ( i != this->my_successors.end() ) {
-<a name="l00653"></a>00653                    <span class="keywordflow">if</span> ( (*i)->try_put( t ) ) {
-<a name="l00654"></a>00654                        <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00655"></a>00655                    } <span class="keywordflow">else</span> {
-<a name="l00656"></a>00656                       <span class="keywordflow">if</span> ( (*i)->register_predecessor(*this->my_owner) ) {
-<a name="l00657"></a>00657                           <span class="keywordflow">if</span> (!upgraded) {
-<a name="l00658"></a>00658                               l.upgrade_to_writer();
-<a name="l00659"></a>00659                               upgraded = <span class="keyword">true</span>;
-<a name="l00660"></a>00660                           }
-<a name="l00661"></a>00661                           i = this->my_successors.erase(i);
-<a name="l00662"></a>00662                       }
-<a name="l00663"></a>00663                       <span class="keywordflow">else</span> {
-<a name="l00664"></a>00664                           ++i;
-<a name="l00665"></a>00665                       }
-<a name="l00666"></a>00666                    }
-<a name="l00667"></a>00667                 }
-<a name="l00668"></a>00668                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00669"></a>00669             }
-<a name="l00670"></a>00670         };
-<a name="l00671"></a>00671 
-<a name="l00672"></a>00672         <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00673"></a>00673         <span class="keyword">class </span>decrementer : <span class="keyword">public</span> continue_receiver, internal::no_copy {
-<a name="l00674"></a>00674 
-<a name="l00675"></a>00675             T *my_node;
-<a name="l00676"></a>00676 
-<a name="l00677"></a>00677             <span class="keywordtype">void</span> execute() {
-<a name="l00678"></a>00678                 my_node->decrement_counter();
-<a name="l00679"></a>00679             }
-<a name="l00680"></a>00680 
-<a name="l00681"></a>00681         <span class="keyword">public</span>:
-<a name="l00682"></a>00682            
-<a name="l00683"></a>00683             <span class="keyword">typedef</span> continue_msg input_type;
-<a name="l00684"></a>00684             <span class="keyword">typedef</span> continue_msg output_type;
-<a name="l00685"></a>00685             decrementer( <span class="keywordtype">int</span> number_of_predecessors = 0 ) : continue_receiver( number_of_predecessors ) { }
-<a name="l00686"></a>00686             <span class="keywordtype">void</span> set_owner( T *node ) { my_node = node; }
-<a name="l00687"></a>00687         };
-<a name="l00688"></a>00688 
-<a name="l00689"></a>00689     }
-<a name="l00691"></a>00691 
-<a name="l00692"></a>00692 
-<a name="l00694"></a>00694 
-<a name="l00695"></a><a class="code" href="a00250.html">00695</a>     <span class="keyword">class </span><a class="code" href="a00250.html">graph</a> : internal::no_copy {
-<a name="l00696"></a>00696 
-<a name="l00697"></a>00697         <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l00698"></a>00698         <span class="keyword">class </span>run_task : <span class="keyword">public</span> <a class="code" href="a00291.html">task</a> {
-<a name="l00699"></a>00699         <span class="keyword">public</span>: 
-<a name="l00700"></a>00700             run_task( Body& body ) : my_body(body) {}
-<a name="l00701"></a>00701             <a class="code" href="a00291.html">task</a> *execute() {
-<a name="l00702"></a>00702                 my_body();
-<a name="l00703"></a>00703                 <span class="keywordflow">return</span> NULL;
-<a name="l00704"></a>00704             }
-<a name="l00705"></a>00705         <span class="keyword">private</span>:
-<a name="l00706"></a>00706             Body my_body;
-<a name="l00707"></a>00707         };
-<a name="l00708"></a>00708 
-<a name="l00709"></a>00709         <span class="keyword">template</span>< <span class="keyword">typename</span> Receiver, <span class="keyword">typename</span> Body >
-<a name="l00710"></a>00710         <span class="keyword">class </span>run_and_put_task : <span class="keyword">public</span> <a class="code" href="a00291.html">task</a> {
-<a name="l00711"></a>00711         <span class="keyword">public</span>: 
-<a name="l00712"></a>00712             run_and_put_task( Receiver &r, Body& body ) : my_receiver(r), my_body(body) {}
-<a name="l00713"></a>00713             <a class="code" href="a00291.html">task</a> *execute() {
-<a name="l00714"></a>00714                 my_receiver.try_put( my_body() );
-<a name="l00715"></a>00715                 <span class="keywordflow">return</span> NULL;
-<a name="l00716"></a>00716             }
-<a name="l00717"></a>00717         <span class="keyword">private</span>:
-<a name="l00718"></a>00718             Receiver &my_receiver;
-<a name="l00719"></a>00719             Body my_body;
-<a name="l00720"></a>00720         };
-<a name="l00721"></a>00721 
-<a name="l00722"></a>00722     <span class="keyword">public</span>:
-<a name="l00723"></a>00723 
-<a name="l00725"></a><a class="code" href="a00250.html#633b9b55e3248b785efd13264261f0e5">00725</a>         <span class="keyword">enum</span> <a class="code" href="a00250.html#633b9b55e3248b785efd13264261f0e5">concurrency</a> { unlimited = 0, serial = 1 };
-<a name="l00726"></a>00726 
-<a name="l00728"></a><a class="code" href="a00250.html#1ba8311506558a2419101722f5d49ba9">00728</a>         <a class="code" href="a00250.html#1ba8311506558a2419101722f5d49ba9">graph</a>() : my_root_task( new ( <a class="code" href="a00291.html">task</a>::allocate_root( ) ) <a class="code" href="a00242.html">empty_task</a> ) {
-<a name="l00729"></a>00729             my_root_task-><a class="code" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
-<a name="l00730"></a>00730         }
-<a name="l00731"></a>00731 
-<a name="l00733"></a>00733 
-<a name="l00735"></a><a class="code" href="a00250.html#55332084e7884a26ff288b8fe960030d">00735</a>         <a class="code" href="a00250.html#55332084e7884a26ff288b8fe960030d">~graph</a>() {
-<a name="l00736"></a>00736             <a class="code" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">wait_for_all</a>();
-<a name="l00737"></a>00737             my_root_task-><a class="code" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(0);
-<a name="l00738"></a>00738             <a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>( *my_root_task );
-<a name="l00739"></a>00739         }
-<a name="l00740"></a>00740 
-<a name="l00741"></a>00741 
-<a name="l00743"></a>00743 
-<a name="l00745"></a><a class="code" href="a00250.html#1e5c5ae6538ec714cee107d1004705b9">00745</a>         <span class="keywordtype">void</span> <a class="code" href="a00250.html#1e5c5ae6538ec714cee107d1004705b9">increment_wait_count</a>() { 
-<a name="l00746"></a>00746             <span class="keywordflow">if</span> (my_root_task)
-<a name="l00747"></a>00747                 my_root_task-><a class="code" href="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>();
-<a name="l00748"></a>00748         }
-<a name="l00749"></a>00749 
-<a name="l00751"></a>00751 
-<a name="l00753"></a><a class="code" href="a00250.html#ff3b6a3ef2ae1e661dcdb398c227b43c">00753</a>         <span class="keywordtype">void</span> <a class="code" href="a00250.html#ff3b6a3ef2ae1e661dcdb398c227b43c">decrement_wait_count</a>() { 
-<a name="l00754"></a>00754             <span class="keywordflow">if</span> (my_root_task)
-<a name="l00755"></a>00755                 my_root_task-><a class="code" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>(); 
-<a name="l00756"></a>00756         }
-<a name="l00757"></a>00757 
-<a name="l00759"></a>00759 
-<a name="l00761"></a>00761         <span class="keyword">template</span>< <span class="keyword">typename</span> Receiver, <span class="keyword">typename</span> Body >
-<a name="l00762"></a><a class="code" href="a00250.html#4c5e8dc5a45e641d534d6206838cfa7f">00762</a>             <span class="keywordtype">void</span> <a class="code" href="a00250.html#4c5e8dc5a45e641d534d6206838cfa7f">run</a>( Receiver &r, Body body ) {
-<a name="l00763"></a>00763            <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) ) 
-<a name="l00764"></a>00764                run_and_put_task< Receiver, Body >( r, body ) );
-<a name="l00765"></a>00765         }
-<a name="l00766"></a>00766 
-<a name="l00768"></a>00768 
-<a name="l00770"></a>00770         <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l00771"></a><a class="code" href="a00250.html#71213dd18099298dc74731e293c8286a">00771</a>         <span class="keywordtype">void</span> <a class="code" href="a00250.html#4c5e8dc5a45e641d534d6206838cfa7f">run</a>( Body body ) {
-<a name="l00772"></a>00772            <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) ) 
-<a name="l00773"></a>00773                run_task< Body >( body ) );
-<a name="l00774"></a>00774         }
-<a name="l00775"></a>00775 
-<a name="l00777"></a>00777 
-<a name="l00778"></a><a class="code" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">00778</a>         <span class="keywordtype">void</span> <a class="code" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">wait_for_all</a>() {
-<a name="l00779"></a>00779             <span class="keywordflow">if</span> (my_root_task)
-<a name="l00780"></a>00780                 my_root_task-><a class="code" href="a00291.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>();
-<a name="l00781"></a>00781             my_root_task-><a class="code" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
-<a name="l00782"></a>00782         }
-<a name="l00783"></a>00783 
-<a name="l00785"></a><a class="code" href="a00250.html#34d61d8b6560e5b2eb42e0112701db0f">00785</a>         <a class="code" href="a00291.html">task</a> * <a class="code" href="a00250.html#34d61d8b6560e5b2eb42e0112701db0f">root_task</a>() {
-<a name="l00786"></a>00786             <span class="keywordflow">return</span> my_root_task;
-<a name="l00787"></a>00787         }
-<a name="l00788"></a>00788 
-<a name="l00789"></a>00789     <span class="keyword">private</span>:
-<a name="l00790"></a>00790 
-<a name="l00791"></a>00791         <a class="code" href="a00291.html">task</a> *my_root_task;
-<a name="l00792"></a>00792 
-<a name="l00793"></a>00793     };
-<a name="l00794"></a>00794 
-<a name="l00795"></a>00795 
-<a name="l00797"></a>00797     <span class="keyword">namespace </span>internal {
-<a name="l00798"></a>00798 
-<a name="l00800"></a>00800         <span class="keyword">template</span>< <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output >
-<a name="l00801"></a>00801         <span class="keyword">class </span>function_input : <span class="keyword">public</span> receiver<Input>, no_assign {
-<a name="l00802"></a>00802             <span class="keyword">typedef</span> sender<Input> predecessor_type;
-<a name="l00803"></a>00803             <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l00804"></a>00804             <span class="keyword">enum</span> op_type {reg_pred, rem_pred, app_body, tryput, try_fwd};
-<a name="l00805"></a>00805 
-<a name="l00806"></a>00806         <span class="keyword">public</span>:
-<a name="l00808"></a>00808             <span class="keyword">typedef</span> Input input_type;
-<a name="l00810"></a>00810             <span class="keyword">typedef</span> Output output_type;
-<a name="l00811"></a>00811 
-<a name="l00813"></a>00813             <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l00814"></a>00814             function_input( graph &g, size_t max_concurrency, Body& body )
-<a name="l00815"></a>00815                 : my_root_task(g.root_task()), my_max_concurrency(max_concurrency), my_concurrency(internal::node_state_idle),
-<a name="l00816"></a>00816                   my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ),
-<a name="l00817"></a>00817                 forwarder_busy(false) {
-<a name="l00818"></a>00818                 my_predecessors.set_owner(<span class="keyword">this</span>);
-<a name="l00819"></a>00819                 my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l00820"></a>00820             }
-<a name="l00821"></a>00821 
-<a name="l00823"></a>00823             <span class="keyword">virtual</span> ~function_input() { <span class="keyword">delete</span> my_body; }
-<a name="l00824"></a>00824 
-<a name="l00826"></a>00826             <span class="keyword">virtual</span> <span class="keywordtype">bool</span> try_put( input_type t ) {
-<a name="l00827"></a>00827                <span class="keywordflow">if</span> ( my_max_concurrency == 0 ) {
-<a name="l00828"></a>00828                    spawn_body_task( t );
-<a name="l00829"></a>00829                    <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00830"></a>00830                } <span class="keywordflow">else</span> {
-<a name="l00831"></a>00831                    my_operation op_data(t, tryput);
-<a name="l00832"></a>00832                    my_aggregator.execute(&op_data);
-<a name="l00833"></a>00833                    <span class="keywordflow">return</span> op_data.status == SUCCEEDED;
-<a name="l00834"></a>00834                }
-<a name="l00835"></a>00835             }
-<a name="l00836"></a>00836 
-<a name="l00838"></a>00838             <span class="comment">/* override */</span> <span class="keywordtype">bool</span> register_predecessor( predecessor_type &src ) {
-<a name="l00839"></a>00839                 my_operation op_data(reg_pred);
-<a name="l00840"></a>00840                 op_data.r = &src;
-<a name="l00841"></a>00841                 my_aggregator.execute(&op_data);
-<a name="l00842"></a>00842                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00843"></a>00843             }
-<a name="l00844"></a>00844 
-<a name="l00846"></a>00846             <span class="comment">/* override */</span> <span class="keywordtype">bool</span> remove_predecessor( predecessor_type &src ) {
-<a name="l00847"></a>00847                 my_operation op_data(rem_pred);
-<a name="l00848"></a>00848                 op_data.r = &src;
-<a name="l00849"></a>00849                 my_aggregator.execute(&op_data);
-<a name="l00850"></a>00850                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00851"></a>00851             }
-<a name="l00852"></a>00852 
-<a name="l00853"></a>00853         <span class="keyword">protected</span>:
-<a name="l00854"></a>00854             task *my_root_task;
-<a name="l00855"></a>00855             <span class="keyword">const</span> size_t my_max_concurrency;
-<a name="l00856"></a>00856             size_t my_concurrency;
-<a name="l00857"></a>00857             function_body<input_type, output_type> *my_body;
-<a name="l00858"></a>00858             predecessor_cache<input_type, null_mutex > my_predecessors;
-<a name="l00859"></a>00859 
-<a name="l00860"></a>00860             <span class="keyword">virtual</span> broadcast_cache<output_type > &successors() = 0;
-<a name="l00861"></a>00861 
-<a name="l00862"></a>00862         <span class="keyword">private</span>:
-<a name="l00863"></a>00863             <span class="keyword">friend</span> <span class="keyword">class </span>apply_body_task< function_input< input_type, output_type >, input_type >;
-<a name="l00864"></a>00864             <span class="keyword">friend</span> <span class="keyword">class </span>forward_task< function_input< input_type, output_type > >;
-<a name="l00865"></a>00865 
-<a name="l00866"></a>00866             <span class="keyword">class </span>my_operation : <span class="keyword">public</span> aggregated_operation< my_operation > {
-<a name="l00867"></a>00867             <span class="keyword">public</span>:
-<a name="l00868"></a>00868                 <span class="keywordtype">char</span> type;
-<a name="l00869"></a>00869                 <span class="keyword">union </span>{
-<a name="l00870"></a>00870                     input_type *elem;
-<a name="l00871"></a>00871                     predecessor_type *r;
-<a name="l00872"></a>00872                 };
-<a name="l00873"></a>00873                 my_operation(<span class="keyword">const</span> input_type& e, op_type t) :
-<a name="l00874"></a>00874                     type(char(t)), elem(const_cast<input_type*>(&e)) {}
-<a name="l00875"></a>00875                 my_operation(op_type t) : type(char(t)), r(NULL) {}
-<a name="l00876"></a>00876             };
-<a name="l00877"></a>00877 
-<a name="l00878"></a>00878             <span class="keyword">class </span>my_functor_t {
-<a name="l00879"></a>00879                 function_input<input_type, output_type> *fi;
-<a name="l00880"></a>00880              <span class="keyword">public</span>:
-<a name="l00881"></a>00881                 my_functor_t() {}
-<a name="l00882"></a>00882                 my_functor_t(function_input<input_type, output_type> *fi_) : fi(fi_) {}
-<a name="l00883"></a>00883                 <span class="keywordtype">void</span> operator()(my_operation* op_list) {
-<a name="l00884"></a>00884                     fi->handle_operations(op_list);
-<a name="l00885"></a>00885                 }
-<a name="l00886"></a>00886             };
-<a name="l00887"></a>00887 
-<a name="l00888"></a>00888             <span class="keywordtype">bool</span> forwarder_busy;
-<a name="l00889"></a>00889             aggregator< my_functor_t, my_operation > my_aggregator;
-<a name="l00890"></a>00890 
-<a name="l00891"></a>00891             <span class="keywordtype">void</span> handle_operations(my_operation *op_list) {
-<a name="l00892"></a>00892                 my_operation *tmp;
-<a name="l00893"></a>00893                 <span class="keywordflow">while</span> (op_list) {
-<a name="l00894"></a>00894                     tmp = op_list;
-<a name="l00895"></a>00895                     op_list = op_list->next;
-<a name="l00896"></a>00896                     <span class="keywordflow">switch</span> (tmp->type) {
-<a name="l00897"></a>00897                     <span class="keywordflow">case</span> reg_pred:
-<a name="l00898"></a>00898                         my_predecessors.add(*(tmp->r));
-<a name="l00899"></a>00899                         __TBB_store_with_release(tmp->status, SUCCEEDED);
-<a name="l00900"></a>00900                         <span class="keywordflow">if</span> (!forwarder_busy) {
-<a name="l00901"></a>00901                             forwarder_busy = <span class="keyword">true</span>;
-<a name="l00902"></a>00902                             spawn_forward_task();
-<a name="l00903"></a>00903                         }
-<a name="l00904"></a>00904                         <span class="keywordflow">break</span>;
-<a name="l00905"></a>00905                     <span class="keywordflow">case</span> rem_pred:
-<a name="l00906"></a>00906                         my_predecessors.remove(*(tmp->r));
-<a name="l00907"></a>00907                         __TBB_store_with_release(tmp->status, SUCCEEDED);
-<a name="l00908"></a>00908                         <span class="keywordflow">break</span>;
-<a name="l00909"></a>00909                     <span class="keywordflow">case</span> app_body:
-<a name="l00910"></a>00910                         __TBB_ASSERT(my_max_concurrency != 0, NULL);
-<a name="l00911"></a>00911                         --my_concurrency;
-<a name="l00912"></a>00912                         __TBB_store_with_release(tmp->status, SUCCEEDED);
-<a name="l00913"></a>00913                         <span class="keywordflow">if</span> (my_concurrency<my_max_concurrency) {
-<a name="l00914"></a>00914                             input_type i;
-<a name="l00915"></a>00915                             <span class="keywordflow">if</span> (my_predecessors.get_item(i)) {
-<a name="l00916"></a>00916                                 ++my_concurrency;
-<a name="l00917"></a>00917                                 spawn_body_task(i);
-<a name="l00918"></a>00918                             }
-<a name="l00919"></a>00919                         }
-<a name="l00920"></a>00920                         <span class="keywordflow">break</span>;
-<a name="l00921"></a>00921                     <span class="keywordflow">case</span> tryput: internal_try_put(tmp);  <span class="keywordflow">break</span>;
-<a name="l00922"></a>00922                     <span class="keywordflow">case</span> try_fwd: internal_forward(tmp);  <span class="keywordflow">break</span>;
-<a name="l00923"></a>00923                     }
-<a name="l00924"></a>00924                 }
-<a name="l00925"></a>00925             }
-<a name="l00926"></a>00926 
-<a name="l00927"></a>00927 
-<a name="l00929"></a>00929             <span class="keywordtype">void</span> internal_try_put(my_operation *op) {
-<a name="l00930"></a>00930                 __TBB_ASSERT(my_max_concurrency != 0, NULL);
-<a name="l00931"></a>00931                 <span class="keywordflow">if</span> (my_concurrency < my_max_concurrency) {
-<a name="l00932"></a>00932                    ++my_concurrency;
-<a name="l00933"></a>00933                    spawn_body_task(*(op->elem));
-<a name="l00934"></a>00934                    __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l00935"></a>00935                } <span class="keywordflow">else</span> {
-<a name="l00936"></a>00936                    __TBB_store_with_release(op->status, FAILED);
-<a name="l00937"></a>00937                }
-<a name="l00938"></a>00938             }
-<a name="l00939"></a>00939 
-<a name="l00941"></a>00941             <span class="keywordtype">void</span> internal_forward(my_operation *op) {
-<a name="l00942"></a>00942                 <span class="keywordflow">if</span> (my_concurrency<my_max_concurrency || !my_max_concurrency) {
-<a name="l00943"></a>00943                     input_type i;
-<a name="l00944"></a>00944                     <span class="keywordflow">if</span> (my_predecessors.get_item(i)) {
-<a name="l00945"></a>00945                         ++my_concurrency;
-<a name="l00946"></a>00946                         __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l00947"></a>00947                         spawn_body_task(i);
-<a name="l00948"></a>00948                         <span class="keywordflow">return</span>;
-<a name="l00949"></a>00949                     }
-<a name="l00950"></a>00950                 }
-<a name="l00951"></a>00951                 __TBB_store_with_release(op->status, FAILED);
-<a name="l00952"></a>00952                 forwarder_busy = <span class="keyword">false</span>;
-<a name="l00953"></a>00953             }
-<a name="l00954"></a>00954 
-<a name="l00956"></a>00956             <span class="keywordtype">void</span> apply_body( input_type &i ) {
-<a name="l00957"></a>00957                 successors().try_put( (*my_body)(i) );
-<a name="l00958"></a>00958                 <span class="keywordflow">if</span> ( my_max_concurrency != 0 ) {
-<a name="l00959"></a>00959                     my_operation op_data(app_body);
-<a name="l00960"></a>00960                     my_aggregator.execute(&op_data);
-<a name="l00961"></a>00961                 }
-<a name="l00962"></a>00962             }
-<a name="l00963"></a>00963 
-<a name="l00965"></a>00965            <span class="keyword">inline</span> <span class="keywordtype">void</span> spawn_body_task( input_type &input ) {
-<a name="l00966"></a>00966                <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>(*<span class="keyword">new</span>(task::allocate_additional_child_of(*my_root_task)) apply_body_task<function_input<input_type, output_type>, input_type >(*<span class="keyword">this</span>, input));
-<a name="l00967"></a>00967            }
-<a name="l00968"></a>00968 
-<a name="l00970"></a>00970            <span class="keywordtype">void</span> forward() {
-<a name="l00971"></a>00971                my_operation op_data(try_fwd);
-<a name="l00972"></a>00972                <span class="keywordflow">do</span> {
-<a name="l00973"></a>00973                    op_data.status = WAIT;
-<a name="l00974"></a>00974                    my_aggregator.execute(&op_data);
-<a name="l00975"></a>00975                } <span class="keywordflow">while</span> (op_data.status == SUCCEEDED);
-<a name="l00976"></a>00976            }
-<a name="l00977"></a>00977 
-<a name="l00979"></a>00979            <span class="keyword">inline</span> <span class="keywordtype">void</span> spawn_forward_task() {
-<a name="l00980"></a>00980                <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>(*<span class="keyword">new</span>(task::allocate_additional_child_of(*my_root_task)) forward_task<function_input<input_type, output_type> >(*<span class="keyword">this</span>));
-<a name="l00981"></a>00981            }
-<a name="l00982"></a>00982         };
-<a name="l00983"></a>00983 
-<a name="l00985"></a>00985         <span class="keyword">template</span>< <span class="keyword">typename</span> Output >
-<a name="l00986"></a>00986         <span class="keyword">class </span>continue_input : <span class="keyword">public</span> continue_receiver {
-<a name="l00987"></a>00987         <span class="keyword">public</span>:
-<a name="l00988"></a>00988 
-<a name="l00990"></a>00990             <span class="keyword">typedef</span> continue_msg input_type;
-<a name="l00991"></a>00991     
-<a name="l00993"></a>00993             <span class="keyword">typedef</span> Output output_type;
-<a name="l00994"></a>00994 
-<a name="l00995"></a>00995             <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l00996"></a>00996             continue_input( graph &g, Body& body )
-<a name="l00997"></a>00997                 : my_root_task(g.root_task()), 
-<a name="l00998"></a>00998                  my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }
-<a name="l00999"></a>00999 
-<a name="l01000"></a>01000             <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l01001"></a>01001             continue_input( graph &g, <span class="keywordtype">int</span> number_of_predecessors, Body& body )
-<a name="l01002"></a>01002                 : continue_receiver( number_of_predecessors ), my_root_task(g.root_task()), 
-<a name="l01003"></a>01003                  my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }
-<a name="l01004"></a>01004 
-<a name="l01005"></a>01005         <span class="keyword">protected</span>:
-<a name="l01006"></a>01006 
-<a name="l01007"></a>01007             task *my_root_task;
-<a name="l01008"></a>01008             function_body<input_type, output_type> *my_body;
-<a name="l01009"></a>01009 
-<a name="l01010"></a>01010             <span class="keyword">virtual</span> broadcast_cache<output_type > &successors() = 0; 
-<a name="l01011"></a>01011 
-<a name="l01012"></a>01012             <span class="keyword">friend</span> <span class="keyword">class </span>apply_body_task< continue_input< Output >, continue_msg >;
-<a name="l01013"></a>01013 
-<a name="l01015"></a>01015             <span class="comment">/* override */</span> <span class="keywordtype">void</span> apply_body( input_type ) {
-<a name="l01016"></a>01016                 successors().try_put( (*my_body)( continue_msg() ) );
-<a name="l01017"></a>01017             }
-<a name="l01018"></a>01018 
-<a name="l01020"></a>01020             <span class="comment">/* override */</span> <span class="keywordtype">void</span> execute( ) {
-<a name="l01021"></a>01021                 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) ) 
-<a name="l01022"></a>01022                    apply_body_task< continue_input< Output >, continue_msg >( *<span class="keyword">this</span>, continue_msg() ) ); 
-<a name="l01023"></a>01023             }
-<a name="l01024"></a>01024         };
-<a name="l01025"></a>01025 
-<a name="l01027"></a>01027         <span class="keyword">template</span>< <span class="keyword">typename</span> Output >
-<a name="l01028"></a>01028         <span class="keyword">class </span>function_output : <span class="keyword">public</span> sender<Output> {
-<a name="l01029"></a>01029         <span class="keyword">public</span>:
-<a name="l01030"></a>01030 
-<a name="l01031"></a>01031             <span class="keyword">typedef</span> Output output_type;
-<a name="l01032"></a>01032 
-<a name="l01033"></a>01033             function_output() { }
-<a name="l01034"></a>01034 
-<a name="l01036"></a>01036             <span class="comment">/* override */</span> <span class="keywordtype">bool</span> register_successor( receiver<output_type> &r ) {
-<a name="l01037"></a>01037                 successors().register_successor( r );
-<a name="l01038"></a>01038                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01039"></a>01039             }
-<a name="l01040"></a>01040 
-<a name="l01042"></a>01042             <span class="comment">/* override */</span> <span class="keywordtype">bool</span> remove_successor( receiver<output_type> &r ) {
-<a name="l01043"></a>01043                 successors().remove_successor( r );
-<a name="l01044"></a>01044                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01045"></a>01045             }
-<a name="l01046"></a>01046   
-<a name="l01047"></a>01047         <span class="keyword">protected</span>:
-<a name="l01048"></a>01048 
-<a name="l01049"></a>01049             <span class="keyword">virtual</span> broadcast_cache<output_type > &successors() = 0; 
-<a name="l01050"></a>01050 
-<a name="l01051"></a>01051         };
-<a name="l01052"></a>01052 
-<a name="l01053"></a>01053     }
-<a name="l01055"></a>01055 
-<a name="l01057"></a>01057     <span class="keyword">template</span> < <span class="keyword">typename</span> Output >
-<a name="l01058"></a><a class="code" href="a00285.html">01058</a>     <span class="keyword">class </span><a class="code" href="a00285.html">source_node</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00282.html">sender</a>< Output > {
-<a name="l01059"></a>01059     <span class="keyword">public</span>:
-<a name="l01060"></a>01060 
-<a name="l01062"></a><a class="code" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">01062</a>         <span class="keyword">typedef</span> Output <a class="code" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a>;           
-<a name="l01063"></a>01063 
-<a name="l01065"></a><a class="code" href="a00285.html#217d72bbc6e7a4b35ef014dd9a15efca">01065</a>         <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< Output ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01066"></a>01066 
-<a name="l01068"></a>01068         <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l01069"></a><a class="code" href="a00285.html#0513272133a06db6742873671af98f21">01069</a>         <a class="code" href="a00285.html#0513272133a06db6742873671af98f21">source_node</a>( <a class="code" href="a00250.html">graph</a> &g, Body body, <span class="keywordtype">bool</span> is_active = <span class="keyword">true</span> )
-<a name="l01070"></a>01070              : my_root_task(g.root_task()), my_state( is_active ? internal::node_state_idle : internal::node_state_inactive ),
-<a name="l01071"></a>01071               my_body( new internal::source_body_leaf< <a class="code" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a>, Body>(body) ),
-<a name="l01072"></a>01072               my_reserved(false), my_has_cached_item(false) { 
-<a name="l01073"></a>01073             my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01074"></a>01074         }
-<a name="l01075"></a>01075 
-<a name="l01077"></a><a class="code" href="a00285.html#90c94a8a52cc3d19cf393ce289e80733">01077</a>         <a class="code" href="a00285.html#90c94a8a52cc3d19cf393ce289e80733">~source_node</a>() { <span class="keyword">delete</span> my_body; }
-<a name="l01078"></a>01078 
-<a name="l01080"></a><a class="code" href="a00285.html#ce601874ec5cbb0996f6dcb8e43badb8">01080</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00285.html#ce601874ec5cbb0996f6dcb8e43badb8">register_successor</a>( <a class="code" href="a00277.html">receiver<output_type></a> &r ) {
-<a name="l01081"></a>01081             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01082"></a>01082             my_successors.register_successor(r);
-<a name="l01083"></a>01083             <span class="keywordflow">if</span> ( my_state != internal::node_state_inactive )
-<a name="l01084"></a>01084                 spawn_put();
-<a name="l01085"></a>01085             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01086"></a>01086         }
-<a name="l01087"></a>01087 
-<a name="l01089"></a><a class="code" href="a00285.html#de069bfc6fae7ed4e82b2a1fbb58b721">01089</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00285.html#de069bfc6fae7ed4e82b2a1fbb58b721">remove_successor</a>( <a class="code" href="a00277.html">receiver<output_type></a> &r ) {
-<a name="l01090"></a>01090             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01091"></a>01091             my_successors.remove_successor(r);
-<a name="l01092"></a>01092             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01093"></a>01093         }
-<a name="l01094"></a>01094 
-<a name="l01096"></a><a class="code" href="a00285.html#0434d2933ad082d3c43a4ec774150511">01096</a>         <span class="comment">/*override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00285.html#0434d2933ad082d3c43a4ec774150511">try_get</a>( <a class="code" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> &v ) {
-<a name="l01097"></a>01097             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01098"></a>01098             <span class="keywordflow">if</span> ( my_reserved )  
-<a name="l01099"></a>01099                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01100"></a>01100 
-<a name="l01101"></a>01101             <span class="keywordflow">if</span> ( my_has_cached_item ) {
-<a name="l01102"></a>01102                 v = my_cached_item;
-<a name="l01103"></a>01103                 my_has_cached_item = <span class="keyword">false</span>;
-<a name="l01104"></a>01104             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (*my_body)(v) == <span class="keyword">false</span> ) {
-<a name="l01105"></a>01105                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01106"></a>01106             }
-<a name="l01107"></a>01107             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01108"></a>01108         }
-<a name="l01109"></a>01109 
-<a name="l01111"></a><a class="code" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">01111</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">try_reserve</a>( <a class="code" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> &v ) {
-<a name="l01112"></a>01112             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01113"></a>01113             <span class="keywordflow">if</span> ( my_reserved ) {
-<a name="l01114"></a>01114                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01115"></a>01115             }
-<a name="l01116"></a>01116 
-<a name="l01117"></a>01117             <span class="keywordflow">if</span> ( !my_has_cached_item && (*my_body)(my_cached_item) )  
-<a name="l01118"></a>01118                 my_has_cached_item = <span class="keyword">true</span>;
-<a name="l01119"></a>01119 
-<a name="l01120"></a>01120             <span class="keywordflow">if</span> ( my_has_cached_item ) {
-<a name="l01121"></a>01121                 v = my_cached_item;
-<a name="l01122"></a>01122                 my_reserved = <span class="keyword">true</span>;
-<a name="l01123"></a>01123                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01124"></a>01124             } <span class="keywordflow">else</span> {
-<a name="l01125"></a>01125                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01126"></a>01126             }
-<a name="l01127"></a>01127         }
-<a name="l01128"></a>01128 
-<a name="l01130"></a>01130 
-<a name="l01131"></a><a class="code" href="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">01131</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">try_release</a>( ) {
-<a name="l01132"></a>01132             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01133"></a>01133             __TBB_ASSERT( my_reserved && my_has_cached_item, <span class="stringliteral">"releasing non-existent reservation"</span> );
-<a name="l01134"></a>01134             my_reserved = <span class="keyword">false</span>;
-<a name="l01135"></a>01135             spawn_put();
-<a name="l01136"></a>01136             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01137"></a>01137         }
-<a name="l01138"></a>01138 
-<a name="l01140"></a><a class="code" href="a00285.html#809f51859ca4dd04204591d76c8572eb">01140</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00285.html#809f51859ca4dd04204591d76c8572eb">try_consume</a>( ) {
-<a name="l01141"></a>01141             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01142"></a>01142             __TBB_ASSERT( my_reserved && my_has_cached_item, <span class="stringliteral">"consuming non-existent reservation"</span> );
-<a name="l01143"></a>01143             my_reserved = <span class="keyword">false</span>;
-<a name="l01144"></a>01144             my_has_cached_item = <span class="keyword">false</span>;
-<a name="l01145"></a>01145             <span class="keywordflow">if</span> ( !my_successors.empty() ) {
-<a name="l01146"></a>01146                 spawn_put();
-<a name="l01147"></a>01147             }
-<a name="l01148"></a>01148             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01149"></a>01149         }
-<a name="l01150"></a>01150 
-<a name="l01152"></a><a class="code" href="a00285.html#d71ed386c53032463f3435f79a15b6ff">01152</a>         <span class="keywordtype">void</span> <a class="code" href="a00285.html#d71ed386c53032463f3435f79a15b6ff">activate</a>() {
-<a name="l01153"></a>01153             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01154"></a>01154             my_state = internal::node_state_idle;
-<a name="l01155"></a>01155             <span class="keywordflow">if</span> ( !my_successors.empty() )
-<a name="l01156"></a>01156                 spawn_put();
-<a name="l01157"></a>01157         }
-<a name="l01158"></a>01158 
-<a name="l01159"></a>01159     <span class="keyword">private</span>:
-<a name="l01160"></a>01160 
-<a name="l01161"></a>01161         <a class="code" href="a00291.html">task</a> *my_root_task;
-<a name="l01162"></a>01162         <a class="code" href="a00286.html">spin_mutex</a> my_mutex;
-<a name="l01163"></a>01163         internal::node_state my_state;
-<a name="l01164"></a>01164         internal::source_body<output_type> *my_body;
-<a name="l01165"></a>01165         internal::broadcast_cache< output_type > my_successors;
-<a name="l01166"></a>01166         <span class="keywordtype">bool</span> my_reserved;
-<a name="l01167"></a>01167         <span class="keywordtype">bool</span> my_has_cached_item;
-<a name="l01168"></a>01168         <a class="code" href="a00285.html#c5a2c6ab64bcd798724976d7d75ba92f">output_type</a> my_cached_item;
-<a name="l01169"></a>01169 
-<a name="l01170"></a>01170         <span class="keyword">friend</span> <span class="keyword">class </span>internal::source_task< source_node< output_type > >;
-<a name="l01171"></a>01171 
-<a name="l01173"></a>01173         <span class="comment">/* override */</span> <span class="keywordtype">void</span> apply_body( ) {
-<a name="l01174"></a>01174             output_type v;
-<a name="l01175"></a>01175             <span class="keywordflow">if</span> ( <a class="code" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">try_reserve</a>(v) == <span class="keyword">false</span> )
-<a name="l01176"></a>01176                 <span class="keywordflow">return</span>;
-<a name="l01177"></a>01177 
-<a name="l01178"></a>01178             <span class="keywordflow">if</span> ( my_successors.try_put( v ) ) 
-<a name="l01179"></a>01179                 <a class="code" href="a00285.html#809f51859ca4dd04204591d76c8572eb">try_consume</a>();
-<a name="l01180"></a>01180             <span class="keywordflow">else</span>
-<a name="l01181"></a>01181                 <a class="code" href="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">try_release</a>();
-<a name="l01182"></a>01182         }
-<a name="l01183"></a>01183 
-<a name="l01185"></a>01185         <span class="comment">/* override */</span> <span class="keywordtype">void</span> spawn_put( ) {
-<a name="l01186"></a>01186             <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) ) 
-<a name="l01187"></a>01187                internal::source_task< source_node< output_type > >( *<span class="keyword">this</span> ) ); 
-<a name="l01188"></a>01188         }
-<a name="l01189"></a>01189 
-<a name="l01190"></a>01190     };
-<a name="l01191"></a>01191 
-<a name="l01193"></a>01193     <span class="keyword">template</span> <<span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output = continue_msg >
-<a name="l01194"></a><a class="code" href="a00249.html">01194</a>     <span class="keyword">class </span><a class="code" href="a00249.html">function_node</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> internal::function_input<Input,Output>, <span class="keyword">public</span> internal::function_output<Output> {
-<a name="l01195"></a>01195     <span class="keyword">public</span>:
-<a name="l01196"></a>01196 
-<a name="l01197"></a>01197         <span class="keyword">typedef</span> Input input_type;
-<a name="l01198"></a>01198         <span class="keyword">typedef</span> Output output_type;
-<a name="l01199"></a>01199         <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01200"></a>01200         <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01201"></a>01201 
-<a name="l01203"></a>01203         <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
-<a name="l01204"></a><a class="code" href="a00249.html#7bde12e8ee43d4cafbdd5b1fc2031e2b">01204</a>         <a class="code" href="a00249.html#7bde12e8ee43d4cafbdd5b1fc2031e2b">function_node</a>( <a class="code" href="a00250.html">graph</a> &g, size_t concurrency, Body body )
-<a name="l01205"></a>01205         : internal::function_input<input_type,output_type>( g, concurrency, body ) {
-<a name="l01206"></a>01206             my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01207"></a>01207         }
-<a name="l01208"></a>01208 
-<a name="l01209"></a>01209     <span class="keyword">protected</span>:
-<a name="l01210"></a>01210 
-<a name="l01211"></a>01211         internal::broadcast_cache<output_type> my_successors; 
-<a name="l01212"></a>01212         <span class="comment">/* override */</span> internal::broadcast_cache<output_type> &successors () { <span class="keywordflow">return</span> my_successors; }
-<a name="l01213"></a>01213 
-<a name="l01214"></a>01214     };
-<a name="l01215"></a>01215 
-<a name="l01217"></a>01217     <span class="keyword">template</span> <<span class="keyword">typename</span> Output>
-<a name="l01218"></a><a class="code" href="a00244.html">01218</a>     <span class="keyword">class </span><a class="code" href="a00244.html">executable_node</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> internal::continue_input<Output>, <span class="keyword">public</span> internal::function_output<Output> {
-<a name="l01219"></a>01219     <span class="keyword">public</span>:
-<a name="l01220"></a>01220 
-<a name="l01221"></a>01221         <span class="keyword">typedef</span> continue_msg input_type;
-<a name="l01222"></a>01222         <span class="keyword">typedef</span> Output output_type;
-<a name="l01223"></a>01223         <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01224"></a>01224         <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01225"></a>01225 
-<a name="l01227"></a>01227          <span class="keyword">template</span> <<span class="keyword">typename</span> Body >
-<a name="l01228"></a><a class="code" href="a00244.html#73d4304b322a25ed0df468e607dd1dac">01228</a>          <a class="code" href="a00244.html#73d4304b322a25ed0df468e607dd1dac">executable_node</a>( <a class="code" href="a00250.html">graph</a> &g, Body body )
-<a name="l01229"></a>01229                  : internal::continue_input<output_type>( g, body ) {
-<a name="l01230"></a>01230              my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01231"></a>01231          }
-<a name="l01232"></a>01232 
-<a name="l01234"></a>01234          <span class="keyword">template</span> <<span class="keyword">typename</span> Body >
-<a name="l01235"></a><a class="code" href="a00244.html#c13030111d34feeafd9cdb1dd21584f1">01235</a>          <a class="code" href="a00244.html#73d4304b322a25ed0df468e607dd1dac">executable_node</a>( <a class="code" href="a00250.html">graph</a> &g, <span class="keywordtype">int</span> number_of_predecessors, Body body )
-<a name="l01236"></a>01236                  : internal::continue_input<output_type>( g, number_of_predecessors, body ) {
-<a name="l01237"></a>01237              my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01238"></a>01238          }
-<a name="l01239"></a>01239 
-<a name="l01240"></a>01240     <span class="keyword">protected</span>:
-<a name="l01241"></a>01241 
-<a name="l01242"></a>01242         internal::broadcast_cache<output_type> my_successors; 
-<a name="l01243"></a>01243         <span class="comment">/* override */</span> internal::broadcast_cache<output_type> &successors () { <span class="keywordflow">return</span> my_successors; }
-<a name="l01244"></a>01244 
-<a name="l01245"></a>01245     };
-<a name="l01246"></a>01246 
-<a name="l01247"></a>01247 
-<a name="l01248"></a>01248 
-<a name="l01249"></a>01249     <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l01250"></a>01250     <span class="keyword">class </span>overwrite_node : <span class="keyword">public</span> graph_node, <span class="keyword">public</span> receiver<T>, <span class="keyword">public</span> sender<T>, internal::no_copy {
-<a name="l01251"></a>01251     <span class="keyword">public</span>:
-<a name="l01252"></a>01252 
-<a name="l01253"></a>01253         <span class="keyword">typedef</span> T input_type;
-<a name="l01254"></a>01254         <span class="keyword">typedef</span> T output_type;
-<a name="l01255"></a>01255         <span class="keyword">typedef</span> sender< input_type > predecessor_type;
-<a name="l01256"></a>01256         <span class="keyword">typedef</span> receiver< output_type > successor_type;
-<a name="l01257"></a>01257 
-<a name="l01258"></a>01258         overwrite_node() : my_buffer_is_valid(false) {
-<a name="l01259"></a>01259             my_successors.set_owner( <span class="keyword">this</span> );
-<a name="l01260"></a>01260         }
-<a name="l01261"></a>01261 
-<a name="l01262"></a>01262         ~overwrite_node() {}
-<a name="l01263"></a>01263 
-<a name="l01264"></a>01264         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">register_successor</a>( successor_type &s ) {
-<a name="l01265"></a>01265             spin_mutex::scoped_lock l( my_mutex );
-<a name="l01266"></a>01266             <span class="keywordflow">if</span> ( my_buffer_is_valid ) {
-<a name="l01267"></a>01267                 <span class="comment">// We have a valid value that must be forwarded immediately.</span>
-<a name="l01268"></a>01268                 <span class="keywordflow">if</span> ( s.try_put( my_buffer ) || !s.register_predecessor( *<span class="keyword">this</span>  ) ) {
-<a name="l01269"></a>01269                     <span class="comment">// We add the successor: it accepted our put or it rejected it but won't let use become a predecessor</span>
-<a name="l01270"></a>01270                     my_successors.register_successor( s );
-<a name="l01271"></a>01271                     <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01272"></a>01272                 } <span class="keywordflow">else</span> {
-<a name="l01273"></a>01273                     <span class="comment">// We don't add the successor: it rejected our put and we became its predecessor instead</span>
-<a name="l01274"></a>01274                     <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01275"></a>01275                 }
-<a name="l01276"></a>01276             } <span class="keywordflow">else</span> {
-<a name="l01277"></a>01277                 <span class="comment">// No valid value yet, just add as successor</span>
-<a name="l01278"></a>01278                 my_successors.register_successor( s );
-<a name="l01279"></a>01279                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01280"></a>01280             }
-<a name="l01281"></a>01281         }
-<a name="l01282"></a>01282 
-<a name="l01283"></a>01283         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00282.html#3f345427e812e8741370308ff88f30bf">remove_successor</a>( successor_type &s ) {
-<a name="l01284"></a>01284             spin_mutex::scoped_lock l( my_mutex );
-<a name="l01285"></a>01285             my_successors.remove_successor(s);
-<a name="l01286"></a>01286             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01287"></a>01287         }
-<a name="l01288"></a>01288 
-<a name="l01289"></a>01289         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_put( T v ) {
-<a name="l01290"></a>01290             spin_mutex::scoped_lock l( my_mutex );
-<a name="l01291"></a>01291             my_buffer = v;
-<a name="l01292"></a>01292             my_buffer_is_valid = <span class="keyword">true</span>;
-<a name="l01293"></a>01293             my_successors.try_put(v);
-<a name="l01294"></a>01294             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01295"></a>01295         }
-<a name="l01296"></a>01296 
-<a name="l01297"></a>01297         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_get( T &v ) {
-<a name="l01298"></a>01298             spin_mutex::scoped_lock l( my_mutex );
-<a name="l01299"></a>01299             <span class="keywordflow">if</span> ( my_buffer_is_valid ) {
-<a name="l01300"></a>01300                 v = my_buffer;
-<a name="l01301"></a>01301                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01302"></a>01302             } <span class="keywordflow">else</span> {
-<a name="l01303"></a>01303                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01304"></a>01304             }
-<a name="l01305"></a>01305         }
-<a name="l01306"></a>01306 
-<a name="l01307"></a>01307         <span class="keywordtype">bool</span> is_valid() {
-<a name="l01308"></a>01308            spin_mutex::scoped_lock l( my_mutex );
-<a name="l01309"></a>01309            <span class="keywordflow">return</span> my_buffer_is_valid;
-<a name="l01310"></a>01310         }
-<a name="l01311"></a>01311 
-<a name="l01312"></a>01312         <span class="keywordtype">void</span> clear() {
-<a name="l01313"></a>01313            spin_mutex::scoped_lock l( my_mutex );
-<a name="l01314"></a>01314            my_buffer_is_valid = <span class="keyword">false</span>;
-<a name="l01315"></a>01315         }
-<a name="l01316"></a>01316 
-<a name="l01317"></a>01317     <span class="keyword">protected</span>:
-<a name="l01318"></a>01318 
-<a name="l01319"></a>01319         spin_mutex my_mutex;
-<a name="l01320"></a>01320         internal::broadcast_cache< T, null_rw_mutex > my_successors;
-<a name="l01321"></a>01321         T my_buffer;
-<a name="l01322"></a>01322         <span class="keywordtype">bool</span> my_buffer_is_valid;
-<a name="l01323"></a>01323 
-<a name="l01324"></a>01324     };
-<a name="l01325"></a>01325 
-<a name="l01326"></a>01326     <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l01327"></a>01327     <span class="keyword">class </span>write_once_node : <span class="keyword">public</span> overwrite_node<T> {
-<a name="l01328"></a>01328     <span class="keyword">public</span>:
-<a name="l01329"></a>01329 
-<a name="l01330"></a>01330         <span class="keyword">typedef</span> T input_type;
-<a name="l01331"></a>01331         <span class="keyword">typedef</span> T output_type;
-<a name="l01332"></a>01332         <span class="keyword">typedef</span> sender< input_type > predecessor_type;
-<a name="l01333"></a>01333         <span class="keyword">typedef</span> receiver< output_type > successor_type;
-<a name="l01334"></a>01334 
-<a name="l01335"></a>01335         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_put( T v ) {
-<a name="l01336"></a>01336             spin_mutex::scoped_lock l( this->my_mutex );
-<a name="l01337"></a>01337             <span class="keywordflow">if</span> ( this->my_buffer_is_valid ) {
-<a name="l01338"></a>01338                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l01339"></a>01339             } <span class="keywordflow">else</span> {
-<a name="l01340"></a>01340                 this->my_buffer = v;
-<a name="l01341"></a>01341                 this->my_buffer_is_valid = <span class="keyword">true</span>;
-<a name="l01342"></a>01342                 this->my_successors.try_put(v);
-<a name="l01343"></a>01343                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01344"></a>01344             }
-<a name="l01345"></a>01345         }
-<a name="l01346"></a>01346     };
-<a name="l01347"></a>01347 
-<a name="l01349"></a>01349 
-<a name="l01350"></a><a class="code" href="a00240.html">01350</a>     <span class="keyword">class </span><a class="code" href="a00240.html">continue_node</a> : <span class="keyword">public</span> <a class="code" href="a00244.html">executable_node</a>< continue_msg > { 
-<a name="l01351"></a>01351     <span class="keyword">public</span>:
-<a name="l01352"></a>01352 
-<a name="l01353"></a>01353         <span class="keyword">typedef</span> continue_msg input_type;
-<a name="l01354"></a>01354         <span class="keyword">typedef</span> continue_msg output_type;
-<a name="l01355"></a>01355         <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01356"></a>01356         <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01357"></a>01357 
-<a name="l01358"></a>01358         <a class="code" href="a00240.html">continue_node</a>( <a class="code" href="a00250.html">graph</a> &g ) : <a class="code" href="a00244.html">executable_node<continue_msg></a>( g, internal::empty_body< continue_msg, continue_msg>() ) {}
-<a name="l01359"></a>01359     };
-<a name="l01360"></a>01360 
-<a name="l01362"></a>01362     <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l01363"></a><a class="code" href="a00224.html">01363</a>     <span class="keyword">class </span><a class="code" href="a00224.html">broadcast_node</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00277.html">receiver</a><T>, <span class="keyword">public</span> <a class="code" href="a00282.html">sender</a><T>, internal::no_copy {
-<a name="l01364"></a>01364 
-<a name="l01365"></a>01365         internal::broadcast_cache<T> my_successors;
-<a name="l01366"></a>01366 
-<a name="l01367"></a>01367     <span class="keyword">public</span>:
-<a name="l01368"></a>01368 
-<a name="l01369"></a><a class="code" href="a00224.html#59ea89dbeab816742e6dc6af467e6c3f">01369</a>         <span class="keyword">typedef</span> T <a class="code" href="a00224.html#59ea89dbeab816742e6dc6af467e6c3f">input_type</a>;
-<a name="l01370"></a><a class="code" href="a00224.html#b844ca1ee578a54bc11ff28467b12e7d">01370</a>         <span class="keyword">typedef</span> T output_type;
-<a name="l01371"></a><a class="code" href="a00224.html#4dd13b81f6361fc244abe7cbcacd048c">01371</a>         <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01372"></a><a class="code" href="a00224.html#453928c367d813cb481f1b9aa1e1742a">01372</a>         <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01373"></a>01373 
-<a name="l01374"></a>01374         <a class="code" href="a00224.html">broadcast_node</a>( ) {
-<a name="l01375"></a>01375            my_successors.set_owner( <span class="keyword">this</span> ); 
-<a name="l01376"></a>01376         }
-<a name="l01377"></a>01377 
-<a name="l01379"></a><a class="code" href="a00224.html#3f4149fa6b984b2138cb5ed40a2ddc6c">01379</a>         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00224.html#3f4149fa6b984b2138cb5ed40a2ddc6c">register_successor</a>( <a class="code" href="a00277.html">receiver<T></a> &r ) {
-<a name="l01380"></a>01380             my_successors.register_successor( r );
-<a name="l01381"></a>01381             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01382"></a>01382         }
-<a name="l01383"></a>01383 
-<a name="l01385"></a><a class="code" href="a00224.html#eefb3210bb9727765ea7385ba163c2a6">01385</a>         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00224.html#eefb3210bb9727765ea7385ba163c2a6">remove_successor</a>( <a class="code" href="a00277.html">receiver<T></a> &r ) {
-<a name="l01386"></a>01386             my_successors.remove_successor( r );
-<a name="l01387"></a>01387             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01388"></a>01388         }
-<a name="l01389"></a>01389 
-<a name="l01390"></a><a class="code" href="a00224.html#9b211e02554d6b39dc04f7e7f4e00073">01390</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00224.html#9b211e02554d6b39dc04f7e7f4e00073">try_put</a>( T t ) {
-<a name="l01391"></a>01391             my_successors.try_put(t);
-<a name="l01392"></a>01392             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01393"></a>01393         }
-<a name="l01394"></a>01394 
-<a name="l01395"></a>01395     };
-<a name="l01396"></a>01396 
-<a name="l01397"></a>01397 
-<a name="l01399"></a>01399     <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l01400"></a><a class="code" href="a00225.html">01400</a>     <span class="keyword">class </span><a class="code" href="a00225.html">buffer_node</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00277.html">receiver</a><T>, <span class="keyword">public</span> <a class="code" href="a00282.html">sender</a><T>, internal::no_copy {
-<a name="l01401"></a>01401     <span class="keyword">public</span>:
-<a name="l01402"></a><a class="code" href="a00225.html#90de308ba6abefb74c537a62ed0f1ca3">01402</a>         <span class="keyword">typedef</span> T <a class="code" href="a00225.html#90de308ba6abefb74c537a62ed0f1ca3">input_type</a>;
-<a name="l01403"></a><a class="code" href="a00225.html#28c06a61dbad153f2e989efbf43016c5">01403</a>         <span class="keyword">typedef</span> T output_type;
-<a name="l01404"></a><a class="code" href="a00225.html#688cf819089ee2fac2b9de2e050adea7">01404</a>         <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01405"></a><a class="code" href="a00225.html#5e23f4f377ff4e1f53e71fd909a65771">01405</a>         <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01406"></a>01406     <span class="keyword">protected</span>:
-<a name="l01407"></a>01407         <span class="keyword">typedef</span> size_t size_type;
-<a name="l01408"></a>01408         <span class="keyword">typedef</span> std::pair< T, bool > item_type;
-<a name="l01409"></a>01409 
-<a name="l01410"></a>01410         internal::round_robin_cache< T, null_rw_mutex > my_successors;
-<a name="l01411"></a>01411 
-<a name="l01412"></a>01412         <a class="code" href="a00291.html">task</a> *my_parent;
-<a name="l01413"></a>01413         item_type *my_array;
-<a name="l01414"></a>01414         size_type my_array_size;
-<a name="l01415"></a>01415         <span class="keyword">static</span> <span class="keyword">const</span> size_type initial_buffer_size = 4;
-<a name="l01416"></a>01416         size_type my_head;
-<a name="l01417"></a>01417         size_type my_tail;
-<a name="l01418"></a>01418         <a class="code" href="a00286.html">spin_mutex</a> my_mutex;
-<a name="l01419"></a>01419         <span class="keywordtype">bool</span> my_reserved;
-<a name="l01420"></a>01420         size_type my_reserved_id;
-<a name="l01421"></a>01421 
-<a name="l01422"></a>01422         <span class="keyword">friend</span> <span class="keyword">class </span>internal::forward_task< buffer_node< T > >;
-<a name="l01423"></a>01423 
-<a name="l01424"></a>01424         <span class="keyword">enum</span> op_type {reg_succ, rem_succ, req_item, res_item, rel_res, con_res, put_item, try_fwd};
-<a name="l01425"></a>01425         <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l01426"></a>01426 
-<a name="l01427"></a>01427         <span class="comment">// implements the aggregator_operation concept</span>
-<a name="l01428"></a>01428         <span class="keyword">class </span>buffer_operation : <span class="keyword">public</span> internal::aggregated_operation< buffer_operation > {
-<a name="l01429"></a>01429         <span class="keyword">public</span>:
-<a name="l01430"></a>01430             <span class="keywordtype">char</span> type;
-<a name="l01431"></a>01431             T *elem;
-<a name="l01432"></a>01432             <a class="code" href="a00225.html#5e23f4f377ff4e1f53e71fd909a65771">successor_type</a> *r;
-<a name="l01433"></a>01433             buffer_operation(<span class="keyword">const</span> T& e, op_type t) :
-<a name="l01434"></a>01434                 type(char(t)), elem(const_cast<T*>(&e)), r(NULL) {}
-<a name="l01435"></a>01435             buffer_operation(op_type t) : type(char(t)), r(NULL) {}
-<a name="l01436"></a>01436         };
-<a name="l01437"></a>01437 
-<a name="l01438"></a>01438         <span class="keyword">class </span>my_functor_t {
-<a name="l01439"></a>01439             buffer_node<T> *bfr;
-<a name="l01440"></a>01440         <span class="keyword">public</span>:
-<a name="l01441"></a>01441             my_functor_t(buffer_node<T> *bfr_) : bfr(bfr_) {}
-<a name="l01442"></a>01442             my_functor_t() {}
-<a name="l01443"></a>01443             <span class="keywordtype">void</span> operator()(buffer_operation* op_list) {
-<a name="l01444"></a>01444                 bfr->handle_operations(op_list);
-<a name="l01445"></a>01445             }
-<a name="l01446"></a>01446         };
-<a name="l01447"></a>01447 
-<a name="l01448"></a>01448         <span class="keywordtype">bool</span> forwarder_busy;
-<a name="l01449"></a>01449         internal::aggregator< my_functor_t, buffer_operation> my_aggregator;
-<a name="l01450"></a>01450 
-<a name="l01451"></a>01451         <span class="keyword">virtual</span> <span class="keywordtype">void</span> handle_operations(buffer_operation *op_list) {
-<a name="l01452"></a>01452             buffer_operation *tmp;
-<a name="l01453"></a>01453             <span class="keywordtype">bool</span> try_forwarding=<span class="keyword">false</span>;
-<a name="l01454"></a>01454             <span class="keywordflow">while</span> (op_list) {
-<a name="l01455"></a>01455                 tmp = op_list;
-<a name="l01456"></a>01456                 op_list = op_list->next;
-<a name="l01457"></a>01457                 <span class="keywordflow">switch</span> (tmp->type) {
-<a name="l01458"></a>01458                 <span class="keywordflow">case</span> reg_succ: <a class="code" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(tmp);  try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01459"></a>01459                 <span class="keywordflow">case</span> rem_succ: <a class="code" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(tmp); <span class="keywordflow">break</span>;
-<a name="l01460"></a>01460                 <span class="keywordflow">case</span> req_item: internal_pop(tmp); <span class="keywordflow">break</span>;
-<a name="l01461"></a>01461                 <span class="keywordflow">case</span> res_item: internal_reserve(tmp); <span class="keywordflow">break</span>;
-<a name="l01462"></a>01462                 <span class="keywordflow">case</span> rel_res:  internal_release(tmp);  try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01463"></a>01463                 <span class="keywordflow">case</span> con_res:  internal_consume(tmp);  try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01464"></a>01464                 <span class="keywordflow">case</span> put_item: internal_push(tmp);  try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01465"></a>01465                 <span class="keywordflow">case</span> try_fwd:  <a class="code" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">internal_forward</a>(tmp); <span class="keywordflow">break</span>;
-<a name="l01466"></a>01466                 }
-<a name="l01467"></a>01467             }
-<a name="l01468"></a>01468             <span class="keywordflow">if</span> (try_forwarding && !forwarder_busy) {
-<a name="l01469"></a>01469                 forwarder_busy = <span class="keyword">true</span>;
-<a name="l01470"></a>01470                 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>(*<span class="keyword">new</span>(task::allocate_additional_child_of(*my_parent)) internal::forward_task< buffer_node<input_type> >(*<span class="keyword">this</span>));
-<a name="l01471"></a>01471             }
-<a name="l01472"></a>01472         }
-<a name="l01473"></a>01473 
-<a name="l01475"></a><a class="code" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">01475</a>         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">forward</a>() {
-<a name="l01476"></a>01476             buffer_operation op_data(try_fwd);
-<a name="l01477"></a>01477             <span class="keywordflow">do</span> {
-<a name="l01478"></a>01478                 op_data.status = WAIT;
-<a name="l01479"></a>01479                 my_aggregator.execute(&op_data);
-<a name="l01480"></a>01480             } <span class="keywordflow">while</span> (op_data.status == SUCCEEDED);
-<a name="l01481"></a>01481         }
-<a name="l01482"></a>01482 
-<a name="l01484"></a><a class="code" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">01484</a>         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(buffer_operation *op) {
-<a name="l01485"></a>01485             my_successors.register_successor(*(op->r));
-<a name="l01486"></a>01486             __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01487"></a>01487         }
-<a name="l01488"></a>01488 
-<a name="l01490"></a><a class="code" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">01490</a>         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(buffer_operation *op) {
-<a name="l01491"></a>01491             my_successors.remove_successor(*(op->r));
-<a name="l01492"></a>01492             __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01493"></a>01493         }
-<a name="l01494"></a>01494 
-<a name="l01496"></a><a class="code" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">01496</a>         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">internal_forward</a>(buffer_operation *op) {
-<a name="l01497"></a>01497             T i_copy;
-<a name="l01498"></a>01498             <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
-<a name="l01499"></a>01499             size_type counter = my_successors.size();
-<a name="l01500"></a>01500             <span class="comment">// Try forwarding, giving each successor a chance</span>
-<a name="l01501"></a>01501             <span class="keywordflow">while</span> (counter>0 && my_tail>my_head && my_array[ (my_tail-1) & (my_array_size-1)].second == <span class="keyword">true</span> ) {
-<a name="l01502"></a>01502                 i_copy = my_array[ (my_tail-1) & (my_array_size-1)].first;
-<a name="l01503"></a>01503                 <span class="keywordtype">bool</span> msg = my_successors.try_put(i_copy);
-<a name="l01504"></a>01504                 <span class="keywordflow">if</span> ( msg == <span class="keyword">true</span> ) {
-<a name="l01505"></a>01505                     my_array[ (my_tail-1) & (my_array_size-1)].second = <span class="keyword">false</span>;
-<a name="l01506"></a>01506                     --my_tail;
-<a name="l01507"></a>01507                     success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
-<a name="l01508"></a>01508                 }
-<a name="l01509"></a>01509                 --counter;
-<a name="l01510"></a>01510             }
-<a name="l01511"></a>01511             <span class="keywordflow">if</span> (success && !counter)
-<a name="l01512"></a>01512                 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01513"></a>01513             <span class="keywordflow">else</span> {
-<a name="l01514"></a>01514                 __TBB_store_with_release(op->status, FAILED);
-<a name="l01515"></a>01515                 forwarder_busy = <span class="keyword">false</span>;
-<a name="l01516"></a>01516             }
-<a name="l01517"></a>01517         }
-<a name="l01518"></a>01518 
-<a name="l01519"></a>01519         <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_push(buffer_operation *op) {
-<a name="l01520"></a>01520             <span class="keywordflow">while</span>( my_tail-my_head >= my_array_size ) {
-<a name="l01521"></a>01521                 <a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>( my_tail - my_head + 1 );
-<a name="l01522"></a>01522             }
-<a name="l01523"></a>01523             my_array[my_tail&(my_array_size-1)] = std::make_pair( *(op->elem), <span class="keyword">true</span> );
-<a name="l01524"></a>01524             ++my_tail;
-<a name="l01525"></a>01525             __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01526"></a>01526         }
-<a name="l01527"></a>01527         <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_pop(buffer_operation *op) {
-<a name="l01528"></a>01528             <span class="keywordflow">if</span> ( my_array[(my_tail-1) & (my_array_size-1)].second == <span class="keyword">false</span> ) {
-<a name="l01529"></a>01529                 __TBB_store_with_release(op->status, FAILED);
-<a name="l01530"></a>01530             }
-<a name="l01531"></a>01531             <span class="keywordflow">else</span> {
-<a name="l01532"></a>01532                 *(op->elem) = my_array[(my_tail-1) & (my_array_size-1)].first;
-<a name="l01533"></a>01533                 my_array[(my_tail-1) & (my_array_size-1)].second = <span class="keyword">false</span>;
-<a name="l01534"></a>01534                 --my_tail;
-<a name="l01535"></a>01535                 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01536"></a>01536             }
-<a name="l01537"></a>01537         }
-<a name="l01538"></a>01538         <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_reserve(buffer_operation *op) {
-<a name="l01539"></a>01539             <span class="keywordflow">if</span> (my_reserved == <span class="keyword">true</span> || my_array[ my_head & (my_array_size-1)].second == <span class="keyword">false</span> ) {
-<a name="l01540"></a>01540                 __TBB_store_with_release(op->status, FAILED);
-<a name="l01541"></a>01541             }
-<a name="l01542"></a>01542             <span class="keywordflow">else</span> {
-<a name="l01543"></a>01543                 my_reserved = <span class="keyword">true</span>;
-<a name="l01544"></a>01544                 *(op->elem) = my_array[ my_head & (my_array_size-1)].first;
-<a name="l01545"></a>01545                 my_array[ my_head & (my_array_size-1)].second = <span class="keyword">false</span>;
-<a name="l01546"></a>01546                 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01547"></a>01547             }
-<a name="l01548"></a>01548         }
-<a name="l01549"></a>01549         <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_consume(buffer_operation *op) {
-<a name="l01550"></a>01550             my_reserved = <span class="keyword">false</span>;
-<a name="l01551"></a>01551             ++my_head;
-<a name="l01552"></a>01552             __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01553"></a>01553         }
-<a name="l01554"></a>01554 
-<a name="l01555"></a>01555         <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_release(buffer_operation *op) {
-<a name="l01556"></a>01556             my_array[my_head&(my_array_size-1)].second = <span class="keyword">true</span>;
-<a name="l01557"></a>01557             my_reserved = <span class="keyword">false</span>;
-<a name="l01558"></a>01558             __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01559"></a>01559         }
-<a name="l01560"></a>01560 
-<a name="l01562"></a><a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">01562</a>         <span class="keywordtype">void</span> <a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>( size_t minimum_size ) {
-<a name="l01563"></a>01563             size_type old_size = my_array_size;
-<a name="l01564"></a>01564             size_type new_size = old_size ? 2*old_size : initial_buffer_size;
-<a name="l01565"></a>01565             <span class="keywordflow">while</span>( new_size<minimum_size )
-<a name="l01566"></a>01566                 new_size*=2;
-<a name="l01567"></a>01567 
-<a name="l01568"></a>01568             item_type* new_array = <a class="code" href="a00226.html">cache_aligned_allocator<item_type></a>().allocate(new_size);
-<a name="l01569"></a>01569             item_type* old_array = my_array;
-<a name="l01570"></a>01570 
-<a name="l01571"></a>01571             <span class="keywordflow">for</span>( size_type i=0; i<new_size; ++i )
-<a name="l01572"></a>01572                 new_array[i].second = <span class="keyword">false</span>;
-<a name="l01573"></a>01573 
-<a name="l01574"></a>01574             size_t t=my_head;
-<a name="l01575"></a>01575             <span class="keywordflow">for</span>( size_type i=0; i<old_size; ++i, ++t )
-<a name="l01576"></a>01576                 new_array[t&(new_size-1)] = old_array[t&(old_size-1)];
-<a name="l01577"></a>01577             my_array = new_array;
-<a name="l01578"></a>01578             my_array_size = new_size;
-<a name="l01579"></a>01579             <span class="keywordflow">if</span>( old_array )
-<a name="l01580"></a>01580                 <a class="code" href="a00226.html">cache_aligned_allocator<item_type></a>().deallocate(old_array,old_size);
-<a name="l01581"></a>01581         }
-<a name="l01582"></a>01582 
-<a name="l01583"></a>01583     <span class="keyword">public</span>:
-<a name="l01585"></a><a class="code" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">01585</a>         <a class="code" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">buffer_node</a>( <a class="code" href="a00250.html">graph</a> &g ) :
-<a name="l01586"></a>01586             my_parent( g.root_task() ), my_array(NULL), my_array_size(0),
-<a name="l01587"></a>01587             my_head(0), my_tail(0), my_reserved(false), forwarder_busy(false) {
-<a name="l01588"></a>01588             my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l01589"></a>01589             my_aggregator.initialize_handler(my_functor_t(<span class="keyword">this</span>));
-<a name="l01590"></a>01590             <a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>(initial_buffer_size);
-<a name="l01591"></a>01591         }
-<a name="l01592"></a>01592 
-<a name="l01593"></a>01593         <span class="keyword">virtual</span> ~buffer_node() {}
-<a name="l01594"></a>01594 
-<a name="l01595"></a>01595         <span class="comment">//</span>
-<a name="l01596"></a>01596         <span class="comment">// message sender implementation</span>
-<a name="l01597"></a>01597         <span class="comment">//</span>
-<a name="l01598"></a>01598 
-<a name="l01600"></a>01600 
-<a name="l01601"></a><a class="code" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">01601</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">register_successor</a>( <a class="code" href="a00277.html">receiver<output_type></a> &r ) {
-<a name="l01602"></a>01602             buffer_operation op_data(reg_succ);
-<a name="l01603"></a>01603             op_data.r = &r;
-<a name="l01604"></a>01604             my_aggregator.execute(&op_data);
-<a name="l01605"></a>01605             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01606"></a>01606         }
-<a name="l01607"></a>01607 
-<a name="l01609"></a>01609 
-<a name="l01611"></a><a class="code" href="a00225.html#415428db02e74a479fb056a8ed72ba53">01611</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#415428db02e74a479fb056a8ed72ba53">remove_successor</a>( <a class="code" href="a00277.html">receiver<output_type></a> &r ) {
-<a name="l01612"></a>01612             r.<a class="code" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(*<span class="keyword">this</span>);
-<a name="l01613"></a>01613             buffer_operation op_data(rem_succ);
-<a name="l01614"></a>01614             op_data.r = &r;
-<a name="l01615"></a>01615             my_aggregator.execute(&op_data);
-<a name="l01616"></a>01616             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01617"></a>01617         }
-<a name="l01618"></a>01618 
-<a name="l01620"></a>01620 
-<a name="l01622"></a><a class="code" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">01622</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">try_get</a>( T &v ) {
-<a name="l01623"></a>01623             buffer_operation op_data(req_item);
-<a name="l01624"></a>01624             op_data.elem = &v;
-<a name="l01625"></a>01625             my_aggregator.execute(&op_data);
-<a name="l01626"></a>01626             <span class="keywordflow">return</span> (op_data.status==SUCCEEDED);
-<a name="l01627"></a>01627         }
-<a name="l01628"></a>01628 
-<a name="l01630"></a>01630 
-<a name="l01632"></a><a class="code" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">01632</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">try_reserve</a>( T &v ) {
-<a name="l01633"></a>01633             buffer_operation op_data(res_item);
-<a name="l01634"></a>01634             op_data.elem = &v;
-<a name="l01635"></a>01635             my_aggregator.execute(&op_data);
-<a name="l01636"></a>01636             <span class="keywordflow">return</span> (op_data.status==SUCCEEDED);
-<a name="l01637"></a>01637         }
-<a name="l01638"></a>01638 
-<a name="l01640"></a>01640 
-<a name="l01641"></a><a class="code" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">01641</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">try_release</a>() {
-<a name="l01642"></a>01642             buffer_operation op_data(rel_res);
-<a name="l01643"></a>01643             my_aggregator.execute(&op_data);
-<a name="l01644"></a>01644             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01645"></a>01645         }
-<a name="l01646"></a>01646 
-<a name="l01648"></a>01648 
-<a name="l01649"></a><a class="code" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">01649</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">try_consume</a>() {
-<a name="l01650"></a>01650             buffer_operation op_data(con_res);
-<a name="l01651"></a>01651             my_aggregator.execute(&op_data);
-<a name="l01652"></a>01652             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01653"></a>01653         }
-<a name="l01654"></a>01654 
-<a name="l01656"></a>01656 
-<a name="l01657"></a><a class="code" href="a00225.html#f74899ffb67687998168ad428f586b64">01657</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00225.html#f74899ffb67687998168ad428f586b64">try_put</a>(T t) {
-<a name="l01658"></a>01658             buffer_operation op_data(t, put_item);
-<a name="l01659"></a>01659             my_aggregator.execute(&op_data);
-<a name="l01660"></a>01660             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l01661"></a>01661         }
-<a name="l01662"></a>01662     };
-<a name="l01663"></a>01663 
-<a name="l01664"></a>01664 
-<a name="l01666"></a>01666     <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l01667"></a><a class="code" href="a00269.html">01667</a>     <span class="keyword">class </span><a class="code" href="a00269.html">queue_node</a> : <span class="keyword">public</span> buffer_node<T> {
-<a name="l01668"></a>01668     <span class="keyword">protected</span>:
-<a name="l01669"></a>01669         <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::size_type</a> size_type;
-<a name="l01670"></a>01670         <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::buffer_operation</a> queue_operation;
-<a name="l01671"></a>01671 
-<a name="l01672"></a>01672         <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l01673"></a>01673 
-<a name="l01675"></a><a class="code" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">01675</a>         <span class="comment">/* override */</span> <span class="keywordtype">void</span> <a class="code" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">internal_forward</a>(queue_operation *op) {
-<a name="l01676"></a>01676             T i_copy;
-<a name="l01677"></a>01677             <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
-<a name="l01678"></a>01678             size_type counter = this->my_successors.size();
-<a name="l01679"></a>01679             <span class="keywordflow">if</span> (this->my_reserved || this->my_array[ this->my_head & (this->my_array_size-1)].second == <span class="keyword">false</span>) {
-<a name="l01680"></a>01680                 __TBB_store_with_release(op->status, FAILED);
-<a name="l01681"></a>01681                 this->forwarder_busy = <span class="keyword">false</span>;
-<a name="l01682"></a>01682                 <span class="keywordflow">return</span>;
-<a name="l01683"></a>01683             }
-<a name="l01684"></a>01684             <span class="comment">// Keep trying to send items while there is at least one accepting successor</span>
-<a name="l01685"></a>01685             <span class="keywordflow">while</span> (counter>0 && this->my_array[ this->my_head & (this->my_array_size-1)].second == <span class="keyword">true</span> ) {
-<a name="l01686"></a>01686                 i_copy = this->my_array[ this->my_head & (this->my_array_size-1)].first;
-<a name="l01687"></a>01687                 <span class="keywordtype">bool</span> msg = this->my_successors.try_put(i_copy);
-<a name="l01688"></a>01688                 <span class="keywordflow">if</span> ( msg == <span class="keyword">true</span> ) {
-<a name="l01689"></a>01689                      this->my_array[ this->my_head & (this->my_array_size-1)].second = <span class="keyword">false</span>;
-<a name="l01690"></a>01690                      ++(this->my_head);
-<a name="l01691"></a>01691                     success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
-<a name="l01692"></a>01692                 }
-<a name="l01693"></a>01693                 --counter;
-<a name="l01694"></a>01694             }
-<a name="l01695"></a>01695             <span class="keywordflow">if</span> (success && !counter)
-<a name="l01696"></a>01696                 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01697"></a>01697             <span class="keywordflow">else</span> {
-<a name="l01698"></a>01698                 __TBB_store_with_release(op->status, FAILED);
-<a name="l01699"></a>01699                 this->forwarder_busy = <span class="keyword">false</span>;
-<a name="l01700"></a>01700             }
-<a name="l01701"></a>01701         }
-<a name="l01702"></a>01702 
-<a name="l01703"></a>01703         <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_pop(queue_operation *op) {
-<a name="l01704"></a>01704             <span class="keywordflow">if</span> ( this->my_reserved == <span class="keyword">true</span> || this->my_array[ this->my_head & (this->my_array_size-1)].second == <span class="keyword">false</span> ) {
-<a name="l01705"></a>01705                 __TBB_store_with_release(op->status, FAILED);
-<a name="l01706"></a>01706             }
-<a name="l01707"></a>01707             <span class="keywordflow">else</span> {
-<a name="l01708"></a>01708                 *(op->elem) = this->my_array[ this->my_head & (this->my_array_size-1)].first;
-<a name="l01709"></a>01709                 this->my_array[ this->my_head & (this->my_array_size-1)].second = <span class="keyword">false</span>;
-<a name="l01710"></a>01710                 ++(this->my_head);
-<a name="l01711"></a>01711                 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01712"></a>01712             }
-<a name="l01713"></a>01713         }
-<a name="l01714"></a>01714         <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_reserve(queue_operation *op) {
-<a name="l01715"></a>01715             <span class="keywordflow">if</span> (this->my_reserved == <span class="keyword">true</span> || this->my_array[ this->my_head & (this->my_array_size-1)].second == <span class="keyword">false</span> ) {
-<a name="l01716"></a>01716                 __TBB_store_with_release(op->status, FAILED);
-<a name="l01717"></a>01717             }
-<a name="l01718"></a>01718             <span class="keywordflow">else</span> {
-<a name="l01719"></a>01719                 this->my_reserved = <span class="keyword">true</span>;
-<a name="l01720"></a>01720                 *(op->elem) = this->my_array[ this->my_head & (this->my_array_size-1)].first;
-<a name="l01721"></a>01721                 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01722"></a>01722             }
-<a name="l01723"></a>01723         }
-<a name="l01724"></a>01724         <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_consume(queue_operation *op) {
-<a name="l01725"></a>01725             this->my_reserved = <span class="keyword">false</span>;
-<a name="l01726"></a>01726             this->my_array[ this->my_head & (this->my_array_size-1)].second = <span class="keyword">false</span>;
-<a name="l01727"></a>01727             ++(this->my_head);
-<a name="l01728"></a>01728             __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01729"></a>01729         }
-<a name="l01730"></a>01730 
-<a name="l01731"></a>01731     <span class="keyword">public</span>:
-<a name="l01732"></a>01732 
-<a name="l01733"></a><a class="code" href="a00269.html#27016487003a4ff2908748c3cf11c1fe">01733</a>         <span class="keyword">typedef</span> T <a class="code" href="a00269.html#27016487003a4ff2908748c3cf11c1fe">input_type</a>;
-<a name="l01734"></a><a class="code" href="a00269.html#d227f122eebe2f9489ba763ff24fd6fb">01734</a>         <span class="keyword">typedef</span> T output_type;
-<a name="l01735"></a><a class="code" href="a00269.html#83bc7308a38f1d205377d78ec14931d1">01735</a>         <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01736"></a><a class="code" href="a00269.html#c3b1d76b66b1292f6a1b6dae52c67a0e">01736</a>         <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01737"></a>01737 
-<a name="l01739"></a><a class="code" href="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">01739</a>         <a class="code" href="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">queue_node</a>( <a class="code" href="a00250.html">graph</a> &g ) : buffer_node<T>(g) {}
-<a name="l01740"></a>01740     };
-<a name="l01741"></a>01741 
-<a name="l01743"></a>01743     <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l01744"></a><a class="code" href="a00283.html">01744</a>     <span class="keyword">class </span><a class="code" href="a00283.html">sequencer_node</a> : <span class="keyword">public</span> <a class="code" href="a00269.html">queue_node</a><T> {
-<a name="l01745"></a>01745         internal::function_body< T, size_t > *my_sequencer;
-<a name="l01746"></a>01746     <span class="keyword">public</span>:
-<a name="l01747"></a>01747 
-<a name="l01748"></a><a class="code" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">01748</a>         <span class="keyword">typedef</span> T <a class="code" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">input_type</a>;
-<a name="l01749"></a><a class="code" href="a00283.html#0c613bb01103dfcfbc3f9cbe943f95b0">01749</a>         <span class="keyword">typedef</span> T output_type;
-<a name="l01750"></a><a class="code" href="a00283.html#6581686ef0cf8e13c0270687628af5eb">01750</a>         <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01751"></a><a class="code" href="a00283.html#3591313e30d0f485a09106686067411f">01751</a>         <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01752"></a>01752 
-<a name="l01754"></a>01754         <span class="keyword">template</span>< <span class="keyword">typename</span> Sequencer >
-<a name="l01755"></a><a class="code" href="a00283.html#c3138c1c96b76ae9f13b0abbf7029590">01755</a>         <a class="code" href="a00283.html#c3138c1c96b76ae9f13b0abbf7029590">sequencer_node</a>( <a class="code" href="a00250.html">graph</a> &g, <span class="keyword">const</span> Sequencer& s ) : <a class="code" href="a00269.html">queue_node</a><T>(g),
-<a name="l01756"></a>01756             my_sequencer(new internal::function_body_leaf< T, size_t, Sequencer>(s) ) {}
-<a name="l01757"></a>01757 
-<a name="l01759"></a><a class="code" href="a00283.html#c87d80feebaf2bae4af22b5f2459b37e">01759</a>         <a class="code" href="a00283.html#c87d80feebaf2bae4af22b5f2459b37e">~sequencer_node</a>() { <span class="keyword">delete</span> my_sequencer; }
-<a name="l01760"></a>01760     <span class="keyword">protected</span>:
-<a name="l01761"></a>01761         <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::size_type</a> size_type;
-<a name="l01762"></a>01762         <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::buffer_operation</a> sequencer_operation;
-<a name="l01763"></a>01763 
-<a name="l01764"></a>01764         <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l01765"></a>01765 
-<a name="l01766"></a>01766     <span class="keyword">private</span>:
-<a name="l01767"></a>01767         <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_push(sequencer_operation *op) {
-<a name="l01768"></a>01768             size_type tag = (*my_sequencer)(*(op->elem));
-<a name="l01769"></a>01769 
-<a name="l01770"></a>01770             this->my_tail = (tag+1 > this->my_tail) ? tag+1 : this->my_tail;
-<a name="l01771"></a>01771             while ( this->my_tail - this->my_head >= this->my_array_size ) {
-<a name="l01772"></a>01772                 this-><a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>( this->my_tail - this->my_head  + 1);
-<a name="l01773"></a>01773             }
-<a name="l01774"></a>01774             this->my_array[tag&(this->my_array_size-1)] = std::make_pair( *(op->elem), <span class="keyword">true</span> );
-<a name="l01775"></a>01775             __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01776"></a>01776         }
-<a name="l01777"></a>01777     };
-<a name="l01778"></a>01778 
-<a name="l01780"></a>01780     <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> Compare = std::less<T> >
-<a name="l01781"></a><a class="code" href="a00268.html">01781</a>     <span class="keyword">class </span><a class="code" href="a00268.html">priority_queue_node</a> : <span class="keyword">public</span> buffer_node<T> {
-<a name="l01782"></a>01782     <span class="keyword">public</span>:
-<a name="l01783"></a><a class="code" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">01783</a>         <span class="keyword">typedef</span> T <a class="code" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">input_type</a>;
-<a name="l01784"></a><a class="code" href="a00268.html#3b3fa4479416e7cb6d4a6a4b175c2b15">01784</a>         <span class="keyword">typedef</span> T output_type;
-<a name="l01785"></a><a class="code" href="a00268.html#98900a87758cac05500fcbc74113cebf">01785</a>         <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01786"></a><a class="code" href="a00268.html#e01014f2e5ceea292c68f6fe47391c57">01786</a>         <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01787"></a>01787 
-<a name="l01789"></a><a class="code" href="a00268.html#1630f68674c4b201346a391b1e8d3f5d">01789</a>         <a class="code" href="a00268.html#1630f68674c4b201346a391b1e8d3f5d">priority_queue_node</a>( <a class="code" href="a00250.html">graph</a> &g ) : buffer_node<T>(g), mark(0) {}
-<a name="l01790"></a>01790 
-<a name="l01791"></a>01791     <span class="keyword">protected</span>:
-<a name="l01792"></a>01792         <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::size_type</a> size_type;
-<a name="l01793"></a>01793         <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::item_type</a> item_type;
-<a name="l01794"></a>01794         <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00225.html">buffer_node<T>::buffer_operation</a> prio_operation;
-<a name="l01795"></a>01795 
-<a name="l01796"></a>01796         <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
-<a name="l01797"></a>01797 
-<a name="l01798"></a>01798         <span class="comment">/* override */</span> <span class="keywordtype">void</span> handle_operations(prio_operation *op_list) {
-<a name="l01799"></a>01799             prio_operation *tmp <span class="comment">/*, *pop_list*/</span> ;
-<a name="l01800"></a>01800             <span class="keywordtype">bool</span> try_forwarding=<span class="keyword">false</span>;
-<a name="l01801"></a>01801             <span class="keywordflow">while</span> (op_list) {
-<a name="l01802"></a>01802                 tmp = op_list;
-<a name="l01803"></a>01803                 op_list = op_list->next;
-<a name="l01804"></a>01804                 <span class="keywordflow">switch</span> (tmp->type) {
-<a name="l01805"></a>01805                 <span class="keywordflow">case</span> buffer_node<T>::reg_succ: this-><a class="code" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">internal_reg_succ</a>(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01806"></a>01806                 <span class="keywordflow">case</span> buffer_node<T>::rem_succ: this-><a class="code" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">internal_rem_succ</a>(tmp); <span class="keywordflow">break</span>;
-<a name="l01807"></a>01807                 <span class="keywordflow">case</span> buffer_node<T>::put_item: internal_push(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01808"></a>01808                 <span class="keywordflow">case</span> buffer_node<T>::try_fwd: <a class="code" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">internal_forward</a>(tmp); <span class="keywordflow">break</span>;
-<a name="l01809"></a>01809                 <span class="keywordflow">case</span> buffer_node<T>::rel_res: internal_release(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01810"></a>01810                 <span class="keywordflow">case</span> buffer_node<T>::con_res: internal_consume(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
-<a name="l01811"></a>01811                 <span class="keywordflow">case</span> buffer_node<T>::req_item: internal_pop(tmp); <span class="keywordflow">break</span>;
-<a name="l01812"></a>01812                 <span class="keywordflow">case</span> buffer_node<T>::res_item: internal_reserve(tmp); <span class="keywordflow">break</span>;
-<a name="l01813"></a>01813                 }
-<a name="l01814"></a>01814             }
-<a name="l01815"></a>01815             <span class="comment">// process pops!  for now, no special pop processing</span>
-<a name="l01816"></a>01816             <span class="keywordflow">if</span> (mark<this->my_tail) heapify();
-<a name="l01817"></a>01817             <span class="keywordflow">if</span> (try_forwarding && !this->forwarder_busy) {
-<a name="l01818"></a>01818                 this->forwarder_busy = <span class="keyword">true</span>;
-<a name="l01819"></a>01819                 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>(*<span class="keyword">new</span>(task::allocate_additional_child_of(*(this->my_parent))) internal::forward_task< buffer_node<input_type> >(*<span class="keyword">this</span>));
-<a name="l01820"></a>01820             }
-<a name="l01821"></a>01821         }
-<a name="l01822"></a>01822 
-<a name="l01824"></a><a class="code" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">01824</a>         <span class="comment">/* override */</span> <span class="keywordtype">void</span> <a class="code" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">internal_forward</a>(prio_operation *op) {
-<a name="l01825"></a>01825             T i_copy;
-<a name="l01826"></a>01826             <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
-<a name="l01827"></a>01827             size_type counter = this->my_successors.size();
-<a name="l01828"></a>01828 
-<a name="l01829"></a>01829             <span class="keywordflow">if</span> (this->my_reserved || this->my_tail == 0) {
-<a name="l01830"></a>01830                 __TBB_store_with_release(op->status, FAILED);
-<a name="l01831"></a>01831                 this->forwarder_busy = <span class="keyword">false</span>;
-<a name="l01832"></a>01832                 <span class="keywordflow">return</span>;
-<a name="l01833"></a>01833             }
-<a name="l01834"></a>01834             <span class="comment">// Keep trying to send while there exists an accepting successor</span>
-<a name="l01835"></a>01835             <span class="keywordflow">while</span> (counter>0 && this->my_tail > 0) {
-<a name="l01836"></a>01836                 i_copy = this->my_array[0].first;
-<a name="l01837"></a>01837                 <span class="keywordtype">bool</span> msg = this->my_successors.try_put(i_copy);
-<a name="l01838"></a>01838                 <span class="keywordflow">if</span> ( msg == <span class="keyword">true</span> ) {
-<a name="l01839"></a>01839                      <span class="keywordflow">if</span> (mark == this->my_tail) --mark;
-<a name="l01840"></a>01840                     --(this->my_tail);
-<a name="l01841"></a>01841                     this->my_array[0].first=this->my_array[this->my_tail].first;
-<a name="l01842"></a>01842                     <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
-<a name="l01843"></a>01843                         reheap();
-<a name="l01844"></a>01844                     success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
-<a name="l01845"></a>01845                 }
-<a name="l01846"></a>01846                 --counter;
-<a name="l01847"></a>01847             }
-<a name="l01848"></a>01848             <span class="keywordflow">if</span> (success && !counter)
-<a name="l01849"></a>01849                 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01850"></a>01850             <span class="keywordflow">else</span> {
-<a name="l01851"></a>01851                 __TBB_store_with_release(op->status, FAILED);
-<a name="l01852"></a>01852                 this->forwarder_busy = <span class="keyword">false</span>;
-<a name="l01853"></a>01853             }
-<a name="l01854"></a>01854         }
-<a name="l01855"></a>01855 
-<a name="l01856"></a>01856         <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_push(prio_operation *op) {
-<a name="l01857"></a>01857             <span class="keywordflow">if</span> ( this->my_tail >= this->my_array_size )
-<a name="l01858"></a>01858                 this-><a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>( this->my_tail + 1 );
-<a name="l01859"></a>01859             this->my_array[this->my_tail] = std::make_pair( *(op->elem), <span class="keyword">true</span> );
-<a name="l01860"></a>01860             ++(this->my_tail);
-<a name="l01861"></a>01861             __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01862"></a>01862         }
-<a name="l01863"></a>01863         <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_pop(prio_operation *op) {
-<a name="l01864"></a>01864             <span class="keywordflow">if</span> ( this->my_reserved == <span class="keyword">true</span> || this->my_tail == 0 ) {
-<a name="l01865"></a>01865                 __TBB_store_with_release(op->status, FAILED);
-<a name="l01866"></a>01866             }
-<a name="l01867"></a>01867             <span class="keywordflow">else</span> {
-<a name="l01868"></a>01868                 <span class="keywordflow">if</span> (mark<this->my_tail &&
-<a name="l01869"></a>01869                     compare(this->my_array[0].first,
-<a name="l01870"></a>01870                             this->my_array[this->my_tail-1].first)) {
-<a name="l01871"></a>01871                     <span class="comment">// there are newly pushed elems; last one higher than top</span>
-<a name="l01872"></a>01872                     <span class="comment">// copy the data</span>
-<a name="l01873"></a>01873                     *(op->elem) = this->my_array[this->my_tail-1].first;
-<a name="l01874"></a>01874                     --(this->my_tail);
-<a name="l01875"></a>01875                     __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01876"></a>01876                 }
-<a name="l01877"></a>01877                 <span class="keywordflow">else</span> { <span class="comment">// extract and push the last element down heap</span>
-<a name="l01878"></a>01878                     *(op->elem) = this->my_array[0].first; <span class="comment">// copy the data</span>
-<a name="l01879"></a>01879                     if (mark == this->my_tail) --mark;
-<a name="l01880"></a>01880                     --(this->my_tail);
-<a name="l01881"></a>01881                     __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01882"></a>01882                     this->my_array[0].first=this->my_array[this->my_tail].first;
-<a name="l01883"></a>01883                     <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
-<a name="l01884"></a>01884                         reheap();
-<a name="l01885"></a>01885                 }
-<a name="l01886"></a>01886             }
-<a name="l01887"></a>01887         }
-<a name="l01888"></a>01888         <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_reserve(prio_operation *op) {
-<a name="l01889"></a>01889             <span class="keywordflow">if</span> (this->my_reserved == <span class="keyword">true</span> || this->my_tail == 0) {
-<a name="l01890"></a>01890                 __TBB_store_with_release(op->status, FAILED);
-<a name="l01891"></a>01891             }
-<a name="l01892"></a>01892             <span class="keywordflow">else</span> {
-<a name="l01893"></a>01893                 this->my_reserved = <span class="keyword">true</span>;
-<a name="l01894"></a>01894                 *(op->elem) = reserved_item = this->my_array[0].first;
-<a name="l01895"></a>01895                 if (mark == this->my_tail) --mark;
-<a name="l01896"></a>01896                 --(this->my_tail);
-<a name="l01897"></a>01897                 __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01898"></a>01898                 this->my_array[0].first = this->my_array[this->my_tail].first;
-<a name="l01899"></a>01899                 <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
-<a name="l01900"></a>01900                     reheap();
-<a name="l01901"></a>01901             }
-<a name="l01902"></a>01902         }
-<a name="l01903"></a>01903         <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_consume(prio_operation *op) {
-<a name="l01904"></a>01904             this->my_reserved = <span class="keyword">false</span>;
-<a name="l01905"></a>01905             __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01906"></a>01906         }
-<a name="l01907"></a>01907         <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_release(prio_operation *op) {
-<a name="l01908"></a>01908             <span class="keywordflow">if</span> (this->my_tail >= this->my_array_size)
-<a name="l01909"></a>01909                 this-><a class="code" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">grow_my_array</a>( this->my_tail + 1 );
-<a name="l01910"></a>01910             this->my_array[this->my_tail] = std::make_pair(reserved_item, <span class="keyword">true</span>);
-<a name="l01911"></a>01911             ++(this->my_tail);
-<a name="l01912"></a>01912             this->my_reserved = <span class="keyword">false</span>;
-<a name="l01913"></a>01913             __TBB_store_with_release(op->status, SUCCEEDED);
-<a name="l01914"></a>01914             heapify();
-<a name="l01915"></a>01915         }
-<a name="l01916"></a>01916     <span class="keyword">private</span>:
-<a name="l01917"></a>01917         Compare compare;
-<a name="l01918"></a>01918         size_type mark;
-<a name="l01919"></a>01919         <a class="code" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">input_type</a> reserved_item;
-<a name="l01920"></a>01920 
-<a name="l01921"></a>01921         <span class="keywordtype">void</span> heapify() {
-<a name="l01922"></a>01922             <span class="keywordflow">if</span> (!mark) mark = 1;
-<a name="l01923"></a>01923             <span class="keywordflow">for</span> (; mark<this->my_tail; ++mark) { <span class="comment">// for each unheaped element</span>
-<a name="l01924"></a>01924                 size_type cur_pos = mark;
-<a name="l01925"></a>01925                 <a class="code" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">input_type</a> to_place = this->my_array[mark].first;
-<a name="l01926"></a>01926                 <span class="keywordflow">do</span> { <span class="comment">// push to_place up the heap</span>
-<a name="l01927"></a>01927                     size_type parent = (cur_pos-1)>>1;
-<a name="l01928"></a>01928                     <span class="keywordflow">if</span> (!compare(this->my_array[parent].first, to_place))
-<a name="l01929"></a>01929                         <span class="keywordflow">break</span>;
-<a name="l01930"></a>01930                     this->my_array[cur_pos].first = this->my_array[parent].first;
-<a name="l01931"></a>01931                     cur_pos = parent;
-<a name="l01932"></a>01932                 } <span class="keywordflow">while</span>( cur_pos );
-<a name="l01933"></a>01933                 this->my_array[cur_pos].first = to_place;
-<a name="l01934"></a>01934             }
-<a name="l01935"></a>01935         }
-<a name="l01936"></a>01936 
-<a name="l01937"></a>01937         <span class="keywordtype">void</span> reheap() {
-<a name="l01938"></a>01938             size_type cur_pos=0, child=1;
-<a name="l01939"></a>01939             <span class="keywordflow">while</span> (child < mark) {
-<a name="l01940"></a>01940                 size_type target = child;
-<a name="l01941"></a>01941                 <span class="keywordflow">if</span> (child+1<mark &&
-<a name="l01942"></a>01942                     compare(this->my_array[child].first,
-<a name="l01943"></a>01943                             this->my_array[child+1].first))
-<a name="l01944"></a>01944                     ++target;
-<a name="l01945"></a>01945                 <span class="comment">// target now has the higher priority child</span>
-<a name="l01946"></a>01946                 <span class="keywordflow">if</span> (compare(this->my_array[target].first,
-<a name="l01947"></a>01947                             this->my_array[this->my_tail].first))
-<a name="l01948"></a>01948                     <span class="keywordflow">break</span>;
-<a name="l01949"></a>01949                 this->my_array[cur_pos].first = this->my_array[target].first;
-<a name="l01950"></a>01950                 cur_pos = target;
-<a name="l01951"></a>01951                 child = (cur_pos<<1)+1;
-<a name="l01952"></a>01952             }
-<a name="l01953"></a>01953             this->my_array[cur_pos].first = this->my_array[this->my_tail].first;
-<a name="l01954"></a>01954         }
-<a name="l01955"></a>01955     };
-<a name="l01956"></a>01956 
-<a name="l01958"></a>01958 
-<a name="l01961"></a>01961     <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l01962"></a><a class="code" href="a00255.html">01962</a>     <span class="keyword">class </span><a class="code" href="a00255.html">limiter_node</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00277.html">receiver</a>< T >, <span class="keyword">public</span> <a class="code" href="a00282.html">sender</a>< T >, internal::no_copy {
-<a name="l01963"></a>01963     <span class="keyword">public</span>:
-<a name="l01964"></a>01964 
-<a name="l01965"></a><a class="code" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">01965</a>         <span class="keyword">typedef</span> T <a class="code" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">input_type</a>;
-<a name="l01966"></a><a class="code" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">01966</a>         <span class="keyword">typedef</span> T output_type;
-<a name="l01967"></a><a class="code" href="a00255.html#fd88ce7670e7107aef2161b45f156185">01967</a>         <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender< input_type ></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l01968"></a><a class="code" href="a00255.html#754182cc1e5b403201495bc1fd45674b">01968</a>         <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver< output_type ></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l01969"></a>01969 
-<a name="l01970"></a>01970     <span class="keyword">private</span>:
-<a name="l01971"></a>01971 
-<a name="l01972"></a>01972         <a class="code" href="a00291.html">task</a> *my_root_task;
-<a name="l01973"></a>01973         size_t my_threshold;
-<a name="l01974"></a>01974         size_t my_count;
-<a name="l01975"></a>01975         internal::predecessor_cache< T > my_predecessors;
-<a name="l01976"></a>01976         <a class="code" href="a00286.html">spin_mutex</a> my_mutex;
-<a name="l01977"></a>01977         internal::broadcast_cache< T > my_successors;
-<a name="l01978"></a>01978 
-<a name="l01979"></a>01979         <span class="keyword">friend</span> <span class="keyword">class </span>internal::forward_task< limiter_node<T> >;
-<a name="l01980"></a>01980 
-<a name="l01981"></a>01981         <span class="comment">// Let decrementer call decrement_counter()</span>
-<a name="l01982"></a>01982         <span class="keyword">friend</span> <span class="keyword">class </span>internal::decrementer< limiter_node<T> >;
-<a name="l01983"></a>01983 
-<a name="l01984"></a>01984         <span class="keywordtype">void</span> decrement_counter() {
-<a name="l01985"></a>01985             <a class="code" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">input_type</a> v;
-<a name="l01986"></a>01986             
-<a name="l01987"></a>01987             <span class="comment">// If we can't get / put an item immediately then drop the count</span>
-<a name="l01988"></a>01988             <span class="keywordflow">if</span> ( my_predecessors.get_item( v ) == <span class="keyword">false</span> 
-<a name="l01989"></a>01989                  || my_successors.try_put(v) == false ) {
-<a name="l01990"></a>01990                 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l01991"></a>01991                 --my_count;
-<a name="l01992"></a>01992                 <span class="keywordflow">if</span> ( !my_predecessors.empty() ) 
-<a name="l01993"></a>01993                     <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) ) 
-<a name="l01994"></a>01994                                 internal::forward_task< <a class="code" href="a00255.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
-<a name="l01995"></a>01995             }
-<a name="l01996"></a>01996         }
-<a name="l01997"></a>01997 
-<a name="l01998"></a>01998         <span class="keywordtype">void</span> forward() {
-<a name="l01999"></a>01999             {
-<a name="l02000"></a>02000                 spin_mutex::scoped_lock lock(my_mutex);
-<a name="l02001"></a>02001                 <span class="keywordflow">if</span> ( my_count < my_threshold ) 
-<a name="l02002"></a>02002                     ++my_count;
-<a name="l02003"></a>02003                 <span class="keywordflow">else</span>
-<a name="l02004"></a>02004                     <span class="keywordflow">return</span>;
-<a name="l02005"></a>02005             }
-<a name="l02006"></a>02006             decrement_counter();
-<a name="l02007"></a>02007         }
-<a name="l02008"></a>02008 
-<a name="l02009"></a>02009     <span class="keyword">public</span>:
-<a name="l02010"></a>02010 
-<a name="l02012"></a><a class="code" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">02012</a>         internal::decrementer< limiter_node<T> > <a class="code" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">decrement</a>;
-<a name="l02013"></a>02013 
-<a name="l02015"></a><a class="code" href="a00255.html#f0139fc645a51ce30b7aebb59c38a4ed">02015</a>         <a class="code" href="a00255.html#f0139fc645a51ce30b7aebb59c38a4ed">limiter_node</a>( <a class="code" href="a00250.html">graph</a> &g, size_t threshold, <span class="keywordtype">int</span> number_of_decrement_predecessors = 0 ) : 
-<a name="l02016"></a>02016            my_root_task(g.root_task()), my_threshold(threshold), my_count(0), <a class="code" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">decrement</a>(number_of_decrement_predecessors) {
-<a name="l02017"></a>02017             my_predecessors.set_owner(<span class="keyword">this</span>);
-<a name="l02018"></a>02018             my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l02019"></a>02019             <a class="code" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">decrement</a>.set_owner(<span class="keyword">this</span>);
-<a name="l02020"></a>02020         }
-<a name="l02021"></a>02021 
-<a name="l02023"></a><a class="code" href="a00255.html#b8b9dbfbfc52750fa0c6bb8849681e86">02023</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00255.html#b8b9dbfbfc52750fa0c6bb8849681e86">register_successor</a>( <a class="code" href="a00277.html">receiver<output_type></a> &r ) {
-<a name="l02024"></a>02024             my_successors.register_successor(r);
-<a name="l02025"></a>02025             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02026"></a>02026         }
-<a name="l02027"></a>02027 
-<a name="l02029"></a>02029 
-<a name="l02030"></a><a class="code" href="a00255.html#047d77f583e789e6d3ac6a52aba3168b">02030</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00255.html#047d77f583e789e6d3ac6a52aba3168b">remove_successor</a>( <a class="code" href="a00277.html">receiver<output_type></a> &r ) {
-<a name="l02031"></a>02031             r.<a class="code" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">remove_predecessor</a>(*<span class="keyword">this</span>);
-<a name="l02032"></a>02032             my_successors.remove_successor(r);
-<a name="l02033"></a>02033             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02034"></a>02034         }
-<a name="l02035"></a>02035 
-<a name="l02037"></a><a class="code" href="a00255.html#a38facb46cde854cb7408bf9f3bf8999">02037</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00255.html#a38facb46cde854cb7408bf9f3bf8999">try_put</a>( T t ) {
-<a name="l02038"></a>02038             {
-<a name="l02039"></a>02039                 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l02040"></a>02040                 <span class="keywordflow">if</span> ( my_count >= my_threshold ) 
-<a name="l02041"></a>02041                     <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02042"></a>02042                 <span class="keywordflow">else</span>
-<a name="l02043"></a>02043                     ++my_count; 
-<a name="l02044"></a>02044             }
-<a name="l02045"></a>02045 
-<a name="l02046"></a>02046             <span class="keywordtype">bool</span> msg = my_successors.try_put(t);
-<a name="l02047"></a>02047 
-<a name="l02048"></a>02048             <span class="keywordflow">if</span> ( msg != <span class="keyword">true</span> ) {
-<a name="l02049"></a>02049                 <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l02050"></a>02050                 --my_count;
-<a name="l02051"></a>02051                 <span class="keywordflow">if</span> ( !my_predecessors.empty() ) 
-<a name="l02052"></a>02052                     <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) ) 
-<a name="l02053"></a>02053                                 internal::forward_task< <a class="code" href="a00255.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
-<a name="l02054"></a>02054             }
-<a name="l02055"></a>02055 
-<a name="l02056"></a>02056             <span class="keywordflow">return</span> msg;
-<a name="l02057"></a>02057         }
-<a name="l02058"></a>02058 
-<a name="l02060"></a><a class="code" href="a00255.html#fb9909b87538f5c881c7cb7577436d14">02060</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00255.html#fb9909b87538f5c881c7cb7577436d14">register_predecessor</a>( <a class="code" href="a00282.html">predecessor_type</a> &src ) {
-<a name="l02061"></a>02061             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> lock(my_mutex);
-<a name="l02062"></a>02062             my_predecessors.add( src );
-<a name="l02063"></a>02063             <span class="keywordflow">if</span> ( my_count < my_threshold && !my_successors.empty() ) 
-<a name="l02064"></a>02064                 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) ) 
-<a name="l02065"></a>02065                                internal::forward_task< <a class="code" href="a00255.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
-<a name="l02066"></a>02066             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02067"></a>02067         }
-<a name="l02068"></a>02068 
-<a name="l02070"></a><a class="code" href="a00255.html#a05cf39b2825183e9c0393890fbbbb41">02070</a>         <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00255.html#a05cf39b2825183e9c0393890fbbbb41">remove_predecessor</a>( <a class="code" href="a00282.html">predecessor_type</a> &src ) {
-<a name="l02071"></a>02071             my_predecessors.remove( src );
-<a name="l02072"></a>02072             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02073"></a>02073         }
-<a name="l02074"></a>02074 
-<a name="l02075"></a>02075     };
-<a name="l02076"></a>02076 
-<a name="l02077"></a>02077     <span class="keyword">namespace </span>internal {
-<a name="l02078"></a>02078 
-<a name="l02079"></a>02079     <span class="keyword">struct </span>forwarding_base {
-<a name="l02080"></a>02080         <span class="keyword">virtual</span> ~forwarding_base() {}
-<a name="l02081"></a>02081         <span class="keyword">virtual</span> <span class="keywordtype">void</span> decrement_port_count() = 0;
-<a name="l02082"></a>02082         <span class="keyword">virtual</span> <span class="keywordtype">void</span> increment_port_count() = 0;
-<a name="l02083"></a>02083     };
-<a name="l02084"></a>02084 
-<a name="l02085"></a>02085     <span class="keyword">template</span>< <span class="keywordtype">int</span> N >
-<a name="l02086"></a>02086     <span class="keyword">struct </span>join_helper {
-<a name="l02087"></a>02087 
-<a name="l02088"></a>02088         <span class="keyword">template</span>< <span class="keyword">typename</span> TupleType, <span class="keyword">typename</span> PortType >
-<a name="l02089"></a>02089         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> set_join_node_pointer(TupleType &my_input, PortType *port) {
-<a name="l02090"></a>02090             std::get<N-1>( my_input ).set_join_node_pointer(port);
-<a name="l02091"></a>02091             join_helper<N-1>::set_join_node_pointer( my_input, port );
-<a name="l02092"></a>02092         }
-<a name="l02093"></a>02093         <span class="keyword">template</span>< <span class="keyword">typename</span> TupleType >
-<a name="l02094"></a>02094         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> consume_reservations( TupleType &my_input ) {
-<a name="l02095"></a>02095             std::get<N-1>( my_input ).consume();
-<a name="l02096"></a>02096             join_helper<N-1>::consume_reservations( my_input );
-<a name="l02097"></a>02097         }
-<a name="l02098"></a>02098 
-<a name="l02099"></a>02099         <span class="keyword">template</span>< <span class="keyword">typename</span> TupleType >
-<a name="l02100"></a>02100         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> release_my_reservation( TupleType &my_input ) {
-<a name="l02101"></a>02101             std::get<N-1>( my_input ).<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>();
-<a name="l02102"></a>02102         }
-<a name="l02103"></a>02103 
-<a name="l02104"></a>02104         <span class="keyword">template</span> <<span class="keyword">typename</span> TupleType>
-<a name="l02105"></a>02105         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> release_reservations( TupleType &my_input) {
-<a name="l02106"></a>02106             join_helper<N-1>::release_reservations(my_input);
-<a name="l02107"></a>02107             release_my_reservation(my_input);
-<a name="l02108"></a>02108         }
-<a name="l02109"></a>02109 
-<a name="l02110"></a>02110         <span class="keyword">template</span>< <span class="keyword">typename</span> InputTuple, <span class="keyword">typename</span> OutputTuple >
-<a name="l02111"></a>02111         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> reserve( InputTuple &my_input, OutputTuple &out) {
-<a name="l02112"></a>02112             <span class="keywordflow">if</span> ( !std::get<N-1>( my_input ).reserve( std::get<N-1>( out ) ) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02113"></a>02113             <span class="keywordflow">if</span> ( !join_helper<N-1>::reserve( my_input, out ) ) {
-<a name="l02114"></a>02114                 release_my_reservation( my_input );
-<a name="l02115"></a>02115                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02116"></a>02116             }
-<a name="l02117"></a>02117             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02118"></a>02118         }
-<a name="l02119"></a>02119     };
-<a name="l02120"></a>02120 
-<a name="l02121"></a>02121     <span class="keyword">template</span>< >
-<a name="l02122"></a>02122     <span class="keyword">struct </span>join_helper<1> {
-<a name="l02123"></a>02123 
-<a name="l02124"></a>02124         <span class="keyword">template</span>< <span class="keyword">typename</span> TupleType, <span class="keyword">typename</span> PortType >
-<a name="l02125"></a>02125         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> set_join_node_pointer(TupleType &my_input, PortType *port) {
-<a name="l02126"></a>02126             std::get<0>( my_input ).set_join_node_pointer(port);
-<a name="l02127"></a>02127         }
-<a name="l02128"></a>02128 
-<a name="l02129"></a>02129         <span class="keyword">template</span>< <span class="keyword">typename</span> TupleType >
-<a name="l02130"></a>02130         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> consume_reservations( TupleType &my_input ) {
-<a name="l02131"></a>02131             std::get<0>( my_input ).consume();
-<a name="l02132"></a>02132         }
-<a name="l02133"></a>02133 
-<a name="l02134"></a>02134         <span class="keyword">template</span>< <span class="keyword">typename</span> TupleType >
-<a name="l02135"></a>02135         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> release_my_reservation( TupleType &my_input ) {
-<a name="l02136"></a>02136             std::get<0>( my_input ).<a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>();
-<a name="l02137"></a>02137         }
-<a name="l02138"></a>02138         
-<a name="l02139"></a>02139         <span class="keyword">template</span><<span class="keyword">typename</span> TupleType>
-<a name="l02140"></a>02140         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> release_reservations( TupleType &my_input) {
-<a name="l02141"></a>02141             release_my_reservation(my_input);
-<a name="l02142"></a>02142         }
-<a name="l02143"></a>02143 
-<a name="l02144"></a>02144         <span class="keyword">template</span>< <span class="keyword">typename</span> InputTuple, <span class="keyword">typename</span> OutputTuple >
-<a name="l02145"></a>02145         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> reserve( InputTuple &my_input, OutputTuple &out) {
-<a name="l02146"></a>02146             <span class="keywordflow">return</span> std::get<0>( my_input ).reserve( std::get<0>( out ) );
-<a name="l02147"></a>02147         }
-<a name="l02148"></a>02148     };
-<a name="l02149"></a>02149 
-<a name="l02150"></a>02150     <span class="keyword">namespace </span>join_policy_namespace {
-<a name="l02151"></a>02151         <span class="keyword">enum</span> join_policy { two_phase
-<a name="l02152"></a>02152         };
-<a name="l02153"></a>02153     }
-<a name="l02154"></a>02154     <span class="keyword">using namespace </span>join_policy_namespace;
-<a name="l02155"></a>02155 
-<a name="l02157"></a>02157     <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l02158"></a><a class="code" href="a00304.html">02158</a>     <span class="keyword">class </span><a class="code" href="a00304.html">two_phase_port</a> : <span class="keyword">public</span> <a class="code" href="a00277.html">receiver</a><T> {
-<a name="l02159"></a>02159     <span class="keyword">public</span>:
-<a name="l02160"></a><a class="code" href="a00304.html#0f464d59e15941d6d625e8c7d634e26b">02160</a>         <span class="keyword">typedef</span> T <a class="code" href="a00304.html#0f464d59e15941d6d625e8c7d634e26b">input_type</a>;
-<a name="l02161"></a><a class="code" href="a00304.html#37ee9b5320b631c39bccc0b4745d88d1">02161</a>         <span class="keyword">typedef</span> <a class="code" href="a00282.html">sender<T></a> <a class="code" href="a00282.html">predecessor_type</a>;
-<a name="l02162"></a>02162 
-<a name="l02164"></a><a class="code" href="a00304.html#60e17ef935031c86c4a288eafab5c066">02164</a>         <a class="code" href="a00304.html#60e17ef935031c86c4a288eafab5c066">two_phase_port</a>() : reserved(false) {
-<a name="l02165"></a>02165            my_join = NULL;
-<a name="l02166"></a>02166            my_predecessors.set_owner( <span class="keyword">this</span> );
-<a name="l02167"></a>02167         }
-<a name="l02168"></a>02168 
-<a name="l02169"></a>02169         <span class="comment">// copy constructor</span>
-<a name="l02170"></a>02170         <a class="code" href="a00304.html#60e17ef935031c86c4a288eafab5c066">two_phase_port</a>(<span class="keyword">const</span> <a class="code" href="a00304.html">two_phase_port</a>& <span class="comment">/* other */</span>) : <a class="code" href="a00277.html">receiver</a><T>() {
-<a name="l02171"></a>02171             reserved = <span class="keyword">false</span>;
-<a name="l02172"></a>02172             my_join = NULL;
-<a name="l02173"></a>02173             my_predecessors.set_owner( <span class="keyword">this</span> );
-<a name="l02174"></a>02174         }
-<a name="l02175"></a>02175 
-<a name="l02176"></a>02176         <span class="keywordtype">void</span> set_join_node_pointer(forwarding_base *join) {
-<a name="l02177"></a>02177             my_join = join;
-<a name="l02178"></a>02178         }
-<a name="l02179"></a>02179 
-<a name="l02180"></a><a class="code" href="a00304.html#f316c0d5ff67068ff23b684accbe87f4">02180</a>         <span class="keywordtype">bool</span> <a class="code" href="a00304.html#f316c0d5ff67068ff23b684accbe87f4">try_put</a>( T ) {
-<a name="l02181"></a>02181             <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02182"></a>02182         }
-<a name="l02183"></a>02183 
-<a name="l02185"></a><a class="code" href="a00304.html#6dc1f9bf02109c7f6fe4cc58bc31a00c">02185</a>         <span class="keywordtype">bool</span> <a class="code" href="a00304.html#6dc1f9bf02109c7f6fe4cc58bc31a00c">register_predecessor</a>( <a class="code" href="a00282.html">sender<T></a> &src ) {
-<a name="l02186"></a>02186             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02187"></a>02187             <span class="keywordtype">bool</span> no_predecessors = my_predecessors.empty();
-<a name="l02188"></a>02188             my_predecessors.add(src);
-<a name="l02189"></a>02189             <span class="keywordflow">if</span> ( no_predecessors ) {
-<a name="l02190"></a>02190                 my_join->decrement_port_count( );
-<a name="l02191"></a>02191             }
-<a name="l02192"></a>02192             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02193"></a>02193         }
-<a name="l02194"></a>02194 
-<a name="l02196"></a><a class="code" href="a00304.html#a734a55289804ff34ce1c6ac4c5075e4">02196</a>         <span class="keywordtype">bool</span> <a class="code" href="a00304.html#a734a55289804ff34ce1c6ac4c5075e4">remove_predecessor</a>( <a class="code" href="a00282.html">sender<T></a> &src ) {
-<a name="l02197"></a>02197             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02198"></a>02198             my_predecessors.remove( src );
-<a name="l02199"></a>02199             <span class="keywordflow">if</span>(my_predecessors.empty()) my_join->increment_port_count();
-<a name="l02200"></a>02200             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02201"></a>02201         }
-<a name="l02202"></a>02202 
-<a name="l02204"></a><a class="code" href="a00304.html#1d7399cfc77fca8878d8d16049ce4e7e">02204</a>         <span class="keywordtype">bool</span> <a class="code" href="a00304.html#1d7399cfc77fca8878d8d16049ce4e7e">reserve</a>( T &v ) {
-<a name="l02205"></a>02205             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02206"></a>02206             <span class="keywordflow">if</span> ( reserved ) {
-<a name="l02207"></a>02207                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02208"></a>02208             }
-<a name="l02209"></a>02209             <span class="keywordflow">if</span> ( my_predecessors.try_reserve( v ) ) {
-<a name="l02210"></a>02210                 reserved = <span class="keyword">true</span>;
-<a name="l02211"></a>02211                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02212"></a>02212             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( my_predecessors.empty() ) {
-<a name="l02213"></a>02213                 my_join->increment_port_count();
-<a name="l02214"></a>02214             }
-<a name="l02215"></a>02215             <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02216"></a>02216         }
-<a name="l02217"></a>02217 
-<a name="l02219"></a><a class="code" href="a00304.html#091f6efffaadbbeca6cf23483dabd891">02219</a>         <span class="keywordtype">void</span> <a class="code" href="a00304.html#091f6efffaadbbeca6cf23483dabd891">release</a>( ) {
-<a name="l02220"></a>02220             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02221"></a>02221             reserved = <span class="keyword">false</span>;
-<a name="l02222"></a>02222             my_predecessors.try_release( );
-<a name="l02223"></a>02223         }
-<a name="l02224"></a>02224 
-<a name="l02226"></a><a class="code" href="a00304.html#684f6bbc3290270ed43cb34ffd273f71">02226</a>         <span class="keywordtype">void</span> <a class="code" href="a00304.html#684f6bbc3290270ed43cb34ffd273f71">consume</a>( ) {
-<a name="l02227"></a>02227             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02228"></a>02228             reserved = <span class="keyword">false</span>;
-<a name="l02229"></a>02229             my_predecessors.try_consume( );
-<a name="l02230"></a>02230         }
-<a name="l02231"></a>02231 
-<a name="l02232"></a>02232     <span class="keyword">private</span>:
-<a name="l02233"></a>02233         <a class="code" href="a00286.html">spin_mutex</a> my_mutex;
-<a name="l02234"></a>02234         forwarding_base *my_join;
-<a name="l02235"></a>02235         reservable_predecessor_cache< T > my_predecessors;
-<a name="l02236"></a>02236         <span class="keywordtype">bool</span> reserved;
-<a name="l02237"></a>02237     };
-<a name="l02238"></a>02238 
-<a name="l02239"></a>02239     <span class="keyword">template</span><join_policy JP, <span class="keyword">typename</span> InputTuple, <span class="keyword">typename</span> OutputTuple>
-<a name="l02240"></a>02240     <span class="keyword">class </span>join_node_base;
-<a name="l02241"></a>02241 
-<a name="l02243"></a>02243     <span class="keyword">template</span><join_policy JP, <span class="keyword">typename</span> InputTuple, <span class="keyword">typename</span> OutputTuple>
-<a name="l02244"></a>02244     <span class="keyword">class </span>join_node_FE;
-<a name="l02245"></a>02245 
-<a name="l02246"></a>02246     <span class="keyword">template</span><<span class="keyword">typename</span> InputTuple, <span class="keyword">typename</span> OutputTuple>
-<a name="l02247"></a>02247     <span class="keyword">class </span>join_node_FE<two_phase, InputTuple, OutputTuple> : <span class="keyword">public</span> forwarding_base {
-<a name="l02248"></a>02248     <span class="keyword">public</span>:
-<a name="l02249"></a>02249         <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<OutputTuple>::value;
-<a name="l02250"></a>02250         <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02251"></a>02251         <span class="keyword">typedef</span> InputTuple input_type;
-<a name="l02252"></a>02252         <span class="keyword">typedef</span> join_node_base<two_phase, InputTuple, OutputTuple> my_node_type; <span class="comment">// for forwarding</span>
-<a name="l02253"></a>02253 
-<a name="l02254"></a>02254         join_node_FE(<a class="code" href="a00250.html">graph</a> &g) : my_root_task(g.root_task()), my_node(NULL) {
-<a name="l02255"></a>02255             ports_with_no_inputs = N;
-<a name="l02256"></a>02256             join_helper<N>::set_join_node_pointer(my_inputs, <span class="keyword">this</span>);
-<a name="l02257"></a>02257         }
-<a name="l02258"></a>02258 
-<a name="l02259"></a>02259         <span class="keywordtype">void</span> set_my_node(my_node_type *new_my_node) { my_node = new_my_node; }
-<a name="l02260"></a>02260 
-<a name="l02261"></a>02261        <span class="keywordtype">void</span> increment_port_count() {
-<a name="l02262"></a>02262             ++ports_with_no_inputs;
-<a name="l02263"></a>02263         }
-<a name="l02264"></a>02264 
-<a name="l02265"></a>02265         <span class="comment">// if all input_ports have predecessors, spawn forward to try and consume tuples</span>
-<a name="l02266"></a>02266         <span class="keywordtype">void</span> decrement_port_count() {
-<a name="l02267"></a>02267             <span class="keywordflow">if</span>(ports_with_no_inputs.fetch_and_decrement() == 1) {
-<a name="l02268"></a>02268                 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
-<a name="l02269"></a>02269                     forward_task<my_node_type>(*my_node) );
-<a name="l02270"></a>02270             }
-<a name="l02271"></a>02271         }
-<a name="l02272"></a>02272 
-<a name="l02273"></a>02273         input_type &inputs() { <span class="keywordflow">return</span> my_inputs; }
-<a name="l02274"></a>02274     <span class="keyword">protected</span>:
-<a name="l02275"></a>02275         <span class="comment">// all methods on input ports should be called under spin lock from join_node_base.</span>
-<a name="l02276"></a>02276 
-<a name="l02277"></a>02277         <span class="keywordtype">bool</span> tuple_build_may_succeed() {
-<a name="l02278"></a>02278             <span class="keywordflow">return</span> !ports_with_no_inputs;
-<a name="l02279"></a>02279         }
-<a name="l02280"></a>02280 
-<a name="l02281"></a>02281         <span class="keywordtype">bool</span> try_to_make_tuple(output_type &out) {
-<a name="l02282"></a>02282             <span class="keywordflow">if</span>(ports_with_no_inputs) <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02283"></a>02283             <span class="keywordflow">return</span> join_helper<N>::reserve(my_inputs, out);
-<a name="l02284"></a>02284         }
-<a name="l02285"></a>02285 
-<a name="l02286"></a>02286         <span class="keywordtype">void</span> tuple_accepted() {
-<a name="l02287"></a>02287             join_helper<N>::consume_reservations(my_inputs);
-<a name="l02288"></a>02288         }
-<a name="l02289"></a>02289         <span class="keywordtype">void</span> tuple_rejected() {
-<a name="l02290"></a>02290             join_helper<N>::release_reservations(my_inputs);
-<a name="l02291"></a>02291         }
-<a name="l02292"></a>02292 
-<a name="l02293"></a>02293         input_type my_inputs;
-<a name="l02294"></a>02294         task *my_root_task;
-<a name="l02295"></a>02295         my_node_type *my_node;
-<a name="l02296"></a>02296         atomic<size_t> ports_with_no_inputs;
-<a name="l02297"></a>02297     };
-<a name="l02298"></a>02298 
-<a name="l02300"></a>02300     <span class="keyword">template</span><join_policy JP, <span class="keyword">typename</span> InputTuple, <span class="keyword">typename</span> OutputTuple>
-<a name="l02301"></a><a class="code" href="a00254.html">02301</a>     <span class="keyword">class </span><a class="code" href="a00254.html">join_node_base</a> : <span class="keyword">public</span> <a class="code" href="a00251.html">graph_node</a>, <span class="keyword">public</span> join_node_FE<JP, InputTuple, OutputTuple>,
-<a name="l02302"></a>02302                            <span class="keyword">public</span> <a class="code" href="a00282.html">sender</a><OutputTuple>, no_copy {
-<a name="l02303"></a>02303     <span class="keyword">public</span>:
-<a name="l02304"></a><a class="code" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">02304</a>         <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02305"></a>02305 
-<a name="l02306"></a><a class="code" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">02306</a>         <span class="keyword">typedef</span> <a class="code" href="a00277.html">receiver<output_type></a> <a class="code" href="a00277.html">successor_type</a>;
-<a name="l02307"></a>02307         <span class="keyword">typedef</span> join_node_FE<JP, InputTuple, OutputTuple> input_ports_type;
-<a name="l02308"></a>02308         <span class="keyword">using</span> input_ports_type::tuple_build_may_succeed;
-<a name="l02309"></a>02309         <span class="keyword">using</span> input_ports_type::try_to_make_tuple;
-<a name="l02310"></a>02310         <span class="keyword">using</span> input_ports_type::tuple_accepted;
-<a name="l02311"></a>02311         <span class="keyword">using</span> input_ports_type::tuple_rejected;
-<a name="l02312"></a>02312 
-<a name="l02313"></a>02313         <a class="code" href="a00254.html">join_node_base</a>(<a class="code" href="a00250.html">graph</a> &g) : input_ports_type(g),  my_root_task(g.root_task()) {
-<a name="l02314"></a>02314             my_successors.set_owner(<span class="keyword">this</span>);
-<a name="l02315"></a>02315             input_ports_type::set_my_node(<span class="keyword">this</span>);
-<a name="l02316"></a>02316         }
-<a name="l02317"></a>02317 
-<a name="l02318"></a>02318         <span class="keywordtype">bool</span> register_successor(<a class="code" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">successor_type</a> &r) {
-<a name="l02319"></a>02319             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02320"></a>02320             my_successors.register_successor(r);
-<a name="l02321"></a>02321             <span class="keywordflow">if</span>(tuple_build_may_succeed()) {
-<a name="l02322"></a>02322                 <a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task) )
-<a name="l02323"></a>02323                         forward_task<<a class="code" href="a00254.html">join_node_base<JP,InputTuple,OutputTuple></a> >( *<span class="keyword">this</span> ) );
-<a name="l02324"></a>02324             }
-<a name="l02325"></a>02325             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02326"></a>02326         }
-<a name="l02327"></a>02327 
-<a name="l02328"></a>02328         <span class="keyword">template</span><size_t N>
-<a name="l02329"></a>02329         receiver<typename std::tuple_element<N, OutputTuple>::value> & input_port(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> std::get<N>(input_ports_type::inputs()); }
-<a name="l02330"></a>02330 
-<a name="l02331"></a>02331         <span class="keywordtype">bool</span> remove_successor( <a class="code" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">successor_type</a> &r) {
-<a name="l02332"></a>02332             spin_mutex::scoped_lock l(my_mutex);
-<a name="l02333"></a>02333             my_successors.remove_successor(r);
-<a name="l02334"></a>02334             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02335"></a>02335         }
-<a name="l02336"></a>02336 
-<a name="l02337"></a><a class="code" href="a00254.html#50c0e6465ac929a2e94d4e62a13ebeff">02337</a>         <span class="keywordtype">bool</span> <a class="code" href="a00254.html#50c0e6465ac929a2e94d4e62a13ebeff">try_get</a>( output_type &v) {
-<a name="l02338"></a>02338             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02339"></a>02339             <span class="keywordflow">if</span>(tuple_build_may_succeed()) {
-<a name="l02340"></a>02340                 <span class="keywordflow">if</span>(try_to_make_tuple(v)) {
-<a name="l02341"></a>02341                     <span class="comment">// successor requested, so acceptance guaranteed</span>
-<a name="l02342"></a>02342                     tuple_accepted();
-<a name="l02343"></a>02343                     <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l02344"></a>02344                 }
-<a name="l02345"></a>02345             }
-<a name="l02346"></a>02346             <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l02347"></a>02347         }
-<a name="l02348"></a>02348 
-<a name="l02349"></a>02349     <span class="keyword">private</span>:
-<a name="l02350"></a>02350         <a class="code" href="a00291.html">task</a> *my_root_task;
-<a name="l02351"></a>02351         broadcast_cache<output_type, null_rw_mutex> my_successors;
-<a name="l02352"></a>02352         <a class="code" href="a00286.html">spin_mutex</a> my_mutex;
-<a name="l02353"></a>02353 
-<a name="l02354"></a>02354         <span class="keyword">friend</span> <span class="keyword">class </span>forward_task< join_node_base<JP, InputTuple, OutputTuple> >;
-<a name="l02355"></a>02355 
-<a name="l02356"></a>02356         <span class="keywordtype">void</span> forward() {
-<a name="l02357"></a>02357             <a class="code" href="a00287.html">spin_mutex::scoped_lock</a> l(my_mutex);
-<a name="l02358"></a>02358             output_type out;
-<a name="l02359"></a>02359             <span class="keywordflow">if</span>(!tuple_build_may_succeed()) <span class="keywordflow">return</span>;
-<a name="l02360"></a>02360             <span class="keywordflow">while</span>(try_to_make_tuple(out)) {
-<a name="l02361"></a>02361                 <span class="keywordflow">if</span>(my_successors.try_put(out)) {
-<a name="l02362"></a>02362                     tuple_accepted();
-<a name="l02363"></a>02363                 }
-<a name="l02364"></a>02364                 <span class="keywordflow">else</span> {
-<a name="l02365"></a>02365                     tuple_rejected();
-<a name="l02366"></a>02366                     <span class="keywordflow">return</span>;
-<a name="l02367"></a>02367                 }
-<a name="l02368"></a>02368             }
-<a name="l02369"></a>02369         }
-<a name="l02370"></a>02370     };
-<a name="l02371"></a>02371 
-<a name="l02373"></a>02373     <span class="comment">//  using tuple_element.</span>
-<a name="l02374"></a>02374     <span class="keyword">template</span><<span class="keywordtype">int</span> N, <span class="keyword">typename</span> OutputTuple, join_policy JP>
-<a name="l02375"></a>02375     <span class="keyword">class </span>unfolded_join_node;
-<a name="l02376"></a>02376 
-<a name="l02377"></a>02377     <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02378"></a>02378     <span class="keyword">class </span>unfolded_join_node<2,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02379"></a>02379         std::tuple<
-<a name="l02380"></a>02380                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-<a name="l02381"></a>02381                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type> >,
-<a name="l02382"></a>02382         OutputTuple
-<a name="l02383"></a>02383                   >
-<a name="l02384"></a>02384                   {
-<a name="l02385"></a>02385     <span class="keyword">private</span>:
-<a name="l02386"></a>02386         <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02387"></a>02387                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-<a name="l02388"></a>02388                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type> > port_tuple_type;
-<a name="l02389"></a>02389     <span class="keyword">public</span>:
-<a name="l02390"></a>02390         <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02391"></a>02391     <span class="keyword">private</span>:
-<a name="l02392"></a>02392         <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02393"></a>02393     <span class="keyword">public</span>:
-<a name="l02394"></a>02394         unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02395"></a>02395     };
-<a name="l02396"></a>02396 
-<a name="l02397"></a>02397     <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02398"></a>02398     <span class="keyword">class </span>unfolded_join_node<3,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02399"></a>02399         std::tuple<
-<a name="l02400"></a>02400                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02401"></a>02401                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02402"></a>02402                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type> >,
-<a name="l02403"></a>02403         OutputTuple
-<a name="l02404"></a>02404                     >
-<a name="l02405"></a>02405                     {
-<a name="l02406"></a>02406     <span class="keyword">private</span>:
-<a name="l02407"></a>02407         <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02408"></a>02408                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-<a name="l02409"></a>02409                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-<a name="l02410"></a>02410                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type> > port_tuple_type;
-<a name="l02411"></a>02411     <span class="keyword">public</span>:
-<a name="l02412"></a>02412         <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02413"></a>02413     <span class="keyword">private</span>:
-<a name="l02414"></a>02414         <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02415"></a>02415     <span class="keyword">public</span>:
-<a name="l02416"></a>02416         unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02417"></a>02417     };
-<a name="l02418"></a>02418 
-<a name="l02419"></a>02419     <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02420"></a>02420     <span class="keyword">class </span>unfolded_join_node<4,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02421"></a>02421         std::tuple<
-<a name="l02422"></a>02422                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02423"></a>02423                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02424"></a>02424                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02425"></a>02425                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type> >,
-<a name="l02426"></a>02426         OutputTuple
-<a name="l02427"></a>02427                     > {
-<a name="l02428"></a>02428     <span class="keyword">private</span>:
-<a name="l02429"></a>02429         <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02430"></a>02430                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-<a name="l02431"></a>02431                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-<a name="l02432"></a>02432                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-<a name="l02433"></a>02433                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type> > port_tuple_type;
-<a name="l02434"></a>02434     <span class="keyword">public</span>:
-<a name="l02435"></a>02435         <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02436"></a>02436     <span class="keyword">private</span>:
-<a name="l02437"></a>02437         <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02438"></a>02438     <span class="keyword">public</span>:
-<a name="l02439"></a>02439         unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02440"></a>02440     };
-<a name="l02441"></a>02441 
-<a name="l02442"></a>02442     <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02443"></a>02443     <span class="keyword">class </span>unfolded_join_node<5,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02444"></a>02444         std::tuple<
-<a name="l02445"></a>02445                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02446"></a>02446                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02447"></a>02447                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02448"></a>02448                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02449"></a>02449                 two_phase_port<typename std::tuple_element<4,OutputTuple>::type> >,
-<a name="l02450"></a>02450         OutputTuple
-<a name="l02451"></a>02451                 > {
-<a name="l02452"></a>02452     <span class="keyword">private</span>:
-<a name="l02453"></a>02453         <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02454"></a>02454                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-<a name="l02455"></a>02455                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-<a name="l02456"></a>02456                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-<a name="l02457"></a>02457                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>, 
-<a name="l02458"></a>02458                 two_phase_port<typename std::tuple_element<4,OutputTuple>::type> > port_tuple_type;
-<a name="l02459"></a>02459     <span class="keyword">public</span>:
-<a name="l02460"></a>02460         <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02461"></a>02461     <span class="keyword">private</span>:
-<a name="l02462"></a>02462         <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02463"></a>02463     <span class="keyword">public</span>:
-<a name="l02464"></a>02464         unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02465"></a>02465     };
-<a name="l02466"></a>02466 
-<a name="l02467"></a>02467     <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02468"></a>02468     <span class="keyword">class </span>unfolded_join_node<6,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02469"></a>02469         std::tuple<
-<a name="l02470"></a>02470                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02471"></a>02471                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02472"></a>02472                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02473"></a>02473                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02474"></a>02474                 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02475"></a>02475                 two_phase_port<typename std::tuple_element<5,OutputTuple>::type> >,
-<a name="l02476"></a>02476         OutputTuple
-<a name="l02477"></a>02477                     > {
-<a name="l02478"></a>02478     <span class="keyword">private</span>:
-<a name="l02479"></a>02479         <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02480"></a>02480                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-<a name="l02481"></a>02481                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-<a name="l02482"></a>02482                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-<a name="l02483"></a>02483                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>, 
-<a name="l02484"></a>02484                 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>, 
-<a name="l02485"></a>02485                 two_phase_port<typename std::tuple_element<5,OutputTuple>::type> > port_tuple_type;
-<a name="l02486"></a>02486     <span class="keyword">public</span>:
-<a name="l02487"></a>02487         <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02488"></a>02488     <span class="keyword">private</span>:
-<a name="l02489"></a>02489         <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02490"></a>02490     <span class="keyword">public</span>:
-<a name="l02491"></a>02491         unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02492"></a>02492     };
-<a name="l02493"></a>02493 
-<a name="l02494"></a>02494     <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02495"></a>02495     <span class="keyword">class </span>unfolded_join_node<7,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02496"></a>02496         std::tuple<
-<a name="l02497"></a>02497                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02498"></a>02498                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02499"></a>02499                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02500"></a>02500                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02501"></a>02501                 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02502"></a>02502                 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-<a name="l02503"></a>02503                 two_phase_port<typename std::tuple_element<6,OutputTuple>::type> >,
-<a name="l02504"></a>02504         OutputTuple
-<a name="l02505"></a>02505                 > {
-<a name="l02506"></a>02506     <span class="keyword">private</span>:
-<a name="l02507"></a>02507         <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02508"></a>02508                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-<a name="l02509"></a>02509                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-<a name="l02510"></a>02510                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-<a name="l02511"></a>02511                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>, 
-<a name="l02512"></a>02512                 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>, 
-<a name="l02513"></a>02513                 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>, 
-<a name="l02514"></a>02514                 two_phase_port<typename std::tuple_element<6,OutputTuple>::type> > port_tuple_type;
-<a name="l02515"></a>02515     <span class="keyword">public</span>:
-<a name="l02516"></a>02516         <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02517"></a>02517     <span class="keyword">private</span>:
-<a name="l02518"></a>02518         <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02519"></a>02519     <span class="keyword">public</span>:
-<a name="l02520"></a>02520         unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02521"></a>02521     };
-<a name="l02522"></a>02522 
-<a name="l02523"></a>02523     <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02524"></a>02524     <span class="keyword">class </span>unfolded_join_node<8,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02525"></a>02525         std::tuple<
-<a name="l02526"></a>02526                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02527"></a>02527                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02528"></a>02528                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02529"></a>02529                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02530"></a>02530                 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02531"></a>02531                 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-<a name="l02532"></a>02532                 two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
-<a name="l02533"></a>02533                 two_phase_port<typename std::tuple_element<7,OutputTuple>::type> >,
-<a name="l02534"></a>02534         OutputTuple
-<a name="l02535"></a>02535                 > {
-<a name="l02536"></a>02536     <span class="keyword">private</span>:
-<a name="l02537"></a>02537         <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02538"></a>02538                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-<a name="l02539"></a>02539                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-<a name="l02540"></a>02540                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-<a name="l02541"></a>02541                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>, 
-<a name="l02542"></a>02542                 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>, 
-<a name="l02543"></a>02543                 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>, 
-<a name="l02544"></a>02544                 two_phase_port<typename std::tuple_element<6,OutputTuple>::type>, 
-<a name="l02545"></a>02545                 two_phase_port<typename std::tuple_element<7,OutputTuple>::type> > port_tuple_type;
-<a name="l02546"></a>02546     <span class="keyword">public</span>:
-<a name="l02547"></a>02547         <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02548"></a>02548     <span class="keyword">private</span>:
-<a name="l02549"></a>02549         <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02550"></a>02550     <span class="keyword">public</span>:
-<a name="l02551"></a>02551         unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02552"></a>02552     };
-<a name="l02553"></a>02553 
-<a name="l02554"></a>02554     <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02555"></a>02555     <span class="keyword">class </span>unfolded_join_node<9,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02556"></a>02556         std::tuple<
-<a name="l02557"></a>02557                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02558"></a>02558                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02559"></a>02559                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02560"></a>02560                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02561"></a>02561                 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02562"></a>02562                 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-<a name="l02563"></a>02563                 two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
-<a name="l02564"></a>02564                 two_phase_port<typename std::tuple_element<7,OutputTuple>::type>,
-<a name="l02565"></a>02565                 two_phase_port<typename std::tuple_element<8,OutputTuple>::type> >,
-<a name="l02566"></a>02566         OutputTuple
-<a name="l02567"></a>02567                 > {
-<a name="l02568"></a>02568     <span class="keyword">private</span>:
-<a name="l02569"></a>02569         <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02570"></a>02570                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-<a name="l02571"></a>02571                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-<a name="l02572"></a>02572                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-<a name="l02573"></a>02573                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>, 
-<a name="l02574"></a>02574                 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>, 
-<a name="l02575"></a>02575                 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>, 
-<a name="l02576"></a>02576                 two_phase_port<typename std::tuple_element<6,OutputTuple>::type>, 
-<a name="l02577"></a>02577                 two_phase_port<typename std::tuple_element<7,OutputTuple>::type>, 
-<a name="l02578"></a>02578                 two_phase_port<typename std::tuple_element<8,OutputTuple>::type> > port_tuple_type;
-<a name="l02579"></a>02579     <span class="keyword">public</span>:
-<a name="l02580"></a>02580         <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02581"></a>02581     <span class="keyword">private</span>:
-<a name="l02582"></a>02582         <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02583"></a>02583     <span class="keyword">public</span>:
-<a name="l02584"></a>02584         unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02585"></a>02585     };
-<a name="l02586"></a>02586 
-<a name="l02587"></a>02587     <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
-<a name="l02588"></a>02588     <span class="keyword">class </span>unfolded_join_node<10,OutputTuple,two_phase> : <span class="keyword">public</span> internal::join_node_base<two_phase,
-<a name="l02589"></a>02589         std::tuple<
-<a name="l02590"></a>02590                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-<a name="l02591"></a>02591                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-<a name="l02592"></a>02592                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-<a name="l02593"></a>02593                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-<a name="l02594"></a>02594                 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-<a name="l02595"></a>02595                 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-<a name="l02596"></a>02596                 two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
-<a name="l02597"></a>02597                 two_phase_port<typename std::tuple_element<7,OutputTuple>::type>,
-<a name="l02598"></a>02598                 two_phase_port<typename std::tuple_element<8,OutputTuple>::type>,
-<a name="l02599"></a>02599                 two_phase_port<typename std::tuple_element<9,OutputTuple>::type> >,
-<a name="l02600"></a>02600         OutputTuple
-<a name="l02601"></a>02601                 > {
-<a name="l02602"></a>02602     <span class="keyword">private</span>:
-<a name="l02603"></a>02603         <span class="keyword">typedef</span> <span class="keyword">typename</span> std::tuple<
-<a name="l02604"></a>02604                 two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-<a name="l02605"></a>02605                 two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-<a name="l02606"></a>02606                 two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-<a name="l02607"></a>02607                 two_phase_port<typename std::tuple_element<3,OutputTuple>::type>, 
-<a name="l02608"></a>02608                 two_phase_port<typename std::tuple_element<4,OutputTuple>::type>, 
-<a name="l02609"></a>02609                 two_phase_port<typename std::tuple_element<5,OutputTuple>::type>, 
-<a name="l02610"></a>02610                 two_phase_port<typename std::tuple_element<6,OutputTuple>::type>, 
-<a name="l02611"></a>02611                 two_phase_port<typename std::tuple_element<7,OutputTuple>::type>, 
-<a name="l02612"></a>02612                 two_phase_port<typename std::tuple_element<8,OutputTuple>::type>, 
-<a name="l02613"></a>02613                 two_phase_port<typename std::tuple_element<9,OutputTuple>::type> > port_tuple_type;
-<a name="l02614"></a>02614     <span class="keyword">public</span>:
-<a name="l02615"></a>02615         <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02616"></a>02616     <span class="keyword">private</span>:
-<a name="l02617"></a>02617         <span class="keyword">typedef</span> join_node_base<two_phase, port_tuple_type, output_type > base_type;
-<a name="l02618"></a>02618     <span class="keyword">public</span>:
-<a name="l02619"></a>02619         unfolded_join_node(graph &g) : base_type(g) {}
-<a name="l02620"></a>02620     };
-<a name="l02621"></a>02621 
-<a name="l02622"></a>02622     } <span class="comment">// namespace internal</span>
-<a name="l02623"></a>02623 
-<a name="l02624"></a>02624 <span class="keyword">using namespace </span>internal::join_policy_namespace;
-<a name="l02625"></a>02625 
-<a name="l02626"></a>02626 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple, join_policy JP=two_phase>
-<a name="l02627"></a>02627 <span class="keyword">class </span>join_node: <span class="keyword">public</span> internal::unfolded_join_node<std::tuple_size<OutputTuple>::value, OutputTuple, JP> {
-<a name="l02628"></a>02628 <span class="keyword">private</span>:
-<a name="l02629"></a>02629     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<OutputTuple>::value;
-<a name="l02630"></a>02630     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::unfolded_join_node<N, OutputTuple, JP> unfolded_type;
-<a name="l02631"></a>02631 <span class="keyword">public</span>:
-<a name="l02632"></a>02632     <span class="keyword">typedef</span> OutputTuple output_type;
-<a name="l02633"></a>02633     join_node(graph &g) : unfolded_type(g) { }
-<a name="l02634"></a>02634 };
-<a name="l02635"></a>02635 
-<a name="l02636"></a>02636     <span class="comment">//</span>
-<a name="l02637"></a>02637     <span class="comment">// Making edges</span>
-<a name="l02638"></a>02638     <span class="comment">//</span>
-<a name="l02639"></a>02639   
-<a name="l02641"></a>02641     <span class="keyword">template</span>< <span class="keyword">typename</span> T >
-<a name="l02642"></a><a class="code" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">02642</a>     <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">make_edge</a>( <a class="code" href="a00282.html">sender<T></a> &p, <a class="code" href="a00277.html">receiver<T></a> &s ) {
-<a name="l02643"></a>02643         p.<a class="code" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">register_successor</a>( s );
-<a name="l02644"></a>02644     }
-<a name="l02645"></a>02645 
-<a name="l02647"></a>02647     <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> SIterator >
-<a name="l02648"></a><a class="code" href="a00362.html#ac6def751039959ab7ab1e52c8535fd3">02648</a>     <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00362.html#ac6def751039959ab7ab1e52c8535fd3">make_edges</a>( <a class="code" href="a00282.html">sender<T></a> &p, SIterator s_begin, SIterator s_end ) {
-<a name="l02649"></a>02649         <span class="keywordflow">for</span> ( SIterator i = s_begin; i != s_end; ++i ) {
-<a name="l02650"></a>02650             <a class="code" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">make_edge</a>( p, **i );
-<a name="l02651"></a>02651         }
-<a name="l02652"></a>02652     }
-<a name="l02653"></a>02653 
-<a name="l02655"></a>02655     <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> PIterator >
-<a name="l02656"></a><a class="code" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">02656</a>     <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00362.html#ac6def751039959ab7ab1e52c8535fd3">make_edges</a>( PIterator p_begin, PIterator p_end, <a class="code" href="a00277.html">receiver<T></a> &s ) {
-<a name="l02657"></a>02657         <span class="keywordflow">for</span> ( PIterator i = p_begin; i != p_end; ++i ) {
-<a name="l02658"></a>02658             <a class="code" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">make_edge</a>( **i, s );
-<a name="l02659"></a>02659         }
-<a name="l02660"></a>02660     }
-<a name="l02661"></a>02661 
-<a name="l02662"></a>02662 }
-<a name="l02663"></a>02663 
-<a name="l02664"></a>02664 <span class="preprocessor">#endif</span>
-<a name="l02665"></a>02665 <span class="preprocessor"></span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00468.html b/doc/html/a00468.html
new file mode 100644
index 0000000..2bbd57d
--- /dev/null
+++ b/doc/html/a00468.html
@@ -0,0 +1,1479 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>flow_graph.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="files.html"><span>File List</span></a></li>
+    <li><a href="globals.html"><span>File Members</span></a></li>
+  </ul></div>
+<h1>flow_graph.h</h1><a href="a00343.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
+<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment">    writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020 
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_flow_graph_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_flow_graph_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include "spin_mutex.h"</span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include "null_mutex.h"</span>
+<a name="l00028"></a>00028 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
+<a name="l00029"></a>00029 <span class="preprocessor">#include "null_rw_mutex.h"</span>
+<a name="l00030"></a>00030 <span class="preprocessor">#include "task.h"</span>
+<a name="l00031"></a>00031 <span class="preprocessor">#include "concurrent_vector.h"</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include "internal/_aggregator_impl.h"</span>
+<a name="l00033"></a>00033 
+<a name="l00034"></a>00034 <span class="comment">// use the VC10 or gcc version of tuple if it is available.</span>
+<a name="l00035"></a>00035 <span class="preprocessor">#if TBB_IMPLEMENT_CPP0X && (!defined(_MSC_VER) || _MSC_VER < 1600)</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#define TBB_PREVIEW_TUPLE 1</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#include "compat/tuple"</span>
+<a name="l00038"></a>00038 <span class="preprocessor">#else</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#include <tuple></span>
+<a name="l00040"></a>00040 <span class="preprocessor">#endif</span>
+<a name="l00041"></a>00041 <span class="preprocessor"></span>
+<a name="l00042"></a>00042 <span class="preprocessor">#include<list></span>
+<a name="l00043"></a>00043 <span class="preprocessor">#include<queue></span>
+<a name="l00044"></a>00044 
+<a name="l00055"></a>00055 <span class="keyword">namespace </span>tbb {
+<a name="l00056"></a>00056 <span class="keyword">namespace </span>flow {
+<a name="l00057"></a>00057 
+<a name="l00059"></a>00059 <span class="keyword">enum</span> concurrency { unlimited = 0, serial = 1 };
+<a name="l00060"></a>00060 
+<a name="l00061"></a>00061 <span class="keyword">namespace </span>interface6 {
+<a name="l00062"></a>00062 
+<a name="l00064"></a><a class="code" href="a00263.html">00064</a> <span class="keyword">class </span><a class="code" href="a00263.html">graph_node</a> {
+<a name="l00065"></a>00065 <span class="keyword">public</span>:
+<a name="l00066"></a>00066     <span class="keyword">virtual</span> ~<a class="code" href="a00263.html">graph_node</a>() {} 
+<a name="l00067"></a>00067 }; 
+<a name="l00068"></a>00068 
+<a name="l00070"></a><a class="code" href="a00251.html">00070</a> <span class="keyword">class </span><a class="code" href="a00251.html">continue_msg</a> {};
+<a name="l00071"></a>00071         
+<a name="l00072"></a>00072 <span class="keyword">template</span>< <span class="keyword">typename</span> T > <span class="keyword">class </span><a class="code" href="a00301.html">sender</a>;
+<a name="l00073"></a>00073 <span class="keyword">template</span>< <span class="keyword">typename</span> T > <span class="keyword">class </span><a class="code" href="a00295.html">receiver</a>;
+<a name="l00074"></a>00074 <span class="keyword">class </span><a class="code" href="a00253.html">continue_receiver</a>;
+<a name="l00075"></a>00075         
+<a name="l00077"></a>00077 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l00078"></a><a class="code" href="a00301.html">00078</a> <span class="keyword">class </span><a class="code" href="a00301.html">sender</a> {
+<a name="l00079"></a>00079 <span class="keyword">public</span>:
+<a name="l00081"></a><a class="code" href="a00301.html#127af99916cc085cd9dbc09c53299928">00081</a>     <span class="keyword">typedef</span> T <a class="code" href="a00301.html#127af99916cc085cd9dbc09c53299928">output_type</a>;
+<a name="l00082"></a>00082         
+<a name="l00084"></a><a class="code" href="a00301.html#d690e8a54e358968f0ee4fdf9ee73068">00084</a>     <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver<T></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00085"></a>00085         
+<a name="l00086"></a>00086     <span class="keyword">virtual</span> ~<a class="code" href="a00301.html">sender</a>() {}
+<a name="l00087"></a>00087         
+<a name="l00089"></a>00089     <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a>( <a class="code" href="a00301.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a> &r ) = 0;
+<a name="l00090"></a>00090         
+<a name="l00092"></a>00092     <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a>( <a class="code" href="a00301.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a> &r ) = 0;
+<a name="l00093"></a>00093         
+<a name="l00095"></a><a class="code" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">00095</a>     <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>( T & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00096"></a>00096         
+<a name="l00098"></a><a class="code" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">00098</a>     <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>( T & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00099"></a>00099         
+<a name="l00101"></a><a class="code" href="a00301.html#27036b06d6a91e97007e14f400529199">00101</a>     <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#27036b06d6a91e97007e14f400529199">try_release</a>( ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00102"></a>00102         
+<a name="l00104"></a><a class="code" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">00104</a>     <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>( ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00105"></a>00105         
+<a name="l00106"></a>00106 };
+<a name="l00107"></a>00107         
+<a name="l00108"></a>00108         
+<a name="l00110"></a>00110 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l00111"></a><a class="code" href="a00295.html">00111</a> <span class="keyword">class </span><a class="code" href="a00295.html">receiver</a> {
+<a name="l00112"></a>00112 <span class="keyword">public</span>:
+<a name="l00113"></a>00113         
+<a name="l00115"></a><a class="code" href="a00295.html#0d0524c99313dedea1e04464bbf2f7ef">00115</a>     <span class="keyword">typedef</span> T <a class="code" href="a00251.html">input_type</a>;
+<a name="l00116"></a>00116         
+<a name="l00118"></a><a class="code" href="a00295.html#7fa8cff811e7c1589b805a4bb4c7a74f">00118</a>     <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender<T></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00119"></a>00119         
+<a name="l00121"></a><a class="code" href="a00295.html#b00699b235435f7b65b663d5063624a1">00121</a>     <span class="keyword">virtual</span> <a class="code" href="a00295.html#b00699b235435f7b65b663d5063624a1">~receiver</a>() {}
+<a name="l00122"></a>00122         
+<a name="l00124"></a>00124     <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00295.html#c6d5d0cb8ebe5771be91933609fe31b8">try_put</a>( <span class="keyword">const</span> T& t ) = 0;
+<a name="l00125"></a>00125         
+<a name="l00127"></a><a class="code" href="a00295.html#30e3316466efe3a713c23062b6e806f3">00127</a>     <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00295.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>( <a class="code" href="a00301.html">predecessor_type</a> & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00128"></a>00128         
+<a name="l00130"></a><a class="code" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">00130</a>     <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>( <a class="code" href="a00301.html">predecessor_type</a> & ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00131"></a>00131         
+<a name="l00132"></a>00132 };
+<a name="l00133"></a>00133         
+<a name="l00135"></a>00135 
+<a name="l00136"></a><a class="code" href="a00253.html">00136</a> <span class="keyword">class </span><a class="code" href="a00253.html">continue_receiver</a> : <span class="keyword">public</span> <a class="code" href="a00295.html">receiver</a>< continue_msg > {
+<a name="l00137"></a>00137 <span class="keyword">public</span>:
+<a name="l00138"></a>00138         
+<a name="l00140"></a><a class="code" href="a00253.html#3c43c166af832d9187035985841e0a7f">00140</a>     <span class="keyword">typedef</span> <a class="code" href="a00251.html">continue_msg</a> <a class="code" href="a00251.html">input_type</a>;
+<a name="l00141"></a>00141         
+<a name="l00143"></a><a class="code" href="a00253.html#f9c58b3e9c46afd2518d0fd8957a5a2f">00143</a>     <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< continue_msg ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00144"></a>00144         
+<a name="l00146"></a><a class="code" href="a00253.html#177db82d548a1f8471371331890b91a8">00146</a>     <a class="code" href="a00253.html#177db82d548a1f8471371331890b91a8">continue_receiver</a>( <span class="keywordtype">int</span> number_of_predecessors = 0 ) { 
+<a name="l00147"></a>00147         my_predecessor_count = my_initial_predecessor_count = number_of_predecessors;
+<a name="l00148"></a>00148         my_current_count = 0;
+<a name="l00149"></a>00149     }
+<a name="l00150"></a>00150         
+<a name="l00152"></a><a class="code" href="a00253.html#a0b292ed7fa6556b2a735f6d1e82dc74">00152</a>     <a class="code" href="a00253.html#177db82d548a1f8471371331890b91a8">continue_receiver</a>( <span class="keyword">const</span> <a class="code" href="a00253.html">continue_receiver</a>& src ) : <a class="code" href="a00295.html">receiver</a><<a class="code" href="a00251.html">continue_msg</a>>() { 
+<a name="l00153"></a>00153         my_predecessor_count = my_initial_predecessor_count = src.<a class="code" href="a00253.html#8a0d4c3084fd13902c2d38f31c1dc232">my_initial_predecessor_count</a>;
+<a name="l00154"></a>00154         my_current_count = 0;
+<a name="l00155"></a>00155     }
+<a name="l00156"></a>00156         
+<a name="l00158"></a><a class="code" href="a00253.html#1e14828fa079b9835ff7267df5ee45d7">00158</a>     <span class="keyword">virtual</span> <a class="code" href="a00253.html#1e14828fa079b9835ff7267df5ee45d7">~continue_receiver</a>() { }
+<a name="l00159"></a>00159         
+<a name="l00161"></a><a class="code" href="a00253.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">00161</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00253.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">register_predecessor</a>( <a class="code" href="a00301.html">predecessor_type</a> & ) {
+<a name="l00162"></a>00162         <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> l(my_mutex);
+<a name="l00163"></a>00163         ++my_predecessor_count;
+<a name="l00164"></a>00164         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00165"></a>00165     }
+<a name="l00166"></a>00166         
+<a name="l00168"></a>00168 
+<a name="l00171"></a><a class="code" href="a00253.html#cb691b18416d4742265aed84d496ebbd">00171</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00253.html#cb691b18416d4742265aed84d496ebbd">remove_predecessor</a>( <a class="code" href="a00301.html">predecessor_type</a> & ) {
+<a name="l00172"></a>00172         <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> l(my_mutex);
+<a name="l00173"></a>00173         --my_predecessor_count;
+<a name="l00174"></a>00174         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00175"></a>00175     }
+<a name="l00176"></a>00176         
+<a name="l00178"></a>00178 
+<a name="l00180"></a><a class="code" href="a00253.html#3969c70fb89c0a982f142ae9eb5facae">00180</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00253.html#3969c70fb89c0a982f142ae9eb5facae">try_put</a>( <span class="keyword">const</span> <a class="code" href="a00251.html">input_type</a> & ) {
+<a name="l00181"></a>00181         {
+<a name="l00182"></a>00182             <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> l(my_mutex);
+<a name="l00183"></a>00183             <span class="keywordflow">if</span> ( ++my_current_count < my_predecessor_count ) 
+<a name="l00184"></a>00184                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00185"></a>00185             <span class="keywordflow">else</span>
+<a name="l00186"></a>00186                 my_current_count = 0;
+<a name="l00187"></a>00187         }
+<a name="l00188"></a>00188         <a class="code" href="a00253.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute</a>();
+<a name="l00189"></a>00189         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00190"></a>00190     }
+<a name="l00191"></a>00191         
+<a name="l00192"></a>00192 <span class="keyword">protected</span>:
+<a name="l00193"></a>00193         
+<a name="l00194"></a>00194     <a class="code" href="a00305.html">spin_mutex</a> my_mutex;
+<a name="l00195"></a>00195     <span class="keywordtype">int</span> my_predecessor_count;
+<a name="l00196"></a>00196     <span class="keywordtype">int</span> my_current_count;
+<a name="l00197"></a>00197     <span class="keywordtype">int</span> my_initial_predecessor_count;
+<a name="l00198"></a>00198         
+<a name="l00200"></a>00200 
+<a name="l00202"></a>00202     <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00253.html#40ca8b7e96c5bc3428b4d1e409725ee5">execute</a>() = 0;
+<a name="l00203"></a>00203         
+<a name="l00204"></a>00204 };
+<a name="l00205"></a>00205 
+<a name="l00206"></a>00206 <span class="preprocessor">#include "internal/_flow_graph_impl.h"</span>
+<a name="l00207"></a>00207 <span class="keyword">using namespace </span>internal::graph_policy_namespace;
+<a name="l00208"></a>00208 
+<a name="l00210"></a>00210 
+<a name="l00211"></a><a class="code" href="a00262.html">00211</a> <span class="keyword">class </span><a class="code" href="a00262.html">graph</a> : tbb::internal::no_copy {
+<a name="l00212"></a>00212         
+<a name="l00213"></a>00213     <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
+<a name="l00214"></a>00214     <span class="keyword">class </span>run_task : <span class="keyword">public</span> <a class="code" href="a00311.html">task</a> {
+<a name="l00215"></a>00215     <span class="keyword">public</span>: 
+<a name="l00216"></a>00216         run_task( Body& body ) : my_body(body) {}
+<a name="l00217"></a>00217         <a class="code" href="a00311.html">task</a> *execute() {
+<a name="l00218"></a>00218             my_body();
+<a name="l00219"></a>00219             <span class="keywordflow">return</span> NULL;
+<a name="l00220"></a>00220         }
+<a name="l00221"></a>00221     <span class="keyword">private</span>:
+<a name="l00222"></a>00222         Body my_body;
+<a name="l00223"></a>00223     };
+<a name="l00224"></a>00224         
+<a name="l00225"></a>00225     <span class="keyword">template</span>< <span class="keyword">typename</span> Receiver, <span class="keyword">typename</span> Body >
+<a name="l00226"></a>00226     <span class="keyword">class </span>run_and_put_task : <span class="keyword">public</span> <a class="code" href="a00311.html">task</a> {
+<a name="l00227"></a>00227     <span class="keyword">public</span>: 
+<a name="l00228"></a>00228         run_and_put_task( Receiver &r, Body& body ) : my_receiver(r), my_body(body) {}
+<a name="l00229"></a>00229         <a class="code" href="a00311.html">task</a> *execute() {
+<a name="l00230"></a>00230             my_receiver.try_put( my_body() );
+<a name="l00231"></a>00231             <span class="keywordflow">return</span> NULL;
+<a name="l00232"></a>00232         }
+<a name="l00233"></a>00233     <span class="keyword">private</span>:
+<a name="l00234"></a>00234         Receiver &my_receiver;
+<a name="l00235"></a>00235         Body my_body;
+<a name="l00236"></a>00236     };
+<a name="l00237"></a>00237         
+<a name="l00238"></a>00238 <span class="keyword">public</span>:
+<a name="l00239"></a>00239         
+<a name="l00240"></a>00240         
+<a name="l00242"></a><a class="code" href="a00262.html#4ab3d4b5208ece28c4c3ced647e26e12">00242</a>     <a class="code" href="a00262.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a>() : my_root_task( new ( <a class="code" href="a00311.html">task</a>::allocate_root( ) ) <a class="code" href="a00254.html">empty_task</a> ) {
+<a name="l00243"></a>00243         my_root_task-><a class="code" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
+<a name="l00244"></a>00244     }
+<a name="l00245"></a>00245         
+<a name="l00247"></a>00247 
+<a name="l00249"></a><a class="code" href="a00262.html#8a7d424c0616a1c37a908ead182e2fe5">00249</a>     <a class="code" href="a00262.html#8a7d424c0616a1c37a908ead182e2fe5">~graph</a>() {
+<a name="l00250"></a>00250         <a class="code" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a>();
+<a name="l00251"></a>00251         my_root_task-><a class="code" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(0);
+<a name="l00252"></a>00252         <a class="code" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>( *my_root_task );
+<a name="l00253"></a>00253     }
+<a name="l00254"></a>00254         
+<a name="l00255"></a>00255         
+<a name="l00257"></a>00257 
+<a name="l00259"></a><a class="code" href="a00262.html#a993b789d1e488e0c3929135beae560e">00259</a>     <span class="keywordtype">void</span> <a class="code" href="a00262.html#a993b789d1e488e0c3929135beae560e">increment_wait_count</a>() { 
+<a name="l00260"></a>00260         <span class="keywordflow">if</span> (my_root_task)
+<a name="l00261"></a>00261             my_root_task-><a class="code" href="a00311.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>();
+<a name="l00262"></a>00262     }
+<a name="l00263"></a>00263         
+<a name="l00265"></a>00265 
+<a name="l00267"></a><a class="code" href="a00262.html#29b85506870f13a884a21655aec2a65d">00267</a>     <span class="keywordtype">void</span> <a class="code" href="a00262.html#29b85506870f13a884a21655aec2a65d">decrement_wait_count</a>() { 
+<a name="l00268"></a>00268         <span class="keywordflow">if</span> (my_root_task)
+<a name="l00269"></a>00269             my_root_task-><a class="code" href="a00311.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>(); 
+<a name="l00270"></a>00270     }
+<a name="l00271"></a>00271         
+<a name="l00273"></a>00273 
+<a name="l00275"></a>00275     <span class="keyword">template</span>< <span class="keyword">typename</span> Receiver, <span class="keyword">typename</span> Body >
+<a name="l00276"></a><a class="code" href="a00262.html#50a7938df01b6148ab2c0696835f002e">00276</a>         <span class="keywordtype">void</span> <a class="code" href="a00262.html#50a7938df01b6148ab2c0696835f002e">run</a>( Receiver &r, Body body ) {
+<a name="l00277"></a>00277        <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) ) 
+<a name="l00278"></a>00278            run_and_put_task< Receiver, Body >( r, body ) );
+<a name="l00279"></a>00279     }
+<a name="l00280"></a>00280         
+<a name="l00282"></a>00282 
+<a name="l00284"></a>00284     <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
+<a name="l00285"></a><a class="code" href="a00262.html#c1145b00e063793a7e7bf994d202c7a0">00285</a>     <span class="keywordtype">void</span> <a class="code" href="a00262.html#50a7938df01b6148ab2c0696835f002e">run</a>( Body body ) {
+<a name="l00286"></a>00286        <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) ) 
+<a name="l00287"></a>00287            run_task< Body >( body ) );
+<a name="l00288"></a>00288     }
+<a name="l00289"></a>00289         
+<a name="l00291"></a>00291 
+<a name="l00292"></a><a class="code" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">00292</a>     <span class="keywordtype">void</span> <a class="code" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a>() {
+<a name="l00293"></a>00293         <span class="keywordflow">if</span> (my_root_task)
+<a name="l00294"></a>00294             my_root_task-><a class="code" href="a00311.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>();
+<a name="l00295"></a>00295         my_root_task-><a class="code" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
+<a name="l00296"></a>00296     }
+<a name="l00297"></a>00297         
+<a name="l00299"></a><a class="code" href="a00262.html#7f4e3ae90811a5d8b597146b5b586d10">00299</a>     <a class="code" href="a00311.html">task</a> * <a class="code" href="a00262.html#7f4e3ae90811a5d8b597146b5b586d10">root_task</a>() {
+<a name="l00300"></a>00300         <span class="keywordflow">return</span> my_root_task;
+<a name="l00301"></a>00301     }
+<a name="l00302"></a>00302         
+<a name="l00303"></a>00303 <span class="keyword">private</span>:
+<a name="l00304"></a>00304         
+<a name="l00305"></a>00305     <a class="code" href="a00311.html">task</a> *my_root_task;
+<a name="l00306"></a>00306         
+<a name="l00307"></a>00307 };
+<a name="l00308"></a>00308 
+<a name="l00309"></a>00309 <span class="preprocessor">#include "internal/_flow_graph_node_impl.h"</span>
+<a name="l00310"></a>00310 
+<a name="l00312"></a>00312 <span class="keyword">template</span> < <span class="keyword">typename</span> Output >
+<a name="l00313"></a><a class="code" href="a00304.html">00313</a> <span class="keyword">class </span><a class="code" href="a00304.html">source_node</a> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00301.html">sender</a>< Output > {
+<a name="l00314"></a>00314 <span class="keyword">public</span>:
+<a name="l00315"></a>00315         
+<a name="l00317"></a><a class="code" href="a00304.html#407533487cc3f6032c1072cba19c609c">00317</a>     <span class="keyword">typedef</span> Output <a class="code" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a>;           
+<a name="l00318"></a>00318         
+<a name="l00320"></a><a class="code" href="a00304.html#dd7b8fe78f0bec9d6b70cbf1018a69fe">00320</a>     <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< Output ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00321"></a>00321         
+<a name="l00323"></a>00323     <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
+<a name="l00324"></a><a class="code" href="a00304.html#503c3b395c629296bf5cccd96d6388c1">00324</a>     <a class="code" href="a00304.html#503c3b395c629296bf5cccd96d6388c1">source_node</a>( <a class="code" href="a00262.html">graph</a> &g, Body body, <span class="keywordtype">bool</span> is_active = <span class="keyword">true</span> )
+<a name="l00325"></a>00325         : my_root_task(g.root_task()), my_active(is_active), init_my_active(is_active),
+<a name="l00326"></a>00326         my_body( new internal::source_body_leaf< <a class="code" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a>, Body>(body) ),
+<a name="l00327"></a>00327         my_reserved(false), my_has_cached_item(false) 
+<a name="l00328"></a>00328     { 
+<a name="l00329"></a>00329         my_successors.set_owner(<span class="keyword">this</span>);
+<a name="l00330"></a>00330     }
+<a name="l00331"></a>00331         
+<a name="l00333"></a><a class="code" href="a00304.html#adaac111fbcace95804219a5f2929304">00333</a>     <a class="code" href="a00304.html#503c3b395c629296bf5cccd96d6388c1">source_node</a>( <span class="keyword">const</span> <a class="code" href="a00304.html">source_node</a>& src ) :
+<a name="l00334"></a>00334         <a class="code" href="a00263.html">graph_node</a>(), <a class="code" href="a00301.html">sender</a><Output>(),
+<a name="l00335"></a>00335         my_root_task( src.my_root_task), my_active(src.init_my_active),
+<a name="l00336"></a>00336         init_my_active(src.init_my_active), my_body( src.my_body->clone() ),
+<a name="l00337"></a>00337         my_reserved(false), my_has_cached_item(false)
+<a name="l00338"></a>00338     {
+<a name="l00339"></a>00339         my_successors.set_owner(<span class="keyword">this</span>);
+<a name="l00340"></a>00340     }
+<a name="l00341"></a>00341 
+<a name="l00343"></a><a class="code" href="a00304.html#61700b0865fc17188b0abe26bbde65b6">00343</a>     <a class="code" href="a00304.html#61700b0865fc17188b0abe26bbde65b6">~source_node</a>() { <span class="keyword">delete</span> my_body; }
+<a name="l00344"></a>00344         
+<a name="l00346"></a><a class="code" href="a00304.html#22960d499df9f1569a9d8a544e35afe3">00346</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#22960d499df9f1569a9d8a544e35afe3">register_successor</a>( <a class="code" href="a00295.html">receiver<output_type></a> &r ) {
+<a name="l00347"></a>00347         <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00348"></a>00348         my_successors.register_successor(r);
+<a name="l00349"></a>00349         <span class="keywordflow">if</span> ( my_active )
+<a name="l00350"></a>00350             spawn_put();
+<a name="l00351"></a>00351         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00352"></a>00352     }
+<a name="l00353"></a>00353         
+<a name="l00355"></a><a class="code" href="a00304.html#222484bf295f39df36415a29e508e5c9">00355</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#222484bf295f39df36415a29e508e5c9">remove_successor</a>( <a class="code" href="a00295.html">receiver<output_type></a> &r ) {
+<a name="l00356"></a>00356         <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00357"></a>00357         my_successors.remove_successor(r);
+<a name="l00358"></a>00358         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00359"></a>00359     }
+<a name="l00360"></a>00360         
+<a name="l00362"></a><a class="code" href="a00304.html#41073ad4d3510ed5a8b6bda9c0f58636">00362</a>     <span class="comment">/*override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#41073ad4d3510ed5a8b6bda9c0f58636">try_get</a>( <a class="code" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v ) {
+<a name="l00363"></a>00363         <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00364"></a>00364         <span class="keywordflow">if</span> ( my_reserved )  
+<a name="l00365"></a>00365             <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00366"></a>00366         
+<a name="l00367"></a>00367         <span class="keywordflow">if</span> ( my_has_cached_item ) {
+<a name="l00368"></a>00368             v = my_cached_item;
+<a name="l00369"></a>00369             my_has_cached_item = <span class="keyword">false</span>;
+<a name="l00370"></a>00370         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( (*my_body)(v) == <span class="keyword">false</span> ) {
+<a name="l00371"></a>00371             <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00372"></a>00372         }
+<a name="l00373"></a>00373         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00374"></a>00374     }
+<a name="l00375"></a>00375         
+<a name="l00377"></a><a class="code" href="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">00377</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a>( <a class="code" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> &v ) {
+<a name="l00378"></a>00378         <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00379"></a>00379         <span class="keywordflow">if</span> ( my_reserved ) {
+<a name="l00380"></a>00380             <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00381"></a>00381         }
+<a name="l00382"></a>00382         
+<a name="l00383"></a>00383         <span class="keywordflow">if</span> ( !my_has_cached_item && (*my_body)(my_cached_item) )  
+<a name="l00384"></a>00384             my_has_cached_item = <span class="keyword">true</span>;
+<a name="l00385"></a>00385         
+<a name="l00386"></a>00386         <span class="keywordflow">if</span> ( my_has_cached_item ) {
+<a name="l00387"></a>00387             v = my_cached_item;
+<a name="l00388"></a>00388             my_reserved = <span class="keyword">true</span>;
+<a name="l00389"></a>00389             <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00390"></a>00390         } <span class="keywordflow">else</span> {
+<a name="l00391"></a>00391             <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00392"></a>00392         }
+<a name="l00393"></a>00393     }
+<a name="l00394"></a>00394         
+<a name="l00396"></a>00396 
+<a name="l00397"></a><a class="code" href="a00304.html#494678baf9096835268736b800824460">00397</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#494678baf9096835268736b800824460">try_release</a>( ) {
+<a name="l00398"></a>00398         <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00399"></a>00399         __TBB_ASSERT( my_reserved && my_has_cached_item, <span class="stringliteral">"releasing non-existent reservation"</span> );
+<a name="l00400"></a>00400         my_reserved = <span class="keyword">false</span>;
+<a name="l00401"></a>00401         spawn_put();
+<a name="l00402"></a>00402         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00403"></a>00403     }
+<a name="l00404"></a>00404         
+<a name="l00406"></a><a class="code" href="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">00406</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</a>( ) {
+<a name="l00407"></a>00407         <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00408"></a>00408         __TBB_ASSERT( my_reserved && my_has_cached_item, <span class="stringliteral">"consuming non-existent reservation"</span> );
+<a name="l00409"></a>00409         my_reserved = <span class="keyword">false</span>;
+<a name="l00410"></a>00410         my_has_cached_item = <span class="keyword">false</span>;
+<a name="l00411"></a>00411         <span class="keywordflow">if</span> ( !my_successors.empty() ) {
+<a name="l00412"></a>00412             spawn_put();
+<a name="l00413"></a>00413         }
+<a name="l00414"></a>00414         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00415"></a>00415     }
+<a name="l00416"></a>00416         
+<a name="l00418"></a><a class="code" href="a00304.html#4b647e4a93d08ccdd8d323279e4eaaa6">00418</a>     <span class="keywordtype">void</span> <a class="code" href="a00304.html#4b647e4a93d08ccdd8d323279e4eaaa6">activate</a>() {
+<a name="l00419"></a>00419         <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l00420"></a>00420         my_active = <span class="keyword">true</span>;
+<a name="l00421"></a>00421         <span class="keywordflow">if</span> ( !my_successors.empty() )
+<a name="l00422"></a>00422             spawn_put();
+<a name="l00423"></a>00423     }
+<a name="l00424"></a>00424         
+<a name="l00425"></a>00425 <span class="keyword">private</span>:
+<a name="l00426"></a>00426         
+<a name="l00427"></a>00427     <a class="code" href="a00311.html">task</a> *my_root_task;
+<a name="l00428"></a>00428     <a class="code" href="a00305.html">spin_mutex</a> my_mutex;
+<a name="l00429"></a>00429     <span class="keywordtype">bool</span> my_active;
+<a name="l00430"></a>00430     <span class="keywordtype">bool</span> init_my_active;
+<a name="l00431"></a>00431     internal::source_body<output_type> *my_body;
+<a name="l00432"></a>00432     internal::broadcast_cache< output_type > my_successors;
+<a name="l00433"></a>00433     <span class="keywordtype">bool</span> my_reserved;
+<a name="l00434"></a>00434     <span class="keywordtype">bool</span> my_has_cached_item;
+<a name="l00435"></a>00435     <a class="code" href="a00304.html#407533487cc3f6032c1072cba19c609c">output_type</a> my_cached_item;
+<a name="l00436"></a>00436         
+<a name="l00437"></a>00437     <span class="keyword">friend</span> <span class="keyword">class </span>internal::source_task< source_node< output_type > >;
+<a name="l00438"></a>00438         
+<a name="l00440"></a>00440     <span class="comment">/* override */</span> <span class="keywordtype">void</span> apply_body( ) {
+<a name="l00441"></a>00441         output_type v;
+<a name="l00442"></a>00442         <span class="keywordflow">if</span> ( <a class="code" href="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">try_reserve</a>(v) == <span class="keyword">false</span> )
+<a name="l00443"></a>00443             <span class="keywordflow">return</span>;
+<a name="l00444"></a>00444         
+<a name="l00445"></a>00445         <span class="keywordflow">if</span> ( my_successors.try_put( v ) ) 
+<a name="l00446"></a>00446             <a class="code" href="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">try_consume</a>();
+<a name="l00447"></a>00447         <span class="keywordflow">else</span>
+<a name="l00448"></a>00448             <a class="code" href="a00304.html#494678baf9096835268736b800824460">try_release</a>();
+<a name="l00449"></a>00449     }
+<a name="l00450"></a>00450         
+<a name="l00452"></a>00452     <span class="comment">/* override */</span> <span class="keywordtype">void</span> spawn_put( ) {
+<a name="l00453"></a>00453         <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) ) 
+<a name="l00454"></a>00454            internal::source_task< <a class="code" href="a00304.html">source_node< output_type ></a> >( *<span class="keyword">this</span> ) ); 
+<a name="l00455"></a>00455     }
+<a name="l00456"></a>00456         
+<a name="l00457"></a>00457 };
+<a name="l00458"></a>00458         
+<a name="l00460"></a>00460 <span class="keyword">template</span> < <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output = continue_msg, graph_buffer_policy = queueing, <span class="keyword">typename</span> Allocator=cache_aligned_allocator<Input> >
+<a name="l00461"></a><a class="code" href="a00260.html">00461</a> <span class="keyword">class </span><a class="code" href="a00260.html">function_node</a> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> internal::function_input<Input,Output,Allocator>, <span class="keyword">public</span> internal::function_output<Output> {
+<a name="l00462"></a>00462 <span class="keyword">public</span>:
+<a name="l00463"></a>00463         
+<a name="l00464"></a>00464     <span class="keyword">typedef</span> Input input_type;
+<a name="l00465"></a>00465     <span class="keyword">typedef</span> Output output_type;
+<a name="l00466"></a>00466     <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00467"></a>00467     <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00468"></a>00468     <span class="keyword">typedef</span> internal::function_output<output_type> fOutput_type;
+<a name="l00469"></a>00469         
+<a name="l00471"></a>00471     <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
+<a name="l00472"></a><a class="code" href="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">00472</a>     <a class="code" href="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>( <a class="code" href="a00262.html">graph</a> &g, size_t concurrency, Body body )
+<a name="l00473"></a>00473     : internal::function_input<input_type,output_type,Allocator>( g, concurrency, body ) {
+<a name="l00474"></a>00474     }
+<a name="l00475"></a>00475 
+<a name="l00477"></a><a class="code" href="a00260.html#d5132323fd2ac6a00ea0c78beda78723">00477</a>     <a class="code" href="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>( <span class="keyword">const</span> <a class="code" href="a00260.html">function_node</a>& src ) : 
+<a name="l00478"></a>00478         <a class="code" href="a00263.html">graph_node</a>(), internal::function_input<input_type,output_type,Allocator>( src ),
+<a name="l00479"></a>00479         fOutput_type() {}
+<a name="l00480"></a>00480         
+<a name="l00481"></a>00481 <span class="keyword">protected</span>:
+<a name="l00482"></a>00482 
+<a name="l00483"></a>00483     <span class="comment">/* override */</span> internal::broadcast_cache<output_type> &successors () { <span class="keywordflow">return</span> fOutput_type::my_successors; }
+<a name="l00484"></a>00484         
+<a name="l00485"></a>00485 };
+<a name="l00486"></a>00486 
+<a name="l00488"></a>00488 <span class="keyword">template</span> < <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output, <span class="keyword">typename</span> Allocator >
+<a name="l00489"></a><a class="code" href="a00261.html">00489</a> <span class="keyword">class </span><a class="code" href="a00260.html">function_node</a><Input,Output,queueing,Allocator> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> internal::function_input<Input,Output,Allocator>, <span class="keyword">public</span> internal::function_output<Output> {
+<a name="l00490"></a>00490 <span class="keyword">public</span>:
+<a name="l00491"></a>00491         
+<a name="l00492"></a>00492     <span class="keyword">typedef</span> Input input_type;
+<a name="l00493"></a>00493     <span class="keyword">typedef</span> Output output_type;
+<a name="l00494"></a>00494     <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00495"></a>00495     <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00496"></a>00496     <span class="keyword">typedef</span> internal::function_input<input_type,output_type,Allocator> fInput_type;
+<a name="l00497"></a>00497     <span class="keyword">typedef</span> internal::function_input_queue<input_type, Allocator> queue_type;
+<a name="l00498"></a>00498     <span class="keyword">typedef</span> internal::function_output<output_type> fOutput_type;
+<a name="l00499"></a>00499         
+<a name="l00501"></a>00501     <span class="keyword">template</span>< <span class="keyword">typename</span> Body >
+<a name="l00502"></a><a class="code" href="a00261.html#5b9019c1e6e9b2c41c986a384bd179db">00502</a>     <a class="code" href="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>( <a class="code" href="a00262.html">graph</a> &g, size_t concurrency, Body body ) : fInput_type( g, concurrency, body, new queue_type() ) {
+<a name="l00503"></a>00503     }
+<a name="l00504"></a>00504 
+<a name="l00506"></a><a class="code" href="a00261.html#01055081ed477714503820035db3a965">00506</a>     <a class="code" href="a00260.html#5c215b40e3daf73d1c6802ecb5aded6c">function_node</a>( <span class="keyword">const</span> <a class="code" href="a00260.html">function_node</a>& src ) : 
+<a name="l00507"></a>00507         <a class="code" href="a00263.html">graph_node</a>(), fInput_type( src, new queue_type() ) , fOutput_type() { }
+<a name="l00508"></a>00508 
+<a name="l00509"></a>00509 <span class="keyword">protected</span>:
+<a name="l00510"></a>00510 
+<a name="l00511"></a>00511     <span class="comment">/* override */</span> internal::broadcast_cache<output_type> &successors () { <span class="keywordflow">return</span> fOutput_type::my_successors; }
+<a name="l00512"></a>00512         
+<a name="l00513"></a>00513 };
+<a name="l00514"></a>00514 
+<a name="l00515"></a>00515 <span class="preprocessor">#include "tbb/internal/_flow_graph_types_impl.h"</span>
+<a name="l00516"></a>00516 
+<a name="l00517"></a>00517 <span class="preprocessor">#if TBB_PREVIEW_GRAPH_NODES</span>
+<a name="l00519"></a>00519 <span class="preprocessor">// Output is a tuple of output types.</span>
+<a name="l00520"></a>00520 <span class="preprocessor"></span><span class="keyword">template</span> < <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output, graph_buffer_policy = queueing, <span class="keyword">typename</span> Allocator=cache_aligned_allocator<Input> >
+<a name="l00521"></a><a class="code" href="a00274.html">00521</a> <span class="keyword">class </span><a class="code" href="a00274.html">multioutput_function_node</a> : 
+<a name="l00522"></a>00522     <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, 
+<a name="l00523"></a>00523     <span class="keyword">public</span> internal::multioutput_function_input
+<a name="l00524"></a>00524     <  
+<a name="l00525"></a>00525         Input, 
+<a name="l00526"></a>00526         typename internal::wrap_tuple_elements<
+<a name="l00527"></a>00527             std::tuple_size<Output>::value,  <span class="comment">// #elements in tuple</span>
+<a name="l00528"></a>00528             internal::function_output,  <span class="comment">// wrap this around each element</span>
+<a name="l00529"></a>00529             Output <span class="comment">// the tuple providing the types</span>
+<a name="l00530"></a>00530         >::type,
+<a name="l00531"></a>00531         Allocator
+<a name="l00532"></a>00532     > {
+<a name="l00533"></a>00533 <span class="keyword">private</span>:
+<a name="l00534"></a>00534     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<Output>::value;
+<a name="l00535"></a>00535 <span class="keyword">public</span>:
+<a name="l00536"></a>00536     <span class="keyword">typedef</span> Input input_type;
+<a name="l00537"></a>00537     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::wrap_tuple_elements<N,internal::function_output, Output>::type ports_type;
+<a name="l00538"></a>00538 <span class="keyword">private</span>:
+<a name="l00539"></a>00539     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::multioutput_function_input<input_type, ports_type, Allocator> base_type;
+<a name="l00540"></a>00540     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::function_input_queue<input_type,Allocator> queue_type;
+<a name="l00541"></a>00541 <span class="keyword">public</span>:
+<a name="l00542"></a>00542     <span class="keyword">template</span><<span class="keyword">typename</span> Body>
+<a name="l00543"></a>00543     <a class="code" href="a00274.html">multioutput_function_node</a>( <a class="code" href="a00262.html">graph</a> &g, size_t concurrency, Body body ) : base_type(g,concurrency, body) {}
+<a name="l00544"></a>00544     <a class="code" href="a00274.html">multioutput_function_node</a>( <span class="keyword">const</span> <a class="code" href="a00274.html">multioutput_function_node</a> &other) :
+<a name="l00545"></a>00545         <a class="code" href="a00263.html">graph_node</a>(), base_type(other) {}
+<a name="l00546"></a>00546     <span class="comment">// all the guts are in multioutput_function_input...</span>
+<a name="l00547"></a>00547 
+<a name="l00548"></a>00548 };  <span class="comment">// multioutput_function_node</span>
+<a name="l00549"></a>00549         
+<a name="l00550"></a>00550 <span class="keyword">template</span> < <span class="keyword">typename</span> Input, <span class="keyword">typename</span> Output, <span class="keyword">typename</span> Allocator >
+<a name="l00551"></a>00551 <span class="keyword">class </span><a class="code" href="a00274.html">multioutput_function_node</a><Input,Output,queueing,Allocator> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> internal::multioutput_function_input<Input, 
+<a name="l00552"></a>00552     typename internal::wrap_tuple_elements<std::tuple_size<Output>::value, internal::function_output, Output>::type, Allocator> {
+<a name="l00553"></a>00553     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<Output>::value;
+<a name="l00554"></a>00554 <span class="keyword">public</span>:
+<a name="l00555"></a>00555     <span class="keyword">typedef</span> Input input_type;
+<a name="l00556"></a>00556     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::wrap_tuple_elements<N, internal::function_output, Output>::type ports_type;
+<a name="l00557"></a>00557 <span class="keyword">private</span>:
+<a name="l00558"></a>00558     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::multioutput_function_input<input_type, ports_type, Allocator> base_type;
+<a name="l00559"></a>00559     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::function_input_queue<input_type,Allocator> queue_type;
+<a name="l00560"></a>00560 <span class="keyword">public</span>:
+<a name="l00561"></a>00561 
+<a name="l00562"></a>00562     <span class="keyword">template</span><<span class="keyword">typename</span> Body>
+<a name="l00563"></a>00563     <a class="code" href="a00274.html">multioutput_function_node</a>( <a class="code" href="a00262.html">graph</a> &g, size_t concurrency, Body body) : base_type(g,concurrency, body, new queue_type()) {}
+<a name="l00564"></a>00564     <a class="code" href="a00274.html">multioutput_function_node</a>( <span class="keyword">const</span> <a class="code" href="a00274.html">multioutput_function_node</a> &other) :
+<a name="l00565"></a>00565         <a class="code" href="a00263.html">graph_node</a>(), base_type(other, new queue_type()) {}
+<a name="l00566"></a>00566 
+<a name="l00567"></a>00567 };  <span class="comment">// multioutput_function_node</span>
+<a name="l00568"></a>00568 
+<a name="l00570"></a>00570 <span class="comment">//  successors.  The node has unlimited concurrency, so though it is marked as</span>
+<a name="l00571"></a>00571 <span class="comment">//  "rejecting" it does not reject inputs.</span>
+<a name="l00572"></a>00572 <span class="keyword">template</span><<span class="keyword">typename</span> TupleType, <span class="keyword">typename</span> Allocator=cache_aligned_allocator<TupleType> >
+<a name="l00573"></a><a class="code" href="a00310.html">00573</a> <span class="keyword">class </span><a class="code" href="a00310.html">split_node</a> : <span class="keyword">public</span> <a class="code" href="a00274.html">multioutput_function_node</a><TupleType, TupleType, rejecting, Allocator> {
+<a name="l00574"></a>00574     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<TupleType>::value;
+<a name="l00575"></a>00575     <span class="keyword">typedef</span> <a class="code" href="a00274.html">multioutput_function_node<TupleType,TupleType,rejecting,Allocator></a> <a class="code" href="a00274.html">base_type</a>;
+<a name="l00576"></a>00576 <span class="keyword">public</span>:
+<a name="l00577"></a>00577     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_type::ports_type ports_type;
+<a name="l00578"></a>00578 <span class="keyword">private</span>:
+<a name="l00579"></a>00579 
+<a name="l00580"></a>00580     <span class="keyword">struct </span>splitting_body {
+<a name="l00581"></a>00581         <span class="keywordtype">void</span> operator()(<span class="keyword">const</span> TupleType& t, ports_type &p) {
+<a name="l00582"></a>00582             internal::emit_element<N>::emit_this(t, p);
+<a name="l00583"></a>00583         }
+<a name="l00584"></a>00584     };
+<a name="l00585"></a>00585 <span class="keyword">public</span>:
+<a name="l00586"></a>00586     <span class="keyword">typedef</span> TupleType input_type;
+<a name="l00587"></a>00587     <span class="keyword">typedef</span> Allocator allocator_type;
+<a name="l00588"></a>00588     <a class="code" href="a00310.html">split_node</a>(<a class="code" href="a00262.html">graph</a> &g) : <a class="code" href="a00274.html">base_type</a>(g, unlimited, splitting_body()) { }
+<a name="l00589"></a>00589     <a class="code" href="a00310.html">split_node</a>( <span class="keyword">const</span> <a class="code" href="a00310.html">split_node</a> & other) : <a class="code" href="a00274.html">base_type</a>(other) { }
+<a name="l00590"></a>00590 };
+<a name="l00591"></a>00591 <span class="preprocessor">#endif  // TBB_PREVIEW_GRAPH_NODES</span>
+<a name="l00592"></a>00592 <span class="preprocessor"></span>
+<a name="l00594"></a>00594 <span class="keyword">template</span> <<span class="keyword">typename</span> Output>
+<a name="l00595"></a><a class="code" href="a00252.html">00595</a> <span class="keyword">class </span><a class="code" href="a00252.html">continue_node</a> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> internal::continue_input<Output>, <span class="keyword">public</span> internal::function_output<Output> {
+<a name="l00596"></a>00596 <span class="keyword">public</span>:
+<a name="l00597"></a>00597         
+<a name="l00598"></a>00598     <span class="keyword">typedef</span> <a class="code" href="a00251.html">continue_msg</a> <a class="code" href="a00251.html">input_type</a>;
+<a name="l00599"></a>00599     <span class="keyword">typedef</span> Output output_type;
+<a name="l00600"></a>00600     <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00601"></a>00601     <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00602"></a>00602     <span class="keyword">typedef</span> internal::function_output<output_type> fOutput_type;
+<a name="l00603"></a>00603         
+<a name="l00605"></a>00605      <span class="keyword">template</span> <<span class="keyword">typename</span> Body >
+<a name="l00606"></a><a class="code" href="a00252.html#2f200db877d2f80c08d09422e8bffd5a">00606</a>      <a class="code" href="a00252.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>( <a class="code" href="a00262.html">graph</a> &g, Body body )
+<a name="l00607"></a>00607              : internal::continue_input<output_type>( g, body ) {
+<a name="l00608"></a>00608      }
+<a name="l00609"></a>00609         
+<a name="l00611"></a>00611     <span class="keyword">template</span> <<span class="keyword">typename</span> Body >
+<a name="l00612"></a><a class="code" href="a00252.html#7817aebf22dd125ca04df53ac488d163">00612</a>     <a class="code" href="a00252.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>( <a class="code" href="a00262.html">graph</a> &g, <span class="keywordtype">int</span> number_of_predecessors, Body body )
+<a name="l00613"></a>00613         : internal::continue_input<output_type>( g, number_of_predecessors, body )
+<a name="l00614"></a>00614     {
+<a name="l00615"></a>00615     }
+<a name="l00616"></a>00616  
+<a name="l00618"></a><a class="code" href="a00252.html#869562787fcb5c57a90aea120f26d492">00618</a>     <a class="code" href="a00252.html#2f200db877d2f80c08d09422e8bffd5a">continue_node</a>( <span class="keyword">const</span> <a class="code" href="a00252.html">continue_node</a>& src ) :
+<a name="l00619"></a>00619         <a class="code" href="a00263.html">graph_node</a>(), internal::continue_input<output_type>(src),
+<a name="l00620"></a>00620         internal::function_output<Output>() { }
+<a name="l00621"></a>00621 
+<a name="l00622"></a>00622 <span class="keyword">protected</span>:
+<a name="l00623"></a>00623         
+<a name="l00624"></a>00624     <span class="comment">/* override */</span> internal::broadcast_cache<output_type> &successors () { <span class="keywordflow">return</span> fOutput_type::my_successors; }
+<a name="l00625"></a>00625         
+<a name="l00626"></a>00626 };
+<a name="l00627"></a>00627         
+<a name="l00628"></a>00628 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l00629"></a>00629 <span class="keyword">class </span>overwrite_node : <span class="keyword">public</span> graph_node, <span class="keyword">public</span> receiver<T>, <span class="keyword">public</span> sender<T> {
+<a name="l00630"></a>00630 <span class="keyword">public</span>:
+<a name="l00631"></a>00631         
+<a name="l00632"></a>00632     <span class="keyword">typedef</span> T input_type;
+<a name="l00633"></a>00633     <span class="keyword">typedef</span> T output_type;
+<a name="l00634"></a>00634     <span class="keyword">typedef</span> sender< input_type > predecessor_type;
+<a name="l00635"></a>00635     <span class="keyword">typedef</span> receiver< output_type > successor_type;
+<a name="l00636"></a>00636         
+<a name="l00637"></a>00637     overwrite_node() : my_buffer_is_valid(false) {
+<a name="l00638"></a>00638         my_successors.set_owner( <span class="keyword">this</span> );
+<a name="l00639"></a>00639     }
+<a name="l00640"></a>00640 
+<a name="l00641"></a>00641     <span class="comment">// Copy constructor; doesn't take anything from src; default won't work</span>
+<a name="l00642"></a>00642     overwrite_node( <span class="keyword">const</span> overwrite_node& ) : 
+<a name="l00643"></a>00643         graph_node(), receiver<T>(), sender<T>(), my_buffer_is_valid(false) {
+<a name="l00644"></a>00644         my_successors.set_owner( <span class="keyword">this</span> );
+<a name="l00645"></a>00645     }
+<a name="l00646"></a>00646         
+<a name="l00647"></a>00647     ~overwrite_node() {}
+<a name="l00648"></a>00648         
+<a name="l00649"></a>00649     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a>( successor_type &s ) {
+<a name="l00650"></a>00650         spin_mutex::scoped_lock l( my_mutex );
+<a name="l00651"></a>00651         <span class="keywordflow">if</span> ( my_buffer_is_valid ) {
+<a name="l00652"></a>00652             <span class="comment">// We have a valid value that must be forwarded immediately.</span>
+<a name="l00653"></a>00653             <span class="keywordflow">if</span> ( s.try_put( my_buffer ) || !s.register_predecessor( *<span class="keyword">this</span>  ) ) {
+<a name="l00654"></a>00654                 <span class="comment">// We add the successor: it accepted our put or it rejected it but won't let use become a predecessor</span>
+<a name="l00655"></a>00655                 my_successors.register_successor( s );
+<a name="l00656"></a>00656                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00657"></a>00657             } <span class="keywordflow">else</span> {
+<a name="l00658"></a>00658                 <span class="comment">// We don't add the successor: it rejected our put and we became its predecessor instead</span>
+<a name="l00659"></a>00659                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00660"></a>00660             }
+<a name="l00661"></a>00661         } <span class="keywordflow">else</span> {
+<a name="l00662"></a>00662             <span class="comment">// No valid value yet, just add as successor</span>
+<a name="l00663"></a>00663             my_successors.register_successor( s );
+<a name="l00664"></a>00664             <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00665"></a>00665         }
+<a name="l00666"></a>00666     }
+<a name="l00667"></a>00667         
+<a name="l00668"></a>00668     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00301.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a>( successor_type &s ) {
+<a name="l00669"></a>00669         spin_mutex::scoped_lock l( my_mutex );
+<a name="l00670"></a>00670         my_successors.remove_successor(s);
+<a name="l00671"></a>00671         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00672"></a>00672     }
+<a name="l00673"></a>00673         
+<a name="l00674"></a>00674     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_put( <span class="keyword">const</span> T &v ) {
+<a name="l00675"></a>00675         spin_mutex::scoped_lock l( my_mutex );
+<a name="l00676"></a>00676         my_buffer = v;
+<a name="l00677"></a>00677         my_buffer_is_valid = <span class="keyword">true</span>;
+<a name="l00678"></a>00678         my_successors.try_put(v);
+<a name="l00679"></a>00679         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00680"></a>00680     }
+<a name="l00681"></a>00681         
+<a name="l00682"></a>00682     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_get( T &v ) {
+<a name="l00683"></a>00683         spin_mutex::scoped_lock l( my_mutex );
+<a name="l00684"></a>00684         <span class="keywordflow">if</span> ( my_buffer_is_valid ) {
+<a name="l00685"></a>00685             v = my_buffer;
+<a name="l00686"></a>00686             <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00687"></a>00687         } <span class="keywordflow">else</span> {
+<a name="l00688"></a>00688             <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00689"></a>00689         }
+<a name="l00690"></a>00690     }
+<a name="l00691"></a>00691         
+<a name="l00692"></a>00692     <span class="keywordtype">bool</span> is_valid() {
+<a name="l00693"></a>00693        spin_mutex::scoped_lock l( my_mutex );
+<a name="l00694"></a>00694        <span class="keywordflow">return</span> my_buffer_is_valid;
+<a name="l00695"></a>00695     }
+<a name="l00696"></a>00696         
+<a name="l00697"></a>00697     <span class="keywordtype">void</span> clear() {
+<a name="l00698"></a>00698        spin_mutex::scoped_lock l( my_mutex );
+<a name="l00699"></a>00699        my_buffer_is_valid = <span class="keyword">false</span>;
+<a name="l00700"></a>00700     }
+<a name="l00701"></a>00701         
+<a name="l00702"></a>00702 <span class="keyword">protected</span>:
+<a name="l00703"></a>00703         
+<a name="l00704"></a>00704     spin_mutex my_mutex;
+<a name="l00705"></a>00705     internal::broadcast_cache< T, null_rw_mutex > my_successors;
+<a name="l00706"></a>00706     T my_buffer;
+<a name="l00707"></a>00707     <span class="keywordtype">bool</span> my_buffer_is_valid;
+<a name="l00708"></a>00708         
+<a name="l00709"></a>00709 };
+<a name="l00710"></a>00710         
+<a name="l00711"></a>00711 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l00712"></a>00712 <span class="keyword">class </span>write_once_node : <span class="keyword">public</span> overwrite_node<T> {
+<a name="l00713"></a>00713 <span class="keyword">public</span>:
+<a name="l00714"></a>00714         
+<a name="l00715"></a>00715     <span class="keyword">typedef</span> T input_type;
+<a name="l00716"></a>00716     <span class="keyword">typedef</span> T output_type;
+<a name="l00717"></a>00717     <span class="keyword">typedef</span> sender< input_type > predecessor_type;
+<a name="l00718"></a>00718     <span class="keyword">typedef</span> receiver< output_type > successor_type;
+<a name="l00719"></a>00719         
+<a name="l00721"></a>00721     write_once_node() : overwrite_node<T>() {}
+<a name="l00722"></a>00722 
+<a name="l00724"></a>00724     write_once_node( <span class="keyword">const</span> write_once_node& src ) : overwrite_node<T>(src) {}
+<a name="l00725"></a>00725 
+<a name="l00726"></a>00726     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> try_put( <span class="keyword">const</span> T &v ) {
+<a name="l00727"></a>00727         spin_mutex::scoped_lock l( this->my_mutex );
+<a name="l00728"></a>00728         <span class="keywordflow">if</span> ( this->my_buffer_is_valid ) {
+<a name="l00729"></a>00729             <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00730"></a>00730         } <span class="keywordflow">else</span> {
+<a name="l00731"></a>00731             this->my_buffer = v;
+<a name="l00732"></a>00732             this->my_buffer_is_valid = <span class="keyword">true</span>;
+<a name="l00733"></a>00733             this->my_successors.try_put(v);
+<a name="l00734"></a>00734             <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00735"></a>00735         }
+<a name="l00736"></a>00736     }
+<a name="l00737"></a>00737 };
+<a name="l00738"></a>00738         
+<a name="l00740"></a>00740 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00741"></a><a class="code" href="a00236.html">00741</a> <span class="keyword">class </span><a class="code" href="a00236.html">broadcast_node</a> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00295.html">receiver</a><T>, <span class="keyword">public</span> <a class="code" href="a00301.html">sender</a><T> {
+<a name="l00742"></a>00742         
+<a name="l00743"></a>00743     internal::broadcast_cache<T> my_successors;
+<a name="l00744"></a>00744         
+<a name="l00745"></a>00745 <span class="keyword">public</span>:
+<a name="l00746"></a>00746         
+<a name="l00747"></a><a class="code" href="a00236.html#43c775d80e98cc601de69764983319f9">00747</a>     <span class="keyword">typedef</span> T <a class="code" href="a00236.html#43c775d80e98cc601de69764983319f9">input_type</a>;
+<a name="l00748"></a><a class="code" href="a00236.html#8fd8d3075823e08b879be46c1215ab0f">00748</a>     <span class="keyword">typedef</span> T output_type;
+<a name="l00749"></a><a class="code" href="a00236.html#0e2ad9a121cb286aa0d0142fef33c646">00749</a>     <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00750"></a><a class="code" href="a00236.html#cc6a0eb1c4ee65465770628d8366f055">00750</a>     <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00751"></a>00751         
+<a name="l00752"></a>00752     <a class="code" href="a00236.html">broadcast_node</a>( ) {
+<a name="l00753"></a>00753         my_successors.set_owner( <span class="keyword">this</span> );
+<a name="l00754"></a>00754     }
+<a name="l00755"></a>00755         
+<a name="l00756"></a>00756     <span class="comment">// Copy constructor</span>
+<a name="l00757"></a>00757     <a class="code" href="a00236.html">broadcast_node</a>( <span class="keyword">const</span> <a class="code" href="a00236.html">broadcast_node</a>& ) : <a class="code" href="a00263.html">graph_node</a>(), <a class="code" href="a00295.html">receiver</a><T>(), <a class="code" href="a00301.html">sender</a><T>() {
+<a name="l00758"></a>00758         my_successors.set_owner( <span class="keyword">this</span> );
+<a name="l00759"></a>00759     }
+<a name="l00760"></a>00760         
+<a name="l00762"></a><a class="code" href="a00236.html#fd0324c9ddb51fe6f95b3d015d338941">00762</a>     <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00236.html#fd0324c9ddb51fe6f95b3d015d338941">register_successor</a>( <a class="code" href="a00295.html">receiver<T></a> &r ) {
+<a name="l00763"></a>00763         my_successors.register_successor( r );
+<a name="l00764"></a>00764         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00765"></a>00765     }
+<a name="l00766"></a>00766         
+<a name="l00768"></a><a class="code" href="a00236.html#366efcc046ec08a104281109801ae629">00768</a>     <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00236.html#366efcc046ec08a104281109801ae629">remove_successor</a>( <a class="code" href="a00295.html">receiver<T></a> &r ) {
+<a name="l00769"></a>00769         my_successors.remove_successor( r );
+<a name="l00770"></a>00770         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00771"></a>00771     }
+<a name="l00772"></a>00772         
+<a name="l00773"></a><a class="code" href="a00236.html#29eb768c10b377880bbf83d31ee49acf">00773</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00236.html#29eb768c10b377880bbf83d31ee49acf">try_put</a>( <span class="keyword">const</span> T &t ) {
+<a name="l00774"></a>00774         my_successors.try_put(t);
+<a name="l00775"></a>00775         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00776"></a>00776     }
+<a name="l00777"></a>00777         
+<a name="l00778"></a>00778 };
+<a name="l00779"></a>00779 
+<a name="l00780"></a>00780 <span class="preprocessor">#include "internal/_flow_graph_item_buffer_impl.h"</span>
+<a name="l00781"></a>00781 
+<a name="l00783"></a>00783 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
+<a name="l00784"></a><a class="code" href="a00237.html">00784</a> <span class="keyword">class </span><a class="code" href="a00237.html">buffer_node</a> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> reservable_item_buffer<T, A>, <span class="keyword">public</span> <a class="code" href="a00295.html">receiver</a><T>, <span class="keyword">public</span> <a class="code" href="a00301.html">sender</a><T> {
+<a name="l00785"></a>00785 <span class="keyword">public</span>:
+<a name="l00786"></a><a class="code" href="a00237.html#334efb81b56a2f2b3ae08a16e8d65620">00786</a>     <span class="keyword">typedef</span> T <a class="code" href="a00237.html#334efb81b56a2f2b3ae08a16e8d65620">input_type</a>;
+<a name="l00787"></a><a class="code" href="a00237.html#089520db81f6a1551dc94c01efbdd7be">00787</a>     <span class="keyword">typedef</span> T output_type;
+<a name="l00788"></a><a class="code" href="a00237.html#5fb0ad03a822ca0fc34ad5d56a4093a2">00788</a>     <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l00789"></a><a class="code" href="a00237.html#66f7eda69b75e08f50726e50a11429cd">00789</a>     <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l00790"></a>00790     <span class="keyword">typedef</span> <a class="code" href="a00237.html">buffer_node<T, A></a> <a class="code" href="a00237.html">my_class</a>;
+<a name="l00791"></a>00791 <span class="keyword">protected</span>:
+<a name="l00792"></a>00792     <span class="keyword">typedef</span> size_t size_type;
+<a name="l00793"></a>00793     internal::round_robin_cache< T, null_rw_mutex > my_successors;
+<a name="l00794"></a>00794         
+<a name="l00795"></a>00795     <a class="code" href="a00311.html">task</a> *my_parent;
+<a name="l00796"></a>00796         
+<a name="l00797"></a>00797     <span class="keyword">friend</span> <span class="keyword">class </span>internal::forward_task< buffer_node< T, A > >;
+<a name="l00798"></a>00798         
+<a name="l00799"></a>00799     <span class="keyword">enum</span> op_type {reg_succ, rem_succ, req_item, res_item, rel_res, con_res, put_item, try_fwd};
+<a name="l00800"></a>00800     <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
+<a name="l00801"></a>00801         
+<a name="l00802"></a>00802     <span class="comment">// implements the aggregator_operation concept</span>
+<a name="l00803"></a>00803     <span class="keyword">class </span>buffer_operation : <span class="keyword">public</span> internal::aggregated_operation< buffer_operation > {
+<a name="l00804"></a>00804     <span class="keyword">public</span>:
+<a name="l00805"></a>00805         <span class="keywordtype">char</span> type;
+<a name="l00806"></a>00806         T *elem;
+<a name="l00807"></a>00807         <a class="code" href="a00237.html#66f7eda69b75e08f50726e50a11429cd">successor_type</a> *r;
+<a name="l00808"></a>00808         buffer_operation(<span class="keyword">const</span> T& e, op_type t) :
+<a name="l00809"></a>00809             type(char(t)), elem(const_cast<T*>(&e)), r(NULL) {}
+<a name="l00810"></a>00810         buffer_operation(op_type t) : type(char(t)), r(NULL) {}
+<a name="l00811"></a>00811     };
+<a name="l00812"></a>00812         
+<a name="l00813"></a>00813     <span class="keywordtype">bool</span> forwarder_busy;
+<a name="l00814"></a>00814     <span class="keyword">typedef</span> internal::aggregating_functor<my_class, buffer_operation> my_handler;
+<a name="l00815"></a>00815     <span class="keyword">friend</span> <span class="keyword">class </span>internal::aggregating_functor<my_class, buffer_operation>;
+<a name="l00816"></a>00816     internal::aggregator< my_handler, buffer_operation> my_aggregator;
+<a name="l00817"></a>00817         
+<a name="l00818"></a>00818     <span class="keyword">virtual</span> <span class="keywordtype">void</span> handle_operations(buffer_operation *op_list) {
+<a name="l00819"></a>00819         buffer_operation *tmp;
+<a name="l00820"></a>00820         <span class="keywordtype">bool</span> try_forwarding=<span class="keyword">false</span>;
+<a name="l00821"></a>00821         <span class="keywordflow">while</span> (op_list) {
+<a name="l00822"></a>00822             tmp = op_list;
+<a name="l00823"></a>00823             op_list = op_list->next;
+<a name="l00824"></a>00824             <span class="keywordflow">switch</span> (tmp->type) {
+<a name="l00825"></a>00825             <span class="keywordflow">case</span> reg_succ: <a class="code" href="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(tmp);  try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
+<a name="l00826"></a>00826             <span class="keywordflow">case</span> rem_succ: <a class="code" href="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(tmp); <span class="keywordflow">break</span>;
+<a name="l00827"></a>00827             <span class="keywordflow">case</span> req_item: internal_pop(tmp); <span class="keywordflow">break</span>;
+<a name="l00828"></a>00828             <span class="keywordflow">case</span> res_item: internal_reserve(tmp); <span class="keywordflow">break</span>;
+<a name="l00829"></a>00829             <span class="keywordflow">case</span> rel_res:  internal_release(tmp);  try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
+<a name="l00830"></a>00830             <span class="keywordflow">case</span> con_res:  internal_consume(tmp);  try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
+<a name="l00831"></a>00831             <span class="keywordflow">case</span> put_item: internal_push(tmp);  try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
+<a name="l00832"></a>00832             <span class="keywordflow">case</span> try_fwd:  <a class="code" href="a00237.html#dcbffbae514f4d95205b0845785c0a91">internal_forward</a>(tmp); <span class="keywordflow">break</span>;
+<a name="l00833"></a>00833             }
+<a name="l00834"></a>00834         }
+<a name="l00835"></a>00835         <span class="keywordflow">if</span> (try_forwarding && !forwarder_busy) {
+<a name="l00836"></a>00836             forwarder_busy = <span class="keyword">true</span>;
+<a name="l00837"></a>00837             <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>(*<span class="keyword">new</span>(task::allocate_additional_child_of(*my_parent)) internal::forward_task< buffer_node<input_type, A> >(*<span class="keyword">this</span>));
+<a name="l00838"></a>00838         }
+<a name="l00839"></a>00839     }
+<a name="l00840"></a>00840         
+<a name="l00842"></a><a class="code" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">00842</a>     <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">forward</a>() {
+<a name="l00843"></a>00843         buffer_operation op_data(try_fwd);
+<a name="l00844"></a>00844         <span class="keywordflow">do</span> {
+<a name="l00845"></a>00845             op_data.status = WAIT;
+<a name="l00846"></a>00846             my_aggregator.execute(&op_data);
+<a name="l00847"></a>00847         } <span class="keywordflow">while</span> (op_data.status == SUCCEEDED);
+<a name="l00848"></a>00848     }
+<a name="l00849"></a>00849         
+<a name="l00851"></a><a class="code" href="a00237.html#df21388252b8963e839dca29d2c67ea5">00851</a>     <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(buffer_operation *op) {
+<a name="l00852"></a>00852         my_successors.register_successor(*(op->r));
+<a name="l00853"></a>00853         __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00854"></a>00854     }
+<a name="l00855"></a>00855         
+<a name="l00857"></a><a class="code" href="a00237.html#6b6cf76dff80fd679251da93351c1291">00857</a>     <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(buffer_operation *op) {
+<a name="l00858"></a>00858         my_successors.remove_successor(*(op->r));
+<a name="l00859"></a>00859         __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00860"></a>00860     }
+<a name="l00861"></a>00861         
+<a name="l00863"></a><a class="code" href="a00237.html#dcbffbae514f4d95205b0845785c0a91">00863</a>     <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00237.html#dcbffbae514f4d95205b0845785c0a91">internal_forward</a>(buffer_operation *op) {
+<a name="l00864"></a>00864         T i_copy;
+<a name="l00865"></a>00865         <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
+<a name="l00866"></a>00866         size_type counter = my_successors.size();
+<a name="l00867"></a>00867         <span class="comment">// Try forwarding, giving each successor a chance</span>
+<a name="l00868"></a>00868         <span class="keywordflow">while</span> (counter>0 && !this->buffer_empty() && this->item_valid(this->my_tail-1)) {
+<a name="l00869"></a>00869             this->fetch_back(i_copy);
+<a name="l00870"></a>00870             <span class="keywordflow">if</span>( my_successors.try_put(i_copy) ) {
+<a name="l00871"></a>00871                 this->invalidate_back();
+<a name="l00872"></a>00872                 --(this->my_tail);
+<a name="l00873"></a>00873                 success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
+<a name="l00874"></a>00874             }
+<a name="l00875"></a>00875             --counter;
+<a name="l00876"></a>00876         }
+<a name="l00877"></a>00877         <span class="keywordflow">if</span> (success && !counter)
+<a name="l00878"></a>00878             __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00879"></a>00879         <span class="keywordflow">else</span> {
+<a name="l00880"></a>00880             __TBB_store_with_release(op->status, FAILED);
+<a name="l00881"></a>00881             forwarder_busy = <span class="keyword">false</span>;
+<a name="l00882"></a>00882         }
+<a name="l00883"></a>00883     }
+<a name="l00884"></a>00884         
+<a name="l00885"></a>00885     <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_push(buffer_operation *op) {
+<a name="l00886"></a>00886         this->push_back(*(op->elem));
+<a name="l00887"></a>00887         __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00888"></a>00888     }
+<a name="l00889"></a>00889         
+<a name="l00890"></a>00890     <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_pop(buffer_operation *op) {
+<a name="l00891"></a>00891         <span class="keywordflow">if</span>(this->pop_back(*(op->elem))) {
+<a name="l00892"></a>00892             __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00893"></a>00893         }
+<a name="l00894"></a>00894         <span class="keywordflow">else</span> {
+<a name="l00895"></a>00895             __TBB_store_with_release(op->status, FAILED);
+<a name="l00896"></a>00896         }
+<a name="l00897"></a>00897     }
+<a name="l00898"></a>00898         
+<a name="l00899"></a>00899     <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_reserve(buffer_operation *op) {
+<a name="l00900"></a>00900         <span class="keywordflow">if</span>(this->reserve_front(*(op->elem))) {
+<a name="l00901"></a>00901             __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00902"></a>00902         }
+<a name="l00903"></a>00903         <span class="keywordflow">else</span> {
+<a name="l00904"></a>00904             __TBB_store_with_release(op->status, FAILED);
+<a name="l00905"></a>00905         }
+<a name="l00906"></a>00906     }
+<a name="l00907"></a>00907         
+<a name="l00908"></a>00908     <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_consume(buffer_operation *op) {
+<a name="l00909"></a>00909         this->consume_front();
+<a name="l00910"></a>00910         __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00911"></a>00911     }
+<a name="l00912"></a>00912         
+<a name="l00913"></a>00913     <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_release(buffer_operation *op) {
+<a name="l00914"></a>00914         this->release_front();
+<a name="l00915"></a>00915         __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l00916"></a>00916     }
+<a name="l00917"></a>00917         
+<a name="l00918"></a>00918 <span class="keyword">public</span>:
+<a name="l00920"></a><a class="code" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">00920</a>     <a class="code" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>( <a class="code" href="a00262.html">graph</a> &g ) : reservable_item_buffer<T>(),
+<a name="l00921"></a>00921         my_parent( g.root_task() ), forwarder_busy(false) {
+<a name="l00922"></a>00922         my_successors.set_owner(<span class="keyword">this</span>);
+<a name="l00923"></a>00923         my_aggregator.initialize_handler(my_handler(<span class="keyword">this</span>));
+<a name="l00924"></a>00924     }
+<a name="l00925"></a>00925 
+<a name="l00927"></a><a class="code" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">00927</a>     <a class="code" href="a00237.html#5fe4b79f780586ff66e002ce32a5c60d">buffer_node</a>( <span class="keyword">const</span> buffer_node& src ) :
+<a name="l00928"></a>00928         <a class="code" href="a00263.html">graph_node</a>(), reservable_item_buffer<T>(), <a class="code" href="a00295.html">receiver</a><T>(), <a class="code" href="a00301.html">sender</a><T>(),
+<a name="l00929"></a>00929         my_parent( src.my_parent ) {
+<a name="l00930"></a>00930         forwarder_busy = <span class="keyword">false</span>;
+<a name="l00931"></a>00931         my_successors.set_owner(<span class="keyword">this</span>);
+<a name="l00932"></a>00932         my_aggregator.initialize_handler(my_handler(<span class="keyword">this</span>));
+<a name="l00933"></a>00933     }
+<a name="l00934"></a>00934 
+<a name="l00935"></a>00935     <span class="keyword">virtual</span> ~buffer_node() {}
+<a name="l00936"></a>00936         
+<a name="l00937"></a>00937     <span class="comment">//</span>
+<a name="l00938"></a>00938     <span class="comment">// message sender implementation</span>
+<a name="l00939"></a>00939     <span class="comment">//</span>
+<a name="l00940"></a>00940         
+<a name="l00942"></a>00942 
+<a name="l00943"></a><a class="code" href="a00237.html#f8bf4944ede4fc106423d67715beb695">00943</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#f8bf4944ede4fc106423d67715beb695">register_successor</a>( <a class="code" href="a00295.html">receiver<output_type></a> &r ) {
+<a name="l00944"></a>00944         buffer_operation op_data(reg_succ);
+<a name="l00945"></a>00945         op_data.r = &r;
+<a name="l00946"></a>00946         my_aggregator.execute(&op_data);
+<a name="l00947"></a>00947         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00948"></a>00948     }
+<a name="l00949"></a>00949         
+<a name="l00951"></a>00951 
+<a name="l00953"></a><a class="code" href="a00237.html#2074da0e39b9477c32897d6e5786196f">00953</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#2074da0e39b9477c32897d6e5786196f">remove_successor</a>( <a class="code" href="a00295.html">receiver<output_type></a> &r ) {
+<a name="l00954"></a>00954         r.<a class="code" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(*<span class="keyword">this</span>);
+<a name="l00955"></a>00955         buffer_operation op_data(rem_succ);
+<a name="l00956"></a>00956         op_data.r = &r;
+<a name="l00957"></a>00957         my_aggregator.execute(&op_data);
+<a name="l00958"></a>00958         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00959"></a>00959     }
+<a name="l00960"></a>00960         
+<a name="l00962"></a>00962 
+<a name="l00964"></a><a class="code" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">00964</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">try_get</a>( T &v ) {
+<a name="l00965"></a>00965         buffer_operation op_data(req_item);
+<a name="l00966"></a>00966         op_data.elem = &v;
+<a name="l00967"></a>00967         my_aggregator.execute(&op_data);
+<a name="l00968"></a>00968         <span class="keywordflow">return</span> (op_data.status==SUCCEEDED);
+<a name="l00969"></a>00969     }
+<a name="l00970"></a>00970         
+<a name="l00972"></a>00972 
+<a name="l00974"></a><a class="code" href="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">00974</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">try_reserve</a>( T &v ) {
+<a name="l00975"></a>00975         buffer_operation op_data(res_item);
+<a name="l00976"></a>00976         op_data.elem = &v;
+<a name="l00977"></a>00977         my_aggregator.execute(&op_data);
+<a name="l00978"></a>00978         <span class="keywordflow">return</span> (op_data.status==SUCCEEDED);
+<a name="l00979"></a>00979     }
+<a name="l00980"></a>00980         
+<a name="l00982"></a>00982 
+<a name="l00983"></a><a class="code" href="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">00983</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">try_release</a>() {
+<a name="l00984"></a>00984         buffer_operation op_data(rel_res);
+<a name="l00985"></a>00985         my_aggregator.execute(&op_data);
+<a name="l00986"></a>00986         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00987"></a>00987     }
+<a name="l00988"></a>00988         
+<a name="l00990"></a>00990 
+<a name="l00991"></a><a class="code" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">00991</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">try_consume</a>() {
+<a name="l00992"></a>00992         buffer_operation op_data(con_res);
+<a name="l00993"></a>00993         my_aggregator.execute(&op_data);
+<a name="l00994"></a>00994         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00995"></a>00995     }
+<a name="l00996"></a>00996         
+<a name="l00998"></a>00998 
+<a name="l00999"></a><a class="code" href="a00237.html#2b02fe332e704bbe14f297802298b63a">00999</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00237.html#2b02fe332e704bbe14f297802298b63a">try_put</a>(<span class="keyword">const</span> T &t) {
+<a name="l01000"></a>01000         buffer_operation op_data(t, put_item);
+<a name="l01001"></a>01001         my_aggregator.execute(&op_data);
+<a name="l01002"></a>01002         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01003"></a>01003     }
+<a name="l01004"></a>01004 };
+<a name="l01005"></a>01005         
+<a name="l01006"></a>01006         
+<a name="l01008"></a>01008 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
+<a name="l01009"></a><a class="code" href="a00287.html">01009</a> <span class="keyword">class </span><a class="code" href="a00287.html">queue_node</a> : <span class="keyword">public</span> buffer_node<T, A> {
+<a name="l01010"></a>01010 <span class="keyword">protected</span>:
+<a name="l01011"></a>01011 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::size_type</a> size_type;
+<a name="l01012"></a>01012 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::buffer_operation</a> queue_operation;
+<a name="l01013"></a>01013         
+<a name="l01014"></a>01014     <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
+<a name="l01015"></a>01015         
+<a name="l01017"></a><a class="code" href="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">01017</a>     <span class="comment">/* override */</span> <span class="keywordtype">void</span> <a class="code" href="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">internal_forward</a>(queue_operation *op) {
+<a name="l01018"></a>01018         T i_copy;
+<a name="l01019"></a>01019         <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
+<a name="l01020"></a>01020         size_type counter = this->my_successors.size();
+<a name="l01021"></a>01021         <span class="keywordflow">if</span> (this->my_reserved || !this->item_valid(this->my_head)){
+<a name="l01022"></a>01022             __TBB_store_with_release(op->status, FAILED);
+<a name="l01023"></a>01023             this->forwarder_busy = <span class="keyword">false</span>;
+<a name="l01024"></a>01024             <span class="keywordflow">return</span>;
+<a name="l01025"></a>01025         }
+<a name="l01026"></a>01026         <span class="comment">// Keep trying to send items while there is at least one accepting successor</span>
+<a name="l01027"></a>01027         <span class="keywordflow">while</span> (counter>0 && this->item_valid(this->my_head)) {
+<a name="l01028"></a>01028             this->fetch_front(i_copy);
+<a name="l01029"></a>01029             <span class="keywordflow">if</span>(this->my_successors.try_put(i_copy)) {
+<a name="l01030"></a>01030                  this->invalidate_front();
+<a name="l01031"></a>01031                  ++(this->my_head);
+<a name="l01032"></a>01032                 success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
+<a name="l01033"></a>01033             }
+<a name="l01034"></a>01034             --counter;
+<a name="l01035"></a>01035         }
+<a name="l01036"></a>01036         <span class="keywordflow">if</span> (success && !counter)
+<a name="l01037"></a>01037             __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01038"></a>01038         <span class="keywordflow">else</span> {
+<a name="l01039"></a>01039             __TBB_store_with_release(op->status, FAILED);
+<a name="l01040"></a>01040             this->forwarder_busy = <span class="keyword">false</span>;
+<a name="l01041"></a>01041         }
+<a name="l01042"></a>01042     }
+<a name="l01043"></a>01043         
+<a name="l01044"></a>01044     <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_pop(queue_operation *op) {
+<a name="l01045"></a>01045         <span class="keywordflow">if</span> ( this->my_reserved || !this->item_valid(this->my_head)){
+<a name="l01046"></a>01046             __TBB_store_with_release(op->status, FAILED);
+<a name="l01047"></a>01047         }
+<a name="l01048"></a>01048         <span class="keywordflow">else</span> {
+<a name="l01049"></a>01049             this->pop_front(*(op->elem));
+<a name="l01050"></a>01050             __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01051"></a>01051         }
+<a name="l01052"></a>01052     }
+<a name="l01053"></a>01053     <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_reserve(queue_operation *op) {
+<a name="l01054"></a>01054         <span class="keywordflow">if</span> (this->my_reserved || !this->item_valid(this->my_head)) {
+<a name="l01055"></a>01055             __TBB_store_with_release(op->status, FAILED);
+<a name="l01056"></a>01056         }
+<a name="l01057"></a>01057         <span class="keywordflow">else</span> {
+<a name="l01058"></a>01058             this->my_reserved = <span class="keyword">true</span>;
+<a name="l01059"></a>01059             this->fetch_front(*(op->elem));
+<a name="l01060"></a>01060             this->invalidate_front();
+<a name="l01061"></a>01061             __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01062"></a>01062         }
+<a name="l01063"></a>01063     }
+<a name="l01064"></a>01064     <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_consume(queue_operation *op) {
+<a name="l01065"></a>01065         this->consume_front();
+<a name="l01066"></a>01066         __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01067"></a>01067     }
+<a name="l01068"></a>01068         
+<a name="l01069"></a>01069 <span class="keyword">public</span>:
+<a name="l01070"></a>01070         
+<a name="l01071"></a><a class="code" href="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">01071</a>     <span class="keyword">typedef</span> T <a class="code" href="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">input_type</a>;
+<a name="l01072"></a><a class="code" href="a00287.html#25b5a53ab1f9a342644fa3759bc0b1ad">01072</a>     <span class="keyword">typedef</span> T output_type;
+<a name="l01073"></a><a class="code" href="a00287.html#5e2fdd33c45d44549dee9c1638e19898">01073</a>     <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l01074"></a><a class="code" href="a00287.html#f35076a19f256f9e7a61bed77ca1ccc5">01074</a>     <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l01075"></a>01075         
+<a name="l01077"></a><a class="code" href="a00287.html#c716593a92448b0f429d1f3a38e67996">01077</a>     <a class="code" href="a00287.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>( <a class="code" href="a00262.html">graph</a> &g ) : buffer_node<T, A>(g) {}
+<a name="l01078"></a>01078 
+<a name="l01080"></a><a class="code" href="a00287.html#0226762d9ebba28311b7b1518d948ab1">01080</a>     <a class="code" href="a00287.html#c716593a92448b0f429d1f3a38e67996">queue_node</a>( <span class="keyword">const</span> <a class="code" href="a00287.html">queue_node</a>& src) : buffer_node<T, A>(src) {}
+<a name="l01081"></a>01081 };
+<a name="l01082"></a>01082         
+<a name="l01084"></a>01084 <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
+<a name="l01085"></a><a class="code" href="a00302.html">01085</a> <span class="keyword">class </span><a class="code" href="a00302.html">sequencer_node</a> : <span class="keyword">public</span> <a class="code" href="a00287.html">queue_node</a><T, A> {
+<a name="l01086"></a>01086     internal::function_body< T, size_t > *my_sequencer;
+<a name="l01087"></a>01087 <span class="keyword">public</span>:
+<a name="l01088"></a>01088         
+<a name="l01089"></a><a class="code" href="a00302.html#af629f26832ff4e476e240637a78bc0c">01089</a>     <span class="keyword">typedef</span> T <a class="code" href="a00302.html#af629f26832ff4e476e240637a78bc0c">input_type</a>;
+<a name="l01090"></a><a class="code" href="a00302.html#ca026eaef70e35791c407323199031a7">01090</a>     <span class="keyword">typedef</span> T output_type;
+<a name="l01091"></a><a class="code" href="a00302.html#8127e36811832563fe1e9bc3ba391f79">01091</a>     <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l01092"></a><a class="code" href="a00302.html#795f3ee75f133b9d3b159172fc4a197f">01092</a>     <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l01093"></a>01093         
+<a name="l01095"></a>01095     <span class="keyword">template</span>< <span class="keyword">typename</span> Sequencer >
+<a name="l01096"></a><a class="code" href="a00302.html#7e71cbdf78f989091bc162b89bee7e66">01096</a>     <a class="code" href="a00302.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a>( <a class="code" href="a00262.html">graph</a> &g, <span class="keyword">const</span> Sequencer& s ) : <a class="code" href="a00287.html">queue_node</a><T, A>(g),
+<a name="l01097"></a>01097         my_sequencer(new internal::function_body_leaf< T, size_t, Sequencer>(s) ) {}
+<a name="l01098"></a>01098 
+<a name="l01100"></a><a class="code" href="a00302.html#b38e7a070552960384bcc1d91af13a5c">01100</a>     <a class="code" href="a00302.html#7e71cbdf78f989091bc162b89bee7e66">sequencer_node</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">sequencer_node</a>& src ) : <a class="code" href="a00287.html">queue_node</a><T, A>(src),
+<a name="l01101"></a>01101         my_sequencer( src.my_sequencer->clone() ) {}
+<a name="l01102"></a>01102         
+<a name="l01104"></a><a class="code" href="a00302.html#93d3d8f6a72b3e1387047282116ed6ee">01104</a>     <a class="code" href="a00302.html#93d3d8f6a72b3e1387047282116ed6ee">~sequencer_node</a>() { <span class="keyword">delete</span> my_sequencer; }
+<a name="l01105"></a>01105 <span class="keyword">protected</span>:
+<a name="l01106"></a>01106     <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::size_type</a> size_type;
+<a name="l01107"></a>01107     <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::buffer_operation</a> sequencer_operation;
+<a name="l01108"></a>01108         
+<a name="l01109"></a>01109     <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
+<a name="l01110"></a>01110         
+<a name="l01111"></a>01111 <span class="keyword">private</span>:
+<a name="l01112"></a>01112     <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_push(sequencer_operation *op) {
+<a name="l01113"></a>01113         size_type tag = (*my_sequencer)(*(op->elem));
+<a name="l01114"></a>01114         
+<a name="l01115"></a>01115         this->my_tail = (tag+1 > this->my_tail) ? tag+1 : this->my_tail;
+<a name="l01116"></a>01116         
+<a name="l01117"></a>01117         <span class="keywordflow">if</span>(this->size() > this->capacity())
+<a name="l01118"></a>01118             this->grow_my_array(this->size());  <span class="comment">// tail already has 1 added to it</span>
+<a name="l01119"></a>01119         this->item(tag) = std::make_pair( *(op->elem), <span class="keyword">true</span> );
+<a name="l01120"></a>01120         __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01121"></a>01121     }
+<a name="l01122"></a>01122 };
+<a name="l01123"></a>01123         
+<a name="l01125"></a>01125 <span class="keyword">template</span>< <span class="keyword">typename</span> T, <span class="keyword">typename</span> Compare = std::less<T>, <span class="keyword">typename</span> A=cache_aligned_allocator<T> >
+<a name="l01126"></a><a class="code" href="a00286.html">01126</a> <span class="keyword">class </span><a class="code" href="a00286.html">priority_queue_node</a> : <span class="keyword">public</span> buffer_node<T, A> {
+<a name="l01127"></a>01127 <span class="keyword">public</span>:
+<a name="l01128"></a><a class="code" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">01128</a>     <span class="keyword">typedef</span> T <a class="code" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a>;
+<a name="l01129"></a><a class="code" href="a00286.html#2cb099b590246b6bc93cc15e78c6ee5c">01129</a>     <span class="keyword">typedef</span> T output_type;
+<a name="l01130"></a><a class="code" href="a00286.html#fdea783bf9d5a4c98e794ac7e0f84ccf">01130</a>     <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l01131"></a><a class="code" href="a00286.html#09ab5064ca8192e68c03da47603e68eb">01131</a>     <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l01132"></a>01132         
+<a name="l01134"></a><a class="code" href="a00286.html#497ec2612615249bf5a294eb1b7b93b3">01134</a>     <a class="code" href="a00286.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a>( <a class="code" href="a00262.html">graph</a> &g ) : buffer_node<T, A>(g), mark(0) {}
+<a name="l01135"></a>01135 
+<a name="l01137"></a><a class="code" href="a00286.html#17a4f66e23d54100b64805405e905d62">01137</a>     <a class="code" href="a00286.html#497ec2612615249bf5a294eb1b7b93b3">priority_queue_node</a>( <span class="keyword">const</span> <a class="code" href="a00286.html">priority_queue_node</a> &src ) : buffer_node<T, A>(src), mark(0) {}
+<a name="l01138"></a>01138         
+<a name="l01139"></a>01139 <span class="keyword">protected</span>:
+<a name="l01140"></a>01140     <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::size_type</a> size_type;
+<a name="l01141"></a>01141     <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::item_type</a> item_type;
+<a name="l01142"></a>01142     <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00237.html">buffer_node<T, A>::buffer_operation</a> prio_operation;
+<a name="l01143"></a>01143         
+<a name="l01144"></a>01144     <span class="keyword">enum</span> op_stat {WAIT=0, SUCCEEDED, FAILED};
+<a name="l01145"></a>01145         
+<a name="l01146"></a>01146     <span class="comment">/* override */</span> <span class="keywordtype">void</span> handle_operations(prio_operation *op_list) {
+<a name="l01147"></a>01147         prio_operation *tmp <span class="comment">/*, *pop_list*/</span> ;
+<a name="l01148"></a>01148         <span class="keywordtype">bool</span> try_forwarding=<span class="keyword">false</span>;
+<a name="l01149"></a>01149         <span class="keywordflow">while</span> (op_list) {
+<a name="l01150"></a>01150             tmp = op_list;
+<a name="l01151"></a>01151             op_list = op_list->next;
+<a name="l01152"></a>01152             <span class="keywordflow">switch</span> (tmp->type) {
+<a name="l01153"></a>01153             <span class="keywordflow">case</span> <a class="code" href="a00237.html">buffer_node<T, A>::reg_succ</a>: this-><a class="code" href="a00237.html#df21388252b8963e839dca29d2c67ea5">internal_reg_succ</a>(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
+<a name="l01154"></a>01154             <span class="keywordflow">case</span> <a class="code" href="a00237.html">buffer_node<T, A>::rem_succ</a>: this-><a class="code" href="a00237.html#6b6cf76dff80fd679251da93351c1291">internal_rem_succ</a>(tmp); <span class="keywordflow">break</span>;
+<a name="l01155"></a>01155             <span class="keywordflow">case</span> <a class="code" href="a00237.html">buffer_node<T, A>::put_item</a>: internal_push(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
+<a name="l01156"></a>01156             <span class="keywordflow">case</span> <a class="code" href="a00237.html">buffer_node<T, A>::try_fwd</a>: <a class="code" href="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">internal_forward</a>(tmp); <span class="keywordflow">break</span>;
+<a name="l01157"></a>01157             <span class="keywordflow">case</span> <a class="code" href="a00237.html">buffer_node<T, A>::rel_res</a>: internal_release(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
+<a name="l01158"></a>01158             <span class="keywordflow">case</span> <a class="code" href="a00237.html">buffer_node<T, A>::con_res</a>: internal_consume(tmp); try_forwarding = <span class="keyword">true</span>; <span class="keywordflow">break</span>;
+<a name="l01159"></a>01159             <span class="keywordflow">case</span> <a class="code" href="a00237.html">buffer_node<T, A>::req_item</a>: internal_pop(tmp); <span class="keywordflow">break</span>;
+<a name="l01160"></a>01160             <span class="keywordflow">case</span> <a class="code" href="a00237.html">buffer_node<T, A>::res_item</a>: internal_reserve(tmp); <span class="keywordflow">break</span>;
+<a name="l01161"></a>01161             }
+<a name="l01162"></a>01162         }
+<a name="l01163"></a>01163         <span class="comment">// process pops!  for now, no special pop processing</span>
+<a name="l01164"></a>01164         <span class="keywordflow">if</span> (mark<this->my_tail) heapify();
+<a name="l01165"></a>01165         <span class="keywordflow">if</span> (try_forwarding && !this->forwarder_busy) {
+<a name="l01166"></a>01166             this->forwarder_busy = <span class="keyword">true</span>;
+<a name="l01167"></a>01167             <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>(*<span class="keyword">new</span>(task::allocate_additional_child_of(*(this->my_parent))) internal::forward_task< buffer_node<input_type, A> >(*<span class="keyword">this</span>));
+<a name="l01168"></a>01168         }
+<a name="l01169"></a>01169     }
+<a name="l01170"></a>01170         
+<a name="l01172"></a><a class="code" href="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">01172</a>     <span class="comment">/* override */</span> <span class="keywordtype">void</span> <a class="code" href="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">internal_forward</a>(prio_operation *op) {
+<a name="l01173"></a>01173         T i_copy;
+<a name="l01174"></a>01174         <span class="keywordtype">bool</span> success = <span class="keyword">false</span>; <span class="comment">// flagged when a successor accepts</span>
+<a name="l01175"></a>01175         size_type counter = this->my_successors.size();
+<a name="l01176"></a>01176         
+<a name="l01177"></a>01177         <span class="keywordflow">if</span> (this->my_reserved || this->my_tail == 0) {
+<a name="l01178"></a>01178             __TBB_store_with_release(op->status, FAILED);
+<a name="l01179"></a>01179             this->forwarder_busy = <span class="keyword">false</span>;
+<a name="l01180"></a>01180             <span class="keywordflow">return</span>;
+<a name="l01181"></a>01181         }
+<a name="l01182"></a>01182         <span class="comment">// Keep trying to send while there exists an accepting successor</span>
+<a name="l01183"></a>01183         <span class="keywordflow">while</span> (counter>0 && this->my_tail > 0) {
+<a name="l01184"></a>01184             i_copy = this->my_array[0].first;
+<a name="l01185"></a>01185             <span class="keywordtype">bool</span> msg = this->my_successors.try_put(i_copy);
+<a name="l01186"></a>01186             <span class="keywordflow">if</span> ( msg == <span class="keyword">true</span> ) {
+<a name="l01187"></a>01187                  <span class="keywordflow">if</span> (mark == this->my_tail) --mark;
+<a name="l01188"></a>01188                 --(this->my_tail);
+<a name="l01189"></a>01189                 this->my_array[0].first=this->my_array[this->my_tail].first;
+<a name="l01190"></a>01190                 <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
+<a name="l01191"></a>01191                     reheap();
+<a name="l01192"></a>01192                 success = <span class="keyword">true</span>; <span class="comment">// found an accepting successor</span>
+<a name="l01193"></a>01193             }
+<a name="l01194"></a>01194             --counter;
+<a name="l01195"></a>01195         }
+<a name="l01196"></a>01196         <span class="keywordflow">if</span> (success && !counter)
+<a name="l01197"></a>01197             __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01198"></a>01198         <span class="keywordflow">else</span> {
+<a name="l01199"></a>01199             __TBB_store_with_release(op->status, FAILED);
+<a name="l01200"></a>01200             this->forwarder_busy = <span class="keyword">false</span>;
+<a name="l01201"></a>01201         }
+<a name="l01202"></a>01202     }
+<a name="l01203"></a>01203         
+<a name="l01204"></a>01204     <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_push(prio_operation *op) {
+<a name="l01205"></a>01205         <span class="keywordflow">if</span> ( this->my_tail >= this->my_array_size )
+<a name="l01206"></a>01206             this->grow_my_array( this->my_tail + 1 );
+<a name="l01207"></a>01207         this->my_array[this->my_tail] = std::make_pair( *(op->elem), <span class="keyword">true</span> );
+<a name="l01208"></a>01208         ++(this->my_tail);
+<a name="l01209"></a>01209         __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01210"></a>01210     }
+<a name="l01211"></a>01211     <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_pop(prio_operation *op) {
+<a name="l01212"></a>01212         <span class="keywordflow">if</span> ( this->my_reserved == <span class="keyword">true</span> || this->my_tail == 0 ) {
+<a name="l01213"></a>01213             __TBB_store_with_release(op->status, FAILED);
+<a name="l01214"></a>01214         }
+<a name="l01215"></a>01215         <span class="keywordflow">else</span> {
+<a name="l01216"></a>01216             <span class="keywordflow">if</span> (mark<this->my_tail &&
+<a name="l01217"></a>01217                 compare(this->my_array[0].first,
+<a name="l01218"></a>01218                         this->my_array[this->my_tail-1].first)) {
+<a name="l01219"></a>01219                 <span class="comment">// there are newly pushed elems; last one higher than top</span>
+<a name="l01220"></a>01220                 <span class="comment">// copy the data</span>
+<a name="l01221"></a>01221                 *(op->elem) = this->my_array[this->my_tail-1].first;
+<a name="l01222"></a>01222                 --(this->my_tail);
+<a name="l01223"></a>01223                 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01224"></a>01224             }
+<a name="l01225"></a>01225             <span class="keywordflow">else</span> { <span class="comment">// extract and push the last element down heap</span>
+<a name="l01226"></a>01226                 *(op->elem) = this->my_array[0].first; <span class="comment">// copy the data</span>
+<a name="l01227"></a>01227                 if (mark == this->my_tail) --mark;
+<a name="l01228"></a>01228                 --(this->my_tail);
+<a name="l01229"></a>01229                 __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01230"></a>01230                 this->my_array[0].first=this->my_array[this->my_tail].first;
+<a name="l01231"></a>01231                 <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
+<a name="l01232"></a>01232                     reheap();
+<a name="l01233"></a>01233             }
+<a name="l01234"></a>01234         }
+<a name="l01235"></a>01235     }
+<a name="l01236"></a>01236     <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_reserve(prio_operation *op) {
+<a name="l01237"></a>01237         <span class="keywordflow">if</span> (this->my_reserved == <span class="keyword">true</span> || this->my_tail == 0) {
+<a name="l01238"></a>01238             __TBB_store_with_release(op->status, FAILED);
+<a name="l01239"></a>01239         }
+<a name="l01240"></a>01240         <span class="keywordflow">else</span> {
+<a name="l01241"></a>01241             this->my_reserved = <span class="keyword">true</span>;
+<a name="l01242"></a>01242             *(op->elem) = reserved_item = this->my_array[0].first;
+<a name="l01243"></a>01243             if (mark == this->my_tail) --mark;
+<a name="l01244"></a>01244             --(this->my_tail);
+<a name="l01245"></a>01245             __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01246"></a>01246             this->my_array[0].first = this->my_array[this->my_tail].first;
+<a name="l01247"></a>01247             <span class="keywordflow">if</span> (this->my_tail > 1) <span class="comment">// don't reheap for heap of size 1</span>
+<a name="l01248"></a>01248                 reheap();
+<a name="l01249"></a>01249         }
+<a name="l01250"></a>01250     }
+<a name="l01251"></a>01251     <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_consume(prio_operation *op) {
+<a name="l01252"></a>01252         this->my_reserved = <span class="keyword">false</span>;
+<a name="l01253"></a>01253         __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01254"></a>01254     }
+<a name="l01255"></a>01255     <span class="comment">/* override */</span> <span class="keywordtype">void</span> internal_release(prio_operation *op) {
+<a name="l01256"></a>01256         <span class="keywordflow">if</span> (this->my_tail >= this->my_array_size)
+<a name="l01257"></a>01257             this->grow_my_array( this->my_tail + 1 );
+<a name="l01258"></a>01258         this->my_array[this->my_tail] = std::make_pair(reserved_item, <span class="keyword">true</span>);
+<a name="l01259"></a>01259         ++(this->my_tail);
+<a name="l01260"></a>01260         this->my_reserved = <span class="keyword">false</span>;
+<a name="l01261"></a>01261         __TBB_store_with_release(op->status, SUCCEEDED);
+<a name="l01262"></a>01262         heapify();
+<a name="l01263"></a>01263     }
+<a name="l01264"></a>01264 <span class="keyword">private</span>:
+<a name="l01265"></a>01265     Compare compare;
+<a name="l01266"></a>01266     size_type mark;
+<a name="l01267"></a>01267     <a class="code" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> reserved_item;
+<a name="l01268"></a>01268         
+<a name="l01269"></a>01269     <span class="keywordtype">void</span> heapify() {
+<a name="l01270"></a>01270         <span class="keywordflow">if</span> (!mark) mark = 1;
+<a name="l01271"></a>01271         <span class="keywordflow">for</span> (; mark<this->my_tail; ++mark) { <span class="comment">// for each unheaped element</span>
+<a name="l01272"></a>01272             size_type cur_pos = mark;
+<a name="l01273"></a>01273             <a class="code" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">input_type</a> to_place = this->my_array[mark].first;
+<a name="l01274"></a>01274             <span class="keywordflow">do</span> { <span class="comment">// push to_place up the heap</span>
+<a name="l01275"></a>01275                 size_type parent = (cur_pos-1)>>1;
+<a name="l01276"></a>01276                 <span class="keywordflow">if</span> (!compare(this->my_array[parent].first, to_place))
+<a name="l01277"></a>01277                     <span class="keywordflow">break</span>;
+<a name="l01278"></a>01278                 this->my_array[cur_pos].first = this->my_array[parent].first;
+<a name="l01279"></a>01279                 cur_pos = parent;
+<a name="l01280"></a>01280             } <span class="keywordflow">while</span>( cur_pos );
+<a name="l01281"></a>01281             this->my_array[cur_pos].first = to_place;
+<a name="l01282"></a>01282         }
+<a name="l01283"></a>01283     }
+<a name="l01284"></a>01284         
+<a name="l01285"></a>01285     <span class="keywordtype">void</span> reheap() {
+<a name="l01286"></a>01286         size_type cur_pos=0, child=1;
+<a name="l01287"></a>01287         <span class="keywordflow">while</span> (child < mark) {
+<a name="l01288"></a>01288             size_type target = child;
+<a name="l01289"></a>01289             <span class="keywordflow">if</span> (child+1<mark &&
+<a name="l01290"></a>01290                 compare(this->my_array[child].first,
+<a name="l01291"></a>01291                         this->my_array[child+1].first))
+<a name="l01292"></a>01292                 ++target;
+<a name="l01293"></a>01293             <span class="comment">// target now has the higher priority child</span>
+<a name="l01294"></a>01294             <span class="keywordflow">if</span> (compare(this->my_array[target].first,
+<a name="l01295"></a>01295                         this->my_array[this->my_tail].first))
+<a name="l01296"></a>01296                 <span class="keywordflow">break</span>;
+<a name="l01297"></a>01297             this->my_array[cur_pos].first = this->my_array[target].first;
+<a name="l01298"></a>01298             cur_pos = target;
+<a name="l01299"></a>01299             child = (cur_pos<<1)+1;
+<a name="l01300"></a>01300         }
+<a name="l01301"></a>01301         this->my_array[cur_pos].first = this->my_array[this->my_tail].first;
+<a name="l01302"></a>01302     }
+<a name="l01303"></a>01303 };
+<a name="l01304"></a>01304         
+<a name="l01306"></a>01306 
+<a name="l01309"></a>01309 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l01310"></a><a class="code" href="a00266.html">01310</a> <span class="keyword">class </span><a class="code" href="a00266.html">limiter_node</a> : <span class="keyword">public</span> <a class="code" href="a00263.html">graph_node</a>, <span class="keyword">public</span> <a class="code" href="a00295.html">receiver</a>< T >, <span class="keyword">public</span> <a class="code" href="a00301.html">sender</a>< T > {
+<a name="l01311"></a>01311 <span class="keyword">public</span>:
+<a name="l01312"></a>01312         
+<a name="l01313"></a><a class="code" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">01313</a>     <span class="keyword">typedef</span> T <a class="code" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">input_type</a>;
+<a name="l01314"></a><a class="code" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">01314</a>     <span class="keyword">typedef</span> T output_type;
+<a name="l01315"></a><a class="code" href="a00266.html#f89fcf44f38eb33f965ee5362d3e68e9">01315</a>     <span class="keyword">typedef</span> <a class="code" href="a00301.html">sender< input_type ></a> <a class="code" href="a00301.html">predecessor_type</a>;
+<a name="l01316"></a><a class="code" href="a00266.html#e8945e4dd6ea759ff9e4735da13f12ef">01316</a>     <span class="keyword">typedef</span> <a class="code" href="a00295.html">receiver< output_type ></a> <a class="code" href="a00295.html">successor_type</a>;
+<a name="l01317"></a>01317         
+<a name="l01318"></a>01318 <span class="keyword">private</span>:
+<a name="l01319"></a>01319         
+<a name="l01320"></a>01320     <a class="code" href="a00311.html">task</a> *my_root_task;
+<a name="l01321"></a>01321     size_t my_threshold;
+<a name="l01322"></a>01322     size_t my_count;
+<a name="l01323"></a>01323     internal::predecessor_cache< T > my_predecessors;
+<a name="l01324"></a>01324     <a class="code" href="a00305.html">spin_mutex</a> my_mutex;
+<a name="l01325"></a>01325     internal::broadcast_cache< T > my_successors;
+<a name="l01326"></a>01326     <span class="keywordtype">int</span> init_decrement_predecessors;
+<a name="l01327"></a>01327 
+<a name="l01328"></a>01328     <span class="keyword">friend</span> <span class="keyword">class </span>internal::forward_task< limiter_node<T> >;
+<a name="l01329"></a>01329         
+<a name="l01330"></a>01330     <span class="comment">// Let decrementer call decrement_counter()</span>
+<a name="l01331"></a>01331     <span class="keyword">friend</span> <span class="keyword">class </span>internal::decrementer< limiter_node<T> >;
+<a name="l01332"></a>01332         
+<a name="l01333"></a>01333     <span class="keywordtype">void</span> decrement_counter() {
+<a name="l01334"></a>01334         <a class="code" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">input_type</a> v;
+<a name="l01335"></a>01335         
+<a name="l01336"></a>01336         <span class="comment">// If we can't get / put an item immediately then drop the count</span>
+<a name="l01337"></a>01337         <span class="keywordflow">if</span> ( my_predecessors.get_item( v ) == <span class="keyword">false</span> 
+<a name="l01338"></a>01338              || my_successors.try_put(v) == false ) {
+<a name="l01339"></a>01339             <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l01340"></a>01340             --my_count;
+<a name="l01341"></a>01341             <span class="keywordflow">if</span> ( !my_predecessors.empty() ) 
+<a name="l01342"></a>01342                 <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) ) 
+<a name="l01343"></a>01343                             internal::forward_task< <a class="code" href="a00266.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
+<a name="l01344"></a>01344         }
+<a name="l01345"></a>01345     }
+<a name="l01346"></a>01346         
+<a name="l01347"></a>01347     <span class="keywordtype">void</span> forward() {
+<a name="l01348"></a>01348         {
+<a name="l01349"></a>01349             <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l01350"></a>01350             <span class="keywordflow">if</span> ( my_count < my_threshold ) 
+<a name="l01351"></a>01351                 ++my_count;
+<a name="l01352"></a>01352             <span class="keywordflow">else</span>
+<a name="l01353"></a>01353                 <span class="keywordflow">return</span>;
+<a name="l01354"></a>01354         }
+<a name="l01355"></a>01355         decrement_counter();
+<a name="l01356"></a>01356     }
+<a name="l01357"></a>01357         
+<a name="l01358"></a>01358 <span class="keyword">public</span>:
+<a name="l01359"></a>01359         
+<a name="l01361"></a><a class="code" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">01361</a>     internal::decrementer< limiter_node<T> > <a class="code" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>;
+<a name="l01362"></a>01362         
+<a name="l01364"></a><a class="code" href="a00266.html#831b06576f46fe2bf3ed0f86b793c1b2">01364</a>     <a class="code" href="a00266.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a>(<a class="code" href="a00262.html">graph</a> &g, size_t threshold, <span class="keywordtype">int</span> num_decrement_predecessors=0) : 
+<a name="l01365"></a>01365         my_root_task(g.root_task()), my_threshold(threshold), my_count(0), 
+<a name="l01366"></a>01366         init_decrement_predecessors(num_decrement_predecessors), 
+<a name="l01367"></a>01367         <a class="code" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>(num_decrement_predecessors) 
+<a name="l01368"></a>01368     {
+<a name="l01369"></a>01369         my_predecessors.set_owner(<span class="keyword">this</span>);
+<a name="l01370"></a>01370         my_successors.set_owner(<span class="keyword">this</span>);
+<a name="l01371"></a>01371         <a class="code" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>.set_owner(<span class="keyword">this</span>);
+<a name="l01372"></a>01372     }
+<a name="l01373"></a>01373         
+<a name="l01375"></a><a class="code" href="a00266.html#83d3ab884543b070ee5b345a87f241fa">01375</a>     <a class="code" href="a00266.html#831b06576f46fe2bf3ed0f86b793c1b2">limiter_node</a>( <span class="keyword">const</span> limiter_node& src ) : 
+<a name="l01376"></a>01376         <a class="code" href="a00263.html">graph_node</a>(), <a class="code" href="a00295.html">receiver</a><T>(), <a class="code" href="a00301.html">sender</a><T>(),
+<a name="l01377"></a>01377         my_root_task(src.my_root_task), my_threshold(src.my_threshold), my_count(0), 
+<a name="l01378"></a>01378         init_decrement_predecessors(src.init_decrement_predecessors), 
+<a name="l01379"></a>01379         <a class="code" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>(src.init_decrement_predecessors) 
+<a name="l01380"></a>01380     {
+<a name="l01381"></a>01381         my_predecessors.set_owner(<span class="keyword">this</span>);
+<a name="l01382"></a>01382         my_successors.set_owner(<span class="keyword">this</span>);
+<a name="l01383"></a>01383         <a class="code" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">decrement</a>.set_owner(<span class="keyword">this</span>);
+<a name="l01384"></a>01384     }
+<a name="l01385"></a>01385 
+<a name="l01387"></a><a class="code" href="a00266.html#c76561d8d871b4769876988a4de12a9b">01387</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00266.html#c76561d8d871b4769876988a4de12a9b">register_successor</a>( <a class="code" href="a00295.html">receiver<output_type></a> &r ) {
+<a name="l01388"></a>01388         my_successors.register_successor(r);
+<a name="l01389"></a>01389         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01390"></a>01390     }
+<a name="l01391"></a>01391         
+<a name="l01393"></a>01393 
+<a name="l01394"></a><a class="code" href="a00266.html#275e328063c121b3e506ccef2a825d28">01394</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00266.html#275e328063c121b3e506ccef2a825d28">remove_successor</a>( <a class="code" href="a00295.html">receiver<output_type></a> &r ) {
+<a name="l01395"></a>01395         r.<a class="code" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>(*<span class="keyword">this</span>);
+<a name="l01396"></a>01396         my_successors.remove_successor(r);
+<a name="l01397"></a>01397         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01398"></a>01398     }
+<a name="l01399"></a>01399         
+<a name="l01401"></a><a class="code" href="a00266.html#55a02d458a4d8ffa6accd7a70605da2f">01401</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00266.html#55a02d458a4d8ffa6accd7a70605da2f">try_put</a>( <span class="keyword">const</span> T &t ) {
+<a name="l01402"></a>01402         {
+<a name="l01403"></a>01403             <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l01404"></a>01404             <span class="keywordflow">if</span> ( my_count >= my_threshold ) 
+<a name="l01405"></a>01405                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01406"></a>01406             <span class="keywordflow">else</span>
+<a name="l01407"></a>01407                 ++my_count; 
+<a name="l01408"></a>01408         }
+<a name="l01409"></a>01409         
+<a name="l01410"></a>01410         <span class="keywordtype">bool</span> msg = my_successors.try_put(t);
+<a name="l01411"></a>01411         
+<a name="l01412"></a>01412         <span class="keywordflow">if</span> ( msg != <span class="keyword">true</span> ) {
+<a name="l01413"></a>01413             <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l01414"></a>01414             --my_count;
+<a name="l01415"></a>01415             <span class="keywordflow">if</span> ( !my_predecessors.empty() ) 
+<a name="l01416"></a>01416                 <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) ) 
+<a name="l01417"></a>01417                             internal::forward_task< <a class="code" href="a00266.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
+<a name="l01418"></a>01418         }
+<a name="l01419"></a>01419         
+<a name="l01420"></a>01420         <span class="keywordflow">return</span> msg;
+<a name="l01421"></a>01421     }
+<a name="l01422"></a>01422         
+<a name="l01424"></a><a class="code" href="a00266.html#de70a0e88ce7655d8c14b6af57f7496f">01424</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00266.html#de70a0e88ce7655d8c14b6af57f7496f">register_predecessor</a>( <a class="code" href="a00301.html">predecessor_type</a> &src ) {
+<a name="l01425"></a>01425         <a class="code" href="a00306.html">spin_mutex::scoped_lock</a> lock(my_mutex);
+<a name="l01426"></a>01426         my_predecessors.add( src );
+<a name="l01427"></a>01427         <span class="keywordflow">if</span> ( my_count < my_threshold && !my_successors.empty() ) 
+<a name="l01428"></a>01428             <a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) ) 
+<a name="l01429"></a>01429                            internal::forward_task< <a class="code" href="a00266.html">limiter_node<T></a> >( *<span class="keyword">this</span> ) );
+<a name="l01430"></a>01430         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01431"></a>01431     }
+<a name="l01432"></a>01432         
+<a name="l01434"></a><a class="code" href="a00266.html#c530e7b469454e2340460795f2da3317">01434</a>     <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00266.html#c530e7b469454e2340460795f2da3317">remove_predecessor</a>( <a class="code" href="a00301.html">predecessor_type</a> &src ) {
+<a name="l01435"></a>01435         my_predecessors.remove( src );
+<a name="l01436"></a>01436         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01437"></a>01437     }
+<a name="l01438"></a>01438         
+<a name="l01439"></a>01439 };
+<a name="l01440"></a>01440 
+<a name="l01441"></a>01441 <span class="preprocessor">#include "internal/_flow_graph_join_impl.h"</span>
+<a name="l01442"></a>01442 
+<a name="l01443"></a>01443 <span class="keyword">using</span> internal::reserving_port;
+<a name="l01444"></a>01444 <span class="keyword">using</span> internal::queueing_port;
+<a name="l01445"></a>01445 <span class="keyword">using</span> internal::tag_matching_port;
+<a name="l01446"></a>01446 <span class="keyword">using</span> internal::input_port;
+<a name="l01447"></a>01447 <span class="keyword">using</span> internal::tag_value;
+<a name="l01448"></a>01448 <span class="keyword">using</span> internal::NO_TAG;
+<a name="l01449"></a>01449 
+<a name="l01450"></a>01450 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple, graph_buffer_policy JP=queueing> <span class="keyword">class </span>join_node;
+<a name="l01451"></a>01451 
+<a name="l01452"></a>01452 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
+<a name="l01453"></a>01453 <span class="keyword">class </span>join_node<OutputTuple,reserving>: <span class="keyword">public</span> internal::unfolded_join_node<std::tuple_size<OutputTuple>::value, reserving_port, OutputTuple, reserving> {
+<a name="l01454"></a>01454 <span class="keyword">private</span>:
+<a name="l01455"></a>01455     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<OutputTuple>::value;
+<a name="l01456"></a>01456     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::unfolded_join_node<N, reserving_port, OutputTuple, reserving> unfolded_type;
+<a name="l01457"></a>01457 <span class="keyword">public</span>:
+<a name="l01458"></a>01458     <span class="keyword">typedef</span> OutputTuple output_type;
+<a name="l01459"></a>01459     <span class="keyword">typedef</span> <span class="keyword">typename</span> unfolded_type::input_ports_tuple_type input_ports_tuple_type;
+<a name="l01460"></a>01460     join_node(<a class="code" href="a00262.html">graph</a> &g) : unfolded_type(g) { }
+<a name="l01461"></a>01461     join_node(<span class="keyword">const</span> join_node &other) : unfolded_type(other) {}
+<a name="l01462"></a>01462 };
+<a name="l01463"></a>01463 
+<a name="l01464"></a>01464 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
+<a name="l01465"></a>01465 <span class="keyword">class </span>join_node<OutputTuple,queueing>: <span class="keyword">public</span> internal::unfolded_join_node<std::tuple_size<OutputTuple>::value, queueing_port, OutputTuple, queueing> {
+<a name="l01466"></a>01466 <span class="keyword">private</span>:
+<a name="l01467"></a>01467     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<OutputTuple>::value;
+<a name="l01468"></a>01468     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::unfolded_join_node<N, queueing_port, OutputTuple, queueing> unfolded_type;
+<a name="l01469"></a>01469 <span class="keyword">public</span>:
+<a name="l01470"></a>01470     <span class="keyword">typedef</span> OutputTuple output_type;
+<a name="l01471"></a>01471     <span class="keyword">typedef</span> <span class="keyword">typename</span> unfolded_type::input_ports_tuple_type input_ports_tuple_type;
+<a name="l01472"></a>01472     join_node(graph &g) : unfolded_type(g) { }
+<a name="l01473"></a>01473     join_node(<span class="keyword">const</span> join_node &other) : unfolded_type(other) {}
+<a name="l01474"></a>01474 };
+<a name="l01475"></a>01475 
+<a name="l01476"></a>01476 <span class="comment">// template for tag_matching join_node</span>
+<a name="l01477"></a>01477 <span class="keyword">template</span><<span class="keyword">typename</span> OutputTuple>
+<a name="l01478"></a>01478 <span class="keyword">class </span>join_node<OutputTuple, tag_matching> : <span class="keyword">public</span> internal::unfolded_join_node<std::tuple_size<OutputTuple>::value,
+<a name="l01479"></a>01479       tag_matching_port, OutputTuple, tag_matching> {
+<a name="l01480"></a>01480 <span class="keyword">private</span>:
+<a name="l01481"></a>01481     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<OutputTuple>::value;
+<a name="l01482"></a>01482     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::unfolded_join_node<N, tag_matching_port, OutputTuple, tag_matching> unfolded_type;
+<a name="l01483"></a>01483 <span class="keyword">public</span>:
+<a name="l01484"></a>01484     <span class="keyword">typedef</span> OutputTuple output_type;
+<a name="l01485"></a>01485     <span class="keyword">typedef</span> <span class="keyword">typename</span> unfolded_type::input_ports_tuple_type input_ports_tuple_type;
+<a name="l01486"></a>01486     <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1>
+<a name="l01487"></a>01487     join_node(graph &g, B0 b0, B1 b1) : unfolded_type(g, b0, b1) { }
+<a name="l01488"></a>01488     <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2>
+<a name="l01489"></a>01489     join_node(graph &g, B0 b0, B1 b1, B2 b2) : unfolded_type(g, b0, b1, b2) { }
+<a name="l01490"></a>01490     <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3>
+<a name="l01491"></a>01491     join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3) : unfolded_type(g, b0, b1, b2, b3) { }
+<a name="l01492"></a>01492     <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3, <span class="keyword">typename</span> B4>
+<a name="l01493"></a>01493     join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) : unfolded_type(g, b0, b1, b2, b3, b4) { }
+<a name="l01494"></a>01494     <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3, <span class="keyword">typename</span> B4, <span class="keyword">typename</span> B5>
+<a name="l01495"></a>01495     join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5) : unfolded_type(g, b0, b1, b2, b3, b4, b5) { }
+<a name="l01496"></a>01496     <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3, <span class="keyword">typename</span> B4, <span class="keyword">typename</span> B5, <span class="keyword">typename</span> B6>
+<a name="l01497"></a>01497     join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6) { }
+<a name="l01498"></a>01498     <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3, <span class="keyword">typename</span> B4, <span class="keyword">typename</span> B5, <span class="keyword">typename</span> B6, <span class="keyword">typename</span> B7>
+<a name="l01499"></a>01499     join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6, b7) { }
+<a name="l01500"></a>01500     <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3, <span class="keyword">typename</span> B4, <span class="keyword">typename</span> B5, <span class="keyword">typename</span> B6, <span class="keyword">typename</span> B7, <span class="keyword">typename</span> B8>
+<a name="l01501"></a>01501     join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7, B8 b8) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6, b7, b8) { }
+<a name="l01502"></a>01502     <span class="keyword">template</span><<span class="keyword">typename</span> B0, <span class="keyword">typename</span> B1, <span class="keyword">typename</span> B2, <span class="keyword">typename</span> B3, <span class="keyword">typename</span> B4, <span class="keyword">typename</span> B5, <span class="keyword">typename</span> B6, <span class="keyword">typename</span> B7, <span class="keyword">typename</span> B8, <span class="keyword">typename</span> B9>
+<a name="l01503"></a>01503     join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7, B8 b8, B9 b9) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9) { }
+<a name="l01504"></a>01504     join_node(<span class="keyword">const</span> join_node &other) : unfolded_type(other) {}
+<a name="l01505"></a>01505 };
+<a name="l01506"></a>01506 
+<a name="l01507"></a>01507 <span class="preprocessor">#if TBB_PREVIEW_GRAPH_NODES</span>
+<a name="l01508"></a>01508 <span class="preprocessor"></span><span class="comment">// or node</span>
+<a name="l01509"></a>01509 <span class="preprocessor">#include "internal/_flow_graph_or_impl.h"</span>
+<a name="l01510"></a>01510 
+<a name="l01511"></a>01511 <span class="keyword">template</span><<span class="keyword">typename</span> InputTuple>
+<a name="l01512"></a>01512 <span class="keyword">class </span>or_node : <span class="keyword">public</span> internal::unfolded_or_node<InputTuple> {
+<a name="l01513"></a>01513 <span class="keyword">private</span>:
+<a name="l01514"></a>01514     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> N = std::tuple_size<InputTuple>::value;
+<a name="l01515"></a>01515 <span class="keyword">public</span>:
+<a name="l01516"></a>01516     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::or_output_type<InputTuple>::type output_type;
+<a name="l01517"></a>01517     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::unfolded_or_node<InputTuple> unfolded_type;
+<a name="l01518"></a>01518     or_node() : unfolded_type() { }
+<a name="l01519"></a>01519     <span class="comment">// Copy constructor</span>
+<a name="l01520"></a>01520     or_node( <span class="keyword">const</span> or_node& <span class="comment">/*other*/</span> ) : unfolded_type() { }
+<a name="l01521"></a>01521 };
+<a name="l01522"></a>01522 <span class="preprocessor">#endif  // TBB_PREVIEW_GRAPH_NODES</span>
+<a name="l01523"></a>01523 <span class="preprocessor"></span>
+<a name="l01525"></a>01525 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l01526"></a>01526 <span class="keyword">inline</span> <span class="keywordtype">void</span> make_edge( sender<T> &p, receiver<T> &s ) {
+<a name="l01527"></a>01527     p.register_successor( s );
+<a name="l01528"></a>01528 }
+<a name="l01529"></a>01529         
+<a name="l01531"></a>01531 <span class="keyword">template</span>< <span class="keyword">typename</span> T >
+<a name="l01532"></a>01532 <span class="keyword">inline</span> <span class="keywordtype">void</span> remove_edge( sender<T> &p, receiver<T> &s ) {
+<a name="l01533"></a>01533     p.remove_successor( s );
+<a name="l01534"></a>01534 }
+<a name="l01535"></a>01535 
+<a name="l01537"></a>01537 <span class="keyword">template</span>< <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Node >
+<a name="l01538"></a>01538 Body copy_body( Node &n ) {
+<a name="l01539"></a>01539     <span class="keywordflow">return</span> n.template copy_function_object<Body>();
+<a name="l01540"></a>01540 }
+<a name="l01541"></a>01541         
+<a name="l01542"></a>01542         
+<a name="l01543"></a>01543 } <span class="comment">// interface6</span>
+<a name="l01544"></a>01544 
+<a name="l01545"></a>01545     <span class="keyword">using</span> interface6::graph;
+<a name="l01546"></a>01546     <span class="keyword">using</span> interface6::graph_node;
+<a name="l01547"></a>01547     <span class="keyword">using</span> interface6::continue_msg;
+<a name="l01548"></a>01548     <span class="keyword">using</span> interface6::sender;
+<a name="l01549"></a>01549     <span class="keyword">using</span> interface6::receiver;
+<a name="l01550"></a>01550     <span class="keyword">using</span> interface6::continue_receiver;
+<a name="l01551"></a>01551 
+<a name="l01552"></a>01552     <span class="keyword">using</span> interface6::source_node;
+<a name="l01553"></a>01553     <span class="keyword">using</span> interface6::function_node;
+<a name="l01554"></a>01554 <span class="preprocessor">#if TBB_PREVIEW_GRAPH_NODES</span>
+<a name="l01555"></a>01555 <span class="preprocessor"></span>    <span class="keyword">using</span> interface6::multioutput_function_node;
+<a name="l01556"></a>01556     <span class="keyword">using</span> interface6::split_node;
+<a name="l01557"></a>01557     <span class="keyword">using</span> interface6::internal::output_port;
+<a name="l01558"></a>01558     <span class="keyword">using</span> interface6::or_node;
+<a name="l01559"></a>01559 <span class="preprocessor">#endif</span>
+<a name="l01560"></a>01560 <span class="preprocessor"></span>    <span class="keyword">using</span> interface6::continue_node;
+<a name="l01561"></a>01561     <span class="keyword">using</span> interface6::overwrite_node;
+<a name="l01562"></a>01562     <span class="keyword">using</span> interface6::write_once_node;
+<a name="l01563"></a>01563     <span class="keyword">using</span> interface6::broadcast_node;
+<a name="l01564"></a>01564     <span class="keyword">using</span> interface6::buffer_node;
+<a name="l01565"></a>01565     <span class="keyword">using</span> interface6::queue_node;
+<a name="l01566"></a>01566     <span class="keyword">using</span> interface6::sequencer_node;
+<a name="l01567"></a>01567     <span class="keyword">using</span> interface6::priority_queue_node;
+<a name="l01568"></a>01568     <span class="keyword">using</span> interface6::limiter_node;
+<a name="l01569"></a>01569     <span class="keyword">using namespace </span>interface6::internal::graph_policy_namespace;
+<a name="l01570"></a>01570     <span class="keyword">using</span> interface6::join_node;
+<a name="l01571"></a>01571     <span class="keyword">using</span> interface6::input_port;
+<a name="l01572"></a>01572     <span class="keyword">using</span> interface6::copy_body; 
+<a name="l01573"></a>01573     <span class="keyword">using</span> interface6::make_edge; 
+<a name="l01574"></a>01574     <span class="keyword">using</span> interface6::remove_edge; 
+<a name="l01575"></a>01575     <span class="keyword">using</span> interface6::internal::NO_TAG;
+<a name="l01576"></a>01576     <span class="keyword">using</span> interface6::internal::tag_value;
+<a name="l01577"></a>01577 
+<a name="l01578"></a>01578 } <span class="comment">// flow</span>
+<a name="l01579"></a>01579 } <span class="comment">// tbb</span>
+<a name="l01580"></a>01580 
+<a name="l01581"></a>01581 <span class="preprocessor">#endif // __TBB_flow_graph_H</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00480.html b/doc/html/a00480.html
new file mode 100644
index 0000000..9b4b4cc
--- /dev/null
+++ b/doc/html/a00480.html
@@ -0,0 +1,259 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>memory_pool.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="files.html"><span>File List</span></a></li>
+    <li><a href="globals.html"><span>File Members</span></a></li>
+  </ul></div>
+<h1>memory_pool.h</h1><a href="a00344.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
+<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment">    writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020 
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_memory_pool_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_memory_pool_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#if !TBB_PREVIEW_MEMORY_POOL</span>
+<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#error Set TBB_PREVIEW_MEMORY_POOL to include memory_pool.h</span>
+<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span>
+<a name="l00029"></a>00029 <span class="preprocessor">#include "<a class="code" href="a00363.html">scalable_allocator.h</a>"</span>
+<a name="l00030"></a>00030 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00031"></a>00031 <span class="preprocessor">#include "tbb_machine.h"</span> <span class="comment">// TODO: Itanium requires linkage with TBB library</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include <new></span> <span class="comment">// std::bad_alloc</span>
+<a name="l00033"></a>00033 
+<a name="l00034"></a>00034 <span class="preprocessor">#if __TBB_EXTRA_DEBUG</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#define __TBBMALLOC_ASSERT ASSERT</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#define __TBBMALLOC_ASSERT(a,b) ((void)0)</span>
+<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span>
+<a name="l00040"></a>00040 <span class="keyword">namespace </span>tbb {
+<a name="l00041"></a>00041 <span class="keyword">namespace </span>interface6 {
+<a name="l00043"></a>00043 <span class="keyword">namespace </span>internal {
+<a name="l00044"></a>00044 
+<a name="l00046"></a>00046 <span class="keyword">class </span>pool_base : tbb::internal::no_copy {
+<a name="l00047"></a>00047     <span class="comment">// Pool interface is separate from standard allocator classes because it has</span>
+<a name="l00048"></a>00048     <span class="comment">// to maintain internal state, no copy or assignment. Move and swap are possible.</span>
+<a name="l00049"></a>00049 <span class="keyword">public</span>:
+<a name="l00051"></a>00051     <span class="keywordtype">void</span> recycle() { rml::pool_reset(my_pool); }
+<a name="l00052"></a>00052 
+<a name="l00054"></a>00054     <span class="keywordtype">void</span> *malloc(size_t size) { <span class="keywordflow">return</span> rml::pool_malloc(my_pool, size); }
+<a name="l00055"></a>00055 
+<a name="l00057"></a>00057     <span class="keywordtype">void</span> free(<span class="keywordtype">void</span>* ptr) { rml::pool_free(my_pool, ptr); }
+<a name="l00058"></a>00058 
+<a name="l00060"></a>00060     <span class="comment">// Enables some low-level optimization possibilities</span>
+<a name="l00061"></a>00061     <span class="keywordtype">void</span> *realloc(<span class="keywordtype">void</span>* ptr, size_t size) {
+<a name="l00062"></a>00062         <span class="keywordflow">return</span> rml::pool_realloc(my_pool, ptr, size);
+<a name="l00063"></a>00063     }
+<a name="l00064"></a>00064 
+<a name="l00065"></a>00065 <span class="keyword">protected</span>:
+<a name="l00067"></a>00067     <span class="keywordtype">void</span> destroy() { rml::pool_destroy(my_pool); }
+<a name="l00068"></a>00068 
+<a name="l00069"></a>00069     rml::MemoryPool *my_pool;
+<a name="l00070"></a>00070 };
+<a name="l00071"></a>00071 
+<a name="l00072"></a>00072 } <span class="comment">// namespace internal</span>
+<a name="l00074"></a>00074 <span class="comment"></span>
+<a name="l00075"></a>00075 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00076"></a>00076 <span class="preprocessor"></span>    <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</span>
+<a name="l00077"></a>00077 <span class="preprocessor">    #pragma warning (push)</span>
+<a name="l00078"></a>00078 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4100)</span>
+<a name="l00079"></a>00079 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00080"></a>00080 <span class="preprocessor"></span>
+<a name="l00082"></a>00082 
+<a name="l00083"></a>00083 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> P = <span class="keywordtype">int</span>ernal::pool_base>
+<a name="l00084"></a><a class="code" href="a00270.html">00084</a> <span class="keyword">class </span><a class="code" href="a00270.html">memory_pool_allocator</a> {
+<a name="l00085"></a>00085 <span class="keyword">protected</span>:
+<a name="l00086"></a>00086     <span class="keyword">typedef</span> P pool_type;
+<a name="l00087"></a>00087     pool_type *my_pool;
+<a name="l00088"></a>00088     <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
+<a name="l00089"></a>00089     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00270.html">memory_pool_allocator</a>;
+<a name="l00090"></a>00090     <span class="keyword">template</span><<span class="keyword">typename</span> V, <span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
+<a name="l00091"></a>00091     <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<V,R></a>& a, <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,R></a>& b);
+<a name="l00092"></a>00092     <span class="keyword">template</span><<span class="keyword">typename</span> V, <span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
+<a name="l00093"></a>00093     <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<V,R></a>& a, <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,R></a>& b);
+<a name="l00094"></a>00094 <span class="keyword">public</span>:
+<a name="l00095"></a>00095     <span class="keyword">typedef</span> <span class="keyword">typename</span> tbb::internal::allocator_type<T>::value_type value_type;
+<a name="l00096"></a>00096     <span class="keyword">typedef</span> value_type* pointer;
+<a name="l00097"></a>00097     <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
+<a name="l00098"></a>00098     <span class="keyword">typedef</span> value_type& reference;
+<a name="l00099"></a>00099     <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
+<a name="l00100"></a>00100     <span class="keyword">typedef</span> size_t size_type;
+<a name="l00101"></a>00101     <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00102"></a>00102     <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
+<a name="l00103"></a>00103         <span class="keyword">typedef</span> <a class="code" href="a00270.html">memory_pool_allocator<U, P></a> other;
+<a name="l00104"></a>00104     };
+<a name="l00105"></a>00105 
+<a name="l00106"></a>00106     <a class="code" href="a00270.html">memory_pool_allocator</a>(pool_type &pool) <span class="keywordflow">throw</span>() : my_pool(&pool) {}
+<a name="l00107"></a>00107     <a class="code" href="a00270.html">memory_pool_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator</a>& src) <span class="keywordflow">throw</span>() : my_pool(src.<a class="code" href="a00270.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>) {}
+<a name="l00108"></a>00108     <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00109"></a>00109     <a class="code" href="a00270.html">memory_pool_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,P></a>& src) <span class="keywordflow">throw</span>() : my_pool(src.<a class="code" href="a00270.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>) {}
+<a name="l00110"></a>00110 
+<a name="l00111"></a>00111     pointer address(reference x)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &x; }
+<a name="l00112"></a>00112     const_pointer address(const_reference x)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &x; }
+<a name="l00113"></a>00113     
+<a name="l00115"></a><a class="code" href="a00270.html#365bd64d284c80d85bb2149a12681526">00115</a>     pointer <a class="code" href="a00270.html#365bd64d284c80d85bb2149a12681526">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* <span class="comment">/*hint*/</span> = 0) {
+<a name="l00116"></a>00116         <span class="keywordflow">return</span> static_cast<pointer>( my_pool->malloc( n*<span class="keyword">sizeof</span>(value_type) ) );
+<a name="l00117"></a>00117     }
+<a name="l00119"></a><a class="code" href="a00270.html#4e24a03de38638af07548383024c54ab">00119</a>     <span class="keywordtype">void</span> <a class="code" href="a00270.html#4e24a03de38638af07548383024c54ab">deallocate</a>( pointer p, size_type ) {
+<a name="l00120"></a>00120         my_pool->free(p);
+<a name="l00121"></a>00121     }
+<a name="l00123"></a><a class="code" href="a00270.html#beebdb6144df8ba219fadfad4de866ea">00123</a>     size_type <a class="code" href="a00270.html#beebdb6144df8ba219fadfad4de866ea">max_size</a>() const throw() {
+<a name="l00124"></a>00124         size_type max = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
+<a name="l00125"></a>00125         <span class="keywordflow">return</span> (max > 0 ? max : 1);
+<a name="l00126"></a>00126     }
+<a name="l00128"></a><a class="code" href="a00270.html#c7e1671b725894b94ce9a6ac544e24f2">00128</a>     <span class="keywordtype">void</span> <a class="code" href="a00270.html#c7e1671b725894b94ce9a6ac544e24f2">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) { ::new((<span class="keywordtype">void</span>*)(p)) value_type(value); }
+<a name="l00129"></a>00129 
+<a name="l00131"></a><a class="code" href="a00270.html#a3af27e1f8535cc512134ec9a82ff4fc">00131</a>     <span class="keywordtype">void</span> <a class="code" href="a00270.html#a3af27e1f8535cc512134ec9a82ff4fc">destroy</a>( pointer p ) { p->~value_type(); }
+<a name="l00132"></a>00132 
+<a name="l00133"></a>00133 };
+<a name="l00134"></a>00134 
+<a name="l00135"></a>00135 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
+<a name="l00137"></a>00137 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
+<a name="l00138"></a>00138 <span class="preprocessor"></span>
+<a name="l00140"></a>00140 
+<a name="l00141"></a>00141 <span class="keyword">template</span><<span class="keyword">typename</span> P> 
+<a name="l00142"></a><a class="code" href="a00271.html">00142</a> <span class="keyword">class </span><a class="code" href="a00270.html">memory_pool_allocator</a><void, P> {
+<a name="l00143"></a>00143 <span class="keyword">public</span>:
+<a name="l00144"></a>00144     <span class="keyword">typedef</span> P pool_type;
+<a name="l00145"></a>00145     <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
+<a name="l00146"></a>00146     <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
+<a name="l00147"></a>00147     <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
+<a name="l00148"></a>00148     <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
+<a name="l00149"></a>00149         <span class="keyword">typedef</span> <a class="code" href="a00270.html">memory_pool_allocator<U, P></a> other;
+<a name="l00150"></a>00150     };
+<a name="l00151"></a>00151 
+<a name="l00152"></a>00152     <a class="code" href="a00270.html">memory_pool_allocator</a>( pool_type &pool) <span class="keywordflow">throw</span>() : my_pool(&pool) {}
+<a name="l00153"></a>00153     <a class="code" href="a00270.html">memory_pool_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator</a>& src) <span class="keywordflow">throw</span>() : my_pool(src.<a class="code" href="a00270.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>) {}
+<a name="l00154"></a>00154     <span class="keyword">template</span><<span class="keyword">typename</span> U>
+<a name="l00155"></a>00155     <a class="code" href="a00270.html">memory_pool_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,P></a>& src) <span class="keywordflow">throw</span>() : my_pool(src.<a class="code" href="a00270.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>) {}
+<a name="l00156"></a>00156 
+<a name="l00157"></a>00157 <span class="keyword">protected</span>:
+<a name="l00158"></a>00158     pool_type *my_pool;
+<a name="l00159"></a>00159     <span class="keyword">template</span><<span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
+<a name="l00160"></a>00160     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00270.html">memory_pool_allocator</a>;
+<a name="l00161"></a>00161     <span class="keyword">template</span><<span class="keyword">typename</span> V, <span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
+<a name="l00162"></a>00162     <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<V,R></a>& a, <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,R></a>& b);
+<a name="l00163"></a>00163     <span class="keyword">template</span><<span class="keyword">typename</span> V, <span class="keyword">typename</span> U, <span class="keyword">typename</span> R>
+<a name="l00164"></a>00164     <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<V,R></a>& a, <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,R></a>& b);
+<a name="l00165"></a>00165 };
+<a name="l00166"></a>00166 
+<a name="l00167"></a>00167 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> P>
+<a name="l00168"></a>00168 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<T,P></a>& a, <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,P></a>& b) {<span class="keywordflow">return</span> a.<a class="code" href="a00270.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>==b.<a class="code" href="a [...]
+<a name="l00169"></a>00169 
+<a name="l00170"></a>00170 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> P>
+<a name="l00171"></a>00171 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<T,P></a>& a, <span class="keyword">const</span> <a class="code" href="a00270.html">memory_pool_allocator<U,P></a>& b) {<span class="keywordflow">return</span> a.<a class="code" href="a00270.html#9f22e947018eb99cde5f44ee3d339499">my_pool</a>!=b.<a class="code" href="a [...]
+<a name="l00172"></a>00172 
+<a name="l00173"></a>00173 
+<a name="l00175"></a>00175 <span class="keyword">template</span> <<span class="keyword">typename</span> Alloc>
+<a name="l00176"></a><a class="code" href="a00269.html">00176</a> <span class="keyword">class </span><a class="code" href="a00269.html">memory_pool</a> : <span class="keyword">public</span> internal::pool_base {
+<a name="l00177"></a>00177     Alloc my_alloc; <span class="comment">// TODO: base-class optimization</span>
+<a name="l00178"></a>00178     <span class="keyword">static</span> <span class="keywordtype">void</span> *allocate_request(intptr_t pool_id, size_t & bytes);
+<a name="l00179"></a>00179     <span class="keyword">static</span> <span class="keywordtype">int</span> deallocate_request(intptr_t pool_id, <span class="keywordtype">void</span>*, size_t raw_bytes);
+<a name="l00180"></a>00180 
+<a name="l00181"></a>00181 <span class="keyword">public</span>:
+<a name="l00183"></a>00183     <a class="code" href="a00269.html#2822528265718a4c779591fc37c02ca8">memory_pool</a>(<span class="keyword">const</span> Alloc &src = Alloc());
+<a name="l00184"></a>00184 
+<a name="l00186"></a><a class="code" href="a00269.html#fdad7c4ed08332ec384491a71b721957">00186</a>     <a class="code" href="a00269.html#fdad7c4ed08332ec384491a71b721957">~memory_pool</a>() { destroy(); } <span class="comment">// call the callbacks first and destroy my_alloc latter</span>
+<a name="l00187"></a>00187 
+<a name="l00188"></a>00188 };
+<a name="l00189"></a>00189 
+<a name="l00190"></a>00190 <span class="keyword">class </span>fixed_pool : <span class="keyword">public</span> internal::pool_base {
+<a name="l00191"></a>00191     <span class="keywordtype">void</span> *my_buffer;
+<a name="l00192"></a>00192     size_t my_size;
+<a name="l00193"></a>00193     <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> *allocate_request(intptr_t pool_id, size_t & bytes);
+<a name="l00194"></a>00194 
+<a name="l00195"></a>00195 <span class="keyword">public</span>:
+<a name="l00197"></a>00197     <span class="keyword">inline</span> fixed_pool(<span class="keywordtype">void</span> *buf, size_t size);
+<a name="l00199"></a>00199     ~fixed_pool() { destroy(); }
+<a name="l00200"></a>00200 };
+<a name="l00201"></a>00201 
+<a name="l00203"></a>00203 
+<a name="l00204"></a>00204 <span class="keyword">template</span> <<span class="keyword">typename</span> Alloc>
+<a name="l00205"></a><a class="code" href="a00269.html#2822528265718a4c779591fc37c02ca8">00205</a> <a class="code" href="a00269.html">memory_pool<Alloc>::memory_pool</a>(<span class="keyword">const</span> Alloc &src) : my_alloc(src) {
+<a name="l00206"></a>00206     rml::MemPoolPolicy args = {
+<a name="l00207"></a>00207         allocate_request, deallocate_request, <span class="keyword">sizeof</span>(<span class="keyword">typename</span> Alloc::value_type)
+<a name="l00208"></a>00208     };
+<a name="l00209"></a>00209     my_pool = rml::pool_create(intptr_t(<span class="keyword">this</span>), &args);
+<a name="l00210"></a>00210     __TBBMALLOC_ASSERT(my_pool, <span class="stringliteral">"Pool is not created"</span>);
+<a name="l00211"></a>00211     <span class="keywordflow">if</span>( !my_pool ) __TBB_THROW(std::bad_alloc());
+<a name="l00212"></a>00212 }
+<a name="l00213"></a>00213 <span class="keyword">template</span> <<span class="keyword">typename</span> Alloc>
+<a name="l00214"></a>00214 <span class="keywordtype">void</span> *<a class="code" href="a00269.html">memory_pool<Alloc>::allocate_request</a>(intptr_t pool_id, size_t & bytes) {
+<a name="l00215"></a>00215     <a class="code" href="a00269.html">memory_pool<Alloc></a> &<span class="keyword">self</span> = *reinterpret_cast<memory_pool<Alloc>*>(pool_id);
+<a name="l00216"></a>00216     <span class="keyword">const</span> size_t unit_size = <span class="keyword">sizeof</span>(<span class="keyword">typename</span> Alloc::value_type);
+<a name="l00217"></a>00217     __TBBMALLOC_ASSERT( 0 == bytes%unit_size, NULL);
+<a name="l00218"></a>00218     <span class="keywordtype">void</span> *ptr;
+<a name="l00219"></a>00219     __TBB_TRY { ptr = <span class="keyword">self</span>.my_alloc.allocate( bytes/unit_size ); }
+<a name="l00220"></a>00220     __TBB_CATCH(...) { <span class="keywordflow">return</span> 0; }
+<a name="l00221"></a>00221     <span class="keywordflow">return</span> ptr;
+<a name="l00222"></a>00222 }
+<a name="l00223"></a>00223 <span class="keyword">template</span> <<span class="keyword">typename</span> Alloc>
+<a name="l00224"></a>00224 <span class="keywordtype">int</span> <a class="code" href="a00269.html">memory_pool<Alloc>::deallocate_request</a>(intptr_t pool_id, <span class="keywordtype">void</span>* raw_ptr, size_t raw_bytes) {
+<a name="l00225"></a>00225     <a class="code" href="a00269.html">memory_pool<Alloc></a> &<span class="keyword">self</span> = *reinterpret_cast<memory_pool<Alloc>*>(pool_id);
+<a name="l00226"></a>00226     <span class="keyword">const</span> size_t unit_size = <span class="keyword">sizeof</span>(<span class="keyword">typename</span> Alloc::value_type);
+<a name="l00227"></a>00227     __TBBMALLOC_ASSERT( 0 == raw_bytes%unit_size, NULL);
+<a name="l00228"></a>00228     <span class="keyword">self</span>.my_alloc.deallocate( static_cast<typename Alloc::value_type*>(raw_ptr), raw_bytes/unit_size );
+<a name="l00229"></a>00229     <span class="keywordflow">return</span> 0;
+<a name="l00230"></a>00230 }
+<a name="l00231"></a>00231 <span class="keyword">inline</span> fixed_pool::fixed_pool(<span class="keywordtype">void</span> *buf, size_t size) : my_buffer(buf), my_size(size) {
+<a name="l00232"></a>00232     rml::MemPoolPolicy args = { allocate_request, 0, size };
+<a name="l00233"></a>00233     my_pool = rml::pool_create(intptr_t(<span class="keyword">this</span>), &args);
+<a name="l00234"></a>00234     __TBBMALLOC_ASSERT(my_pool, <span class="stringliteral">"Pool is not created"</span>);
+<a name="l00235"></a>00235     <span class="keywordflow">if</span>( !my_pool ) __TBB_THROW(std::bad_alloc());
+<a name="l00236"></a>00236 }
+<a name="l00237"></a>00237 <span class="keyword">inline</span> <span class="keywordtype">void</span> *fixed_pool::allocate_request(intptr_t pool_id, size_t & bytes) {
+<a name="l00238"></a>00238     fixed_pool &<span class="keyword">self</span> = *reinterpret_cast<fixed_pool*>(pool_id);
+<a name="l00239"></a>00239     <span class="keywordflow">if</span>( bytes > <span class="keyword">self</span>.my_size || !__TBB_CompareAndSwapW(&<span class="keyword">self</span>.my_size, 0, (bytes=<span class="keyword">self</span>.my_size)) )
+<a name="l00240"></a>00240         <span class="keywordflow">return</span> 0; <span class="comment">// all the memory was given already</span>
+<a name="l00241"></a>00241     <span class="keywordflow">return</span> <span class="keyword">self</span>.my_buffer;
+<a name="l00242"></a>00242 }
+<a name="l00243"></a>00243 
+<a name="l00244"></a>00244 } <span class="comment">//namespace interface6</span>
+<a name="l00245"></a>00245 <span class="keyword">using</span> <a class="code" href="a00270.html">interface6::memory_pool_allocator</a>;
+<a name="l00246"></a>00246 <span class="keyword">using</span> <a class="code" href="a00269.html">interface6::memory_pool</a>;
+<a name="l00247"></a>00247 <span class="keyword">using</span> interface6::fixed_pool;
+<a name="l00248"></a>00248 } <span class="comment">//namespace tbb</span>
+<a name="l00249"></a>00249 
+<a name="l00250"></a>00250 <span class="preprocessor">#undef __TBBMALLOC_ASSERT</span>
+<a name="l00251"></a>00251 <span class="preprocessor"></span><span class="preprocessor">#endif// __TBB_memory_pool_H</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00499.html b/doc/html/a00487.html
similarity index 82%
rename from doc/html/a00499.html
rename to doc/html/a00487.html
index d92f103..50a926d 100644
--- a/doc/html/a00499.html
+++ b/doc/html/a00487.html
@@ -56,9 +56,9 @@
 <a name="l00035"></a>00035 <span class="keyword">namespace </span>tbb {
 <a name="l00036"></a>00036 
 <a name="l00038"></a>00038 
-<a name="l00040"></a><a class="code" href="a00258.html">00040</a> <span class="keyword">class </span><a class="code" href="a00258.html">mutex</a> {
+<a name="l00040"></a><a class="code" href="a00275.html">00040</a> <span class="keyword">class </span><a class="code" href="a00275.html">mutex</a> {
 <a name="l00041"></a>00041 <span class="keyword">public</span>:
-<a name="l00043"></a><a class="code" href="a00258.html#05313cb77d4f85213103d4dab74ed454">00043</a>     <a class="code" href="a00258.html#05313cb77d4f85213103d4dab74ed454">mutex</a>() {
+<a name="l00043"></a><a class="code" href="a00275.html#05313cb77d4f85213103d4dab74ed454">00043</a>     <a class="code" href="a00275.html#05313cb77d4f85213103d4dab74ed454">mutex</a>() {
 <a name="l00044"></a>00044 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_THREADING_TOOLS</span>
 <a name="l00045"></a>00045 <span class="preprocessor"></span>    internal_construct();
 <a name="l00046"></a>00046 <span class="preprocessor">#else</span>
@@ -72,7 +72,7 @@
 <a name="l00054"></a>00054 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
 <a name="l00055"></a>00055     };
 <a name="l00056"></a>00056 
-<a name="l00057"></a>00057     ~<a class="code" href="a00258.html">mutex</a>() {
+<a name="l00057"></a>00057     ~<a class="code" href="a00275.html">mutex</a>() {
 <a name="l00058"></a>00058 <span class="preprocessor">#if TBB_USE_ASSERT</span>
 <a name="l00059"></a>00059 <span class="preprocessor"></span>        internal_destroy();
 <a name="l00060"></a>00060 <span class="preprocessor">#else</span>
@@ -89,58 +89,58 @@
 <a name="l00071"></a>00071     <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
 <a name="l00072"></a>00072 
 <a name="l00074"></a>00074 
-<a name="l00076"></a><a class="code" href="a00259.html">00076</a>     <span class="keyword">class </span><a class="code" href="a00259.html">scoped_lock</a> : internal::no_copy {
+<a name="l00076"></a><a class="code" href="a00276.html">00076</a>     <span class="keyword">class </span><a class="code" href="a00276.html">scoped_lock</a> : internal::no_copy {
 <a name="l00077"></a>00077     <span class="keyword">public</span>:
-<a name="l00079"></a><a class="code" href="a00259.html#1d403ae51b484df5d86d85ae38f11e6e">00079</a>         <a class="code" href="a00259.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>() : my_mutex(NULL) {};
+<a name="l00079"></a><a class="code" href="a00276.html#1d403ae51b484df5d86d85ae38f11e6e">00079</a>         <a class="code" href="a00276.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>() : my_mutex(NULL) {};
 <a name="l00080"></a>00080 
-<a name="l00082"></a><a class="code" href="a00259.html#605a6b9af0f8cdabdf81825e0de99600">00082</a>         <a class="code" href="a00259.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>( <a class="code" href="a00258.html">mutex</a>& <a class="code" href="a00258.html">mutex</a> ) {
-<a name="l00083"></a>00083             <a class="code" href="a00259.html#862e022841cdc522e4296a5533b22efd">acquire</a>( mutex );
+<a name="l00082"></a><a class="code" href="a00276.html#605a6b9af0f8cdabdf81825e0de99600">00082</a>         <a class="code" href="a00276.html#1d403ae51b484df5d86d85ae38f11e6e">scoped_lock</a>( <a class="code" href="a00275.html">mutex</a>& <a class="code" href="a00275.html">mutex</a> ) {
+<a name="l00083"></a>00083             <a class="code" href="a00276.html#862e022841cdc522e4296a5533b22efd">acquire</a>( mutex );
 <a name="l00084"></a>00084         }
 <a name="l00085"></a>00085 
-<a name="l00087"></a><a class="code" href="a00259.html#0ebbbecaf4311e9df7362cb76ceaa368">00087</a>         <a class="code" href="a00259.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>() {
+<a name="l00087"></a><a class="code" href="a00276.html#0ebbbecaf4311e9df7362cb76ceaa368">00087</a>         <a class="code" href="a00276.html#0ebbbecaf4311e9df7362cb76ceaa368">~scoped_lock</a>() {
 <a name="l00088"></a>00088             <span class="keywordflow">if</span>( my_mutex ) 
-<a name="l00089"></a>00089                 <a class="code" href="a00259.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>();
+<a name="l00089"></a>00089                 <a class="code" href="a00276.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>();
 <a name="l00090"></a>00090         }
 <a name="l00091"></a>00091 
-<a name="l00093"></a><a class="code" href="a00259.html#862e022841cdc522e4296a5533b22efd">00093</a>         <span class="keywordtype">void</span> <a class="code" href="a00259.html#862e022841cdc522e4296a5533b22efd">acquire</a>( <a class="code" href="a00258.html">mutex</a>& <a class="code" href="a00258.html">mutex</a> ) {
+<a name="l00093"></a><a class="code" href="a00276.html#862e022841cdc522e4296a5533b22efd">00093</a>         <span class="keywordtype">void</span> <a class="code" href="a00276.html#862e022841cdc522e4296a5533b22efd">acquire</a>( <a class="code" href="a00275.html">mutex</a>& <a class="code" href="a00275.html">mutex</a> ) {
 <a name="l00094"></a>00094 <span class="preprocessor">#if TBB_USE_ASSERT</span>
 <a name="l00095"></a>00095 <span class="preprocessor"></span>            internal_acquire(mutex);
 <a name="l00096"></a>00096 <span class="preprocessor">#else</span>
-<a name="l00097"></a>00097 <span class="preprocessor"></span>            mutex.<a class="code" href="a00258.html#4470e61c24c129a0299ca6c17240adbb">lock</a>();
+<a name="l00097"></a>00097 <span class="preprocessor"></span>            mutex.<a class="code" href="a00275.html#4470e61c24c129a0299ca6c17240adbb">lock</a>();
 <a name="l00098"></a>00098             my_mutex = &mutex;
 <a name="l00099"></a>00099 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
 <a name="l00100"></a>00100         }
 <a name="l00101"></a>00101 
-<a name="l00103"></a><a class="code" href="a00259.html#591e0c49b82bcedffcbe0923f1b915ec">00103</a>         <span class="keywordtype">bool</span> <a class="code" href="a00259.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>( <a class="code" href="a00258.html">mutex</a>& <a class="code" href="a00258.html">mutex</a> ) {
+<a name="l00103"></a><a class="code" href="a00276.html#591e0c49b82bcedffcbe0923f1b915ec">00103</a>         <span class="keywordtype">bool</span> <a class="code" href="a00276.html#591e0c49b82bcedffcbe0923f1b915ec">try_acquire</a>( <a class="code" href="a00275.html">mutex</a>& <a class="code" href="a00275.html">mutex</a> ) {
 <a name="l00104"></a>00104 <span class="preprocessor">#if TBB_USE_ASSERT</span>
 <a name="l00105"></a>00105 <span class="preprocessor"></span>            <span class="keywordflow">return</span> internal_try_acquire (mutex);
 <a name="l00106"></a>00106 <span class="preprocessor">#else</span>
-<a name="l00107"></a>00107 <span class="preprocessor"></span>            <span class="keywordtype">bool</span> result = mutex.<a class="code" href="a00258.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>();
+<a name="l00107"></a>00107 <span class="preprocessor"></span>            <span class="keywordtype">bool</span> result = mutex.<a class="code" href="a00275.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>();
 <a name="l00108"></a>00108             <span class="keywordflow">if</span>( result )
 <a name="l00109"></a>00109                 my_mutex = &mutex;
 <a name="l00110"></a>00110             <span class="keywordflow">return</span> result;
 <a name="l00111"></a>00111 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
 <a name="l00112"></a>00112         }
 <a name="l00113"></a>00113 
-<a name="l00115"></a><a class="code" href="a00259.html#0d51d18cd99df3b2e93bf07378d0992c">00115</a>         <span class="keywordtype">void</span> <a class="code" href="a00259.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>() {
+<a name="l00115"></a><a class="code" href="a00276.html#0d51d18cd99df3b2e93bf07378d0992c">00115</a>         <span class="keywordtype">void</span> <a class="code" href="a00276.html#0d51d18cd99df3b2e93bf07378d0992c">release</a>() {
 <a name="l00116"></a>00116 <span class="preprocessor">#if TBB_USE_ASSERT</span>
 <a name="l00117"></a>00117 <span class="preprocessor"></span>            internal_release ();
 <a name="l00118"></a>00118 <span class="preprocessor">#else</span>
-<a name="l00119"></a>00119 <span class="preprocessor"></span>            my_mutex-><a class="code" href="a00258.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>();
+<a name="l00119"></a>00119 <span class="preprocessor"></span>            my_mutex-><a class="code" href="a00275.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>();
 <a name="l00120"></a>00120             my_mutex = NULL;
 <a name="l00121"></a>00121 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
 <a name="l00122"></a>00122         }
 <a name="l00123"></a>00123 
 <a name="l00124"></a>00124     <span class="keyword">private</span>:
-<a name="l00126"></a>00126         <a class="code" href="a00258.html">mutex</a>* my_mutex;
+<a name="l00126"></a>00126         <a class="code" href="a00275.html">mutex</a>* my_mutex;
 <a name="l00127"></a>00127 
-<a name="l00129"></a>00129         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00258.html">mutex</a>& m );
+<a name="l00129"></a>00129         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00275.html">mutex</a>& m );
 <a name="l00130"></a>00130 
-<a name="l00132"></a>00132         <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00258.html">mutex</a>& m );
+<a name="l00132"></a>00132         <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00275.html">mutex</a>& m );
 <a name="l00133"></a>00133 
 <a name="l00135"></a>00135         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release();
 <a name="l00136"></a>00136 
-<a name="l00137"></a>00137         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00258.html">mutex</a>;
+<a name="l00137"></a>00137         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00275.html">mutex</a>;
 <a name="l00138"></a>00138     };
 <a name="l00139"></a>00139 
 <a name="l00140"></a>00140     <span class="comment">// Mutex traits</span>
@@ -150,10 +150,10 @@
 <a name="l00144"></a>00144 
 <a name="l00145"></a>00145     <span class="comment">// ISO C++0x compatibility methods</span>
 <a name="l00146"></a>00146 
-<a name="l00148"></a><a class="code" href="a00258.html#4470e61c24c129a0299ca6c17240adbb">00148</a>     <span class="keywordtype">void</span> <a class="code" href="a00258.html#4470e61c24c129a0299ca6c17240adbb">lock</a>() {
+<a name="l00148"></a><a class="code" href="a00275.html#4470e61c24c129a0299ca6c17240adbb">00148</a>     <span class="keywordtype">void</span> <a class="code" href="a00275.html#4470e61c24c129a0299ca6c17240adbb">lock</a>() {
 <a name="l00149"></a>00149 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span>        <a class="code" href="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00151"></a>00151         <span class="keyword">new</span>(tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00259.html">scoped_lock</a>(*<span class="keyword">this</span>);
+<a name="l00150"></a>00150 <span class="preprocessor"></span>        <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00151"></a>00151         <span class="keyword">new</span>(tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00276.html">scoped_lock</a>(*<span class="keyword">this</span>);
 <a name="l00152"></a>00152 <span class="preprocessor">#else</span>
 <a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor">  #if _WIN32||_WIN64</span>
 <a name="l00154"></a>00154 <span class="preprocessor"></span>        EnterCriticalSection(&impl);
@@ -164,12 +164,12 @@
 <a name="l00159"></a>00159     }
 <a name="l00160"></a>00160 
 <a name="l00162"></a>00162 
-<a name="l00163"></a><a class="code" href="a00258.html#4331652c79dea1c1131bd59ab161b234">00163</a>     <span class="keywordtype">bool</span> <a class="code" href="a00258.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>() {
+<a name="l00163"></a><a class="code" href="a00275.html#4331652c79dea1c1131bd59ab161b234">00163</a>     <span class="keywordtype">bool</span> <a class="code" href="a00275.html#4331652c79dea1c1131bd59ab161b234">try_lock</a>() {
 <a name="l00164"></a>00164 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00165"></a>00165 <span class="preprocessor"></span>        <a class="code" href="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00166"></a>00166         <a class="code" href="a00259.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00167"></a>00167         s.<a class="code" href="a00259.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = NULL;
-<a name="l00168"></a>00168         <span class="keywordflow">return</span> s.<a class="code" href="a00259.html#e86ffb41a026694b16637f78aa337874">internal_try_acquire</a>(*<span class="keyword">this</span>);
+<a name="l00165"></a>00165 <span class="preprocessor"></span>        <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00166"></a>00166         <a class="code" href="a00276.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00167"></a>00167         s.<a class="code" href="a00276.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = NULL;
+<a name="l00168"></a>00168         <span class="keywordflow">return</span> s.<a class="code" href="a00276.html#e86ffb41a026694b16637f78aa337874">internal_try_acquire</a>(*<span class="keyword">this</span>);
 <a name="l00169"></a>00169 <span class="preprocessor">#else</span>
 <a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor">  #if _WIN32||_WIN64</span>
 <a name="l00171"></a>00171 <span class="preprocessor"></span>        <span class="keywordflow">return</span> TryEnterCriticalSection(&impl)!=0;
@@ -179,12 +179,12 @@
 <a name="l00175"></a>00175 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
 <a name="l00176"></a>00176     }
 <a name="l00177"></a>00177 
-<a name="l00179"></a><a class="code" href="a00258.html#5fc9ef443ae75d966695546be399cc6b">00179</a>     <span class="keywordtype">void</span> <a class="code" href="a00258.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>() {
+<a name="l00179"></a><a class="code" href="a00275.html#5fc9ef443ae75d966695546be399cc6b">00179</a>     <span class="keywordtype">void</span> <a class="code" href="a00275.html#5fc9ef443ae75d966695546be399cc6b">unlock</a>() {
 <a name="l00180"></a>00180 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00181"></a>00181 <span class="preprocessor"></span>        <a class="code" href="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00182"></a>00182         <a class="code" href="a00259.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00183"></a>00183         s.<a class="code" href="a00259.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = <span class="keyword">this</span>;
-<a name="l00184"></a>00184         s.<a class="code" href="a00259.html#448b7e9042afcdc455ea3f929ac4c594">internal_release</a>();
+<a name="l00181"></a>00181 <span class="preprocessor"></span>        <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00182"></a>00182         <a class="code" href="a00276.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00183"></a>00183         s.<a class="code" href="a00276.html#be42c8fe11cce1af4fe1e9eaab717567">my_mutex</a> = <span class="keyword">this</span>;
+<a name="l00184"></a>00184         s.<a class="code" href="a00276.html#448b7e9042afcdc455ea3f929ac4c594">internal_release</a>();
 <a name="l00185"></a>00185 <span class="preprocessor">#else</span>
 <a name="l00186"></a>00186 <span class="preprocessor"></span><span class="preprocessor">  #if _WIN32||_WIN64</span>
 <a name="l00187"></a>00187 <span class="preprocessor"></span>        LeaveCriticalSection(&impl);
@@ -195,11 +195,11 @@
 <a name="l00192"></a>00192     }
 <a name="l00193"></a>00193 
 <a name="l00195"></a>00195 <span class="preprocessor">  #if _WIN32||_WIN64</span>
-<a name="l00196"></a><a class="code" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">00196</a> <span class="preprocessor"></span>    <span class="keyword">typedef</span> LPCRITICAL_SECTION <a class="code" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>;
+<a name="l00196"></a><a class="code" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">00196</a> <span class="preprocessor"></span>    <span class="keyword">typedef</span> LPCRITICAL_SECTION <a class="code" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>;
 <a name="l00197"></a>00197 <span class="preprocessor">  #else</span>
-<a name="l00198"></a>00198 <span class="preprocessor"></span>    <span class="keyword">typedef</span> pthread_mutex_t* <a class="code" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>;
+<a name="l00198"></a>00198 <span class="preprocessor"></span>    <span class="keyword">typedef</span> pthread_mutex_t* <a class="code" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>;
 <a name="l00199"></a>00199 <span class="preprocessor">  #endif</span>
-<a name="l00200"></a>00200 <span class="preprocessor"></span>    <a class="code" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> native_handle() { <span class="keywordflow">return</span> (<a class="code" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>) &impl; }
+<a name="l00200"></a>00200 <span class="preprocessor"></span>    <a class="code" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a> native_handle() { <span class="keywordflow">return</span> (<a class="code" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">native_handle_type</a>) &impl; }
 <a name="l00201"></a>00201 
 <a name="l00202"></a>00202     <span class="keyword">enum</span> state_t {
 <a name="l00203"></a>00203         INITIALIZED=0x1234,
@@ -220,7 +220,7 @@
 <a name="l00220"></a>00220 
 <a name="l00221"></a>00221 <span class="preprocessor">#if _WIN32||_WIN64</span>
 <a name="l00222"></a>00222 <span class="preprocessor"></span><span class="keyword">public</span>:
-<a name="l00224"></a><a class="code" href="a00258.html#795649a185b0d6af6dc81c5f378616dd">00224</a>     <span class="keywordtype">void</span> <a class="code" href="a00258.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>( state_t to ) { state = to; }
+<a name="l00224"></a><a class="code" href="a00275.html#795649a185b0d6af6dc81c5f378616dd">00224</a>     <span class="keywordtype">void</span> <a class="code" href="a00275.html#795649a185b0d6af6dc81c5f378616dd">set_state</a>( state_t to ) { state = to; }
 <a name="l00225"></a>00225 <span class="preprocessor">#endif</span>
 <a name="l00226"></a>00226 <span class="preprocessor"></span>};
 <a name="l00227"></a>00227 
diff --git a/doc/html/a00501.html b/doc/html/a00489.html
similarity index 86%
rename from doc/html/a00501.html
rename to doc/html/a00489.html
index ca1902a..439546f 100644
--- a/doc/html/a00501.html
+++ b/doc/html/a00489.html
@@ -45,21 +45,21 @@
 <a name="l00024"></a>00024 <span class="keyword">namespace </span>tbb {
 <a name="l00025"></a>00025     
 <a name="l00027"></a>00027 
-<a name="l00029"></a><a class="code" href="a00260.html">00029</a> <span class="keyword">class </span><a class="code" href="a00260.html">null_mutex</a> {   
-<a name="l00031"></a>00031     <a class="code" href="a00260.html">null_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00260.html">null_mutex</a>& );   
-<a name="l00032"></a>00032     <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00260.html">null_mutex</a>& );   
+<a name="l00029"></a><a class="code" href="a00277.html">00029</a> <span class="keyword">class </span><a class="code" href="a00277.html">null_mutex</a> {   
+<a name="l00031"></a>00031     <a class="code" href="a00277.html">null_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00277.html">null_mutex</a>& );   
+<a name="l00032"></a>00032     <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00277.html">null_mutex</a>& );   
 <a name="l00033"></a>00033 <span class="keyword">public</span>:   
-<a name="l00035"></a><a class="code" href="a00261.html">00035</a>     <span class="keyword">class </span><a class="code" href="a00261.html">scoped_lock</a> {   
+<a name="l00035"></a><a class="code" href="a00278.html">00035</a>     <span class="keyword">class </span><a class="code" href="a00278.html">scoped_lock</a> {   
 <a name="l00036"></a>00036     <span class="keyword">public</span>:   
-<a name="l00037"></a>00037         <a class="code" href="a00261.html">scoped_lock</a>() {}
-<a name="l00038"></a>00038         <a class="code" href="a00261.html">scoped_lock</a>( <a class="code" href="a00260.html">null_mutex</a>& ) {}   
-<a name="l00039"></a>00039         ~<a class="code" href="a00261.html">scoped_lock</a>() {}
-<a name="l00040"></a>00040         <span class="keywordtype">void</span> acquire( <a class="code" href="a00260.html">null_mutex</a>& ) {}
-<a name="l00041"></a>00041         <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00260.html">null_mutex</a>& ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
+<a name="l00037"></a>00037         <a class="code" href="a00278.html">scoped_lock</a>() {}
+<a name="l00038"></a>00038         <a class="code" href="a00278.html">scoped_lock</a>( <a class="code" href="a00277.html">null_mutex</a>& ) {}   
+<a name="l00039"></a>00039         ~<a class="code" href="a00278.html">scoped_lock</a>() {}
+<a name="l00040"></a>00040         <span class="keywordtype">void</span> acquire( <a class="code" href="a00277.html">null_mutex</a>& ) {}
+<a name="l00041"></a>00041         <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00277.html">null_mutex</a>& ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
 <a name="l00042"></a>00042         <span class="keywordtype">void</span> release() {}
 <a name="l00043"></a>00043     };
 <a name="l00044"></a>00044   
-<a name="l00045"></a>00045     <a class="code" href="a00260.html">null_mutex</a>() {}
+<a name="l00045"></a>00045     <a class="code" href="a00277.html">null_mutex</a>() {}
 <a name="l00046"></a>00046     
 <a name="l00047"></a>00047     <span class="comment">// Mutex traits   </span>
 <a name="l00048"></a>00048     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;   
diff --git a/doc/html/a00502.html b/doc/html/a00490.html
similarity index 87%
rename from doc/html/a00502.html
rename to doc/html/a00490.html
index c9dd694..883e61a 100644
--- a/doc/html/a00502.html
+++ b/doc/html/a00490.html
@@ -45,23 +45,23 @@
 <a name="l00024"></a>00024 <span class="keyword">namespace </span>tbb {
 <a name="l00025"></a>00025     
 <a name="l00027"></a>00027 
-<a name="l00029"></a><a class="code" href="a00262.html">00029</a> <span class="keyword">class </span><a class="code" href="a00262.html">null_rw_mutex</a> {
-<a name="l00031"></a>00031     <a class="code" href="a00262.html">null_rw_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00262.html">null_rw_mutex</a>& );   
-<a name="l00032"></a>00032     <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00262.html">null_rw_mutex</a>& );   
+<a name="l00029"></a><a class="code" href="a00279.html">00029</a> <span class="keyword">class </span><a class="code" href="a00279.html">null_rw_mutex</a> {
+<a name="l00031"></a>00031     <a class="code" href="a00279.html">null_rw_mutex</a>( <span class="keyword">const</span> <a class="code" href="a00279.html">null_rw_mutex</a>& );   
+<a name="l00032"></a>00032     <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00279.html">null_rw_mutex</a>& );   
 <a name="l00033"></a>00033 <span class="keyword">public</span>:   
-<a name="l00035"></a><a class="code" href="a00263.html">00035</a>     <span class="keyword">class </span><a class="code" href="a00263.html">scoped_lock</a> {   
+<a name="l00035"></a><a class="code" href="a00280.html">00035</a>     <span class="keyword">class </span><a class="code" href="a00280.html">scoped_lock</a> {   
 <a name="l00036"></a>00036     <span class="keyword">public</span>:   
-<a name="l00037"></a>00037         <a class="code" href="a00263.html">scoped_lock</a>() {}
-<a name="l00038"></a>00038         <a class="code" href="a00263.html">scoped_lock</a>( <a class="code" href="a00262.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) {}
-<a name="l00039"></a>00039         ~<a class="code" href="a00263.html">scoped_lock</a>() {}
-<a name="l00040"></a>00040         <span class="keywordtype">void</span> acquire( <a class="code" href="a00262.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) {}
+<a name="l00037"></a>00037         <a class="code" href="a00280.html">scoped_lock</a>() {}
+<a name="l00038"></a>00038         <a class="code" href="a00280.html">scoped_lock</a>( <a class="code" href="a00279.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) {}
+<a name="l00039"></a>00039         ~<a class="code" href="a00280.html">scoped_lock</a>() {}
+<a name="l00040"></a>00040         <span class="keywordtype">void</span> acquire( <a class="code" href="a00279.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) {}
 <a name="l00041"></a>00041         <span class="keywordtype">bool</span> upgrade_to_writer() { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
 <a name="l00042"></a>00042         <span class="keywordtype">bool</span> downgrade_to_reader() { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
-<a name="l00043"></a>00043         <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00262.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
+<a name="l00043"></a>00043         <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00279.html">null_rw_mutex</a>& , <span class="keywordtype">bool</span> = <span class="keyword">true</span> ) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
 <a name="l00044"></a>00044         <span class="keywordtype">void</span> release() {}
 <a name="l00045"></a>00045     };
 <a name="l00046"></a>00046   
-<a name="l00047"></a>00047     <a class="code" href="a00262.html">null_rw_mutex</a>() {}
+<a name="l00047"></a>00047     <a class="code" href="a00279.html">null_rw_mutex</a>() {}
 <a name="l00048"></a>00048     
 <a name="l00049"></a>00049     <span class="comment">// Mutex traits   </span>
 <a name="l00050"></a>00050     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">true</span>;   
diff --git a/doc/html/a00503.html b/doc/html/a00491.html
similarity index 97%
rename from doc/html/a00503.html
rename to doc/html/a00491.html
index 0d38b3d..2710997 100644
--- a/doc/html/a00503.html
+++ b/doc/html/a00491.html
@@ -74,14 +74,14 @@
 <a name="l00056"></a>00056 <span class="comment"></span>
 <a name="l00058"></a>00058 
 <a name="l00059"></a>00059 <span class="keyword">template</span><<span class="keyword">typename</span> Item>
-<a name="l00060"></a><a class="code" href="a00264.html">00060</a> <span class="keyword">class </span><a class="code" href="a00264.html">parallel_do_feeder</a>: internal::no_copy
+<a name="l00060"></a><a class="code" href="a00281.html">00060</a> <span class="keyword">class </span><a class="code" href="a00281.html">parallel_do_feeder</a>: internal::no_copy
 <a name="l00061"></a>00061 {
-<a name="l00062"></a>00062     <a class="code" href="a00264.html">parallel_do_feeder</a>() {}
-<a name="l00063"></a>00063     <span class="keyword">virtual</span> ~<a class="code" href="a00264.html">parallel_do_feeder</a> () {}
+<a name="l00062"></a>00062     <a class="code" href="a00281.html">parallel_do_feeder</a>() {}
+<a name="l00063"></a>00063     <span class="keyword">virtual</span> ~<a class="code" href="a00281.html">parallel_do_feeder</a> () {}
 <a name="l00064"></a>00064     <span class="keyword">virtual</span> <span class="keywordtype">void</span> internal_add( <span class="keyword">const</span> Item& item ) = 0;
 <a name="l00065"></a>00065     <span class="keyword">template</span><<span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Item_> <span class="keyword">friend</span> <span class="keyword">class </span>internal::parallel_do_feeder_impl;
 <a name="l00066"></a>00066 <span class="keyword">public</span>:
-<a name="l00068"></a><a class="code" href="a00264.html#40baaf0f6856f4491dd0adf896c93516">00068</a>     <span class="keywordtype">void</span> <a class="code" href="a00264.html#40baaf0f6856f4491dd0adf896c93516">add</a>( <span class="keyword">const</span> Item& item ) {internal_add(item);}
+<a name="l00068"></a><a class="code" href="a00281.html#40baaf0f6856f4491dd0adf896c93516">00068</a>     <span class="keywordtype">void</span> <a class="code" href="a00281.html#40baaf0f6856f4491dd0adf896c93516">add</a>( <span class="keyword">const</span> Item& item ) {internal_add(item);}
 <a name="l00069"></a>00069 };
 <a name="l00070"></a>00070 
 <a name="l00072"></a>00072 <span class="keyword">namespace </span>internal {
@@ -173,14 +173,14 @@
 <a name="l00164"></a>00164 
 <a name="l00165"></a>00165         parallel_do_feeder_impl()
 <a name="l00166"></a>00166         {
-<a name="l00167"></a>00167             my_barrier = <span class="keyword">new</span>( <a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>() ) empty_task();
+<a name="l00167"></a>00167             my_barrier = <span class="keyword">new</span>( <a class="code" href="a00311.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>() ) empty_task();
 <a name="l00168"></a>00168             __TBB_ASSERT(my_barrier, <span class="stringliteral">"root task allocation failed"</span>);
 <a name="l00169"></a>00169         }
 <a name="l00170"></a>00170 
 <a name="l00171"></a>00171 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00172"></a>00172 <span class="preprocessor"></span>        parallel_do_feeder_impl(<a class="code" href="a00293.html">tbb::task_group_context</a> &context)
+<a name="l00172"></a>00172 <span class="preprocessor"></span>        parallel_do_feeder_impl(<a class="code" href="a00314.html">tbb::task_group_context</a> &context)
 <a name="l00173"></a>00173         {
-<a name="l00174"></a>00174             my_barrier = <span class="keyword">new</span>( <a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(context) ) empty_task();
+<a name="l00174"></a>00174             my_barrier = <span class="keyword">new</span>( <a class="code" href="a00311.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(context) ) empty_task();
 <a name="l00175"></a>00175             __TBB_ASSERT(my_barrier, <span class="stringliteral">"root task allocation failed"</span>);
 <a name="l00176"></a>00176         }
 <a name="l00177"></a>00177 <span class="preprocessor">#endif</span>
@@ -440,12 +440,12 @@
 <a name="l00467"></a>00467 
 <a name="l00468"></a>00468 
 <a name="l00469"></a>00469 <span class="keyword">template</span><<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Body> 
-<a name="l00470"></a><a class="code" href="a00371.html#g3383e2703977012b6f384d673410f1f7">00470</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body )
+<a name="l00470"></a><a class="code" href="a00395.html#g3383e2703977012b6f384d673410f1f7">00470</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body )
 <a name="l00471"></a>00471 {
 <a name="l00472"></a>00472     <span class="keywordflow">if</span> ( first == last )
 <a name="l00473"></a>00473         <span class="keywordflow">return</span>;
 <a name="l00474"></a>00474 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00475"></a>00475 <span class="preprocessor"></span>    <a class="code" href="a00293.html">task_group_context</a> context;
+<a name="l00475"></a>00475 <span class="preprocessor"></span>    <a class="code" href="a00314.html">task_group_context</a> context;
 <a name="l00476"></a>00476 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT</span>
 <a name="l00477"></a>00477 <span class="preprocessor"></span>    internal::select_parallel_do( first, last, body, &Body::operator()
 <a name="l00478"></a>00478 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
@@ -457,7 +457,7 @@
 <a name="l00484"></a>00484 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
 <a name="l00486"></a>00486 <span class="preprocessor"></span>
 <a name="l00487"></a>00487 <span class="preprocessor">template<typename Iterator, typename Body> </span>
-<a name="l00488"></a><a class="code" href="a00371.html#g2617dc9b88b3285a7212599d49f74228">00488</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00371.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <a class="code" href="a00293.html">task_group_context</a>& context  )
+<a name="l00488"></a><a class="code" href="a00395.html#g2617dc9b88b3285a7212599d49f74228">00488</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00395.html#g3383e2703977012b6f384d673410f1f7">parallel_do</a>( Iterator first, Iterator last, <span class="keyword">const</span> Body& body, <a class="code" href="a00314.html">task_group_context</a>& context  )
 <a name="l00489"></a>00489 {
 <a name="l00490"></a>00490     <span class="keywordflow">if</span> ( first == last )
 <a name="l00491"></a>00491         <span class="keywordflow">return</span>;
diff --git a/doc/html/a00500.html b/doc/html/a00500.html
new file mode 100644
index 0000000..3111633
--- /dev/null
+++ b/doc/html/a00500.html
@@ -0,0 +1,256 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>parallel_for.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="files.html"><span>File List</span></a></li>
+    <li><a href="globals.html"><span>File Members</span></a></li>
+  </ul></div>
+<h1>parallel_for.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
+<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment">    writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020 
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_for_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_for_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include <new></span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "task.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include "partitioner.h"</span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include "blocked_range.h"</span>
+<a name="l00028"></a>00028 <span class="preprocessor">#include "tbb_exception.h"</span>
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="keyword">namespace </span>tbb {
+<a name="l00031"></a>00031 
+<a name="l00032"></a>00032 <span class="keyword">namespace </span>interface6 {
+<a name="l00034"></a>00034 <span class="keyword">namespace </span>internal {
+<a name="l00035"></a>00035 
+<a name="l00037"></a>00037 
+<a name="l00038"></a>00038     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
+<a name="l00039"></a>00039     <span class="keyword">class </span>start_for: <span class="keyword">public</span> task {
+<a name="l00040"></a>00040         Range my_range;
+<a name="l00041"></a>00041         <span class="keyword">const</span> Body my_body;
+<a name="l00042"></a>00042         <span class="keyword">typename</span> Partitioner::task_partition_type my_partition;
+<a name="l00043"></a>00043         <span class="comment">/*override*/</span> task* execute();
+<a name="l00044"></a>00044 
+<a name="l00045"></a>00045     <span class="keyword">public</span>:
+<a name="l00047"></a>00047         start_for( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, Partitioner& partitioner ) :
+<a name="l00048"></a>00048             my_range(range),    
+<a name="l00049"></a>00049             my_body(body),
+<a name="l00050"></a>00050             my_partition(partitioner)
+<a name="l00051"></a>00051         {
+<a name="l00052"></a>00052         }
+<a name="l00054"></a>00054 
+<a name="l00055"></a>00055         start_for( start_for& parent_, split ) :
+<a name="l00056"></a>00056             my_range(parent_.my_range,split()),
+<a name="l00057"></a>00057             my_body(parent_.my_body),
+<a name="l00058"></a>00058             my_partition(parent_.my_partition, split())
+<a name="l00059"></a>00059         {
+<a name="l00060"></a>00060             my_partition.set_affinity(*<span class="keyword">this</span>);
+<a name="l00061"></a>00061         }
+<a name="l00063"></a>00063 
+<a name="l00064"></a>00064         start_for( start_for& parent_, <span class="keyword">const</span> Range& r, depth_t d ) :
+<a name="l00065"></a>00065             my_range(r),
+<a name="l00066"></a>00066             my_body(parent_.my_body),
+<a name="l00067"></a>00067             my_partition(parent_.my_partition,split())
+<a name="l00068"></a>00068         {
+<a name="l00069"></a>00069             my_partition.set_affinity(*<span class="keyword">this</span>);
+<a name="l00070"></a>00070             my_partition.align_depth( d );
+<a name="l00071"></a>00071         }
+<a name="l00073"></a>00073         <span class="comment">/*override*/</span> <span class="keywordtype">void</span> note_affinity( affinity_id <span class="keywordtype">id</span> ) {
+<a name="l00074"></a>00074             my_partition.note_affinity( <span class="keywordtype">id</span> );
+<a name="l00075"></a>00075         }
+<a name="l00076"></a>00076         <span class="keyword">static</span> <span class="keywordtype">void</span> run(  <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> Partitioner& partitioner ) {
+<a name="l00077"></a>00077             <span class="keywordflow">if</span>( !range.empty() ) {
+<a name="l00078"></a>00078 #<span class="keywordflow">if</span> !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
+<a name="l00079"></a>00079                 start_for& a = *<span class="keyword">new</span>(<a class="code" href="a00311.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_for(range,body,const_cast<Partitioner&>(partitioner));
+<a name="l00080"></a>00080 <span class="preprocessor">#else</span>
+<a name="l00081"></a>00081 <span class="preprocessor"></span>                <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
+<a name="l00082"></a>00082                 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
+<a name="l00083"></a>00083                 task_group_context context;
+<a name="l00084"></a>00084                 start_for& a = *<span class="keyword">new</span>(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
+<a name="l00085"></a>00085 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */</span>
+<a name="l00086"></a>00086                 <a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>(a);
+<a name="l00087"></a>00087             }
+<a name="l00088"></a>00088         }
+<a name="l00089"></a>00089 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00090"></a>00090 <span class="preprocessor"></span>        <span class="keyword">static</span> <span class="keywordtype">void</span> run(  <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> Partitioner& partitioner, task_group_context& context ) {
+<a name="l00091"></a>00091             <span class="keywordflow">if</span>( !range.empty() ) {
+<a name="l00092"></a>00092                 start_for& a = *<span class="keyword">new</span>(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
+<a name="l00093"></a>00093                 <a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>(a);
+<a name="l00094"></a>00094             }
+<a name="l00095"></a>00095         }
+<a name="l00096"></a>00096 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00098"></a>00098         flag_task *create_continuation() {
+<a name="l00099"></a>00099             <span class="keywordflow">return</span> <span class="keyword">new</span>( allocate_continuation() ) flag_task();
+<a name="l00100"></a>00100         }
+<a name="l00102"></a>00102         <span class="keywordtype">void</span> run_body( Range &r ) { my_body( r ); }
+<a name="l00103"></a>00103     };
+<a name="l00104"></a>00104 
+<a name="l00105"></a>00105     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
+<a name="l00106"></a>00106     task* start_for<Range,Body,Partitioner>::execute() {
+<a name="l00107"></a>00107         my_partition.check_being_stolen( *<span class="keyword">this</span> );
+<a name="l00108"></a>00108         my_partition.execute(*<span class="keyword">this</span>, my_range);
+<a name="l00109"></a>00109         <span class="keywordflow">return</span> NULL;
+<a name="l00110"></a>00110     } 
+<a name="l00111"></a>00111 } <span class="comment">// namespace internal</span>
+<a name="l00113"></a>00113 <span class="comment"></span>} <span class="comment">// namespace interfaceX</span>
+<a name="l00114"></a>00114 
+<a name="l00116"></a>00116 <span class="keyword">namespace </span>internal {
+<a name="l00117"></a>00117     <span class="keyword">using</span> interface6::internal::start_for;
+<a name="l00118"></a>00118     
+<a name="l00120"></a>00120     <span class="keyword">template</span><<span class="keyword">typename</span> Function, <span class="keyword">typename</span> Index>
+<a name="l00121"></a>00121     <span class="keyword">class </span>parallel_for_body : internal::no_assign {
+<a name="l00122"></a>00122         <span class="keyword">const</span> Function &my_func;
+<a name="l00123"></a>00123         <span class="keyword">const</span> Index my_begin;
+<a name="l00124"></a>00124         <span class="keyword">const</span> Index my_step; 
+<a name="l00125"></a>00125     <span class="keyword">public</span>:
+<a name="l00126"></a>00126         parallel_for_body( <span class="keyword">const</span> Function& _func, Index& _begin, Index& _step) 
+<a name="l00127"></a>00127             : my_func(_func), my_begin(_begin), my_step(_step) {}
+<a name="l00128"></a>00128         
+<a name="l00129"></a>00129         <span class="keywordtype">void</span> operator()( <a class="code" href="a00233.html">tbb::blocked_range<Index></a>& r )<span class="keyword"> const </span>{
+<a name="l00130"></a>00130             <span class="keywordflow">for</span>( Index i = r.<a class="code" href="a00233.html#18d2258400756ac1446dac7676b18df3">begin</a>(),  k = my_begin + i * my_step; i < r.<a class="code" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>(); i++, k = k + my_step)
+<a name="l00131"></a>00131                 my_func( k );
+<a name="l00132"></a>00132         }
+<a name="l00133"></a>00133     };
+<a name="l00134"></a>00134 } <span class="comment">// namespace internal</span>
+<a name="l00136"></a>00136 <span class="comment"></span>
+<a name="l00137"></a>00137 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
+<a name="l00138"></a>00138 
+<a name="l00149"></a>00149 
+<a name="l00151"></a>00151 
+<a name="l00152"></a>00152 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00153"></a><a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">00153</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body ) {
+<a name="l00154"></a>00154     internal::start_for<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
+<a name="l00155"></a>00155 }
+<a name="l00156"></a>00156 
+<a name="l00158"></a>00158 
+<a name="l00159"></a>00159 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00160"></a><a class="code" href="a00395.html#g13cac5dd55c7533bccea43a51c33d0e5">00160</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>& partitioner ) {
+<a name="l00161"></a>00161     internal::start_for<Range,Body,simple_partitioner>::run(range,body,partitioner);
+<a name="l00162"></a>00162 }
+<a name="l00163"></a>00163 
+<a name="l00165"></a>00165 
+<a name="l00166"></a>00166 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00167"></a><a class="code" href="a00395.html#ga7ac75d532389b55b9247f3fdb0b00d1">00167</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>& partitioner ) {
+<a name="l00168"></a>00168     internal::start_for<Range,Body,auto_partitioner>::run(range,body,partitioner);
+<a name="l00169"></a>00169 }
+<a name="l00170"></a>00170 
+<a name="l00172"></a>00172 
+<a name="l00173"></a>00173 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00174"></a><a class="code" href="a00395.html#g9cd1b210ceb1c040f30e390b4a21bde8">00174</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00225.html">affinity_partitioner</a>& partitioner ) {
+<a name="l00175"></a>00175     internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner);
+<a name="l00176"></a>00176 }
+<a name="l00177"></a>00177 
+<a name="l00178"></a>00178 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00180"></a>00180 <span class="preprocessor"></span>
+<a name="l00181"></a>00181 <span class="preprocessor">template<typename Range, typename Body></span>
+<a name="l00182"></a><a class="code" href="a00395.html#g2d317a5e0078cd193125439fed60dfdc">00182</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>& partitioner, <a class="code" hr [...]
+<a name="l00183"></a>00183     internal::start_for<Range,Body,simple_partitioner>::run(range, body, partitioner, context);
+<a name="l00184"></a>00184 }
+<a name="l00185"></a>00185 
+<a name="l00187"></a>00187 
+<a name="l00188"></a>00188 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00189"></a><a class="code" href="a00395.html#g1c0700e3f85e83a788ff3ede88ebb7e9">00189</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_context< [...]
+<a name="l00190"></a>00190     internal::start_for<Range,Body,auto_partitioner>::run(range, body, partitioner, context);
+<a name="l00191"></a>00191 }
+<a name="l00192"></a>00192 
+<a name="l00194"></a>00194 
+<a name="l00195"></a>00195 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00196"></a><a class="code" href="a00395.html#g04b4696b67370c01353ff5974c8f1196">00196</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00225.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00197"></a>00197     internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner, context);
+<a name="l00198"></a>00198 }
+<a name="l00199"></a>00199 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00200"></a>00200 
+<a name="l00201"></a>00201 
+<a name="l00202"></a>00202 <span class="keyword">namespace </span>strict_ppl {
+<a name="l00203"></a>00203 
+<a name="l00205"></a>00205 
+<a name="l00206"></a>00206 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
+<a name="l00207"></a>00207 <span class="keywordtype">void</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f) {
+<a name="l00208"></a>00208     <span class="keywordflow">if</span> (step <= 0 )
+<a name="l00209"></a>00209         internal::throw_exception(internal::eid_nonpositive_step); <span class="comment">// throws std::invalid_argument</span>
+<a name="l00210"></a>00210     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (last > first) {
+<a name="l00211"></a>00211         <span class="comment">// Above "else" avoids "potential divide by zero" warning on some platforms</span>
+<a name="l00212"></a>00212         Index end = (last - first - Index(1)) / step + Index(1);
+<a name="l00213"></a>00213         <a class="code" href="a00233.html">tbb::blocked_range<Index></a> range(static_cast<Index>(0), end);
+<a name="l00214"></a>00214         internal::parallel_for_body<Function, Index> body(f, first, step);
+<a name="l00215"></a>00215         <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a>(range, body, <a class="code" href="a00231.html">tbb::auto_partitioner</a>());
+<a name="l00216"></a>00216     }
+<a name="l00217"></a>00217 }
+<a name="l00219"></a>00219 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
+<a name="l00220"></a>00220 <span class="keywordtype">void</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f) {
+<a name="l00221"></a>00221     <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f);
+<a name="l00222"></a>00222 }
+<a name="l00223"></a>00223 
+<a name="l00224"></a>00224 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00226"></a>00226 <span class="preprocessor">template <typename Index, typename Function></span>
+<a name="l00227"></a>00227 <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f, <a class="code" href="a00314.html">tbb::task_group_context</a> &context) {
+<a name="l00228"></a>00228     <span class="keywordflow">if</span> (step <= 0 )
+<a name="l00229"></a>00229         internal::throw_exception(internal::eid_nonpositive_step); <span class="comment">// throws std::invalid_argument</span>
+<a name="l00230"></a>00230     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (last > first) {
+<a name="l00231"></a>00231         <span class="comment">// Above "else" avoids "potential divide by zero" warning on some platforms</span>
+<a name="l00232"></a>00232         Index end = (last - first - Index(1)) / step + Index(1);
+<a name="l00233"></a>00233         <a class="code" href="a00233.html">tbb::blocked_range<Index></a> range(static_cast<Index>(0), end);
+<a name="l00234"></a>00234         internal::parallel_for_body<Function, Index> body(f, first, step);
+<a name="l00235"></a>00235         <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a>(range, body, <a class="code" href="a00231.html">tbb::auto_partitioner</a>(), context);
+<a name="l00236"></a>00236     }
+<a name="l00237"></a>00237 }
+<a name="l00239"></a>00239 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
+<a name="l00240"></a>00240 <span class="keywordtype">void</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f, <a class="code" href="a00314.html">tbb::task_group_context</a> &context) {
+<a name="l00241"></a>00241     <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f, context);
+<a name="l00242"></a>00242 }
+<a name="l00243"></a>00243 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00244"></a>00244 
+<a name="l00245"></a>00245 
+<a name="l00246"></a>00246 } <span class="comment">// namespace strict_ppl</span>
+<a name="l00247"></a>00247 
+<a name="l00248"></a>00248 <span class="keyword">using</span> <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">strict_ppl::parallel_for</a>;
+<a name="l00249"></a>00249 
+<a name="l00250"></a>00250 } <span class="comment">// namespace tbb</span>
+<a name="l00251"></a>00251 
+<a name="l00252"></a>00252 <span class="preprocessor">#if TBB_PREVIEW_SERIAL_SUBSET</span>
+<a name="l00253"></a>00253 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_NORMAL_EXECUTION</span>
+<a name="l00254"></a>00254 <span class="preprocessor"></span><span class="preprocessor">#include "../serial/tbb/parallel_for.h"</span>
+<a name="l00255"></a>00255 <span class="preprocessor">#undef __TBB_NORMAL_EXECUTION</span>
+<a name="l00256"></a>00256 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00257"></a>00257 <span class="preprocessor"></span>
+<a name="l00258"></a>00258 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_for_H */</span>
+<a name="l00259"></a>00259 
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00516.html b/doc/html/a00504.html
similarity index 82%
rename from doc/html/a00516.html
rename to doc/html/a00504.html
index c77c0cb..556b092 100644
--- a/doc/html/a00516.html
+++ b/doc/html/a00504.html
@@ -55,7 +55,7 @@
 <a name="l00035"></a>00035         parallel_for_each_body(<span class="keyword">const</span> Function &_func) : my_func(_func) {}
 <a name="l00036"></a>00036         parallel_for_each_body(<span class="keyword">const</span> parallel_for_each_body<Function, Iterator> &_caller) : my_func(_caller.my_func) {}
 <a name="l00037"></a>00037 
-<a name="l00038"></a>00038         <span class="keywordtype">void</span> operator() ( <span class="keyword">typename</span> std::iterator_traits<Iterator>::value_type& value )<span class="keyword"> const </span>{
+<a name="l00038"></a>00038         <span class="keywordtype">void</span> operator() ( <span class="keyword">typename</span> std::iterator_traits<Iterator>::reference value )<span class="keyword"> const </span>{
 <a name="l00039"></a>00039             my_func(value);
 <a name="l00040"></a>00040         }
 <a name="l00041"></a>00041     };
@@ -63,18 +63,18 @@
 <a name="l00044"></a>00044 <span class="comment"></span>
 <a name="l00048"></a>00048 
 <a name="l00049"></a>00049 
-<a name="l00050"></a>00050 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator, <span class="keyword">typename</span> Function>
-<a name="l00051"></a><a class="code" href="a00371.html#gcd40c32f319747e61a8f73fcfc452001">00051</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f, <a class="code" href="a00293.html">task_group_context</a> &context) {
-<a name="l00052"></a>00052     internal::parallel_for_each_body<Function, InputIterator> body(f);
-<a name="l00053"></a>00053 
-<a name="l00054"></a>00054     <a class="code" href="a00371.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body, context);
+<a name="l00050"></a>00050 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> InputIterator, <span class="keyword">typename</span> Function>
+<a name="l00052"></a><a class="code" href="a00395.html#gcd40c32f319747e61a8f73fcfc452001">00052</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f, <a class="code" href="a00314.html">task_group_context</a> &context) {
+<a name="l00053"></a>00053     internal::parallel_for_each_body<Function, InputIterator> body(f);
+<a name="l00054"></a>00054     <a class="code" href="a00395.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body, context);
 <a name="l00055"></a>00055 }
-<a name="l00056"></a>00056 
-<a name="l00058"></a>00058 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator, <span class="keyword">typename</span> Function>
-<a name="l00059"></a><a class="code" href="a00371.html#gc2d710ca573f0a9bd94379cba3772def">00059</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f) {
-<a name="l00060"></a>00060     internal::parallel_for_each_body<Function, InputIterator> body(f);
-<a name="l00061"></a>00061 
-<a name="l00062"></a>00062     <a class="code" href="a00371.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body);
+<a name="l00056"></a>00056 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00057"></a>00057 
+<a name="l00059"></a>00059 <span class="keyword">template</span><<span class="keyword">typename</span> InputIterator, <span class="keyword">typename</span> Function>
+<a name="l00060"></a><a class="code" href="a00395.html#gc2d710ca573f0a9bd94379cba3772def">00060</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#gcd40c32f319747e61a8f73fcfc452001">parallel_for_each</a>(InputIterator first, InputIterator last, <span class="keyword">const</span> Function& f) {
+<a name="l00061"></a>00061     internal::parallel_for_each_body<Function, InputIterator> body(f);
+<a name="l00062"></a>00062     <a class="code" href="a00395.html#g3383e2703977012b6f384d673410f1f7">tbb::parallel_do</a> (first, last, body);
 <a name="l00063"></a>00063 }
 <a name="l00064"></a>00064 
 <a name="l00066"></a>00066 
diff --git a/doc/html/a00518.html b/doc/html/a00506.html
similarity index 51%
copy from doc/html/a00518.html
copy to doc/html/a00506.html
index 9f8f271..c0f248a 100644
--- a/doc/html/a00518.html
+++ b/doc/html/a00506.html
@@ -46,323 +46,335 @@
 <a name="l00025"></a>00025 
 <a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
 <a name="l00027"></a>00027 
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>internal {
-<a name="l00030"></a>00030     <span class="comment">// Simple task object, executing user method</span>
-<a name="l00031"></a>00031     <span class="keyword">template</span><<span class="keyword">typename</span> function>
-<a name="l00032"></a>00032     <span class="keyword">class </span>function_invoker : <span class="keyword">public</span> task{
-<a name="l00033"></a>00033     <span class="keyword">public</span>:
-<a name="l00034"></a>00034         function_invoker(<span class="keyword">const</span> function& _function) : my_function(_function) {}
-<a name="l00035"></a>00035     <span class="keyword">private</span>:
-<a name="l00036"></a>00036         <span class="keyword">const</span> function &my_function;
-<a name="l00037"></a>00037         <span class="comment">/*override*/</span>
-<a name="l00038"></a>00038         task* execute()
-<a name="l00039"></a>00039         {
-<a name="l00040"></a>00040             my_function();
-<a name="l00041"></a>00041             <span class="keywordflow">return</span> NULL;
-<a name="l00042"></a>00042         }
-<a name="l00043"></a>00043     };
-<a name="l00044"></a>00044 
-<a name="l00045"></a>00045     <span class="comment">// The class spawns two or three child tasks</span>
-<a name="l00046"></a>00046     <span class="keyword">template</span> <size_t N, <span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2, <span class="keyword">typename</span> function3>
-<a name="l00047"></a>00047     <span class="keyword">class </span>spawner : <span class="keyword">public</span> task {
-<a name="l00048"></a>00048     <span class="keyword">private</span>:
-<a name="l00049"></a>00049         <span class="keyword">const</span> function1& my_func1;
-<a name="l00050"></a>00050         <span class="keyword">const</span> function2& my_func2;
-<a name="l00051"></a>00051         <span class="keyword">const</span> function3& my_func3;
-<a name="l00052"></a>00052         <span class="keywordtype">bool</span> is_recycled;
-<a name="l00053"></a>00053 
-<a name="l00054"></a>00054         task* execute (){
-<a name="l00055"></a>00055             <span class="keywordflow">if</span>(is_recycled){
-<a name="l00056"></a>00056                 <span class="keywordflow">return</span> NULL;
-<a name="l00057"></a>00057             }<span class="keywordflow">else</span>{
-<a name="l00058"></a>00058                 __TBB_ASSERT(N==2 || N==3, <span class="stringliteral">"Number of arguments passed to spawner is wrong"</span>);
-<a name="l00059"></a>00059                 set_ref_count(N);
-<a name="l00060"></a>00060                 recycle_as_safe_continuation();
-<a name="l00061"></a>00061                 internal::function_invoker<function2>* invoker2 = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function2>(my_func2);
-<a name="l00062"></a>00062                 __TBB_ASSERT(invoker2, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00063"></a>00063                 spawn(*invoker2);
-<a name="l00064"></a>00064                 size_t n = N; <span class="comment">// To prevent compiler warnings</span>
-<a name="l00065"></a>00065                 <span class="keywordflow">if</span> (n>2) {
-<a name="l00066"></a>00066                     internal::function_invoker<function3>* invoker3 = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function3>(my_func3);
-<a name="l00067"></a>00067                     __TBB_ASSERT(invoker3, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00068"></a>00068                     spawn(*invoker3);
-<a name="l00069"></a>00069                 }
-<a name="l00070"></a>00070                 my_func1();
-<a name="l00071"></a>00071                 is_recycled = <span class="keyword">true</span>;
-<a name="l00072"></a>00072                 <span class="keywordflow">return</span> NULL;
-<a name="l00073"></a>00073             }
-<a name="l00074"></a>00074         } <span class="comment">// execute</span>
-<a name="l00075"></a>00075 
-<a name="l00076"></a>00076     <span class="keyword">public</span>:
-<a name="l00077"></a>00077         spawner(<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2, <span class="keyword">const</span> function3& _func3) : my_func1(_func1), my_func2(_func2), my_func3(_func3), is_recycled(false) {}
-<a name="l00078"></a>00078     };
-<a name="l00079"></a>00079 
-<a name="l00080"></a>00080     <span class="comment">// Creates and spawns child tasks</span>
-<a name="l00081"></a>00081     <span class="keyword">class </span>parallel_invoke_helper : <span class="keyword">public</span> empty_task {
-<a name="l00082"></a>00082     <span class="keyword">public</span>:
-<a name="l00083"></a>00083         <span class="comment">// Dummy functor class</span>
-<a name="l00084"></a>00084         <span class="keyword">class </span>parallel_invoke_noop {
-<a name="l00085"></a>00085         <span class="keyword">public</span>:
-<a name="l00086"></a>00086             <span class="keywordtype">void</span> operator() ()<span class="keyword"> const </span>{}
-<a name="l00087"></a>00087         };
-<a name="l00088"></a>00088         <span class="comment">// Creates a helper object with user-defined number of children expected</span>
-<a name="l00089"></a>00089         parallel_invoke_helper(<span class="keywordtype">int</span> number_of_children)
-<a name="l00090"></a>00090         {
-<a name="l00091"></a>00091             set_ref_count(number_of_children + 1);
-<a name="l00092"></a>00092         }
-<a name="l00093"></a>00093         <span class="comment">// Adds child task and spawns it</span>
-<a name="l00094"></a>00094         <span class="keyword">template</span> <<span class="keyword">typename</span> function>
-<a name="l00095"></a>00095         <span class="keywordtype">void</span> add_child (<span class="keyword">const</span> function &_func)
-<a name="l00096"></a>00096         {
-<a name="l00097"></a>00097             internal::function_invoker<function>* invoker = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function>(_func);
-<a name="l00098"></a>00098             __TBB_ASSERT(invoker, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00099"></a>00099             spawn(*invoker);
-<a name="l00100"></a>00100         }
-<a name="l00101"></a>00101 
-<a name="l00102"></a>00102         <span class="comment">// Adds a task with multiple child tasks and spawns it</span>
-<a name="l00103"></a>00103         <span class="comment">// two arguments</span>
-<a name="l00104"></a>00104         <span class="keyword">template</span> <<span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2>
-<a name="l00105"></a>00105         <span class="keywordtype">void</span> add_children (<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2)
-<a name="l00106"></a>00106         {
-<a name="l00107"></a>00107             <span class="comment">// The third argument is dummy, it is ignored actually.</span>
-<a name="l00108"></a>00108             parallel_invoke_noop noop;
-<a name="l00109"></a>00109             internal::spawner<2, function1, function2, parallel_invoke_noop>& sub_root = *<span class="keyword">new</span>(allocate_child())internal::spawner<2, function1, function2, parallel_invoke_noop>(_func1, _func2, noop);
-<a name="l00110"></a>00110             spawn(sub_root);
-<a name="l00111"></a>00111         }
-<a name="l00112"></a>00112         <span class="comment">// three arguments</span>
-<a name="l00113"></a>00113         <span class="keyword">template</span> <<span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2, <span class="keyword">typename</span> function3>
-<a name="l00114"></a>00114         <span class="keywordtype">void</span> add_children (<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2, <span class="keyword">const</span> function3& _func3)
-<a name="l00115"></a>00115         {
-<a name="l00116"></a>00116             internal::spawner<3, function1, function2, function3>& sub_root = *<span class="keyword">new</span>(allocate_child())internal::spawner<3, function1, function2, function3>(_func1, _func2, _func3);
-<a name="l00117"></a>00117             spawn(sub_root);
-<a name="l00118"></a>00118         }
-<a name="l00119"></a>00119 
-<a name="l00120"></a>00120         <span class="comment">// Waits for all child tasks</span>
-<a name="l00121"></a>00121         <span class="keyword">template</span> <<span class="keyword">typename</span> F0>
-<a name="l00122"></a>00122         <span class="keywordtype">void</span> run_and_finish(<span class="keyword">const</span> F0& f0)
-<a name="l00123"></a>00123         {
-<a name="l00124"></a>00124             internal::function_invoker<F0>* invoker = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<F0>(f0);
-<a name="l00125"></a>00125             __TBB_ASSERT(invoker, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00126"></a>00126             spawn_and_wait_for_all(*invoker);
-<a name="l00127"></a>00127         }
-<a name="l00128"></a>00128     };
-<a name="l00129"></a>00129     <span class="comment">// The class destroys root if exception occured as well as in normal case</span>
-<a name="l00130"></a>00130     <span class="keyword">class </span>parallel_invoke_cleaner: internal::no_copy { 
-<a name="l00131"></a>00131     <span class="keyword">public</span>:
-<a name="l00132"></a>00132         parallel_invoke_cleaner(<span class="keywordtype">int</span> number_of_children, <a class="code" href="a00293.html">tbb::task_group_context</a>& context) : root(*new(task::allocate_root(context)) internal::parallel_invoke_helper(number_of_children))
-<a name="l00133"></a>00133         {}
-<a name="l00134"></a>00134         ~parallel_invoke_cleaner(){
-<a name="l00135"></a>00135             root.destroy(root);
-<a name="l00136"></a>00136         }
-<a name="l00137"></a>00137         internal::parallel_invoke_helper& root;
-<a name="l00138"></a>00138     };
-<a name="l00139"></a>00139 } <span class="comment">// namespace internal</span>
-<a name="l00141"></a>00141 <span class="comment"></span>
+<a name="l00028"></a>00028 <span class="preprocessor">#if !__TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span>
+<a name="l00030"></a><a class="code" href="a00314.html">00030</a>     <span class="keyword">struct </span><a class="code" href="a00314.html">task_group_context</a> {};
+<a name="l00031"></a>00031 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00032"></a>00032 
+<a name="l00034"></a>00034 <span class="keyword">namespace </span>internal {
+<a name="l00035"></a>00035     <span class="comment">// Simple task object, executing user method</span>
+<a name="l00036"></a>00036     <span class="keyword">template</span><<span class="keyword">typename</span> function>
+<a name="l00037"></a>00037     <span class="keyword">class </span>function_invoker : <span class="keyword">public</span> <a class="code" href="a00311.html">task</a>{
+<a name="l00038"></a>00038     <span class="keyword">public</span>:
+<a name="l00039"></a>00039         function_invoker(<span class="keyword">const</span> function& _function) : my_function(_function) {}
+<a name="l00040"></a>00040     <span class="keyword">private</span>:
+<a name="l00041"></a>00041         <span class="keyword">const</span> function &my_function;
+<a name="l00042"></a>00042         <span class="comment">/*override*/</span>
+<a name="l00043"></a>00043         task* execute()
+<a name="l00044"></a>00044         {
+<a name="l00045"></a>00045             my_function();
+<a name="l00046"></a>00046             <span class="keywordflow">return</span> NULL;
+<a name="l00047"></a>00047         }
+<a name="l00048"></a>00048     };
+<a name="l00049"></a>00049 
+<a name="l00050"></a>00050     <span class="comment">// The class spawns two or three child tasks</span>
+<a name="l00051"></a>00051     <span class="keyword">template</span> <size_t N, <span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2, <span class="keyword">typename</span> function3>
+<a name="l00052"></a>00052     <span class="keyword">class </span>spawner : <span class="keyword">public</span> task {
+<a name="l00053"></a>00053     <span class="keyword">private</span>:
+<a name="l00054"></a>00054         <span class="keyword">const</span> function1& my_func1;
+<a name="l00055"></a>00055         <span class="keyword">const</span> function2& my_func2;
+<a name="l00056"></a>00056         <span class="keyword">const</span> function3& my_func3;
+<a name="l00057"></a>00057         <span class="keywordtype">bool</span> is_recycled;
+<a name="l00058"></a>00058 
+<a name="l00059"></a>00059         task* execute (){
+<a name="l00060"></a>00060             <span class="keywordflow">if</span>(is_recycled){
+<a name="l00061"></a>00061                 <span class="keywordflow">return</span> NULL;
+<a name="l00062"></a>00062             }<span class="keywordflow">else</span>{
+<a name="l00063"></a>00063                 __TBB_ASSERT(N==2 || N==3, <span class="stringliteral">"Number of arguments passed to spawner is wrong"</span>);
+<a name="l00064"></a>00064                 set_ref_count(N);
+<a name="l00065"></a>00065                 recycle_as_safe_continuation();
+<a name="l00066"></a>00066                 internal::function_invoker<function2>* invoker2 = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function2>(my_func2);
+<a name="l00067"></a>00067                 __TBB_ASSERT(invoker2, <span class="stringliteral">"Child task allocation failed"</span>);
+<a name="l00068"></a>00068                 spawn(*invoker2);
+<a name="l00069"></a>00069                 size_t n = N; <span class="comment">// To prevent compiler warnings</span>
+<a name="l00070"></a>00070                 <span class="keywordflow">if</span> (n>2) {
+<a name="l00071"></a>00071                     internal::function_invoker<function3>* invoker3 = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function3>(my_func3);
+<a name="l00072"></a>00072                     __TBB_ASSERT(invoker3, <span class="stringliteral">"Child task allocation failed"</span>);
+<a name="l00073"></a>00073                     spawn(*invoker3);
+<a name="l00074"></a>00074                 }
+<a name="l00075"></a>00075                 my_func1();
+<a name="l00076"></a>00076                 is_recycled = <span class="keyword">true</span>;
+<a name="l00077"></a>00077                 <span class="keywordflow">return</span> NULL;
+<a name="l00078"></a>00078             }
+<a name="l00079"></a>00079         } <span class="comment">// execute</span>
+<a name="l00080"></a>00080 
+<a name="l00081"></a>00081     <span class="keyword">public</span>:
+<a name="l00082"></a>00082         spawner(<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2, <span class="keyword">const</span> function3& _func3) : my_func1(_func1), my_func2(_func2), my_func3(_func3), is_recycled(false) {}
+<a name="l00083"></a>00083     };
+<a name="l00084"></a>00084 
+<a name="l00085"></a>00085     <span class="comment">// Creates and spawns child tasks</span>
+<a name="l00086"></a>00086     <span class="keyword">class </span>parallel_invoke_helper : <span class="keyword">public</span> empty_task {
+<a name="l00087"></a>00087     <span class="keyword">public</span>:
+<a name="l00088"></a>00088         <span class="comment">// Dummy functor class</span>
+<a name="l00089"></a>00089         <span class="keyword">class </span>parallel_invoke_noop {
+<a name="l00090"></a>00090         <span class="keyword">public</span>:
+<a name="l00091"></a>00091             <span class="keywordtype">void</span> operator() ()<span class="keyword"> const </span>{}
+<a name="l00092"></a>00092         };
+<a name="l00093"></a>00093         <span class="comment">// Creates a helper object with user-defined number of children expected</span>
+<a name="l00094"></a>00094         parallel_invoke_helper(<span class="keywordtype">int</span> number_of_children)
+<a name="l00095"></a>00095         {
+<a name="l00096"></a>00096             set_ref_count(number_of_children + 1);
+<a name="l00097"></a>00097         }
+<a name="l00098"></a>00098         <span class="comment">// Adds child task and spawns it</span>
+<a name="l00099"></a>00099         <span class="keyword">template</span> <<span class="keyword">typename</span> function>
+<a name="l00100"></a>00100         <span class="keywordtype">void</span> add_child (<span class="keyword">const</span> function &_func)
+<a name="l00101"></a>00101         {
+<a name="l00102"></a>00102             internal::function_invoker<function>* invoker = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function>(_func);
+<a name="l00103"></a>00103             __TBB_ASSERT(invoker, <span class="stringliteral">"Child task allocation failed"</span>);
+<a name="l00104"></a>00104             spawn(*invoker);
+<a name="l00105"></a>00105         }
+<a name="l00106"></a>00106 
+<a name="l00107"></a>00107         <span class="comment">// Adds a task with multiple child tasks and spawns it</span>
+<a name="l00108"></a>00108         <span class="comment">// two arguments</span>
+<a name="l00109"></a>00109         <span class="keyword">template</span> <<span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2>
+<a name="l00110"></a>00110         <span class="keywordtype">void</span> add_children (<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2)
+<a name="l00111"></a>00111         {
+<a name="l00112"></a>00112             <span class="comment">// The third argument is dummy, it is ignored actually.</span>
+<a name="l00113"></a>00113             parallel_invoke_noop noop;
+<a name="l00114"></a>00114             internal::spawner<2, function1, function2, parallel_invoke_noop>& sub_root = *<span class="keyword">new</span>(allocate_child())internal::spawner<2, function1, function2, parallel_invoke_noop>(_func1, _func2, noop);
+<a name="l00115"></a>00115             spawn(sub_root);
+<a name="l00116"></a>00116         }
+<a name="l00117"></a>00117         <span class="comment">// three arguments</span>
+<a name="l00118"></a>00118         <span class="keyword">template</span> <<span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2, <span class="keyword">typename</span> function3>
+<a name="l00119"></a>00119         <span class="keywordtype">void</span> add_children (<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2, <span class="keyword">const</span> function3& _func3)
+<a name="l00120"></a>00120         {
+<a name="l00121"></a>00121             internal::spawner<3, function1, function2, function3>& sub_root = *<span class="keyword">new</span>(allocate_child())internal::spawner<3, function1, function2, function3>(_func1, _func2, _func3);
+<a name="l00122"></a>00122             spawn(sub_root);
+<a name="l00123"></a>00123         }
+<a name="l00124"></a>00124 
+<a name="l00125"></a>00125         <span class="comment">// Waits for all child tasks</span>
+<a name="l00126"></a>00126         <span class="keyword">template</span> <<span class="keyword">typename</span> F0>
+<a name="l00127"></a>00127         <span class="keywordtype">void</span> run_and_finish(<span class="keyword">const</span> F0& f0)
+<a name="l00128"></a>00128         {
+<a name="l00129"></a>00129             internal::function_invoker<F0>* invoker = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<F0>(f0);
+<a name="l00130"></a>00130             __TBB_ASSERT(invoker, <span class="stringliteral">"Child task allocation failed"</span>);
+<a name="l00131"></a>00131             spawn_and_wait_for_all(*invoker);
+<a name="l00132"></a>00132         }
+<a name="l00133"></a>00133     };
+<a name="l00134"></a>00134     <span class="comment">// The class destroys root if exception occured as well as in normal case</span>
+<a name="l00135"></a>00135     <span class="keyword">class </span>parallel_invoke_cleaner: internal::no_copy { 
+<a name="l00136"></a>00136     <span class="keyword">public</span>:
+<a name="l00137"></a>00137 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00138"></a>00138 <span class="preprocessor"></span>        parallel_invoke_cleaner(<span class="keywordtype">int</span> number_of_children, <a class="code" href="a00314.html">tbb::task_group_context</a>& context)
+<a name="l00139"></a>00139             : root(*new(task::allocate_root(context)) internal::parallel_invoke_helper(number_of_children))
+<a name="l00140"></a>00140 #else
+<a name="l00141"></a>00141         parallel_invoke_cleaner(int number_of_children, tbb::task_group_context&)
+<a name="l00142"></a>00142             : root(*new(task::allocate_root()) internal::parallel_invoke_helper(number_of_children))
+<a name="l00143"></a>00143 #endif <span class="comment">/* !__TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00144"></a>00144         {}
 <a name="l00145"></a>00145 
-<a name="l00146"></a>00146 
-<a name="l00148"></a>00148 <span class="comment">// parallel_invoke with user-defined context</span>
-<a name="l00149"></a>00149 <span class="comment">// two arguments</span>
-<a name="l00150"></a>00150 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1 >
-<a name="l00151"></a><a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">00151</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <a class="code" href="a00293.html">tbb::task_group_context</a>& context) {
-<a name="l00152"></a>00152     internal::parallel_invoke_cleaner cleaner(2, context);
-<a name="l00153"></a>00153     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00154"></a>00154 
-<a name="l00155"></a>00155     root.add_child(f1);
-<a name="l00156"></a>00156 
-<a name="l00157"></a>00157     root.run_and_finish(f0);
-<a name="l00158"></a>00158 }
-<a name="l00159"></a>00159 
-<a name="l00160"></a>00160 <span class="comment">// three arguments</span>
-<a name="l00161"></a>00161 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2 >
-<a name="l00162"></a>00162 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <a class="code" href="a00293.html">tbb::task_group_context</a>& context) {
-<a name="l00163"></a>00163     internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00164"></a>00164     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00165"></a>00165 
-<a name="l00166"></a>00166     root.add_child(f2);
+<a name="l00146"></a>00146         ~parallel_invoke_cleaner(){
+<a name="l00147"></a>00147             root.destroy(root);
+<a name="l00148"></a>00148         }
+<a name="l00149"></a>00149         internal::parallel_invoke_helper& root;
+<a name="l00150"></a>00150     };
+<a name="l00151"></a>00151 } <span class="comment">// namespace internal</span>
+<a name="l00153"></a>00153 <span class="comment"></span>
+<a name="l00157"></a>00157 
+<a name="l00158"></a>00158 
+<a name="l00160"></a>00160 <span class="comment">// parallel_invoke with user-defined context</span>
+<a name="l00161"></a>00161 <span class="comment">// two arguments</span>
+<a name="l00162"></a>00162 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1 >
+<a name="l00163"></a><a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <a class="code" href="a00314.html">tbb::task_group_context</a>& context) {
+<a name="l00164"></a>00164     internal::parallel_invoke_cleaner cleaner(2, context);
+<a name="l00165"></a>00165     internal::parallel_invoke_helper& root = cleaner.root;
+<a name="l00166"></a>00166 
 <a name="l00167"></a>00167     root.add_child(f1);
 <a name="l00168"></a>00168 
 <a name="l00169"></a>00169     root.run_and_finish(f0);
 <a name="l00170"></a>00170 }
 <a name="l00171"></a>00171 
-<a name="l00172"></a>00172 <span class="comment">// four arguments</span>
-<a name="l00173"></a>00173 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3>
-<a name="l00174"></a>00174 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3,
-<a name="l00175"></a>00175                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00176"></a>00176 {
-<a name="l00177"></a>00177     internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00178"></a>00178     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00179"></a>00179 
-<a name="l00180"></a>00180     root.add_child(f3);
-<a name="l00181"></a>00181     root.add_child(f2);
-<a name="l00182"></a>00182     root.add_child(f1);
+<a name="l00172"></a>00172 <span class="comment">// three arguments</span>
+<a name="l00173"></a>00173 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2 >
+<a name="l00174"></a>00174 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <a class="code" href="a00314.html">tbb::task_group_context</a>& context) {
+<a name="l00175"></a>00175     internal::parallel_invoke_cleaner cleaner(3, context);
+<a name="l00176"></a>00176     internal::parallel_invoke_helper& root = cleaner.root;
+<a name="l00177"></a>00177 
+<a name="l00178"></a>00178     root.add_child(f2);
+<a name="l00179"></a>00179     root.add_child(f1);
+<a name="l00180"></a>00180 
+<a name="l00181"></a>00181     root.run_and_finish(f0);
+<a name="l00182"></a>00182 }
 <a name="l00183"></a>00183 
-<a name="l00184"></a>00184     root.run_and_finish(f0);
-<a name="l00185"></a>00185 }
-<a name="l00186"></a>00186 
-<a name="l00187"></a>00187 <span class="comment">// five arguments</span>
-<a name="l00188"></a>00188 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4 >
-<a name="l00189"></a>00189 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00190"></a>00190                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00191"></a>00191 {
-<a name="l00192"></a>00192     internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00193"></a>00193     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00194"></a>00194 
-<a name="l00195"></a>00195     root.add_children(f4, f3);
-<a name="l00196"></a>00196     root.add_children(f2, f1);
-<a name="l00197"></a>00197 
-<a name="l00198"></a>00198     root.run_and_finish(f0);
-<a name="l00199"></a>00199 }
-<a name="l00200"></a>00200 
-<a name="l00201"></a>00201 <span class="comment">// six arguments</span>
-<a name="l00202"></a>00202 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5>
-<a name="l00203"></a>00203 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4, <span class="keyword">const</span> F5& f5,
-<a name="l00204"></a>00204                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00205"></a>00205 {
-<a name="l00206"></a>00206     internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00207"></a>00207     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00208"></a>00208 
-<a name="l00209"></a>00209     root.add_children(f5, f4, f3);
-<a name="l00210"></a>00210     root.add_children(f2, f1);
-<a name="l00211"></a>00211 
-<a name="l00212"></a>00212     root.run_and_finish(f0);
-<a name="l00213"></a>00213 }
-<a name="l00214"></a>00214 
-<a name="l00215"></a>00215 <span class="comment">// seven arguments</span>
-<a name="l00216"></a>00216 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6>
-<a name="l00217"></a>00217 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00218"></a>00218                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6,
-<a name="l00219"></a>00219                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00220"></a>00220 {
-<a name="l00221"></a>00221     internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00222"></a>00222     internal::parallel_invoke_helper& root = cleaner.root;
+<a name="l00184"></a>00184 <span class="comment">// four arguments</span>
+<a name="l00185"></a>00185 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3>
+<a name="l00186"></a>00186 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3,
+<a name="l00187"></a>00187                      <a class="code" href="a00314.html">tbb::task_group_context</a>& context)
+<a name="l00188"></a>00188 {
+<a name="l00189"></a>00189     internal::parallel_invoke_cleaner cleaner(4, context);
+<a name="l00190"></a>00190     internal::parallel_invoke_helper& root = cleaner.root;
+<a name="l00191"></a>00191 
+<a name="l00192"></a>00192     root.add_child(f3);
+<a name="l00193"></a>00193     root.add_child(f2);
+<a name="l00194"></a>00194     root.add_child(f1);
+<a name="l00195"></a>00195 
+<a name="l00196"></a>00196     root.run_and_finish(f0);
+<a name="l00197"></a>00197 }
+<a name="l00198"></a>00198 
+<a name="l00199"></a>00199 <span class="comment">// five arguments</span>
+<a name="l00200"></a>00200 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4 >
+<a name="l00201"></a>00201 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00202"></a>00202                      <a class="code" href="a00314.html">tbb::task_group_context</a>& context)
+<a name="l00203"></a>00203 {
+<a name="l00204"></a>00204     internal::parallel_invoke_cleaner cleaner(3, context);
+<a name="l00205"></a>00205     internal::parallel_invoke_helper& root = cleaner.root;
+<a name="l00206"></a>00206 
+<a name="l00207"></a>00207     root.add_children(f4, f3);
+<a name="l00208"></a>00208     root.add_children(f2, f1);
+<a name="l00209"></a>00209 
+<a name="l00210"></a>00210     root.run_and_finish(f0);
+<a name="l00211"></a>00211 }
+<a name="l00212"></a>00212 
+<a name="l00213"></a>00213 <span class="comment">// six arguments</span>
+<a name="l00214"></a>00214 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5>
+<a name="l00215"></a>00215 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4, <span class="keyword">const</span> F5& f5,
+<a name="l00216"></a>00216                      <a class="code" href="a00314.html">tbb::task_group_context</a>& context)
+<a name="l00217"></a>00217 {
+<a name="l00218"></a>00218     internal::parallel_invoke_cleaner cleaner(3, context);
+<a name="l00219"></a>00219     internal::parallel_invoke_helper& root = cleaner.root;
+<a name="l00220"></a>00220 
+<a name="l00221"></a>00221     root.add_children(f5, f4, f3);
+<a name="l00222"></a>00222     root.add_children(f2, f1);
 <a name="l00223"></a>00223 
-<a name="l00224"></a>00224     root.add_children(f6, f5, f4);
-<a name="l00225"></a>00225     root.add_children(f3, f2, f1);
+<a name="l00224"></a>00224     root.run_and_finish(f0);
+<a name="l00225"></a>00225 }
 <a name="l00226"></a>00226 
-<a name="l00227"></a>00227     root.run_and_finish(f0);
-<a name="l00228"></a>00228 }
-<a name="l00229"></a>00229 
-<a name="l00230"></a>00230 <span class="comment">// eight arguments</span>
-<a name="l00231"></a>00231 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00232"></a>00232          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
-<a name="l00233"></a>00233 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00234"></a>00234                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7,
-<a name="l00235"></a>00235                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00236"></a>00236 {
-<a name="l00237"></a>00237     internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00238"></a>00238     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00239"></a>00239 
-<a name="l00240"></a>00240     root.add_children(f7, f6, f5);
-<a name="l00241"></a>00241     root.add_children(f4, f3);
-<a name="l00242"></a>00242     root.add_children(f2, f1);
-<a name="l00243"></a>00243 
-<a name="l00244"></a>00244     root.run_and_finish(f0);
-<a name="l00245"></a>00245 }
-<a name="l00246"></a>00246 
-<a name="l00247"></a>00247 <span class="comment">// nine arguments</span>
-<a name="l00248"></a>00248 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00249"></a>00249          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8>
-<a name="l00250"></a>00250 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00251"></a>00251                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8,
-<a name="l00252"></a>00252                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00253"></a>00253 {
-<a name="l00254"></a>00254     internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00255"></a>00255     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00256"></a>00256 
-<a name="l00257"></a>00257     root.add_children(f8, f7, f6);
-<a name="l00258"></a>00258     root.add_children(f5, f4, f3);
-<a name="l00259"></a>00259     root.add_children(f2, f1);
-<a name="l00260"></a>00260 
-<a name="l00261"></a>00261     root.run_and_finish(f0);
-<a name="l00262"></a>00262 }
-<a name="l00263"></a>00263 
-<a name="l00264"></a>00264 <span class="comment">// ten arguments</span>
-<a name="l00265"></a>00265 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00266"></a>00266          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8, <span class="keyword">typename</span> F9>
-<a name="l00267"></a>00267 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00268"></a>00268                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8, <span class="keyword">const</span> F9& f9,
-<a name="l00269"></a>00269                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00270"></a>00270 {
-<a name="l00271"></a>00271     internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00272"></a>00272     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00273"></a>00273 
-<a name="l00274"></a>00274     root.add_children(f9, f8, f7);
-<a name="l00275"></a>00275     root.add_children(f6, f5, f4);
-<a name="l00276"></a>00276     root.add_children(f3, f2, f1);
-<a name="l00277"></a>00277 
-<a name="l00278"></a>00278     root.run_and_finish(f0);
-<a name="l00279"></a>00279 }
-<a name="l00280"></a>00280 
-<a name="l00281"></a>00281 <span class="comment">// two arguments</span>
-<a name="l00282"></a>00282 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1>
-<a name="l00283"></a>00283 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1) {
-<a name="l00284"></a>00284     task_group_context context;
-<a name="l00285"></a>00285     parallel_invoke<F0, F1>(f0, f1, context);
-<a name="l00286"></a>00286 }
-<a name="l00287"></a>00287 <span class="comment">// three arguments</span>
-<a name="l00288"></a>00288 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2>
-<a name="l00289"></a>00289 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2) {
-<a name="l00290"></a>00290     task_group_context context;
-<a name="l00291"></a>00291     parallel_invoke<F0, F1, F2>(f0, f1, f2, context);
-<a name="l00292"></a>00292 }
-<a name="l00293"></a>00293 <span class="comment">// four arguments</span>
-<a name="l00294"></a>00294 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3 >
-<a name="l00295"></a>00295 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3) {
+<a name="l00227"></a>00227 <span class="comment">// seven arguments</span>
+<a name="l00228"></a>00228 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6>
+<a name="l00229"></a>00229 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00230"></a>00230                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6,
+<a name="l00231"></a>00231                      <a class="code" href="a00314.html">tbb::task_group_context</a>& context)
+<a name="l00232"></a>00232 {
+<a name="l00233"></a>00233     internal::parallel_invoke_cleaner cleaner(3, context);
+<a name="l00234"></a>00234     internal::parallel_invoke_helper& root = cleaner.root;
+<a name="l00235"></a>00235 
+<a name="l00236"></a>00236     root.add_children(f6, f5, f4);
+<a name="l00237"></a>00237     root.add_children(f3, f2, f1);
+<a name="l00238"></a>00238 
+<a name="l00239"></a>00239     root.run_and_finish(f0);
+<a name="l00240"></a>00240 }
+<a name="l00241"></a>00241 
+<a name="l00242"></a>00242 <span class="comment">// eight arguments</span>
+<a name="l00243"></a>00243 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
+<a name="l00244"></a>00244          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
+<a name="l00245"></a>00245 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00246"></a>00246                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7,
+<a name="l00247"></a>00247                      <a class="code" href="a00314.html">tbb::task_group_context</a>& context)
+<a name="l00248"></a>00248 {
+<a name="l00249"></a>00249     internal::parallel_invoke_cleaner cleaner(4, context);
+<a name="l00250"></a>00250     internal::parallel_invoke_helper& root = cleaner.root;
+<a name="l00251"></a>00251 
+<a name="l00252"></a>00252     root.add_children(f7, f6, f5);
+<a name="l00253"></a>00253     root.add_children(f4, f3);
+<a name="l00254"></a>00254     root.add_children(f2, f1);
+<a name="l00255"></a>00255 
+<a name="l00256"></a>00256     root.run_and_finish(f0);
+<a name="l00257"></a>00257 }
+<a name="l00258"></a>00258 
+<a name="l00259"></a>00259 <span class="comment">// nine arguments</span>
+<a name="l00260"></a>00260 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
+<a name="l00261"></a>00261          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8>
+<a name="l00262"></a>00262 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00263"></a>00263                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8,
+<a name="l00264"></a>00264                      <a class="code" href="a00314.html">tbb::task_group_context</a>& context)
+<a name="l00265"></a>00265 {
+<a name="l00266"></a>00266     internal::parallel_invoke_cleaner cleaner(4, context);
+<a name="l00267"></a>00267     internal::parallel_invoke_helper& root = cleaner.root;
+<a name="l00268"></a>00268 
+<a name="l00269"></a>00269     root.add_children(f8, f7, f6);
+<a name="l00270"></a>00270     root.add_children(f5, f4, f3);
+<a name="l00271"></a>00271     root.add_children(f2, f1);
+<a name="l00272"></a>00272 
+<a name="l00273"></a>00273     root.run_and_finish(f0);
+<a name="l00274"></a>00274 }
+<a name="l00275"></a>00275 
+<a name="l00276"></a>00276 <span class="comment">// ten arguments</span>
+<a name="l00277"></a>00277 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
+<a name="l00278"></a>00278          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8, <span class="keyword">typename</span> F9>
+<a name="l00279"></a>00279 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00280"></a>00280                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8, <span class="keyword">const</span> F9& f9,
+<a name="l00281"></a>00281                      <a class="code" href="a00314.html">tbb::task_group_context</a>& context)
+<a name="l00282"></a>00282 {
+<a name="l00283"></a>00283     internal::parallel_invoke_cleaner cleaner(4, context);
+<a name="l00284"></a>00284     internal::parallel_invoke_helper& root = cleaner.root;
+<a name="l00285"></a>00285 
+<a name="l00286"></a>00286     root.add_children(f9, f8, f7);
+<a name="l00287"></a>00287     root.add_children(f6, f5, f4);
+<a name="l00288"></a>00288     root.add_children(f3, f2, f1);
+<a name="l00289"></a>00289 
+<a name="l00290"></a>00290     root.run_and_finish(f0);
+<a name="l00291"></a>00291 }
+<a name="l00292"></a>00292 
+<a name="l00293"></a>00293 <span class="comment">// two arguments</span>
+<a name="l00294"></a>00294 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1>
+<a name="l00295"></a>00295 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1) {
 <a name="l00296"></a>00296     task_group_context context;
-<a name="l00297"></a>00297     parallel_invoke<F0, F1, F2, F3>(f0, f1, f2, f3, context);
+<a name="l00297"></a>00297     parallel_invoke<F0, F1>(f0, f1, context);
 <a name="l00298"></a>00298 }
-<a name="l00299"></a>00299 <span class="comment">// five arguments</span>
-<a name="l00300"></a>00300 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4>
-<a name="l00301"></a>00301 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4) {
+<a name="l00299"></a>00299 <span class="comment">// three arguments</span>
+<a name="l00300"></a>00300 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2>
+<a name="l00301"></a>00301 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2) {
 <a name="l00302"></a>00302     task_group_context context;
-<a name="l00303"></a>00303     parallel_invoke<F0, F1, F2, F3, F4>(f0, f1, f2, f3, f4, context);
+<a name="l00303"></a>00303     parallel_invoke<F0, F1, F2>(f0, f1, f2, context);
 <a name="l00304"></a>00304 }
-<a name="l00305"></a>00305 <span class="comment">// six arguments</span>
-<a name="l00306"></a>00306 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5>
-<a name="l00307"></a>00307 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4, <span class="keyword">const</span> F5& f5) {
+<a name="l00305"></a>00305 <span class="comment">// four arguments</span>
+<a name="l00306"></a>00306 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3 >
+<a name="l00307"></a>00307 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3) {
 <a name="l00308"></a>00308     task_group_context context;
-<a name="l00309"></a>00309     parallel_invoke<F0, F1, F2, F3, F4, F5>(f0, f1, f2, f3, f4, f5, context);
+<a name="l00309"></a>00309     parallel_invoke<F0, F1, F2, F3>(f0, f1, f2, f3, context);
 <a name="l00310"></a>00310 }
-<a name="l00311"></a>00311 <span class="comment">// seven arguments</span>
-<a name="l00312"></a>00312 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6>
-<a name="l00313"></a>00313 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00314"></a>00314                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6)
-<a name="l00315"></a>00315 {
-<a name="l00316"></a>00316     task_group_context context;
-<a name="l00317"></a>00317     parallel_invoke<F0, F1, F2, F3, F4, F5, F6>(f0, f1, f2, f3, f4, f5, f6, context);
-<a name="l00318"></a>00318 }
-<a name="l00319"></a>00319 <span class="comment">// eigth arguments</span>
-<a name="l00320"></a>00320 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, 
-<a name="l00321"></a>00321          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
-<a name="l00322"></a>00322 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00323"></a>00323                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7)
-<a name="l00324"></a>00324 {
-<a name="l00325"></a>00325     task_group_context context;
-<a name="l00326"></a>00326     parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7>(f0, f1, f2, f3, f4, f5, f6, f7, context);
-<a name="l00327"></a>00327 }
-<a name="l00328"></a>00328 <span class="comment">// nine arguments</span>
-<a name="l00329"></a>00329 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00330"></a>00330          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8>
-<a name="l00331"></a>00331 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00332"></a>00332                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8)
-<a name="l00333"></a>00333 {
-<a name="l00334"></a>00334     task_group_context context;
-<a name="l00335"></a>00335     parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8>(f0, f1, f2, f3, f4, f5, f6, f7, f8, context);
-<a name="l00336"></a>00336 }
-<a name="l00337"></a>00337 <span class="comment">// ten arguments</span>
-<a name="l00338"></a>00338 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00339"></a>00339          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8, <span class="keyword">typename</span> F9>
-<a name="l00340"></a>00340 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00341"></a>00341                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8, <span class="keyword">const</span> F9& f9)
-<a name="l00342"></a>00342 {
-<a name="l00343"></a>00343     task_group_context context;
-<a name="l00344"></a>00344     parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8, F9>(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, context);
-<a name="l00345"></a>00345 }
-<a name="l00346"></a>00346 
-<a name="l00348"></a>00348 
-<a name="l00349"></a>00349 } <span class="comment">// namespace</span>
-<a name="l00350"></a>00350 
-<a name="l00351"></a>00351 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_invoke_H */</span>
+<a name="l00311"></a>00311 <span class="comment">// five arguments</span>
+<a name="l00312"></a>00312 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4>
+<a name="l00313"></a>00313 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4) {
+<a name="l00314"></a>00314     task_group_context context;
+<a name="l00315"></a>00315     parallel_invoke<F0, F1, F2, F3, F4>(f0, f1, f2, f3, f4, context);
+<a name="l00316"></a>00316 }
+<a name="l00317"></a>00317 <span class="comment">// six arguments</span>
+<a name="l00318"></a>00318 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5>
+<a name="l00319"></a>00319 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4, <span class="keyword">const</span> F5& f5) {
+<a name="l00320"></a>00320     task_group_context context;
+<a name="l00321"></a>00321     parallel_invoke<F0, F1, F2, F3, F4, F5>(f0, f1, f2, f3, f4, f5, context);
+<a name="l00322"></a>00322 }
+<a name="l00323"></a>00323 <span class="comment">// seven arguments</span>
+<a name="l00324"></a>00324 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6>
+<a name="l00325"></a>00325 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00326"></a>00326                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6)
+<a name="l00327"></a>00327 {
+<a name="l00328"></a>00328     task_group_context context;
+<a name="l00329"></a>00329     parallel_invoke<F0, F1, F2, F3, F4, F5, F6>(f0, f1, f2, f3, f4, f5, f6, context);
+<a name="l00330"></a>00330 }
+<a name="l00331"></a>00331 <span class="comment">// eigth arguments</span>
+<a name="l00332"></a>00332 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, 
+<a name="l00333"></a>00333          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
+<a name="l00334"></a>00334 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00335"></a>00335                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7)
+<a name="l00336"></a>00336 {
+<a name="l00337"></a>00337     task_group_context context;
+<a name="l00338"></a>00338     parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7>(f0, f1, f2, f3, f4, f5, f6, f7, context);
+<a name="l00339"></a>00339 }
+<a name="l00340"></a>00340 <span class="comment">// nine arguments</span>
+<a name="l00341"></a>00341 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
+<a name="l00342"></a>00342          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8>
+<a name="l00343"></a>00343 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00344"></a>00344                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8)
+<a name="l00345"></a>00345 {
+<a name="l00346"></a>00346     task_group_context context;
+<a name="l00347"></a>00347     parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8>(f0, f1, f2, f3, f4, f5, f6, f7, f8, context);
+<a name="l00348"></a>00348 }
+<a name="l00349"></a>00349 <span class="comment">// ten arguments</span>
+<a name="l00350"></a>00350 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
+<a name="l00351"></a>00351          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8, <span class="keyword">typename</span> F9>
+<a name="l00352"></a>00352 <span class="keywordtype">void</span> <a class="code" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
+<a name="l00353"></a>00353                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8, <span class="keyword">const</span> F9& f9)
+<a name="l00354"></a>00354 {
+<a name="l00355"></a>00355     task_group_context context;
+<a name="l00356"></a>00356     parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8, F9>(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, context);
+<a name="l00357"></a>00357 }
+<a name="l00358"></a>00358 
+<a name="l00360"></a>00360 
+<a name="l00361"></a>00361 } <span class="comment">// namespace</span>
+<a name="l00362"></a>00362 
+<a name="l00363"></a>00363 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_invoke_H */</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00512.html b/doc/html/a00512.html
index 05b4eeb..ea4e0bb 100644
--- a/doc/html/a00512.html
+++ b/doc/html/a00512.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_for.h Source File</title>
+<title>parallel_reduce.h Source File</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -19,7 +19,7 @@
     <li><a href="files.html"><span>File List</span></a></li>
     <li><a href="globals.html"><span>File Members</span></a></li>
   </ul></div>
-<h1>parallel_for.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>parallel_reduce.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
 <a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
 <a name="l00003"></a>00003 <span class="comment"></span>
 <a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
@@ -39,190 +39,429 @@
 <a name="l00018"></a>00018 <span class="comment">    writing.</span>
 <a name="l00019"></a>00019 <span class="comment">*/</span>
 <a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_for_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_for_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_reduce_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_reduce_H</span>
 <a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "partitioner.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "blocked_range.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include <new></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include "tbb_exception.h"</span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include <new></span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "task.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include "aligned_space.h"</span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include "partitioner.h"</span>
+<a name="l00028"></a>00028 <span class="preprocessor">#include "tbb_profiling.h"</span>
 <a name="l00029"></a>00029 
 <a name="l00030"></a>00030 <span class="keyword">namespace </span>tbb {
 <a name="l00031"></a>00031 
-<a name="l00033"></a>00033 <span class="keyword">namespace </span>internal {
-<a name="l00034"></a>00034 
-<a name="l00036"></a>00036 
-<a name="l00037"></a>00037     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
-<a name="l00038"></a>00038     <span class="keyword">class </span>start_for: <span class="keyword">public</span> task {
-<a name="l00039"></a>00039         Range my_range;
-<a name="l00040"></a>00040         <span class="keyword">const</span> Body my_body;
-<a name="l00041"></a>00041         <span class="keyword">typename</span> Partitioner::partition_type my_partition;
-<a name="l00042"></a>00042         <span class="comment">/*override*/</span> task* execute();
+<a name="l00032"></a>00032 <span class="keyword">namespace </span>interface6 {
+<a name="l00034"></a>00034 <span class="keyword">namespace </span>internal {
+<a name="l00035"></a>00035 
+<a name="l00036"></a>00036     <span class="keyword">using namespace </span>tbb::internal;
+<a name="l00037"></a>00037 
+<a name="l00039"></a>00039 
+<a name="l00040"></a>00040     <span class="keyword">typedef</span> <span class="keywordtype">char</span> reduction_context;
+<a name="l00041"></a>00041 
 <a name="l00043"></a>00043 
-<a name="l00045"></a>00045         start_for( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, Partitioner& partitioner ) :
-<a name="l00046"></a>00046             my_range(range),    
-<a name="l00047"></a>00047             my_body(body),
-<a name="l00048"></a>00048             my_partition(partitioner)
-<a name="l00049"></a>00049         {
-<a name="l00050"></a>00050         }
-<a name="l00052"></a>00052 
-<a name="l00053"></a>00053         start_for( start_for& parent_, split ) :
-<a name="l00054"></a>00054             my_range(parent_.my_range,split()),    
-<a name="l00055"></a>00055             my_body(parent_.my_body),
-<a name="l00056"></a>00056             my_partition(parent_.my_partition,split())
-<a name="l00057"></a>00057         {
-<a name="l00058"></a>00058             my_partition.set_affinity(*<span class="keyword">this</span>);
-<a name="l00059"></a>00059         }
-<a name="l00061"></a>00061         <span class="comment">/*override*/</span> <span class="keywordtype">void</span> note_affinity( affinity_id <span class="keywordtype">id</span> ) {
-<a name="l00062"></a>00062             my_partition.note_affinity( <span class="keywordtype">id</span> );
-<a name="l00063"></a>00063         }
-<a name="l00064"></a>00064     <span class="keyword">public</span>:
-<a name="l00065"></a>00065         <span class="keyword">static</span> <span class="keywordtype">void</span> run(  <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> Partitioner& partitioner ) {
-<a name="l00066"></a>00066             <span class="keywordflow">if</span>( !range.empty() ) {
-<a name="l00067"></a>00067 #<span class="keywordflow">if</span> !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
-<a name="l00068"></a>00068                 start_for& a = *<span class="keyword">new</span>(<a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_for(range,body,const_cast<Partitioner&>(partitioner));
-<a name="l00069"></a>00069 <span class="preprocessor">#else</span>
-<a name="l00070"></a>00070 <span class="preprocessor"></span>                <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
-<a name="l00071"></a>00071                 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
-<a name="l00072"></a>00072                 task_group_context context;
-<a name="l00073"></a>00073                 start_for& a = *<span class="keyword">new</span>(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
-<a name="l00074"></a>00074 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */</span>
-<a name="l00075"></a>00075                 <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>(a);
-<a name="l00076"></a>00076             }
-<a name="l00077"></a>00077         }
-<a name="l00078"></a>00078 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00079"></a>00079 <span class="preprocessor"></span>        <span class="keyword">static</span> <span class="keywordtype">void</span> run(  <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> Partitioner& partitioner, task_group_context& context ) {
-<a name="l00080"></a>00080             <span class="keywordflow">if</span>( !range.empty() ) {
-<a name="l00081"></a>00081                 start_for& a = *<span class="keyword">new</span>(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner));
-<a name="l00082"></a>00082                 <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>(a);
-<a name="l00083"></a>00083             }
-<a name="l00084"></a>00084         }
-<a name="l00085"></a>00085 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00086"></a>00086     };
-<a name="l00087"></a>00087 
-<a name="l00088"></a>00088     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
-<a name="l00089"></a>00089     task* start_for<Range,Body,Partitioner>::execute() {
-<a name="l00090"></a>00090         <span class="keywordflow">if</span>( !my_range.is_divisible() || my_partition.should_execute_range(*<span class="keyword">this</span>) ) {
-<a name="l00091"></a>00091             my_body( my_range );
-<a name="l00092"></a>00092             <span class="keywordflow">return</span> my_partition.continue_after_execute_range(); 
-<a name="l00093"></a>00093         } <span class="keywordflow">else</span> {
-<a name="l00094"></a>00094             empty_task& c = *<span class="keyword">new</span>( this->allocate_continuation() ) empty_task;
-<a name="l00095"></a>00095             recycle_as_child_of(c);
-<a name="l00096"></a>00096             c.set_ref_count(2);
-<a name="l00097"></a>00097             <span class="keywordtype">bool</span> delay = my_partition.decide_whether_to_delay();
-<a name="l00098"></a>00098             start_for& b = *<span class="keyword">new</span>( c.allocate_child() ) start_for(*<span class="keyword">this</span>,split());
-<a name="l00099"></a>00099             my_partition.spawn_or_delay(delay,b);
-<a name="l00100"></a>00100             <span class="keywordflow">return</span> <span class="keyword">this</span>;
-<a name="l00101"></a>00101         }
-<a name="l00102"></a>00102     } 
-<a name="l00103"></a>00103 } <span class="comment">// namespace internal</span>
-<a name="l00105"></a>00105 <span class="comment"></span>
+<a name="l00044"></a>00044     <span class="keyword">template</span><<span class="keyword">typename</span> Body>
+<a name="l00045"></a>00045     <span class="keyword">class </span>finish_reduce: <span class="keyword">public</span> flag_task {
+<a name="l00047"></a>00047         <span class="keywordtype">bool</span> has_right_zombie;
+<a name="l00048"></a>00048         <span class="keyword">const</span> reduction_context my_context;
+<a name="l00049"></a>00049         Body* my_body;
+<a name="l00050"></a>00050         aligned_space<Body,1> zombie_space;
+<a name="l00051"></a>00051         finish_reduce( reduction_context context_ ) : 
+<a name="l00052"></a>00052             has_right_zombie(false), <span class="comment">// TODO: substitute by flag_task::child_stolen?</span>
+<a name="l00053"></a>00053             my_context(context_),
+<a name="l00054"></a>00054             my_body(NULL)
+<a name="l00055"></a>00055         {
+<a name="l00056"></a>00056         }
+<a name="l00057"></a>00057         task* execute() {
+<a name="l00058"></a>00058             <span class="keywordflow">if</span>( has_right_zombie ) {
+<a name="l00059"></a>00059                 <span class="comment">// Right child was stolen.</span>
+<a name="l00060"></a>00060                 Body* s = zombie_space.begin();
+<a name="l00061"></a>00061                 my_body->join( *s );
+<a name="l00062"></a>00062                 s->~Body();
+<a name="l00063"></a>00063             }
+<a name="l00064"></a>00064             <span class="keywordflow">if</span>( my_context==1 )  <span class="comment">// left child</span>
+<a name="l00065"></a>00065                 itt_store_word_with_release( static_cast<finish_reduce*>(parent())->my_body, my_body );
+<a name="l00066"></a>00066             <span class="keywordflow">return</span> NULL;
+<a name="l00067"></a>00067         }
+<a name="l00068"></a>00068         <span class="keyword">template</span><<span class="keyword">typename</span> Range,<span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Partitioner>
+<a name="l00069"></a>00069         <span class="keyword">friend</span> <span class="keyword">class </span>start_reduce;
+<a name="l00070"></a>00070     };
+<a name="l00071"></a>00071 
+<a name="l00073"></a>00073 
+<a name="l00074"></a>00074     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
+<a name="l00075"></a>00075     <span class="keyword">class </span>start_reduce: <span class="keyword">public</span> task {
+<a name="l00076"></a>00076         <span class="keyword">typedef</span> finish_reduce<Body> finish_type;
+<a name="l00077"></a>00077         Body* my_body;
+<a name="l00078"></a>00078         Range my_range;
+<a name="l00079"></a>00079         <span class="keyword">typename</span> Partitioner::task_partition_type my_partition;
+<a name="l00080"></a>00080         reduction_context my_context; <span class="comment">// TODO: factor out into start_reduce_base</span>
+<a name="l00081"></a>00081         <span class="comment">/*override*/</span> task* execute();
+<a name="l00082"></a>00082         <span class="keyword">template</span><<span class="keyword">typename</span> Body_>
+<a name="l00083"></a>00083         <span class="keyword">friend</span> <span class="keyword">class </span>finish_reduce;
+<a name="l00084"></a>00084     
+<a name="l00085"></a>00085 <span class="keyword">public</span>:
+<a name="l00087"></a>00087         start_reduce( <span class="keyword">const</span> Range& range, Body* body, Partitioner& partitioner ) :
+<a name="l00088"></a>00088             my_body(body),
+<a name="l00089"></a>00089             my_range(range),
+<a name="l00090"></a>00090             my_partition(partitioner),
+<a name="l00091"></a>00091             my_context(0)
+<a name="l00092"></a>00092         {
+<a name="l00093"></a>00093         }
+<a name="l00095"></a>00095 
+<a name="l00096"></a>00096         start_reduce( start_reduce& parent_, split ) :
+<a name="l00097"></a>00097             my_body(parent_.my_body),
+<a name="l00098"></a>00098             my_range(parent_.my_range,split()),
+<a name="l00099"></a>00099             my_partition(parent_.my_partition,split()),
+<a name="l00100"></a>00100             my_context(2)
+<a name="l00101"></a>00101         {
+<a name="l00102"></a>00102             my_partition.set_affinity(*<span class="keyword">this</span>);
+<a name="l00103"></a>00103             parent_.my_context = 1;
+<a name="l00104"></a>00104         }
 <a name="l00106"></a>00106 
-<a name="l00107"></a>00107 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
-<a name="l00108"></a>00108 
-<a name="l00119"></a>00119 
-<a name="l00121"></a>00121 
-<a name="l00122"></a>00122 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00123"></a><a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">00123</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body ) {
-<a name="l00124"></a>00124     internal::start_for<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
-<a name="l00125"></a>00125 }
-<a name="l00126"></a>00126 
-<a name="l00128"></a>00128 
-<a name="l00129"></a>00129 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00130"></a><a class="code" href="a00371.html#g13cac5dd55c7533bccea43a51c33d0e5">00130</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>& partitioner ) {
-<a name="l00131"></a>00131     internal::start_for<Range,Body,simple_partitioner>::run(range,body,partitioner);
-<a name="l00132"></a>00132 }
-<a name="l00133"></a>00133 
-<a name="l00135"></a>00135 
-<a name="l00136"></a>00136 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00137"></a><a class="code" href="a00371.html#ga7ac75d532389b55b9247f3fdb0b00d1">00137</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>& partitioner ) {
-<a name="l00138"></a>00138     internal::start_for<Range,Body,auto_partitioner>::run(range,body,partitioner);
-<a name="l00139"></a>00139 }
-<a name="l00140"></a>00140 
-<a name="l00142"></a>00142 
-<a name="l00143"></a>00143 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00144"></a><a class="code" href="a00371.html#g9cd1b210ceb1c040f30e390b4a21bde8">00144</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00212.html">affinity_partitioner</a>& partitioner ) {
-<a name="l00145"></a>00145     internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner);
-<a name="l00146"></a>00146 }
-<a name="l00147"></a>00147 
-<a name="l00148"></a>00148 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span>
-<a name="l00151"></a>00151 <span class="preprocessor">template<typename Range, typename Body></span>
-<a name="l00152"></a><a class="code" href="a00371.html#g2d317a5e0078cd193125439fed60dfdc">00152</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>& partitioner, <a class="code" hr [...]
-<a name="l00153"></a>00153     internal::start_for<Range,Body,simple_partitioner>::run(range, body, partitioner, context);
-<a name="l00154"></a>00154 }
-<a name="l00155"></a>00155 
-<a name="l00157"></a>00157 
-<a name="l00158"></a>00158 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00159"></a><a class="code" href="a00371.html#g1c0700e3f85e83a788ff3ede88ebb7e9">00159</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context< [...]
-<a name="l00160"></a>00160     internal::start_for<Range,Body,auto_partitioner>::run(range, body, partitioner, context);
-<a name="l00161"></a>00161 }
-<a name="l00162"></a>00162 
+<a name="l00107"></a>00107         start_reduce( start_reduce& parent_, <span class="keyword">const</span> Range& r, depth_t d ) :
+<a name="l00108"></a>00108             my_body(parent_.my_body),
+<a name="l00109"></a>00109             my_range(r),
+<a name="l00110"></a>00110             my_partition(parent_.my_partition,split()),
+<a name="l00111"></a>00111             my_context(2) <span class="comment">// right leaf mark</span>
+<a name="l00112"></a>00112         {
+<a name="l00113"></a>00113             my_partition.set_affinity(*<span class="keyword">this</span>);
+<a name="l00114"></a>00114             my_partition.align_depth( d );
+<a name="l00115"></a>00115             parent_.my_context = 1; <span class="comment">// left leaf mark</span>
+<a name="l00116"></a>00116         }
+<a name="l00118"></a>00118         <span class="comment">/*override*/</span> <span class="keywordtype">void</span> note_affinity( affinity_id <span class="keywordtype">id</span> ) {
+<a name="l00119"></a>00119             my_partition.note_affinity( <span class="keywordtype">id</span> );
+<a name="l00120"></a>00120         }
+<a name="l00121"></a>00121         <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, Partitioner& partitioner ) {
+<a name="l00122"></a>00122             <span class="keywordflow">if</span>( !range.empty() ) {
+<a name="l00123"></a>00123 #<span class="keywordflow">if</span> !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
+<a name="l00124"></a>00124                 <a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(<a class="code" href="a00311.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_reduce(range,&body,partitioner) );
+<a name="l00125"></a>00125 <span class="preprocessor">#else</span>
+<a name="l00126"></a>00126 <span class="preprocessor"></span>                <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
+<a name="l00127"></a>00127                 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
+<a name="l00128"></a>00128                 task_group_context context;
+<a name="l00129"></a>00129                 <a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
+<a name="l00130"></a>00130 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */</span>
+<a name="l00131"></a>00131             }
+<a name="l00132"></a>00132         }
+<a name="l00133"></a>00133 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00134"></a>00134 <span class="preprocessor"></span>        <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, Partitioner& partitioner, task_group_context& context ) {
+<a name="l00135"></a>00135             <span class="keywordflow">if</span>( !range.empty() ) 
+<a name="l00136"></a>00136                 <a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
+<a name="l00137"></a>00137         }
+<a name="l00138"></a>00138 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00140"></a>00140         finish_type *create_continuation() {
+<a name="l00141"></a>00141             <span class="keywordflow">return</span> <span class="keyword">new</span>( allocate_continuation() ) finish_type(my_context);
+<a name="l00142"></a>00142         }
+<a name="l00144"></a>00144         <span class="keywordtype">void</span> run_body( Range &r ) { (*my_body)( r ); }
+<a name="l00145"></a>00145     };
+<a name="l00146"></a>00146     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
+<a name="l00147"></a>00147     task* start_reduce<Range,Body,Partitioner>::execute() {
+<a name="l00148"></a>00148         my_partition.check_being_stolen( *<span class="keyword">this</span> );
+<a name="l00149"></a>00149         <span class="keywordflow">if</span>( my_context==2 ) { <span class="comment">// right child</span>
+<a name="l00150"></a>00150             finish_type* parent_ptr = static_cast<finish_type*>(parent());
+<a name="l00151"></a>00151             <span class="keywordflow">if</span>( !itt_load_word_with_acquire(parent_ptr->my_body) ) { <span class="comment">// TODO: replace by is_stolen_task() or by parent_ptr->ref_count() == 2???</span>
+<a name="l00152"></a>00152                 my_body = <span class="keyword">new</span>( parent_ptr->zombie_space.begin() ) Body(*my_body,split());
+<a name="l00153"></a>00153                 parent_ptr->has_right_zombie = <span class="keyword">true</span>;
+<a name="l00154"></a>00154             }
+<a name="l00155"></a>00155         } <span class="keywordflow">else</span> __TBB_ASSERT(my_context==0,0);<span class="comment">// because left leaf spawns right leafs without recycling</span>
+<a name="l00156"></a>00156         my_partition.execute(*<span class="keyword">this</span>, my_range);
+<a name="l00157"></a>00157         <span class="keywordflow">if</span>( my_context==1 ) {
+<a name="l00158"></a>00158             finish_type* parent_ptr = static_cast<finish_type*>(parent());
+<a name="l00159"></a>00159             __TBB_ASSERT(my_body!=parent_ptr->zombie_space.begin(),0);
+<a name="l00160"></a>00160             itt_store_word_with_release(parent_ptr->my_body, my_body );
+<a name="l00161"></a>00161         }
+<a name="l00162"></a>00162         <span class="keywordflow">return</span> NULL;
+<a name="l00163"></a>00163     }
 <a name="l00164"></a>00164 
-<a name="l00165"></a>00165 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00166"></a><a class="code" href="a00371.html#g04b4696b67370c01353ff5974c8f1196">00166</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Body& body, <a class="code" href="a00212.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context</a>& context ) {
-<a name="l00167"></a>00167     internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner, context);
-<a name="l00168"></a>00168 }
-<a name="l00169"></a>00169 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00170"></a>00170 
-<a name="l00171"></a>00171 
-<a name="l00173"></a>00173 <span class="keyword">namespace </span>internal {
-<a name="l00175"></a>00175 <span class="keyword">template</span><<span class="keyword">typename</span> Function, <span class="keyword">typename</span> Index>
-<a name="l00176"></a>00176 <span class="keyword">class </span>parallel_for_body : internal::no_assign {
-<a name="l00177"></a>00177     <span class="keyword">const</span> Function &my_func;
-<a name="l00178"></a>00178     <span class="keyword">const</span> Index my_begin;
-<a name="l00179"></a>00179     <span class="keyword">const</span> Index my_step; 
-<a name="l00180"></a>00180 <span class="keyword">public</span>:
-<a name="l00181"></a>00181     parallel_for_body( <span class="keyword">const</span> Function& _func, Index& _begin, Index& _step) 
-<a name="l00182"></a>00182         : my_func(_func), my_begin(_begin), my_step(_step) {}
-<a name="l00183"></a>00183     
-<a name="l00184"></a>00184     <span class="keywordtype">void</span> operator()( <a class="code" href="a00221.html">tbb::blocked_range<Index></a>& r )<span class="keyword"> const </span>{
-<a name="l00185"></a>00185         <span class="keywordflow">for</span>( Index i = r.<a class="code" href="a00221.html#18d2258400756ac1446dac7676b18df3">begin</a>(),  k = my_begin + i * my_step; i < r.<a class="code" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">end</a>(); i++, k = k + my_step)
-<a name="l00186"></a>00186             my_func( k );
-<a name="l00187"></a>00187     }
-<a name="l00188"></a>00188 };
-<a name="l00189"></a>00189 } <span class="comment">// namespace internal</span>
-<a name="l00191"></a>00191 <span class="comment"></span>
-<a name="l00192"></a>00192 <span class="keyword">namespace </span>strict_ppl {
-<a name="l00193"></a>00193 
-<a name="l00195"></a>00195 
-<a name="l00196"></a>00196 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00197"></a><a class="code" href="a00370.html#15c764c70c8a32e7a4b8c291d0cc8dde">00197</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f) {
-<a name="l00198"></a>00198     <a class="code" href="a00293.html">tbb::task_group_context</a> context;
-<a name="l00199"></a>00199     <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, step, f, context);
-<a name="l00200"></a>00200 }
-<a name="l00201"></a>00201 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00202"></a>00202 <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, Index step, <span class="keyword">const</span> Function& f, <a class="code" href="a00293.html">tbb::task_group_context</a> &context) {
-<a name="l00203"></a>00203     <span class="keywordflow">if</span> (step <= 0 )
-<a name="l00204"></a>00204         internal::throw_exception(internal::eid_nonpositive_step); <span class="comment">// throws std::invalid_argument</span>
-<a name="l00205"></a>00205     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (last > first) {
-<a name="l00206"></a>00206         <span class="comment">// Above "else" avoids "potential divide by zero" warning on some platforms</span>
-<a name="l00207"></a>00207         Index end = (last - first - Index(1)) / step + Index(1);
-<a name="l00208"></a>00208         <a class="code" href="a00221.html">tbb::blocked_range<Index></a> range(static_cast<Index>(0), end);
-<a name="l00209"></a>00209         internal::parallel_for_body<Function, Index> body(f, first, step);
-<a name="l00210"></a>00210         <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">tbb::parallel_for</a>(range, body, <a class="code" href="a00219.html">tbb::auto_partitioner</a>(), context);
-<a name="l00211"></a>00211     }
-<a name="l00212"></a>00212 }
-<a name="l00214"></a>00214 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00215"></a><a class="code" href="a00370.html#490399525b1e690ec31d6db964c6b272">00215</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f) {
-<a name="l00216"></a>00216     <a class="code" href="a00293.html">tbb::task_group_context</a> context;
-<a name="l00217"></a>00217     <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f, context);
-<a name="l00218"></a>00218 }
-<a name="l00219"></a>00219 <span class="keyword">template</span> <<span class="keyword">typename</span> Index, <span class="keyword">typename</span> Function>
-<a name="l00220"></a>00220 <span class="keywordtype">void</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(Index first, Index last, <span class="keyword">const</span> Function& f, <a class="code" href="a00293.html">tbb::task_group_context</a> &context) {
-<a name="l00221"></a>00221     <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>(first, last, static_cast<Index>(1), f, context);
-<a name="l00222"></a>00222 }
-<a name="l00223"></a>00223 
-<a name="l00225"></a>00225 
-<a name="l00226"></a>00226 } <span class="comment">// namespace strict_ppl</span>
-<a name="l00227"></a>00227 
-<a name="l00228"></a>00228 <span class="keyword">using</span> <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">strict_ppl::parallel_for</a>;
+<a name="l00165"></a>00165 <span class="preprocessor">#if TBB_PREVIEW_DETERMINISTIC_REDUCE</span>
+<a name="l00167"></a>00167 <span class="preprocessor"></span>
+<a name="l00168"></a>00168 <span class="preprocessor">    template<typename Body></span>
+<a name="l00169"></a>00169 <span class="preprocessor"></span>    <span class="keyword">class </span>finish_deterministic_reduce: <span class="keyword">public</span> task {
+<a name="l00170"></a>00170         Body &my_left_body;
+<a name="l00171"></a>00171         Body my_right_body;
+<a name="l00172"></a>00172 
+<a name="l00173"></a>00173         finish_deterministic_reduce( Body &body ) :
+<a name="l00174"></a>00174             my_left_body( body ),
+<a name="l00175"></a>00175             my_right_body( body, split() )
+<a name="l00176"></a>00176         {
+<a name="l00177"></a>00177         }
+<a name="l00178"></a>00178         task* execute() {
+<a name="l00179"></a>00179             my_left_body.join( my_right_body );
+<a name="l00180"></a>00180             <span class="keywordflow">return</span> NULL;
+<a name="l00181"></a>00181         }
+<a name="l00182"></a>00182         <span class="keyword">template</span><<span class="keyword">typename</span> Range,<span class="keyword">typename</span> Body_>
+<a name="l00183"></a>00183         <span class="keyword">friend</span> <span class="keyword">class </span>start_deterministic_reduce;
+<a name="l00184"></a>00184     };
+<a name="l00185"></a>00185 
+<a name="l00187"></a>00187 
+<a name="l00188"></a>00188     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00189"></a>00189     <span class="keyword">class </span>start_deterministic_reduce: <span class="keyword">public</span> task {
+<a name="l00190"></a>00190         <span class="keyword">typedef</span> finish_deterministic_reduce<Body> finish_type;
+<a name="l00191"></a>00191         Body &my_body;
+<a name="l00192"></a>00192         Range my_range;
+<a name="l00193"></a>00193         <span class="comment">/*override*/</span> task* execute();
+<a name="l00194"></a>00194 
+<a name="l00196"></a>00196         start_deterministic_reduce( <span class="keyword">const</span> Range& range, Body& body ) :
+<a name="l00197"></a>00197             my_body( body ),
+<a name="l00198"></a>00198             my_range( range )
+<a name="l00199"></a>00199         {
+<a name="l00200"></a>00200         }
+<a name="l00202"></a>00202 
+<a name="l00203"></a>00203         start_deterministic_reduce( start_deterministic_reduce& parent_, finish_type& c ) :
+<a name="l00204"></a>00204             my_body( c.my_right_body ),
+<a name="l00205"></a>00205             my_range( parent_.my_range, split() )
+<a name="l00206"></a>00206         {
+<a name="l00207"></a>00207         }
+<a name="l00208"></a>00208 
+<a name="l00209"></a>00209 <span class="keyword">public</span>:
+<a name="l00210"></a>00210         <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body ) {
+<a name="l00211"></a>00211             <span class="keywordflow">if</span>( !range.empty() ) {
+<a name="l00212"></a>00212 #<span class="keywordflow">if</span> !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
+<a name="l00213"></a>00213                 task::spawn_root_and_wait( *<span class="keyword">new</span>(task::allocate_root()) start_deterministic_reduce(range,&body) );
+<a name="l00214"></a>00214 <span class="preprocessor">#else</span>
+<a name="l00215"></a>00215 <span class="preprocessor"></span>                <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
+<a name="l00216"></a>00216                 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
+<a name="l00217"></a>00217                 task_group_context context;
+<a name="l00218"></a>00218                 task::spawn_root_and_wait( *<span class="keyword">new</span>(task::allocate_root(context)) start_deterministic_reduce(range,body) );
+<a name="l00219"></a>00219 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */</span>
+<a name="l00220"></a>00220             }
+<a name="l00221"></a>00221         }
+<a name="l00222"></a>00222 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00223"></a>00223 <span class="preprocessor"></span>        <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, task_group_context& context ) {
+<a name="l00224"></a>00224             <span class="keywordflow">if</span>( !range.empty() ) 
+<a name="l00225"></a>00225                 task::spawn_root_and_wait( *<span class="keyword">new</span>(task::allocate_root(context)) start_deterministic_reduce(range,body) );
+<a name="l00226"></a>00226         }
+<a name="l00227"></a>00227 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00228"></a>00228     };
 <a name="l00229"></a>00229 
-<a name="l00230"></a>00230 } <span class="comment">// namespace tbb</span>
-<a name="l00231"></a>00231 
-<a name="l00232"></a>00232 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_for_H */</span>
-<a name="l00233"></a>00233 
+<a name="l00230"></a>00230     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00231"></a>00231     task* start_deterministic_reduce<Range,Body>::execute() {
+<a name="l00232"></a>00232         <span class="keywordflow">if</span>( !my_range.is_divisible() ) {
+<a name="l00233"></a>00233             my_body( my_range );
+<a name="l00234"></a>00234             <span class="keywordflow">return</span> NULL;
+<a name="l00235"></a>00235         } <span class="keywordflow">else</span> {
+<a name="l00236"></a>00236             finish_type& c = *<span class="keyword">new</span>( allocate_continuation() ) finish_type( my_body );
+<a name="l00237"></a>00237             recycle_as_child_of(c);
+<a name="l00238"></a>00238             c.set_ref_count(2);
+<a name="l00239"></a>00239             start_deterministic_reduce& b = *<span class="keyword">new</span>( c.allocate_child() ) start_deterministic_reduce( *<span class="keyword">this</span>, c );
+<a name="l00240"></a>00240             task::spawn(b);
+<a name="l00241"></a>00241             <span class="keywordflow">return</span> <span class="keyword">this</span>;
+<a name="l00242"></a>00242         }
+<a name="l00243"></a>00243     }
+<a name="l00244"></a>00244 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_DETERMINISTIC_REDUCE */</span>
+<a name="l00245"></a>00245 } <span class="comment">// namespace internal</span>
+<a name="l00247"></a>00247 <span class="comment"></span>} <span class="comment">//namespace interfaceX</span>
+<a name="l00248"></a>00248 
+<a name="l00250"></a>00250 <span class="keyword">namespace </span>internal {
+<a name="l00251"></a>00251     <span class="keyword">using</span> interface6::internal::start_reduce;
+<a name="l00252"></a>00252 <span class="preprocessor">#if TBB_PREVIEW_DETERMINISTIC_REDUCE</span>
+<a name="l00253"></a>00253 <span class="preprocessor"></span>    <span class="keyword">using</span> interface6::internal::start_deterministic_reduce;
+<a name="l00254"></a>00254 <span class="preprocessor">#endif</span>
+<a name="l00256"></a>00256 <span class="preprocessor"></span>
+<a name="l00260"></a>00260 <span class="preprocessor">    template<typename Range, typename Value, typename RealBody, typename Reduction></span>
+<a name="l00261"></a>00261 <span class="preprocessor"></span>    <span class="keyword">class </span>lambda_reduce_body {
+<a name="l00262"></a>00262 
+<a name="l00263"></a>00263 <span class="comment">//FIXME: decide if my_real_body, my_reduction, and identity_element should be copied or referenced</span>
+<a name="l00264"></a>00264 <span class="comment">//       (might require some performance measurements)</span>
+<a name="l00265"></a>00265 
+<a name="l00266"></a>00266         <span class="keyword">const</span> Value&     identity_element;
+<a name="l00267"></a>00267         <span class="keyword">const</span> RealBody&  my_real_body;
+<a name="l00268"></a>00268         <span class="keyword">const</span> Reduction& my_reduction;
+<a name="l00269"></a>00269         Value            my_value;
+<a name="l00270"></a>00270         lambda_reduce_body& operator= ( <span class="keyword">const</span> lambda_reduce_body& other );
+<a name="l00271"></a>00271     <span class="keyword">public</span>:
+<a name="l00272"></a>00272         lambda_reduce_body( <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& body, <span class="keyword">const</span> Reduction& reduction )
+<a name="l00273"></a>00273             : identity_element(identity)
+<a name="l00274"></a>00274             , my_real_body(body)
+<a name="l00275"></a>00275             , my_reduction(reduction)
+<a name="l00276"></a>00276             , my_value(identity)
+<a name="l00277"></a>00277         { }
+<a name="l00278"></a>00278         lambda_reduce_body( <span class="keyword">const</span> lambda_reduce_body& other )
+<a name="l00279"></a>00279             : identity_element(other.identity_element)
+<a name="l00280"></a>00280             , my_real_body(other.my_real_body)
+<a name="l00281"></a>00281             , my_reduction(other.my_reduction)
+<a name="l00282"></a>00282             , my_value(other.my_value)
+<a name="l00283"></a>00283         { }
+<a name="l00284"></a>00284         lambda_reduce_body( lambda_reduce_body& other, <a class="code" href="a00309.html">tbb::split</a> )
+<a name="l00285"></a>00285             : identity_element(other.identity_element)
+<a name="l00286"></a>00286             , my_real_body(other.my_real_body)
+<a name="l00287"></a>00287             , my_reduction(other.my_reduction)
+<a name="l00288"></a>00288             , my_value(other.identity_element)
+<a name="l00289"></a>00289         { }
+<a name="l00290"></a>00290         <span class="keywordtype">void</span> operator()(Range& range) {
+<a name="l00291"></a>00291             my_value = my_real_body(range, const_cast<const Value&>(my_value));
+<a name="l00292"></a>00292         }
+<a name="l00293"></a>00293         <span class="keywordtype">void</span> join( lambda_reduce_body& rhs ) {
+<a name="l00294"></a>00294             my_value = my_reduction(const_cast<const Value&>(my_value), const_cast<const Value&>(rhs.my_value));
+<a name="l00295"></a>00295         }
+<a name="l00296"></a>00296         Value result()<span class="keyword"> const </span>{
+<a name="l00297"></a>00297             <span class="keywordflow">return</span> my_value;
+<a name="l00298"></a>00298         }
+<a name="l00299"></a>00299     };
+<a name="l00300"></a>00300 
+<a name="l00301"></a>00301 } <span class="comment">// namespace internal</span>
+<a name="l00303"></a>00303 <span class="comment"></span>
+<a name="l00304"></a>00304 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
+<a name="l00305"></a>00305 
+<a name="l00324"></a>00324 
+<a name="l00326"></a>00326 
+<a name="l00327"></a>00327 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00328"></a><a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">00328</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body ) {
+<a name="l00329"></a>00329     internal::start_reduce<Range,Body, const __TBB_DEFAULT_PARTITIONER>::run( range, body, __TBB_DEFAULT_PARTITIONER() );
+<a name="l00330"></a>00330 }
+<a name="l00331"></a>00331 
+<a name="l00333"></a>00333 
+<a name="l00334"></a>00334 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00335"></a><a class="code" href="a00395.html#gec1b7c03f9da909bef5db12e3d41bed3">00335</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>& partitioner ) {
+<a name="l00336"></a>00336     internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner );
+<a name="l00337"></a>00337 }
+<a name="l00338"></a>00338 
+<a name="l00340"></a>00340 
+<a name="l00341"></a>00341 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00342"></a><a class="code" href="a00395.html#g18a19157e6245992fc00ca0adeb7dd37">00342</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>& partitioner ) {
+<a name="l00343"></a>00343     internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner );
+<a name="l00344"></a>00344 }
+<a name="l00345"></a>00345 
+<a name="l00347"></a>00347 
+<a name="l00348"></a>00348 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00349"></a><a class="code" href="a00395.html#gc61e73fcc36c92d79a217fc355ff4a6b">00349</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00225.html">affinity_partitioner</a>& partitioner ) {
+<a name="l00350"></a>00350     internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner );
+<a name="l00351"></a>00351 }
+<a name="l00352"></a>00352 
+<a name="l00353"></a>00353 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00355"></a>00355 <span class="preprocessor"></span>
+<a name="l00356"></a>00356 <span class="preprocessor">template<typename Range, typename Body></span>
+<a name="l00357"></a><a class="code" href="a00395.html#g45cb00c42a18e334bbde8b7535afe460">00357</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_cont [...]
+<a name="l00358"></a>00358     internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner, context );
+<a name="l00359"></a>00359 }
+<a name="l00360"></a>00360 
+<a name="l00362"></a>00362 
+<a name="l00363"></a>00363 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00364"></a><a class="code" href="a00395.html#g1c1ea1d7c61b3c225e92c70d669a53a5">00364</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00365"></a>00365     internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner, context );
+<a name="l00366"></a>00366 }
+<a name="l00367"></a>00367 
+<a name="l00369"></a>00369 
+<a name="l00370"></a>00370 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00371"></a><a class="code" href="a00395.html#gd9ac3a3811060314695f33b703c6e11b">00371</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00225.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00372"></a>00372     internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner, context );
+<a name="l00373"></a>00373 }
+<a name="l00374"></a>00374 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00375"></a>00375 
+<a name="l00379"></a>00379 
+<a name="l00380"></a>00380 
+<a name="l00381"></a>00381 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
+<a name="l00382"></a><a class="code" href="a00395.html#gc9412e09fb01fcad8c018ea9cffb28ef">00382</a> Value <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction ) {
+<a name="l00383"></a>00383     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00384"></a>00384     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> __TBB_DEFAULT_PARTITIONER>
+<a name="l00385"></a>00385                           ::run(range, body, __TBB_DEFAULT_PARTITIONER() );
+<a name="l00386"></a>00386     <span class="keywordflow">return</span> body.result();
+<a name="l00387"></a>00387 }
+<a name="l00388"></a>00388 
+<a name="l00390"></a>00390 
+<a name="l00391"></a>00391 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
+<a name="l00392"></a><a class="code" href="a00395.html#gaddffeec0e892ac3d6fc7fc2053e1eca">00392</a> Value <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
+<a name="l00393"></a>00393                        <span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>& partitioner ) {
+<a name="l00394"></a>00394     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00395"></a>00395     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>>
+<a name="l00396"></a>00396                           ::run(range, body, partitioner );
+<a name="l00397"></a>00397     <span class="keywordflow">return</span> body.result();
+<a name="l00398"></a>00398 }
+<a name="l00399"></a>00399 
+<a name="l00401"></a>00401 
+<a name="l00402"></a>00402 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
+<a name="l00403"></a><a class="code" href="a00395.html#gb175401f0729e40dd2c5860a17c14385">00403</a> Value <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
+<a name="l00404"></a>00404                        <span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>& partitioner ) {
+<a name="l00405"></a>00405     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00406"></a>00406     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>>
+<a name="l00407"></a>00407                           ::run( range, body, partitioner );
+<a name="l00408"></a>00408     <span class="keywordflow">return</span> body.result();
+<a name="l00409"></a>00409 }
+<a name="l00410"></a>00410 
+<a name="l00412"></a>00412 
+<a name="l00413"></a>00413 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
+<a name="l00414"></a><a class="code" href="a00395.html#gb7f1f1828ae2b330ce05b8513a495154">00414</a> Value <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
+<a name="l00415"></a>00415                        <a class="code" href="a00225.html">affinity_partitioner</a>& partitioner ) {
+<a name="l00416"></a>00416     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00417"></a>00417     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00225.html">affinity_partitioner</a>>
+<a name="l00418"></a>00418                                         ::run( range, body, partitioner );
+<a name="l00419"></a>00419     <span class="keywordflow">return</span> body.result();
+<a name="l00420"></a>00420 }
+<a name="l00421"></a>00421 
+<a name="l00422"></a>00422 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00424"></a>00424 <span class="preprocessor"></span>
+<a name="l00425"></a>00425 <span class="preprocessor">template<typename Range, typename Value, typename RealBody, typename Reduction></span>
+<a name="l00426"></a><a class="code" href="a00395.html#gfbc0cc2026d87f11a96bcd62788f5bb5">00426</a> <span class="preprocessor"></span>Value <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
+<a name="l00427"></a>00427                        <span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00428"></a>00428     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00429"></a>00429     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>>
+<a name="l00430"></a>00430                           ::run( range, body, partitioner, context );
+<a name="l00431"></a>00431     <span class="keywordflow">return</span> body.result();
+<a name="l00432"></a>00432 }
+<a name="l00433"></a>00433 
+<a name="l00435"></a>00435 
+<a name="l00436"></a>00436 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
+<a name="l00437"></a><a class="code" href="a00395.html#g630c90a399937d9d4ae70ff883186dfd">00437</a> Value <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
+<a name="l00438"></a>00438                        <span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00439"></a>00439     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00440"></a>00440     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>>
+<a name="l00441"></a>00441                           ::run( range, body, partitioner, context );
+<a name="l00442"></a>00442     <span class="keywordflow">return</span> body.result();
+<a name="l00443"></a>00443 }
+<a name="l00444"></a>00444 
+<a name="l00446"></a>00446 
+<a name="l00447"></a>00447 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
+<a name="l00448"></a><a class="code" href="a00395.html#g496bd7eadb3b97495ccb5655ef90319e">00448</a> Value <a class="code" href="a00395.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
+<a name="l00449"></a>00449                        <a class="code" href="a00225.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00450"></a>00450     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00451"></a>00451     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00225.html">affinity_partitioner</a>>
+<a name="l00452"></a>00452                                         ::run( range, body, partitioner, context );
+<a name="l00453"></a>00453     <span class="keywordflow">return</span> body.result();
+<a name="l00454"></a>00454 }
+<a name="l00455"></a>00455 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00456"></a>00456 
+<a name="l00457"></a>00457 <span class="preprocessor">#if TBB_PREVIEW_DETERMINISTIC_REDUCE</span>
+<a name="l00459"></a>00459 <span class="preprocessor"></span>
+<a name="l00460"></a>00460 <span class="preprocessor">template<typename Range, typename Body></span>
+<a name="l00461"></a><a class="code" href="a00395.html#g873006cc80868b5b4604822bf100ddeb">00461</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00395.html#g873006cc80868b5b4604822bf100ddeb">parallel_deterministic_reduce</a>( <span class="keyword">const</span> Range& range, Body& body ) {
+<a name="l00462"></a>00462     internal::start_deterministic_reduce<Range,Body>::run( range, body );
+<a name="l00463"></a>00463 }
+<a name="l00464"></a>00464 
+<a name="l00465"></a>00465 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00467"></a>00467 <span class="preprocessor"></span>
+<a name="l00468"></a>00468 <span class="preprocessor">template<typename Range, typename Body></span>
+<a name="l00469"></a><a class="code" href="a00395.html#gfd08c56b3a98d4437dadc5365326928a">00469</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00395.html#g873006cc80868b5b4604822bf100ddeb">parallel_deterministic_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00470"></a>00470     internal::start_deterministic_reduce<Range,Body>::run( range, body, context );
+<a name="l00471"></a>00471 }
+<a name="l00472"></a>00472 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00473"></a>00473 
+<a name="l00477"></a>00477 
+<a name="l00478"></a>00478 
+<a name="l00479"></a>00479 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
+<a name="l00480"></a><a class="code" href="a00395.html#g3edb17bb1967c291d227556e0e47e507">00480</a> Value <a class="code" href="a00395.html#g873006cc80868b5b4604822bf100ddeb">parallel_deterministic_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction ) {
+<a name="l00481"></a>00481     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00482"></a>00482     internal::start_deterministic_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction> >
+<a name="l00483"></a>00483                           ::run(range, body);
+<a name="l00484"></a>00484     <span class="keywordflow">return</span> body.result();
+<a name="l00485"></a>00485 }
+<a name="l00486"></a>00486 
+<a name="l00487"></a>00487 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00489"></a>00489 <span class="preprocessor"></span>
+<a name="l00490"></a>00490 <span class="preprocessor">template<typename Range, typename Value, typename RealBody, typename Reduction></span>
+<a name="l00491"></a><a class="code" href="a00395.html#g0a66bc67567b2d01d709b59b9bddf84a">00491</a> <span class="preprocessor"></span>Value <a class="code" href="a00395.html#g873006cc80868b5b4604822bf100ddeb">parallel_deterministic_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
+<a name="l00492"></a>00492                        <a class="code" href="a00314.html">task_group_context</a>& context ) {
+<a name="l00493"></a>00493     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+<a name="l00494"></a>00494     internal::start_deterministic_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction> >
+<a name="l00495"></a>00495                           ::run( range, body, context );
+<a name="l00496"></a>00496     <span class="keywordflow">return</span> body.result();
+<a name="l00497"></a>00497 }
+<a name="l00498"></a>00498 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00499"></a>00499 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_DETERMINISTIC_REDUCE */</span>
+<a name="l00500"></a>00500 
+<a name="l00501"></a>00501 
+<a name="l00502"></a>00502 } <span class="comment">// namespace tbb</span>
+<a name="l00503"></a>00503 
+<a name="l00504"></a>00504 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_reduce_H */</span>
+<a name="l00505"></a>00505 
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00518.html b/doc/html/a00518.html
index 9f8f271..b3be504 100644
--- a/doc/html/a00518.html
+++ b/doc/html/a00518.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_invoke.h Source File</title>
+<title>parallel_scan.h Source File</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -19,7 +19,7 @@
     <li><a href="files.html"><span>File List</span></a></li>
     <li><a href="globals.html"><span>File Members</span></a></li>
   </ul></div>
-<h1>parallel_invoke.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>parallel_scan.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
 <a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
 <a name="l00003"></a>00003 <span class="comment"></span>
 <a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
@@ -39,330 +39,297 @@
 <a name="l00018"></a>00018 <span class="comment">    writing.</span>
 <a name="l00019"></a>00019 <span class="comment">*/</span>
 <a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_invoke_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_invoke_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_scan_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_scan_H</span>
 <a name="l00023"></a>00023 <span class="preprocessor"></span>
 <a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025 
-<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
-<a name="l00027"></a>00027 
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>internal {
-<a name="l00030"></a>00030     <span class="comment">// Simple task object, executing user method</span>
-<a name="l00031"></a>00031     <span class="keyword">template</span><<span class="keyword">typename</span> function>
-<a name="l00032"></a>00032     <span class="keyword">class </span>function_invoker : <span class="keyword">public</span> task{
-<a name="l00033"></a>00033     <span class="keyword">public</span>:
-<a name="l00034"></a>00034         function_invoker(<span class="keyword">const</span> function& _function) : my_function(_function) {}
-<a name="l00035"></a>00035     <span class="keyword">private</span>:
-<a name="l00036"></a>00036         <span class="keyword">const</span> function &my_function;
-<a name="l00037"></a>00037         <span class="comment">/*override*/</span>
-<a name="l00038"></a>00038         task* execute()
-<a name="l00039"></a>00039         {
-<a name="l00040"></a>00040             my_function();
-<a name="l00041"></a>00041             <span class="keywordflow">return</span> NULL;
-<a name="l00042"></a>00042         }
-<a name="l00043"></a>00043     };
-<a name="l00044"></a>00044 
-<a name="l00045"></a>00045     <span class="comment">// The class spawns two or three child tasks</span>
-<a name="l00046"></a>00046     <span class="keyword">template</span> <size_t N, <span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2, <span class="keyword">typename</span> function3>
-<a name="l00047"></a>00047     <span class="keyword">class </span>spawner : <span class="keyword">public</span> task {
-<a name="l00048"></a>00048     <span class="keyword">private</span>:
-<a name="l00049"></a>00049         <span class="keyword">const</span> function1& my_func1;
-<a name="l00050"></a>00050         <span class="keyword">const</span> function2& my_func2;
-<a name="l00051"></a>00051         <span class="keyword">const</span> function3& my_func3;
-<a name="l00052"></a>00052         <span class="keywordtype">bool</span> is_recycled;
-<a name="l00053"></a>00053 
-<a name="l00054"></a>00054         task* execute (){
-<a name="l00055"></a>00055             <span class="keywordflow">if</span>(is_recycled){
-<a name="l00056"></a>00056                 <span class="keywordflow">return</span> NULL;
-<a name="l00057"></a>00057             }<span class="keywordflow">else</span>{
-<a name="l00058"></a>00058                 __TBB_ASSERT(N==2 || N==3, <span class="stringliteral">"Number of arguments passed to spawner is wrong"</span>);
-<a name="l00059"></a>00059                 set_ref_count(N);
-<a name="l00060"></a>00060                 recycle_as_safe_continuation();
-<a name="l00061"></a>00061                 internal::function_invoker<function2>* invoker2 = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function2>(my_func2);
-<a name="l00062"></a>00062                 __TBB_ASSERT(invoker2, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00063"></a>00063                 spawn(*invoker2);
-<a name="l00064"></a>00064                 size_t n = N; <span class="comment">// To prevent compiler warnings</span>
-<a name="l00065"></a>00065                 <span class="keywordflow">if</span> (n>2) {
-<a name="l00066"></a>00066                     internal::function_invoker<function3>* invoker3 = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function3>(my_func3);
-<a name="l00067"></a>00067                     __TBB_ASSERT(invoker3, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00068"></a>00068                     spawn(*invoker3);
-<a name="l00069"></a>00069                 }
-<a name="l00070"></a>00070                 my_func1();
-<a name="l00071"></a>00071                 is_recycled = <span class="keyword">true</span>;
-<a name="l00072"></a>00072                 <span class="keywordflow">return</span> NULL;
-<a name="l00073"></a>00073             }
-<a name="l00074"></a>00074         } <span class="comment">// execute</span>
-<a name="l00075"></a>00075 
-<a name="l00076"></a>00076     <span class="keyword">public</span>:
-<a name="l00077"></a>00077         spawner(<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2, <span class="keyword">const</span> function3& _func3) : my_func1(_func1), my_func2(_func2), my_func3(_func3), is_recycled(false) {}
-<a name="l00078"></a>00078     };
+<a name="l00025"></a>00025 <span class="preprocessor">#include "aligned_space.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include <new></span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include "partitioner.h"</span>
+<a name="l00028"></a>00028 
+<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb {
+<a name="l00030"></a>00030 
+<a name="l00032"></a>00032 
+<a name="l00033"></a><a class="code" href="a00285.html">00033</a> <span class="keyword">struct </span><a class="code" href="a00285.html">pre_scan_tag</a> {
+<a name="l00034"></a>00034     <span class="keyword">static</span> <span class="keywordtype">bool</span> is_final_scan() {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
+<a name="l00035"></a>00035 };
+<a name="l00036"></a>00036 
+<a name="l00038"></a>00038 
+<a name="l00039"></a><a class="code" href="a00258.html">00039</a> <span class="keyword">struct </span><a class="code" href="a00258.html">final_scan_tag</a> {
+<a name="l00040"></a>00040     <span class="keyword">static</span> <span class="keywordtype">bool</span> is_final_scan() {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
+<a name="l00041"></a>00041 };
+<a name="l00042"></a>00042 
+<a name="l00044"></a>00044 <span class="keyword">namespace </span>internal {
+<a name="l00045"></a>00045 
+<a name="l00047"></a>00047 
+<a name="l00048"></a>00048     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00049"></a>00049     <span class="keyword">class </span>final_sum: <span class="keyword">public</span> <a class="code" href="a00311.html">task</a> {
+<a name="l00050"></a>00050     <span class="keyword">public</span>:
+<a name="l00051"></a>00051         Body body;
+<a name="l00052"></a>00052     <span class="keyword">private</span>:
+<a name="l00053"></a>00053         <a class="code" href="a00227.html">aligned_space<Range,1></a> range;
+<a name="l00055"></a>00055         Body* stuff_last;
+<a name="l00056"></a>00056     <span class="keyword">public</span>:
+<a name="l00057"></a>00057         final_sum( Body& body_ ) :
+<a name="l00058"></a>00058             body(body_,<a class="code" href="a00309.html">split</a>())
+<a name="l00059"></a>00059         {
+<a name="l00060"></a>00060             poison_pointer(stuff_last);
+<a name="l00061"></a>00061         }
+<a name="l00062"></a>00062         ~final_sum() {
+<a name="l00063"></a>00063             range.begin()->~Range();
+<a name="l00064"></a>00064         }     
+<a name="l00065"></a>00065         <span class="keywordtype">void</span> finish_construction( <span class="keyword">const</span> Range& range_, Body* stuff_last_ ) {
+<a name="l00066"></a>00066             <span class="keyword">new</span>( range.begin() ) Range(range_);
+<a name="l00067"></a>00067             stuff_last = stuff_last_;
+<a name="l00068"></a>00068         }
+<a name="l00069"></a>00069     <span class="keyword">private</span>:
+<a name="l00070"></a>00070         <span class="comment">/*override*/</span> task* execute() {
+<a name="l00071"></a>00071             body( *range.begin(), final_scan_tag() );
+<a name="l00072"></a>00072             <span class="keywordflow">if</span>( stuff_last )
+<a name="l00073"></a>00073                 stuff_last->assign(body);
+<a name="l00074"></a>00074             <span class="keywordflow">return</span> NULL;
+<a name="l00075"></a>00075         }
+<a name="l00076"></a>00076     };       
+<a name="l00077"></a>00077 
 <a name="l00079"></a>00079 
-<a name="l00080"></a>00080     <span class="comment">// Creates and spawns child tasks</span>
-<a name="l00081"></a>00081     <span class="keyword">class </span>parallel_invoke_helper : <span class="keyword">public</span> empty_task {
-<a name="l00082"></a>00082     <span class="keyword">public</span>:
-<a name="l00083"></a>00083         <span class="comment">// Dummy functor class</span>
-<a name="l00084"></a>00084         <span class="keyword">class </span>parallel_invoke_noop {
-<a name="l00085"></a>00085         <span class="keyword">public</span>:
-<a name="l00086"></a>00086             <span class="keywordtype">void</span> operator() ()<span class="keyword"> const </span>{}
-<a name="l00087"></a>00087         };
-<a name="l00088"></a>00088         <span class="comment">// Creates a helper object with user-defined number of children expected</span>
-<a name="l00089"></a>00089         parallel_invoke_helper(<span class="keywordtype">int</span> number_of_children)
-<a name="l00090"></a>00090         {
-<a name="l00091"></a>00091             set_ref_count(number_of_children + 1);
-<a name="l00092"></a>00092         }
-<a name="l00093"></a>00093         <span class="comment">// Adds child task and spawns it</span>
-<a name="l00094"></a>00094         <span class="keyword">template</span> <<span class="keyword">typename</span> function>
-<a name="l00095"></a>00095         <span class="keywordtype">void</span> add_child (<span class="keyword">const</span> function &_func)
-<a name="l00096"></a>00096         {
-<a name="l00097"></a>00097             internal::function_invoker<function>* invoker = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<function>(_func);
-<a name="l00098"></a>00098             __TBB_ASSERT(invoker, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00099"></a>00099             spawn(*invoker);
-<a name="l00100"></a>00100         }
-<a name="l00101"></a>00101 
-<a name="l00102"></a>00102         <span class="comment">// Adds a task with multiple child tasks and spawns it</span>
-<a name="l00103"></a>00103         <span class="comment">// two arguments</span>
-<a name="l00104"></a>00104         <span class="keyword">template</span> <<span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2>
-<a name="l00105"></a>00105         <span class="keywordtype">void</span> add_children (<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2)
-<a name="l00106"></a>00106         {
-<a name="l00107"></a>00107             <span class="comment">// The third argument is dummy, it is ignored actually.</span>
-<a name="l00108"></a>00108             parallel_invoke_noop noop;
-<a name="l00109"></a>00109             internal::spawner<2, function1, function2, parallel_invoke_noop>& sub_root = *<span class="keyword">new</span>(allocate_child())internal::spawner<2, function1, function2, parallel_invoke_noop>(_func1, _func2, noop);
-<a name="l00110"></a>00110             spawn(sub_root);
-<a name="l00111"></a>00111         }
-<a name="l00112"></a>00112         <span class="comment">// three arguments</span>
-<a name="l00113"></a>00113         <span class="keyword">template</span> <<span class="keyword">typename</span> function1, <span class="keyword">typename</span> function2, <span class="keyword">typename</span> function3>
-<a name="l00114"></a>00114         <span class="keywordtype">void</span> add_children (<span class="keyword">const</span> function1& _func1, <span class="keyword">const</span> function2& _func2, <span class="keyword">const</span> function3& _func3)
-<a name="l00115"></a>00115         {
-<a name="l00116"></a>00116             internal::spawner<3, function1, function2, function3>& sub_root = *<span class="keyword">new</span>(allocate_child())internal::spawner<3, function1, function2, function3>(_func1, _func2, _func3);
-<a name="l00117"></a>00117             spawn(sub_root);
-<a name="l00118"></a>00118         }
-<a name="l00119"></a>00119 
-<a name="l00120"></a>00120         <span class="comment">// Waits for all child tasks</span>
-<a name="l00121"></a>00121         <span class="keyword">template</span> <<span class="keyword">typename</span> F0>
-<a name="l00122"></a>00122         <span class="keywordtype">void</span> run_and_finish(<span class="keyword">const</span> F0& f0)
-<a name="l00123"></a>00123         {
-<a name="l00124"></a>00124             internal::function_invoker<F0>* invoker = <span class="keyword">new</span> (allocate_child()) internal::function_invoker<F0>(f0);
-<a name="l00125"></a>00125             __TBB_ASSERT(invoker, <span class="stringliteral">"Child task allocation failed"</span>);
-<a name="l00126"></a>00126             spawn_and_wait_for_all(*invoker);
-<a name="l00127"></a>00127         }
-<a name="l00128"></a>00128     };
-<a name="l00129"></a>00129     <span class="comment">// The class destroys root if exception occured as well as in normal case</span>
-<a name="l00130"></a>00130     <span class="keyword">class </span>parallel_invoke_cleaner: internal::no_copy { 
-<a name="l00131"></a>00131     <span class="keyword">public</span>:
-<a name="l00132"></a>00132         parallel_invoke_cleaner(<span class="keywordtype">int</span> number_of_children, <a class="code" href="a00293.html">tbb::task_group_context</a>& context) : root(*new(task::allocate_root(context)) internal::parallel_invoke_helper(number_of_children))
-<a name="l00133"></a>00133         {}
-<a name="l00134"></a>00134         ~parallel_invoke_cleaner(){
-<a name="l00135"></a>00135             root.destroy(root);
-<a name="l00136"></a>00136         }
-<a name="l00137"></a>00137         internal::parallel_invoke_helper& root;
+<a name="l00080"></a>00080     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00081"></a>00081     <span class="keyword">class </span>sum_node: <span class="keyword">public</span> task {
+<a name="l00082"></a>00082         <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
+<a name="l00083"></a>00083     <span class="keyword">public</span>:
+<a name="l00084"></a>00084         final_sum_type *incoming; 
+<a name="l00085"></a>00085         final_sum_type *body;
+<a name="l00086"></a>00086         Body *stuff_last;
+<a name="l00087"></a>00087     <span class="keyword">private</span>:
+<a name="l00088"></a>00088         final_sum_type *left_sum;
+<a name="l00089"></a>00089         sum_node *left;
+<a name="l00090"></a>00090         sum_node *right;     
+<a name="l00091"></a>00091         <span class="keywordtype">bool</span> left_is_final;
+<a name="l00092"></a>00092         Range range;
+<a name="l00093"></a>00093         sum_node( <span class="keyword">const</span> Range range_, <span class="keywordtype">bool</span> left_is_final_ ) : 
+<a name="l00094"></a>00094             left_sum(NULL), 
+<a name="l00095"></a>00095             left(NULL), 
+<a name="l00096"></a>00096             right(NULL), 
+<a name="l00097"></a>00097             left_is_final(left_is_final_), 
+<a name="l00098"></a>00098             range(range_)
+<a name="l00099"></a>00099         {
+<a name="l00100"></a>00100             <span class="comment">// Poison fields that will be set by second pass.</span>
+<a name="l00101"></a>00101             poison_pointer(body);
+<a name="l00102"></a>00102             poison_pointer(incoming);
+<a name="l00103"></a>00103         }
+<a name="l00104"></a>00104         task* create_child( <span class="keyword">const</span> Range& range_, final_sum_type& f, sum_node* n, final_sum_type* incoming_, Body* stuff_last_ ) {
+<a name="l00105"></a>00105             <span class="keywordflow">if</span>( !n ) {
+<a name="l00106"></a>00106                 f.recycle_as_child_of( *<span class="keyword">this</span> );
+<a name="l00107"></a>00107                 f.finish_construction( range_, stuff_last_ );
+<a name="l00108"></a>00108                 <span class="keywordflow">return</span> &f;
+<a name="l00109"></a>00109             } <span class="keywordflow">else</span> {
+<a name="l00110"></a>00110                 n->body = &f;
+<a name="l00111"></a>00111                 n->incoming = incoming_;
+<a name="l00112"></a>00112                 n->stuff_last = stuff_last_;
+<a name="l00113"></a>00113                 <span class="keywordflow">return</span> n;
+<a name="l00114"></a>00114             }
+<a name="l00115"></a>00115         }
+<a name="l00116"></a>00116         <span class="comment">/*override*/</span> task* execute() {
+<a name="l00117"></a>00117             <span class="keywordflow">if</span>( body ) {
+<a name="l00118"></a>00118                 <span class="keywordflow">if</span>( incoming )
+<a name="l00119"></a>00119                     left_sum->body.reverse_join( incoming->body );
+<a name="l00120"></a>00120                 recycle_as_continuation();
+<a name="l00121"></a>00121                 sum_node& c = *<span class="keyword">this</span>;
+<a name="l00122"></a>00122                 task* b = c.create_child(Range(range,split()),*left_sum,right,left_sum,stuff_last);
+<a name="l00123"></a>00123                 task* a = left_is_final ? NULL : c.create_child(range,*body,left,incoming,NULL);
+<a name="l00124"></a>00124                 set_ref_count( (a!=NULL)+(b!=NULL) );
+<a name="l00125"></a>00125                 body = NULL; 
+<a name="l00126"></a>00126                 <span class="keywordflow">if</span>( a ) spawn(*b);
+<a name="l00127"></a>00127                 <span class="keywordflow">else</span> a = b;
+<a name="l00128"></a>00128                 <span class="keywordflow">return</span> a;
+<a name="l00129"></a>00129             } <span class="keywordflow">else</span> {
+<a name="l00130"></a>00130                 <span class="keywordflow">return</span> NULL;
+<a name="l00131"></a>00131             }
+<a name="l00132"></a>00132         }
+<a name="l00133"></a>00133         <span class="keyword">template</span><<span class="keyword">typename</span> Range_,<span class="keyword">typename</span> Body_,<span class="keyword">typename</span> Partitioner_>
+<a name="l00134"></a>00134         <span class="keyword">friend</span> <span class="keyword">class </span>start_scan;
+<a name="l00135"></a>00135 
+<a name="l00136"></a>00136         <span class="keyword">template</span><<span class="keyword">typename</span> Range_,<span class="keyword">typename</span> Body_>
+<a name="l00137"></a>00137         <span class="keyword">friend</span> <span class="keyword">class </span>finish_scan;
 <a name="l00138"></a>00138     };
-<a name="l00139"></a>00139 } <span class="comment">// namespace internal</span>
-<a name="l00141"></a>00141 <span class="comment"></span>
-<a name="l00145"></a>00145 
-<a name="l00146"></a>00146 
-<a name="l00148"></a>00148 <span class="comment">// parallel_invoke with user-defined context</span>
-<a name="l00149"></a>00149 <span class="comment">// two arguments</span>
-<a name="l00150"></a>00150 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1 >
-<a name="l00151"></a><a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">00151</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <a class="code" href="a00293.html">tbb::task_group_context</a>& context) {
-<a name="l00152"></a>00152     internal::parallel_invoke_cleaner cleaner(2, context);
-<a name="l00153"></a>00153     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00154"></a>00154 
-<a name="l00155"></a>00155     root.add_child(f1);
-<a name="l00156"></a>00156 
-<a name="l00157"></a>00157     root.run_and_finish(f0);
-<a name="l00158"></a>00158 }
-<a name="l00159"></a>00159 
-<a name="l00160"></a>00160 <span class="comment">// three arguments</span>
-<a name="l00161"></a>00161 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2 >
-<a name="l00162"></a>00162 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <a class="code" href="a00293.html">tbb::task_group_context</a>& context) {
-<a name="l00163"></a>00163     internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00164"></a>00164     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00165"></a>00165 
-<a name="l00166"></a>00166     root.add_child(f2);
-<a name="l00167"></a>00167     root.add_child(f1);
-<a name="l00168"></a>00168 
-<a name="l00169"></a>00169     root.run_and_finish(f0);
-<a name="l00170"></a>00170 }
-<a name="l00171"></a>00171 
-<a name="l00172"></a>00172 <span class="comment">// four arguments</span>
-<a name="l00173"></a>00173 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3>
-<a name="l00174"></a>00174 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3,
-<a name="l00175"></a>00175                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00176"></a>00176 {
-<a name="l00177"></a>00177     internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00178"></a>00178     internal::parallel_invoke_helper& root = cleaner.root;
+<a name="l00139"></a>00139 
+<a name="l00141"></a>00141 
+<a name="l00142"></a>00142     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00143"></a>00143     <span class="keyword">class </span>finish_scan: <span class="keyword">public</span> task {
+<a name="l00144"></a>00144         <span class="keyword">typedef</span> sum_node<Range,Body> sum_node_type;
+<a name="l00145"></a>00145         <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
+<a name="l00146"></a>00146         final_sum_type** <span class="keyword">const</span> sum;
+<a name="l00147"></a>00147         sum_node_type*& return_slot;
+<a name="l00148"></a>00148     <span class="keyword">public</span>:
+<a name="l00149"></a>00149         final_sum_type* right_zombie;
+<a name="l00150"></a>00150         sum_node_type& result;
+<a name="l00151"></a>00151 
+<a name="l00152"></a>00152         <span class="comment">/*override*/</span> task* execute() {
+<a name="l00153"></a>00153             __TBB_ASSERT( result.ref_count()==(result.left!=NULL)+(result.right!=NULL), NULL );
+<a name="l00154"></a>00154             <span class="keywordflow">if</span>( result.left )
+<a name="l00155"></a>00155                 result.left_is_final = <span class="keyword">false</span>;
+<a name="l00156"></a>00156             <span class="keywordflow">if</span>( right_zombie && sum ) 
+<a name="l00157"></a>00157                 ((*sum)->body).reverse_join(result.left_sum->body);
+<a name="l00158"></a>00158             __TBB_ASSERT( !return_slot, NULL );
+<a name="l00159"></a>00159             <span class="keywordflow">if</span>( right_zombie || result.right ) {
+<a name="l00160"></a>00160                 return_slot = &result;
+<a name="l00161"></a>00161             } <span class="keywordflow">else</span> {
+<a name="l00162"></a>00162                 destroy( result );
+<a name="l00163"></a>00163             }
+<a name="l00164"></a>00164             <span class="keywordflow">if</span>( right_zombie && !sum && !result.right ) destroy(*right_zombie);
+<a name="l00165"></a>00165             <span class="keywordflow">return</span> NULL;
+<a name="l00166"></a>00166         }
+<a name="l00167"></a>00167 
+<a name="l00168"></a>00168         finish_scan( sum_node_type*& return_slot_, final_sum_type** sum_, sum_node_type& result_ ) : 
+<a name="l00169"></a>00169             sum(sum_),
+<a name="l00170"></a>00170             return_slot(return_slot_), 
+<a name="l00171"></a>00171             right_zombie(NULL),
+<a name="l00172"></a>00172             result(result_)
+<a name="l00173"></a>00173         {
+<a name="l00174"></a>00174             __TBB_ASSERT( !return_slot, NULL );
+<a name="l00175"></a>00175         }
+<a name="l00176"></a>00176     };
+<a name="l00177"></a>00177 
 <a name="l00179"></a>00179 
-<a name="l00180"></a>00180     root.add_child(f3);
-<a name="l00181"></a>00181     root.add_child(f2);
-<a name="l00182"></a>00182     root.add_child(f1);
-<a name="l00183"></a>00183 
-<a name="l00184"></a>00184     root.run_and_finish(f0);
-<a name="l00185"></a>00185 }
-<a name="l00186"></a>00186 
-<a name="l00187"></a>00187 <span class="comment">// five arguments</span>
-<a name="l00188"></a>00188 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4 >
-<a name="l00189"></a>00189 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00190"></a>00190                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00191"></a>00191 {
-<a name="l00192"></a>00192     internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00193"></a>00193     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00194"></a>00194 
-<a name="l00195"></a>00195     root.add_children(f4, f3);
-<a name="l00196"></a>00196     root.add_children(f2, f1);
-<a name="l00197"></a>00197 
-<a name="l00198"></a>00198     root.run_and_finish(f0);
-<a name="l00199"></a>00199 }
-<a name="l00200"></a>00200 
-<a name="l00201"></a>00201 <span class="comment">// six arguments</span>
-<a name="l00202"></a>00202 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5>
-<a name="l00203"></a>00203 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4, <span class="keyword">const</span> F5& f5,
-<a name="l00204"></a>00204                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00205"></a>00205 {
-<a name="l00206"></a>00206     internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00207"></a>00207     internal::parallel_invoke_helper& root = cleaner.root;
+<a name="l00180"></a>00180     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner=simple_partitioner>
+<a name="l00181"></a>00181     <span class="keyword">class </span>start_scan: <span class="keyword">public</span> task {
+<a name="l00182"></a>00182         <span class="keyword">typedef</span> sum_node<Range,Body> sum_node_type;
+<a name="l00183"></a>00183         <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
+<a name="l00184"></a>00184         final_sum_type* body;
+<a name="l00186"></a>00186         final_sum_type** sum; 
+<a name="l00187"></a>00187         sum_node_type** return_slot;
+<a name="l00189"></a>00189         sum_node_type* parent_sum;
+<a name="l00190"></a>00190         <span class="keywordtype">bool</span> is_final;
+<a name="l00191"></a>00191         <span class="keywordtype">bool</span> is_right_child;
+<a name="l00192"></a>00192         Range range;
+<a name="l00193"></a>00193         <span class="keyword">typename</span> Partitioner::partition_type partition;
+<a name="l00194"></a>00194         <span class="comment">/*override*/</span> task* execute();
+<a name="l00195"></a>00195     <span class="keyword">public</span>:
+<a name="l00196"></a>00196         start_scan( sum_node_type*& return_slot_, start_scan& parent_, sum_node_type* parent_sum_ ) :
+<a name="l00197"></a>00197             body(parent_.body),
+<a name="l00198"></a>00198             sum(parent_.sum),
+<a name="l00199"></a>00199             return_slot(&return_slot_),
+<a name="l00200"></a>00200             parent_sum(parent_sum_),
+<a name="l00201"></a>00201             is_final(parent_.is_final),
+<a name="l00202"></a>00202             is_right_child(false),
+<a name="l00203"></a>00203             range(parent_.range,split()),
+<a name="l00204"></a>00204             partition(parent_.partition,split())
+<a name="l00205"></a>00205         {
+<a name="l00206"></a>00206             __TBB_ASSERT( !*return_slot, NULL );
+<a name="l00207"></a>00207         }
 <a name="l00208"></a>00208 
-<a name="l00209"></a>00209     root.add_children(f5, f4, f3);
-<a name="l00210"></a>00210     root.add_children(f2, f1);
-<a name="l00211"></a>00211 
-<a name="l00212"></a>00212     root.run_and_finish(f0);
-<a name="l00213"></a>00213 }
-<a name="l00214"></a>00214 
-<a name="l00215"></a>00215 <span class="comment">// seven arguments</span>
-<a name="l00216"></a>00216 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6>
-<a name="l00217"></a>00217 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00218"></a>00218                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6,
-<a name="l00219"></a>00219                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00220"></a>00220 {
-<a name="l00221"></a>00221     internal::parallel_invoke_cleaner cleaner(3, context);
-<a name="l00222"></a>00222     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00223"></a>00223 
-<a name="l00224"></a>00224     root.add_children(f6, f5, f4);
-<a name="l00225"></a>00225     root.add_children(f3, f2, f1);
-<a name="l00226"></a>00226 
-<a name="l00227"></a>00227     root.run_and_finish(f0);
-<a name="l00228"></a>00228 }
-<a name="l00229"></a>00229 
-<a name="l00230"></a>00230 <span class="comment">// eight arguments</span>
-<a name="l00231"></a>00231 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00232"></a>00232          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
-<a name="l00233"></a>00233 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00234"></a>00234                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7,
-<a name="l00235"></a>00235                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00236"></a>00236 {
-<a name="l00237"></a>00237     internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00238"></a>00238     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00239"></a>00239 
-<a name="l00240"></a>00240     root.add_children(f7, f6, f5);
-<a name="l00241"></a>00241     root.add_children(f4, f3);
-<a name="l00242"></a>00242     root.add_children(f2, f1);
-<a name="l00243"></a>00243 
-<a name="l00244"></a>00244     root.run_and_finish(f0);
-<a name="l00245"></a>00245 }
-<a name="l00246"></a>00246 
-<a name="l00247"></a>00247 <span class="comment">// nine arguments</span>
-<a name="l00248"></a>00248 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00249"></a>00249          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8>
-<a name="l00250"></a>00250 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00251"></a>00251                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8,
-<a name="l00252"></a>00252                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00253"></a>00253 {
-<a name="l00254"></a>00254     internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00255"></a>00255     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00256"></a>00256 
-<a name="l00257"></a>00257     root.add_children(f8, f7, f6);
-<a name="l00258"></a>00258     root.add_children(f5, f4, f3);
-<a name="l00259"></a>00259     root.add_children(f2, f1);
-<a name="l00260"></a>00260 
-<a name="l00261"></a>00261     root.run_and_finish(f0);
-<a name="l00262"></a>00262 }
-<a name="l00263"></a>00263 
-<a name="l00264"></a>00264 <span class="comment">// ten arguments</span>
-<a name="l00265"></a>00265 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00266"></a>00266          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8, <span class="keyword">typename</span> F9>
-<a name="l00267"></a>00267 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00268"></a>00268                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8, <span class="keyword">const</span> F9& f9,
-<a name="l00269"></a>00269                      <a class="code" href="a00293.html">tbb::task_group_context</a>& context)
-<a name="l00270"></a>00270 {
-<a name="l00271"></a>00271     internal::parallel_invoke_cleaner cleaner(4, context);
-<a name="l00272"></a>00272     internal::parallel_invoke_helper& root = cleaner.root;
-<a name="l00273"></a>00273 
-<a name="l00274"></a>00274     root.add_children(f9, f8, f7);
-<a name="l00275"></a>00275     root.add_children(f6, f5, f4);
-<a name="l00276"></a>00276     root.add_children(f3, f2, f1);
-<a name="l00277"></a>00277 
-<a name="l00278"></a>00278     root.run_and_finish(f0);
-<a name="l00279"></a>00279 }
-<a name="l00280"></a>00280 
-<a name="l00281"></a>00281 <span class="comment">// two arguments</span>
-<a name="l00282"></a>00282 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1>
-<a name="l00283"></a>00283 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1) {
-<a name="l00284"></a>00284     task_group_context context;
-<a name="l00285"></a>00285     parallel_invoke<F0, F1>(f0, f1, context);
-<a name="l00286"></a>00286 }
-<a name="l00287"></a>00287 <span class="comment">// three arguments</span>
-<a name="l00288"></a>00288 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2>
-<a name="l00289"></a>00289 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2) {
-<a name="l00290"></a>00290     task_group_context context;
-<a name="l00291"></a>00291     parallel_invoke<F0, F1, F2>(f0, f1, f2, context);
-<a name="l00292"></a>00292 }
-<a name="l00293"></a>00293 <span class="comment">// four arguments</span>
-<a name="l00294"></a>00294 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3 >
-<a name="l00295"></a>00295 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3) {
-<a name="l00296"></a>00296     task_group_context context;
-<a name="l00297"></a>00297     parallel_invoke<F0, F1, F2, F3>(f0, f1, f2, f3, context);
-<a name="l00298"></a>00298 }
-<a name="l00299"></a>00299 <span class="comment">// five arguments</span>
-<a name="l00300"></a>00300 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4>
-<a name="l00301"></a>00301 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4) {
-<a name="l00302"></a>00302     task_group_context context;
-<a name="l00303"></a>00303     parallel_invoke<F0, F1, F2, F3, F4>(f0, f1, f2, f3, f4, context);
-<a name="l00304"></a>00304 }
-<a name="l00305"></a>00305 <span class="comment">// six arguments</span>
-<a name="l00306"></a>00306 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5>
-<a name="l00307"></a>00307 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4, <span class="keyword">const</span> F5& f5) {
-<a name="l00308"></a>00308     task_group_context context;
-<a name="l00309"></a>00309     parallel_invoke<F0, F1, F2, F3, F4, F5>(f0, f1, f2, f3, f4, f5, context);
-<a name="l00310"></a>00310 }
-<a name="l00311"></a>00311 <span class="comment">// seven arguments</span>
-<a name="l00312"></a>00312 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6>
-<a name="l00313"></a>00313 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00314"></a>00314                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6)
-<a name="l00315"></a>00315 {
-<a name="l00316"></a>00316     task_group_context context;
-<a name="l00317"></a>00317     parallel_invoke<F0, F1, F2, F3, F4, F5, F6>(f0, f1, f2, f3, f4, f5, f6, context);
-<a name="l00318"></a>00318 }
-<a name="l00319"></a>00319 <span class="comment">// eigth arguments</span>
-<a name="l00320"></a>00320 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4, 
-<a name="l00321"></a>00321          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7>
-<a name="l00322"></a>00322 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00323"></a>00323                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7)
-<a name="l00324"></a>00324 {
-<a name="l00325"></a>00325     task_group_context context;
-<a name="l00326"></a>00326     parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7>(f0, f1, f2, f3, f4, f5, f6, f7, context);
-<a name="l00327"></a>00327 }
-<a name="l00328"></a>00328 <span class="comment">// nine arguments</span>
-<a name="l00329"></a>00329 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00330"></a>00330          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8>
-<a name="l00331"></a>00331 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00332"></a>00332                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8)
-<a name="l00333"></a>00333 {
-<a name="l00334"></a>00334     task_group_context context;
-<a name="l00335"></a>00335     parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8>(f0, f1, f2, f3, f4, f5, f6, f7, f8, context);
-<a name="l00336"></a>00336 }
-<a name="l00337"></a>00337 <span class="comment">// ten arguments</span>
-<a name="l00338"></a>00338 <span class="keyword">template</span><<span class="keyword">typename</span> F0, <span class="keyword">typename</span> F1, <span class="keyword">typename</span> F2, <span class="keyword">typename</span> F3, <span class="keyword">typename</span> F4,
-<a name="l00339"></a>00339          <span class="keyword">typename</span> F5, <span class="keyword">typename</span> F6, <span class="keyword">typename</span> F7, <span class="keyword">typename</span> F8, <span class="keyword">typename</span> F9>
-<a name="l00340"></a>00340 <span class="keywordtype">void</span> <a class="code" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">parallel_invoke</a>(<span class="keyword">const</span> F0& f0, <span class="keyword">const</span> F1& f1, <span class="keyword">const</span> F2& f2, <span class="keyword">const</span> F3& f3, <span class="keyword">const</span> F4& f4,
-<a name="l00341"></a>00341                      <span class="keyword">const</span> F5& f5, <span class="keyword">const</span> F6& f6, <span class="keyword">const</span> F7& f7, <span class="keyword">const</span> F8& f8, <span class="keyword">const</span> F9& f9)
-<a name="l00342"></a>00342 {
-<a name="l00343"></a>00343     task_group_context context;
-<a name="l00344"></a>00344     parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8, F9>(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, context);
-<a name="l00345"></a>00345 }
-<a name="l00346"></a>00346 
-<a name="l00348"></a>00348 
-<a name="l00349"></a>00349 } <span class="comment">// namespace</span>
-<a name="l00350"></a>00350 
-<a name="l00351"></a>00351 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_invoke_H */</span>
+<a name="l00209"></a>00209         start_scan( sum_node_type*& return_slot_, <span class="keyword">const</span> Range& range_, final_sum_type& body_, <span class="keyword">const</span> Partitioner& partitioner_) :
+<a name="l00210"></a>00210             body(&body_),
+<a name="l00211"></a>00211             sum(NULL),
+<a name="l00212"></a>00212             return_slot(&return_slot_),
+<a name="l00213"></a>00213             parent_sum(NULL),
+<a name="l00214"></a>00214             is_final(true),
+<a name="l00215"></a>00215             is_right_child(false),
+<a name="l00216"></a>00216             range(range_),
+<a name="l00217"></a>00217             partition(partitioner_)
+<a name="l00218"></a>00218         {
+<a name="l00219"></a>00219             __TBB_ASSERT( !*return_slot, NULL );
+<a name="l00220"></a>00220         }
+<a name="l00221"></a>00221 
+<a name="l00222"></a>00222         <span class="keyword">static</span> <span class="keywordtype">void</span> run(  <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> Partitioner& partitioner ) {
+<a name="l00223"></a>00223             <span class="keywordflow">if</span>( !range.empty() ) {
+<a name="l00224"></a>00224                 <span class="keyword">typedef</span> internal::start_scan<Range,Body,Partitioner> start_pass1_type;
+<a name="l00225"></a>00225                 internal::sum_node<Range,Body>* root = NULL;
+<a name="l00226"></a>00226                 <span class="keyword">typedef</span> internal::final_sum<Range,Body> final_sum_type;
+<a name="l00227"></a>00227                 final_sum_type* temp_body = <span class="keyword">new</span>(<a class="code" href="a00311.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) final_sum_type( body );
+<a name="l00228"></a>00228                 start_pass1_type& pass1 = *<span class="keyword">new</span>(<a class="code" href="a00311.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_pass1_type(
+<a name="l00229"></a>00229                     <span class="comment">/*return_slot=*/</span>root,
+<a name="l00230"></a>00230                     range,
+<a name="l00231"></a>00231                     *temp_body,
+<a name="l00232"></a>00232                     partitioner );
+<a name="l00233"></a>00233                 <a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( pass1 );
+<a name="l00234"></a>00234                 <span class="keywordflow">if</span>( root ) {
+<a name="l00235"></a>00235                     root->body = temp_body;
+<a name="l00236"></a>00236                     root->incoming = NULL;
+<a name="l00237"></a>00237                     root->stuff_last = &body;
+<a name="l00238"></a>00238                     <a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *root );
+<a name="l00239"></a>00239                 } <span class="keywordflow">else</span> {
+<a name="l00240"></a>00240                     body.assign(temp_body->body);
+<a name="l00241"></a>00241                     temp_body->finish_construction( range, NULL );
+<a name="l00242"></a>00242                     temp_body->destroy(*temp_body);
+<a name="l00243"></a>00243                 }
+<a name="l00244"></a>00244             }
+<a name="l00245"></a>00245         }
+<a name="l00246"></a>00246     };
+<a name="l00247"></a>00247 
+<a name="l00248"></a>00248     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
+<a name="l00249"></a>00249     task* start_scan<Range,Body,Partitioner>::execute() {
+<a name="l00250"></a>00250         <span class="keyword">typedef</span> internal::finish_scan<Range,Body> finish_pass1_type;
+<a name="l00251"></a>00251         finish_pass1_type* p = parent_sum ? static_cast<finish_pass1_type*>( parent() ) : NULL;
+<a name="l00252"></a>00252         <span class="comment">// Inspecting p->result.left_sum would ordinarily be a race condition.</span>
+<a name="l00253"></a>00253         <span class="comment">// But we inspect it only if we are not a stolen task, in which case we</span>
+<a name="l00254"></a>00254         <span class="comment">// know that task assigning to p->result.left_sum has completed.</span>
+<a name="l00255"></a>00255         <span class="keywordtype">bool</span> treat_as_stolen = is_right_child && (is_stolen_task() || body!=p->result.left_sum);
+<a name="l00256"></a>00256         <span class="keywordflow">if</span>( treat_as_stolen ) {
+<a name="l00257"></a>00257             <span class="comment">// Invocation is for right child that has been really stolen or needs to be virtually stolen</span>
+<a name="l00258"></a>00258             p->right_zombie = body = <span class="keyword">new</span>( allocate_root() ) final_sum_type(body->body);
+<a name="l00259"></a>00259             is_final = <span class="keyword">false</span>;
+<a name="l00260"></a>00260         }
+<a name="l00261"></a>00261         task* next_task = NULL;
+<a name="l00262"></a>00262         <span class="keywordflow">if</span>( (is_right_child && !treat_as_stolen) || !range.is_divisible() || partition.should_execute_range(*<span class="keyword">this</span>) ) {
+<a name="l00263"></a>00263             <span class="keywordflow">if</span>( is_final )
+<a name="l00264"></a>00264                 (body->body)( range, final_scan_tag() );
+<a name="l00265"></a>00265             <span class="keywordflow">else</span> <span class="keywordflow">if</span>( sum )
+<a name="l00266"></a>00266                 (body->body)( range, pre_scan_tag() );
+<a name="l00267"></a>00267             <span class="keywordflow">if</span>( sum ) 
+<a name="l00268"></a>00268                 *sum = body;
+<a name="l00269"></a>00269             __TBB_ASSERT( !*return_slot, NULL );
+<a name="l00270"></a>00270         } <span class="keywordflow">else</span> {
+<a name="l00271"></a>00271             sum_node_type* result;
+<a name="l00272"></a>00272             <span class="keywordflow">if</span>( parent_sum ) 
+<a name="l00273"></a>00273                 result = <span class="keyword">new</span>(allocate_additional_child_of(*parent_sum)) sum_node_type(range,<span class="comment">/*left_is_final=*/</span>is_final);
+<a name="l00274"></a>00274             <span class="keywordflow">else</span>
+<a name="l00275"></a>00275                 result = <span class="keyword">new</span>(<a class="code" href="a00311.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) sum_node_type(range,<span class="comment">/*left_is_final=*/</span>is_final);
+<a name="l00276"></a>00276             finish_pass1_type& c = *<span class="keyword">new</span>( allocate_continuation()) finish_pass1_type(*return_slot,sum,*result);
+<a name="l00277"></a>00277             <span class="comment">// Split off right child</span>
+<a name="l00278"></a>00278             start_scan& b = *<span class="keyword">new</span>( c.allocate_child() ) start_scan( <span class="comment">/*return_slot=*/</span>result->right, *<span class="keyword">this</span>, result );
+<a name="l00279"></a>00279             b.is_right_child = <span class="keyword">true</span>;    
+<a name="l00280"></a>00280             <span class="comment">// Left child is recycling of *this.  Must recycle this before spawning b, </span>
+<a name="l00281"></a>00281             <span class="comment">// otherwise b might complete and decrement c.ref_count() to zero, which</span>
+<a name="l00282"></a>00282             <span class="comment">// would cause c.execute() to run prematurely.</span>
+<a name="l00283"></a>00283             recycle_as_child_of(c);
+<a name="l00284"></a>00284             c.set_ref_count(2);
+<a name="l00285"></a>00285             c.spawn(b);
+<a name="l00286"></a>00286             sum = &result->left_sum;
+<a name="l00287"></a>00287             return_slot = &result->left;
+<a name="l00288"></a>00288             is_right_child = <span class="keyword">false</span>;
+<a name="l00289"></a>00289             next_task = <span class="keyword">this</span>;
+<a name="l00290"></a>00290             parent_sum = result; 
+<a name="l00291"></a>00291             __TBB_ASSERT( !*return_slot, NULL );
+<a name="l00292"></a>00292         }
+<a name="l00293"></a>00293         <span class="keywordflow">return</span> next_task;
+<a name="l00294"></a>00294     } 
+<a name="l00295"></a>00295 } <span class="comment">// namespace internal</span>
+<a name="l00297"></a>00297 <span class="comment"></span>
+<a name="l00298"></a>00298 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
+<a name="l00299"></a>00299 
+<a name="l00317"></a>00317 
+<a name="l00319"></a>00319 
+<a name="l00320"></a>00320 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00321"></a><a class="code" href="a00395.html#ged143f31dd3d96ded02ab3db915b91c7">00321</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body ) {
+<a name="l00322"></a>00322     internal::start_scan<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
+<a name="l00323"></a>00323 }
+<a name="l00324"></a>00324 
+<a name="l00326"></a>00326 
+<a name="l00327"></a>00327 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00328"></a><a class="code" href="a00395.html#gc9fac8870b2e6365fb337014404529df">00328</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>& partitioner ) {
+<a name="l00329"></a>00329     internal::start_scan<Range,Body,simple_partitioner>::run(range,body,partitioner);
+<a name="l00330"></a>00330 }
+<a name="l00331"></a>00331 
+<a name="l00333"></a>00333 
+<a name="l00334"></a>00334 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
+<a name="l00335"></a><a class="code" href="a00395.html#g62fde400a37bbca1a2fddc8e3d22f556">00335</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00231.html">auto_partitioner</a>& partitioner ) {
+<a name="l00336"></a>00336     internal::start_scan<Range,Body,auto_partitioner>::run(range,body,partitioner);
+<a name="l00337"></a>00337 }
+<a name="l00339"></a>00339 
+<a name="l00340"></a>00340 } <span class="comment">// namespace tbb</span>
+<a name="l00341"></a>00341 
+<a name="l00342"></a>00342 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_scan_H */</span>
+<a name="l00343"></a>00343 
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00533.html b/doc/html/a00523.html
similarity index 69%
rename from doc/html/a00533.html
rename to doc/html/a00523.html
index 4867322..2d5cf5b 100644
--- a/doc/html/a00533.html
+++ b/doc/html/a00523.html
@@ -120,100 +120,104 @@
 <a name="l00103"></a>00103     }
 <a name="l00104"></a>00104 };
 <a name="l00105"></a>00105 
-<a name="l00107"></a>00107 
-<a name="l00108"></a>00108 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00109"></a>00109 <span class="keyword">class </span>quick_sort_pretest_body : internal::no_assign {
-<a name="l00110"></a>00110     <span class="keyword">const</span> Compare &comp;
-<a name="l00111"></a>00111 
-<a name="l00112"></a>00112 <span class="keyword">public</span>:
-<a name="l00113"></a>00113     quick_sort_pretest_body(<span class="keyword">const</span> Compare &_comp) : comp(_comp) {}
-<a name="l00114"></a>00114 
-<a name="l00115"></a>00115     <span class="keywordtype">void</span> operator()( <span class="keyword">const</span> blocked_range<RandomAccessIterator>& range )<span class="keyword"> const </span>{
-<a name="l00116"></a>00116         task &my_task = <a class="code" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>();
-<a name="l00117"></a>00117         RandomAccessIterator my_end = range.end();
-<a name="l00118"></a>00118 
-<a name="l00119"></a>00119         <span class="keywordtype">int</span> i = 0;
-<a name="l00120"></a>00120         <span class="keywordflow">for</span> (RandomAccessIterator k = range.begin(); k != my_end; ++k, ++i) {
-<a name="l00121"></a>00121             <span class="keywordflow">if</span> ( i%64 == 0 && my_task.is_cancelled() ) <span class="keywordflow">break</span>;
-<a name="l00122"></a>00122           
-<a name="l00123"></a>00123             <span class="comment">// The k-1 is never out-of-range because the first chunk starts at begin+serial_cutoff+1</span>
-<a name="l00124"></a>00124             <span class="keywordflow">if</span> ( comp( *(k), *(k-1) ) ) {
-<a name="l00125"></a>00125                 my_task.cancel_group_execution();
-<a name="l00126"></a>00126                 <span class="keywordflow">break</span>;
-<a name="l00127"></a>00127             }
-<a name="l00128"></a>00128         }
-<a name="l00129"></a>00129     }
-<a name="l00130"></a>00130 
-<a name="l00131"></a>00131 };
-<a name="l00132"></a>00132 
+<a name="l00106"></a>00106 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00108"></a>00108 <span class="preprocessor"></span>
+<a name="l00109"></a>00109 <span class="preprocessor">template<typename RandomAccessIterator, typename Compare></span>
+<a name="l00110"></a>00110 <span class="preprocessor"></span><span class="keyword">class </span>quick_sort_pretest_body : internal::no_assign {
+<a name="l00111"></a>00111     <span class="keyword">const</span> Compare &comp;
+<a name="l00112"></a>00112 
+<a name="l00113"></a>00113 <span class="keyword">public</span>:
+<a name="l00114"></a>00114     quick_sort_pretest_body(<span class="keyword">const</span> Compare &_comp) : comp(_comp) {}
+<a name="l00115"></a>00115 
+<a name="l00116"></a>00116     <span class="keywordtype">void</span> operator()( <span class="keyword">const</span> blocked_range<RandomAccessIterator>& range )<span class="keyword"> const </span>{
+<a name="l00117"></a>00117         task &my_task = <a class="code" href="a00311.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>();
+<a name="l00118"></a>00118         RandomAccessIterator my_end = range.end();
+<a name="l00119"></a>00119 
+<a name="l00120"></a>00120         <span class="keywordtype">int</span> i = 0;
+<a name="l00121"></a>00121         <span class="keywordflow">for</span> (RandomAccessIterator k = range.begin(); k != my_end; ++k, ++i) {
+<a name="l00122"></a>00122             <span class="keywordflow">if</span> ( i%64 == 0 && my_task.is_cancelled() ) <span class="keywordflow">break</span>;
+<a name="l00123"></a>00123           
+<a name="l00124"></a>00124             <span class="comment">// The k-1 is never out-of-range because the first chunk starts at begin+serial_cutoff+1</span>
+<a name="l00125"></a>00125             <span class="keywordflow">if</span> ( comp( *(k), *(k-1) ) ) {
+<a name="l00126"></a>00126                 my_task.cancel_group_execution();
+<a name="l00127"></a>00127                 <span class="keywordflow">break</span>;
+<a name="l00128"></a>00128             }
+<a name="l00129"></a>00129         }
+<a name="l00130"></a>00130     }
+<a name="l00131"></a>00131 
+<a name="l00132"></a>00132 };
+<a name="l00133"></a>00133 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
 <a name="l00134"></a>00134 
-<a name="l00135"></a>00135 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00136"></a>00136 <span class="keyword">struct </span>quick_sort_body {
-<a name="l00137"></a>00137     <span class="keywordtype">void</span> operator()( <span class="keyword">const</span> quick_sort_range<RandomAccessIterator,Compare>& range )<span class="keyword"> const </span>{
-<a name="l00138"></a>00138         <span class="comment">//SerialQuickSort( range.begin, range.size, range.comp );</span>
-<a name="l00139"></a>00139         std::sort( range.begin, range.begin + range.size, range.comp );
-<a name="l00140"></a>00140     }
-<a name="l00141"></a>00141 };
-<a name="l00142"></a>00142 
+<a name="l00136"></a>00136 
+<a name="l00137"></a>00137 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
+<a name="l00138"></a>00138 <span class="keyword">struct </span>quick_sort_body {
+<a name="l00139"></a>00139     <span class="keywordtype">void</span> operator()( <span class="keyword">const</span> quick_sort_range<RandomAccessIterator,Compare>& range )<span class="keyword"> const </span>{
+<a name="l00140"></a>00140         <span class="comment">//SerialQuickSort( range.begin, range.size, range.comp );</span>
+<a name="l00141"></a>00141         std::sort( range.begin, range.begin + range.size, range.comp );
+<a name="l00142"></a>00142     }
+<a name="l00143"></a>00143 };
 <a name="l00144"></a>00144 
-<a name="l00145"></a>00145 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00146"></a>00146 <span class="keywordtype">void</span> parallel_quick_sort( RandomAccessIterator begin, RandomAccessIterator end, <span class="keyword">const</span> Compare& comp ) {
-<a name="l00147"></a>00147     task_group_context my_context;
-<a name="l00148"></a>00148     <span class="keyword">const</span> <span class="keywordtype">int</span> serial_cutoff = 9;
-<a name="l00149"></a>00149 
-<a name="l00150"></a>00150     __TBB_ASSERT( begin + serial_cutoff < end, <span class="stringliteral">"min_parallel_size is smaller than serial cutoff?"</span> );
-<a name="l00151"></a>00151     RandomAccessIterator k;
-<a name="l00152"></a>00152     <span class="keywordflow">for</span> ( k = begin ; k != begin + serial_cutoff; ++k ) {
-<a name="l00153"></a>00153         <span class="keywordflow">if</span> ( comp( *(k+1), *k ) ) {
-<a name="l00154"></a>00154             <span class="keywordflow">goto</span> do_parallel_quick_sort;
-<a name="l00155"></a>00155         }
-<a name="l00156"></a>00156     }
-<a name="l00157"></a>00157 
-<a name="l00158"></a>00158     <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( blocked_range<RandomAccessIterator>(k+1, end),
-<a name="l00159"></a>00159                   quick_sort_pretest_body<RandomAccessIterator,Compare>(comp),
-<a name="l00160"></a>00160                   auto_partitioner(),
-<a name="l00161"></a>00161                   my_context);
-<a name="l00162"></a>00162 
-<a name="l00163"></a>00163     <span class="keywordflow">if</span> (my_context.is_group_execution_cancelled())
-<a name="l00164"></a>00164 do_parallel_quick_sort:
-<a name="l00165"></a>00165         <a class="code" href="a00371.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( quick_sort_range<RandomAccessIterator,Compare>(begin, end-begin, comp ), 
-<a name="l00166"></a>00166                       quick_sort_body<RandomAccessIterator,Compare>(),
-<a name="l00167"></a>00167                       auto_partitioner() );
-<a name="l00168"></a>00168 }
-<a name="l00169"></a>00169 
-<a name="l00170"></a>00170 } <span class="comment">// namespace internal</span>
-<a name="l00172"></a>00172 <span class="comment"></span>
-<a name="l00183"></a>00183 
-<a name="l00185"></a>00185 
-<a name="l00188"></a>00188 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
-<a name="l00189"></a><a class="code" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">00189</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end, <span class="keyword">const</span> Compare& comp) { 
-<a name="l00190"></a>00190     <span class="keyword">const</span> <span class="keywordtype">int</span> min_parallel_size = 500; 
-<a name="l00191"></a>00191     <span class="keywordflow">if</span>( end > begin ) {
-<a name="l00192"></a>00192         <span class="keywordflow">if</span> (end - begin < min_parallel_size) { 
-<a name="l00193"></a>00193             std::sort(begin, end, comp);
-<a name="l00194"></a>00194         } <span class="keywordflow">else</span> {
-<a name="l00195"></a>00195             internal::parallel_quick_sort(begin, end, comp);
-<a name="l00196"></a>00196         }
-<a name="l00197"></a>00197     }
-<a name="l00198"></a>00198 }
-<a name="l00199"></a>00199 
-<a name="l00201"></a>00201 
-<a name="l00202"></a>00202 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator>
-<a name="l00203"></a><a class="code" href="a00371.html#g16c3eb77d0e530834c51ce3857f01012">00203</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end ) { 
-<a name="l00204"></a>00204     <a class="code" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< <span class="keyword">typename</span> std::iterator_traits<RandomAccessIterator>::value_type >() );
-<a name="l00205"></a>00205 }
-<a name="l00206"></a>00206 
-<a name="l00208"></a>00208 
-<a name="l00209"></a>00209 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00210"></a><a class="code" href="a00371.html#gc7576f82fdedc8a701a6c17ad9415926">00210</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( T * begin, T * end ) {
-<a name="l00211"></a>00211     <a class="code" href="a00371.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< T >() );
-<a name="l00212"></a>00212 }   
-<a name="l00214"></a>00214 
-<a name="l00215"></a>00215 
-<a name="l00216"></a>00216 } <span class="comment">// namespace tbb</span>
-<a name="l00217"></a>00217 
-<a name="l00218"></a>00218 <span class="preprocessor">#endif</span>
-<a name="l00219"></a>00219 <span class="preprocessor"></span>
+<a name="l00146"></a>00146 
+<a name="l00147"></a>00147 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
+<a name="l00148"></a>00148 <span class="keywordtype">void</span> parallel_quick_sort( RandomAccessIterator begin, RandomAccessIterator end, <span class="keyword">const</span> Compare& comp ) {
+<a name="l00149"></a>00149 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00150"></a>00150 <span class="preprocessor"></span>    task_group_context my_context;
+<a name="l00151"></a>00151     <span class="keyword">const</span> <span class="keywordtype">int</span> serial_cutoff = 9;
+<a name="l00152"></a>00152 
+<a name="l00153"></a>00153     __TBB_ASSERT( begin + serial_cutoff < end, <span class="stringliteral">"min_parallel_size is smaller than serial cutoff?"</span> );
+<a name="l00154"></a>00154     RandomAccessIterator k;
+<a name="l00155"></a>00155     <span class="keywordflow">for</span> ( k = begin ; k != begin + serial_cutoff; ++k ) {
+<a name="l00156"></a>00156         <span class="keywordflow">if</span> ( comp( *(k+1), *k ) ) {
+<a name="l00157"></a>00157             <span class="keywordflow">goto</span> do_parallel_quick_sort;
+<a name="l00158"></a>00158         }
+<a name="l00159"></a>00159     }
+<a name="l00160"></a>00160 
+<a name="l00161"></a>00161     <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( blocked_range<RandomAccessIterator>(k+1, end),
+<a name="l00162"></a>00162                   quick_sort_pretest_body<RandomAccessIterator,Compare>(comp),
+<a name="l00163"></a>00163                   auto_partitioner(),
+<a name="l00164"></a>00164                   my_context);
+<a name="l00165"></a>00165 
+<a name="l00166"></a>00166     <span class="keywordflow">if</span> (my_context.is_group_execution_cancelled())
+<a name="l00167"></a>00167 do_parallel_quick_sort:
+<a name="l00168"></a>00168 #endif <span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00169"></a>00169         <a class="code" href="a00395.html#g68cc046ef72c42ce205fccbc435a0d81">parallel_for</a>( quick_sort_range<RandomAccessIterator,Compare>(begin, end-begin, comp ), 
+<a name="l00170"></a>00170                       quick_sort_body<RandomAccessIterator,Compare>(),
+<a name="l00171"></a>00171                       auto_partitioner() );
+<a name="l00172"></a>00172 }
+<a name="l00173"></a>00173 
+<a name="l00174"></a>00174 } <span class="comment">// namespace internal</span>
+<a name="l00176"></a>00176 <span class="comment"></span>
+<a name="l00187"></a>00187 
+<a name="l00189"></a>00189 
+<a name="l00192"></a>00192 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator, <span class="keyword">typename</span> Compare>
+<a name="l00193"></a><a class="code" href="a00395.html#g49edcf9447cd91a9527a3f8e8512b7aa">00193</a> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end, <span class="keyword">const</span> Compare& comp) { 
+<a name="l00194"></a>00194     <span class="keyword">const</span> <span class="keywordtype">int</span> min_parallel_size = 500; 
+<a name="l00195"></a>00195     <span class="keywordflow">if</span>( end > begin ) {
+<a name="l00196"></a>00196         <span class="keywordflow">if</span> (end - begin < min_parallel_size) { 
+<a name="l00197"></a>00197             std::sort(begin, end, comp);
+<a name="l00198"></a>00198         } <span class="keywordflow">else</span> {
+<a name="l00199"></a>00199             internal::parallel_quick_sort(begin, end, comp);
+<a name="l00200"></a>00200         }
+<a name="l00201"></a>00201     }
+<a name="l00202"></a>00202 }
+<a name="l00203"></a>00203 
+<a name="l00205"></a>00205 
+<a name="l00206"></a>00206 <span class="keyword">template</span><<span class="keyword">typename</span> RandomAccessIterator>
+<a name="l00207"></a><a class="code" href="a00395.html#g16c3eb77d0e530834c51ce3857f01012">00207</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( RandomAccessIterator begin, RandomAccessIterator end ) { 
+<a name="l00208"></a>00208     <a class="code" href="a00395.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< <span class="keyword">typename</span> std::iterator_traits<RandomAccessIterator>::value_type >() );
+<a name="l00209"></a>00209 }
+<a name="l00210"></a>00210 
+<a name="l00212"></a>00212 
+<a name="l00213"></a>00213 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00214"></a><a class="code" href="a00395.html#gc7576f82fdedc8a701a6c17ad9415926">00214</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00395.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( T * begin, T * end ) {
+<a name="l00215"></a>00215     <a class="code" href="a00395.html#g49edcf9447cd91a9527a3f8e8512b7aa">parallel_sort</a>( begin, end, std::less< T >() );
+<a name="l00216"></a>00216 }   
+<a name="l00218"></a>00218 
+<a name="l00219"></a>00219 
+<a name="l00220"></a>00220 } <span class="comment">// namespace tbb</span>
+<a name="l00221"></a>00221 
+<a name="l00222"></a>00222 <span class="preprocessor">#endif</span>
+<a name="l00223"></a>00223 <span class="preprocessor"></span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00524.html b/doc/html/a00524.html
deleted file mode 100644
index 55c0bdd..0000000
--- a/doc/html/a00524.html
+++ /dev/null
@@ -1,340 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_reduce.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>parallel_reduce.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_reduce_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_reduce_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "partitioner.h"</span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#include <new></span>
-<a name="l00029"></a>00029 
-<a name="l00030"></a>00030 <span class="keyword">namespace </span>tbb {
-<a name="l00031"></a>00031 
-<a name="l00033"></a>00033 <span class="keyword">namespace </span>internal {
-<a name="l00035"></a>00035 
-<a name="l00036"></a>00036     <span class="keyword">typedef</span> <span class="keywordtype">char</span> reduction_context;
-<a name="l00037"></a>00037 
-<a name="l00039"></a>00039 
-<a name="l00040"></a>00040     <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00041"></a>00041     <span class="keyword">class </span>finish_reduce: <span class="keyword">public</span> task {
-<a name="l00043"></a>00043         Body* my_body;
-<a name="l00044"></a>00044         <span class="keywordtype">bool</span> has_right_zombie;
-<a name="l00045"></a>00045         <span class="keyword">const</span> reduction_context my_context;
-<a name="l00046"></a>00046         aligned_space<Body,1> zombie_space;
-<a name="l00047"></a>00047         finish_reduce( reduction_context context_ ) : 
-<a name="l00048"></a>00048             my_body(NULL),
-<a name="l00049"></a>00049             has_right_zombie(false),
-<a name="l00050"></a>00050             my_context(context_)
-<a name="l00051"></a>00051         {
-<a name="l00052"></a>00052         }
-<a name="l00053"></a>00053         task* execute() {
-<a name="l00054"></a>00054             <span class="keywordflow">if</span>( has_right_zombie ) {
-<a name="l00055"></a>00055                 <span class="comment">// Right child was stolen.</span>
-<a name="l00056"></a>00056                 Body* s = zombie_space.begin();
-<a name="l00057"></a>00057                 my_body->join( *s );
-<a name="l00058"></a>00058                 s->~Body();
-<a name="l00059"></a>00059             }
-<a name="l00060"></a>00060             <span class="keywordflow">if</span>( my_context==1 )  <span class="comment">// left child</span>
-<a name="l00061"></a>00061                 itt_store_word_with_release( static_cast<finish_reduce*>(parent())->my_body, my_body );
-<a name="l00062"></a>00062             <span class="keywordflow">return</span> NULL;
-<a name="l00063"></a>00063         }
-<a name="l00064"></a>00064         <span class="keyword">template</span><<span class="keyword">typename</span> Range,<span class="keyword">typename</span> Body_, <span class="keyword">typename</span> Partitioner>
-<a name="l00065"></a>00065         <span class="keyword">friend</span> <span class="keyword">class </span>start_reduce;
-<a name="l00066"></a>00066     };
-<a name="l00067"></a>00067 
-<a name="l00069"></a>00069 
-<a name="l00070"></a>00070     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
-<a name="l00071"></a>00071     <span class="keyword">class </span>start_reduce: <span class="keyword">public</span> task {
-<a name="l00072"></a>00072         <span class="keyword">typedef</span> finish_reduce<Body> finish_type;
-<a name="l00073"></a>00073         Body* my_body;
-<a name="l00074"></a>00074         Range my_range;
-<a name="l00075"></a>00075         <span class="keyword">typename</span> Partitioner::partition_type my_partition;
-<a name="l00076"></a>00076         reduction_context my_context;
-<a name="l00077"></a>00077         <span class="comment">/*override*/</span> task* execute();
-<a name="l00078"></a>00078         <span class="keyword">template</span><<span class="keyword">typename</span> Body_>
-<a name="l00079"></a>00079         <span class="keyword">friend</span> <span class="keyword">class </span>finish_reduce;
-<a name="l00080"></a>00080     
-<a name="l00082"></a>00082         start_reduce( <span class="keyword">const</span> Range& range, Body* body, Partitioner& partitioner ) :
-<a name="l00083"></a>00083             my_body(body),
-<a name="l00084"></a>00084             my_range(range),
-<a name="l00085"></a>00085             my_partition(partitioner),
-<a name="l00086"></a>00086             my_context(0)
-<a name="l00087"></a>00087         {
-<a name="l00088"></a>00088         }
-<a name="l00090"></a>00090 
-<a name="l00091"></a>00091         start_reduce( start_reduce& parent_, split ) :
-<a name="l00092"></a>00092             my_body(parent_.my_body),
-<a name="l00093"></a>00093             my_range(parent_.my_range,split()),
-<a name="l00094"></a>00094             my_partition(parent_.my_partition,split()),
-<a name="l00095"></a>00095             my_context(2)
-<a name="l00096"></a>00096         {
-<a name="l00097"></a>00097             my_partition.set_affinity(*<span class="keyword">this</span>);
-<a name="l00098"></a>00098             parent_.my_context = 1;
-<a name="l00099"></a>00099         }
-<a name="l00101"></a>00101         <span class="comment">/*override*/</span> <span class="keywordtype">void</span> note_affinity( affinity_id <span class="keywordtype">id</span> ) {
-<a name="l00102"></a>00102             my_partition.note_affinity( <span class="keywordtype">id</span> );
-<a name="l00103"></a>00103         }
-<a name="l00104"></a>00104 
-<a name="l00105"></a>00105 <span class="keyword">public</span>:
-<a name="l00106"></a>00106         <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, Partitioner& partitioner ) {
-<a name="l00107"></a>00107             <span class="keywordflow">if</span>( !range.empty() ) {
-<a name="l00108"></a>00108 #<span class="keywordflow">if</span> !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
-<a name="l00109"></a>00109                 <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(<a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_reduce(range,&body,partitioner) );
-<a name="l00110"></a>00110 <span class="preprocessor">#else</span>
-<a name="l00111"></a>00111 <span class="preprocessor"></span>                <span class="comment">// Bound context prevents exceptions from body to affect nesting or sibling algorithms,</span>
-<a name="l00112"></a>00112                 <span class="comment">// and allows users to handle exceptions safely by wrapping parallel_for in the try-block.</span>
-<a name="l00113"></a>00113                 task_group_context context;
-<a name="l00114"></a>00114                 <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
-<a name="l00115"></a>00115 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */</span>
-<a name="l00116"></a>00116             }
-<a name="l00117"></a>00117         }
-<a name="l00118"></a>00118 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00119"></a>00119 <span class="preprocessor"></span>        <span class="keyword">static</span> <span class="keywordtype">void</span> run( <span class="keyword">const</span> Range& range, Body& body, Partitioner& partitioner, task_group_context& context ) {
-<a name="l00120"></a>00120             <span class="keywordflow">if</span>( !range.empty() ) 
-<a name="l00121"></a>00121                 <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *<span class="keyword">new</span>(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
-<a name="l00122"></a>00122         }
-<a name="l00123"></a>00123 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00124"></a>00124     };
-<a name="l00125"></a>00125 
-<a name="l00126"></a>00126     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
-<a name="l00127"></a>00127     task* start_reduce<Range,Body,Partitioner>::execute() {
-<a name="l00128"></a>00128         <span class="keywordflow">if</span>( my_context==2 ) { <span class="comment">// right child</span>
-<a name="l00129"></a>00129             finish_type* p = static_cast<finish_type*>(parent());
-<a name="l00130"></a>00130             <span class="keywordflow">if</span>( !itt_load_word_with_acquire(p->my_body) ) {
-<a name="l00131"></a>00131                 my_body = <span class="keyword">new</span>( p->zombie_space.begin() ) Body(*my_body,split());
-<a name="l00132"></a>00132                 p->has_right_zombie = <span class="keyword">true</span>;
-<a name="l00133"></a>00133             }
-<a name="l00134"></a>00134         }
-<a name="l00135"></a>00135         <span class="keywordflow">if</span>( !my_range.is_divisible() || my_partition.should_execute_range(*<span class="keyword">this</span>) ) {
-<a name="l00136"></a>00136             (*my_body)( my_range );
-<a name="l00137"></a>00137             <span class="keywordflow">if</span>( my_context==1 ) 
-<a name="l00138"></a>00138                 itt_store_word_with_release(static_cast<finish_type*>(parent())->my_body, my_body );
-<a name="l00139"></a>00139             <span class="keywordflow">return</span> my_partition.continue_after_execute_range();
-<a name="l00140"></a>00140         } <span class="keywordflow">else</span> {
-<a name="l00141"></a>00141             finish_type& c = *<span class="keyword">new</span>( allocate_continuation()) finish_type(my_context);
-<a name="l00142"></a>00142             recycle_as_child_of(c);
-<a name="l00143"></a>00143             c.set_ref_count(2);    
-<a name="l00144"></a>00144             <span class="keywordtype">bool</span> delay = my_partition.decide_whether_to_delay();
-<a name="l00145"></a>00145             start_reduce& b = *<span class="keyword">new</span>( c.allocate_child() ) start_reduce(*<span class="keyword">this</span>,split());
-<a name="l00146"></a>00146             my_partition.spawn_or_delay(delay,b);
-<a name="l00147"></a>00147             <span class="keywordflow">return</span> <span class="keyword">this</span>;
-<a name="l00148"></a>00148         }
-<a name="l00149"></a>00149     }
-<a name="l00150"></a>00150 
-<a name="l00152"></a>00152 
-<a name="l00156"></a>00156     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00157"></a>00157     <span class="keyword">class </span>lambda_reduce_body {
-<a name="l00158"></a>00158 
-<a name="l00159"></a>00159 <span class="comment">//FIXME: decide if my_real_body, my_reduction, and identity_element should be copied or referenced</span>
-<a name="l00160"></a>00160 <span class="comment">//       (might require some performance measurements)</span>
-<a name="l00161"></a>00161 
-<a name="l00162"></a>00162         <span class="keyword">const</span> Value&     identity_element;
-<a name="l00163"></a>00163         <span class="keyword">const</span> RealBody&  my_real_body;
-<a name="l00164"></a>00164         <span class="keyword">const</span> Reduction& my_reduction;
-<a name="l00165"></a>00165         Value            my_value;
-<a name="l00166"></a>00166         lambda_reduce_body& operator= ( <span class="keyword">const</span> lambda_reduce_body& other );
-<a name="l00167"></a>00167     <span class="keyword">public</span>:
-<a name="l00168"></a>00168         lambda_reduce_body( <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& body, <span class="keyword">const</span> Reduction& reduction )
-<a name="l00169"></a>00169             : identity_element(identity)
-<a name="l00170"></a>00170             , my_real_body(body)
-<a name="l00171"></a>00171             , my_reduction(reduction)
-<a name="l00172"></a>00172             , my_value(identity)
-<a name="l00173"></a>00173         { }
-<a name="l00174"></a>00174         lambda_reduce_body( <span class="keyword">const</span> lambda_reduce_body& other )
-<a name="l00175"></a>00175             : identity_element(other.identity_element)
-<a name="l00176"></a>00176             , my_real_body(other.my_real_body)
-<a name="l00177"></a>00177             , my_reduction(other.my_reduction)
-<a name="l00178"></a>00178             , my_value(other.my_value)
-<a name="l00179"></a>00179         { }
-<a name="l00180"></a>00180         lambda_reduce_body( lambda_reduce_body& other, <a class="code" href="a00290.html">tbb::split</a> )
-<a name="l00181"></a>00181             : identity_element(other.identity_element)
-<a name="l00182"></a>00182             , my_real_body(other.my_real_body)
-<a name="l00183"></a>00183             , my_reduction(other.my_reduction)
-<a name="l00184"></a>00184             , my_value(other.identity_element)
-<a name="l00185"></a>00185         { }
-<a name="l00186"></a>00186         <span class="keywordtype">void</span> operator()(Range& range) {
-<a name="l00187"></a>00187             my_value = my_real_body(range, const_cast<const Value&>(my_value));
-<a name="l00188"></a>00188         }
-<a name="l00189"></a>00189         <span class="keywordtype">void</span> join( lambda_reduce_body& rhs ) {
-<a name="l00190"></a>00190             my_value = my_reduction(const_cast<const Value&>(my_value), const_cast<const Value&>(rhs.my_value));
-<a name="l00191"></a>00191         }
-<a name="l00192"></a>00192         Value result()<span class="keyword"> const </span>{
-<a name="l00193"></a>00193             <span class="keywordflow">return</span> my_value;
-<a name="l00194"></a>00194         }
-<a name="l00195"></a>00195     };
-<a name="l00196"></a>00196 
-<a name="l00197"></a>00197 } <span class="comment">// namespace internal</span>
-<a name="l00199"></a>00199 <span class="comment"></span>
-<a name="l00200"></a>00200 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
-<a name="l00201"></a>00201 
-<a name="l00220"></a>00220 
-<a name="l00222"></a>00222 
-<a name="l00223"></a>00223 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00224"></a><a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">00224</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body ) {
-<a name="l00225"></a>00225     internal::start_reduce<Range,Body, const __TBB_DEFAULT_PARTITIONER>::run( range, body, __TBB_DEFAULT_PARTITIONER() );
-<a name="l00226"></a>00226 }
-<a name="l00227"></a>00227 
-<a name="l00229"></a>00229 
-<a name="l00230"></a>00230 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00231"></a><a class="code" href="a00371.html#gec1b7c03f9da909bef5db12e3d41bed3">00231</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>& partitioner ) {
-<a name="l00232"></a>00232     internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner );
-<a name="l00233"></a>00233 }
-<a name="l00234"></a>00234 
-<a name="l00236"></a>00236 
-<a name="l00237"></a>00237 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00238"></a><a class="code" href="a00371.html#g18a19157e6245992fc00ca0adeb7dd37">00238</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>& partitioner ) {
-<a name="l00239"></a>00239     internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner );
-<a name="l00240"></a>00240 }
-<a name="l00241"></a>00241 
-<a name="l00243"></a>00243 
-<a name="l00244"></a>00244 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00245"></a><a class="code" href="a00371.html#gc61e73fcc36c92d79a217fc355ff4a6b">00245</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00212.html">affinity_partitioner</a>& partitioner ) {
-<a name="l00246"></a>00246     internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner );
-<a name="l00247"></a>00247 }
-<a name="l00248"></a>00248 
-<a name="l00249"></a>00249 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00251"></a>00251 <span class="preprocessor"></span>
-<a name="l00252"></a>00252 <span class="preprocessor">template<typename Range, typename Body></span>
-<a name="l00253"></a><a class="code" href="a00371.html#g45cb00c42a18e334bbde8b7535afe460">00253</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_cont [...]
-<a name="l00254"></a>00254     internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner, context );
-<a name="l00255"></a>00255 }
-<a name="l00256"></a>00256 
-<a name="l00258"></a>00258 
-<a name="l00259"></a>00259 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00260"></a><a class="code" href="a00371.html#g1c1ea1d7c61b3c225e92c70d669a53a5">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context</a>& context ) {
-<a name="l00261"></a>00261     internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner, context );
-<a name="l00262"></a>00262 }
-<a name="l00263"></a>00263 
-<a name="l00265"></a>00265 
-<a name="l00266"></a>00266 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00267"></a><a class="code" href="a00371.html#gd9ac3a3811060314695f33b703c6e11b">00267</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, Body& body, <a class="code" href="a00212.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context</a>& context ) {
-<a name="l00268"></a>00268     internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner, context );
-<a name="l00269"></a>00269 }
-<a name="l00270"></a>00270 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00271"></a>00271 
-<a name="l00275"></a>00275 
-<a name="l00276"></a>00276 
-<a name="l00277"></a>00277 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00278"></a><a class="code" href="a00371.html#gc9412e09fb01fcad8c018ea9cffb28ef">00278</a> Value <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction ) {
-<a name="l00279"></a>00279     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00280"></a>00280     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> __TBB_DEFAULT_PARTITIONER>
-<a name="l00281"></a>00281                           ::run(range, body, __TBB_DEFAULT_PARTITIONER() );
-<a name="l00282"></a>00282     <span class="keywordflow">return</span> body.result();
-<a name="l00283"></a>00283 }
-<a name="l00284"></a>00284 
-<a name="l00286"></a>00286 
-<a name="l00287"></a>00287 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00288"></a><a class="code" href="a00371.html#gaddffeec0e892ac3d6fc7fc2053e1eca">00288</a> Value <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00289"></a>00289                        <span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>& partitioner ) {
-<a name="l00290"></a>00290     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00291"></a>00291     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>>
-<a name="l00292"></a>00292                           ::run(range, body, partitioner );
-<a name="l00293"></a>00293     <span class="keywordflow">return</span> body.result();
-<a name="l00294"></a>00294 }
-<a name="l00295"></a>00295 
-<a name="l00297"></a>00297 
-<a name="l00298"></a>00298 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00299"></a><a class="code" href="a00371.html#gb175401f0729e40dd2c5860a17c14385">00299</a> Value <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00300"></a>00300                        <span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>& partitioner ) {
-<a name="l00301"></a>00301     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00302"></a>00302     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>>
-<a name="l00303"></a>00303                           ::run( range, body, partitioner );
-<a name="l00304"></a>00304     <span class="keywordflow">return</span> body.result();
-<a name="l00305"></a>00305 }
-<a name="l00306"></a>00306 
-<a name="l00308"></a>00308 
-<a name="l00309"></a>00309 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00310"></a><a class="code" href="a00371.html#gb7f1f1828ae2b330ce05b8513a495154">00310</a> Value <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00311"></a>00311                        <a class="code" href="a00212.html">affinity_partitioner</a>& partitioner ) {
-<a name="l00312"></a>00312     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00313"></a>00313     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00212.html">affinity_partitioner</a>>
-<a name="l00314"></a>00314                                         ::run( range, body, partitioner );
-<a name="l00315"></a>00315     <span class="keywordflow">return</span> body.result();
-<a name="l00316"></a>00316 }
-<a name="l00317"></a>00317 
-<a name="l00318"></a>00318 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00320"></a>00320 <span class="preprocessor"></span>
-<a name="l00321"></a>00321 <span class="preprocessor">template<typename Range, typename Value, typename RealBody, typename Reduction></span>
-<a name="l00322"></a><a class="code" href="a00371.html#gfbc0cc2026d87f11a96bcd62788f5bb5">00322</a> <span class="preprocessor"></span>Value <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00323"></a>00323                        <span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context</a>& context ) {
-<a name="l00324"></a>00324     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00325"></a>00325     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>>
-<a name="l00326"></a>00326                           ::run( range, body, partitioner, context );
-<a name="l00327"></a>00327     <span class="keywordflow">return</span> body.result();
-<a name="l00328"></a>00328 }
-<a name="l00329"></a>00329 
-<a name="l00331"></a>00331 
-<a name="l00332"></a>00332 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00333"></a><a class="code" href="a00371.html#g630c90a399937d9d4ae70ff883186dfd">00333</a> Value <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00334"></a>00334                        <span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context</a>& context ) {
-<a name="l00335"></a>00335     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00336"></a>00336     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>>
-<a name="l00337"></a>00337                           ::run( range, body, partitioner, context );
-<a name="l00338"></a>00338     <span class="keywordflow">return</span> body.result();
-<a name="l00339"></a>00339 }
-<a name="l00340"></a>00340 
-<a name="l00342"></a>00342 
-<a name="l00343"></a>00343 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Value, <span class="keyword">typename</span> RealBody, <span class="keyword">typename</span> Reduction>
-<a name="l00344"></a><a class="code" href="a00371.html#g496bd7eadb3b97495ccb5655ef90319e">00344</a> Value <a class="code" href="a00371.html#g1b3d59c5eb62683c5754db6970392fa3">parallel_reduce</a>( <span class="keyword">const</span> Range& range, <span class="keyword">const</span> Value& identity, <span class="keyword">const</span> RealBody& real_body, <span class="keyword">const</span> Reduction& reduction,
-<a name="l00345"></a>00345                        <a class="code" href="a00212.html">affinity_partitioner</a>& partitioner, <a class="code" href="a00293.html">task_group_context</a>& context ) {
-<a name="l00346"></a>00346     internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
-<a name="l00347"></a>00347     internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,<a class="code" href="a00212.html">affinity_partitioner</a>>
-<a name="l00348"></a>00348                                         ::run( range, body, partitioner, context );
-<a name="l00349"></a>00349     <span class="keywordflow">return</span> body.result();
-<a name="l00350"></a>00350 }
-<a name="l00351"></a>00351 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00352"></a>00352 
-<a name="l00353"></a>00353 
-<a name="l00354"></a>00354 } <span class="comment">// namespace tbb</span>
-<a name="l00355"></a>00355 
-<a name="l00356"></a>00356 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_reduce_H */</span>
-<a name="l00357"></a>00357 
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00537.html b/doc/html/a00527.html
similarity index 89%
rename from doc/html/a00537.html
rename to doc/html/a00527.html
index 0285ca3..c55ab0f 100644
--- a/doc/html/a00537.html
+++ b/doc/html/a00527.html
@@ -67,7 +67,7 @@
 <a name="l00049"></a>00049             my_body(body), my_value(value)
 <a name="l00050"></a>00050         {}
 <a name="l00051"></a>00051         <span class="keyword">template</span><<span class="keyword">typename</span> Body_> <span class="keyword">friend</span> <span class="keyword">class </span>while_group_task;
-<a name="l00052"></a>00052         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00265.html">tbb::parallel_while</a><Body>;
+<a name="l00052"></a>00052         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00282.html">tbb::parallel_while</a><Body>;
 <a name="l00053"></a>00053     };
 <a name="l00054"></a>00054 
 <a name="l00056"></a>00056 
@@ -127,59 +127,59 @@
 <a name="l00113"></a>00113             my_body(body),
 <a name="l00114"></a>00114             my_barrier(barrier)
 <a name="l00115"></a>00115         {} 
-<a name="l00116"></a>00116         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00265.html">tbb::parallel_while</a><Body>;
+<a name="l00116"></a>00116         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00282.html">tbb::parallel_while</a><Body>;
 <a name="l00117"></a>00117     };
 <a name="l00118"></a>00118 
 <a name="l00119"></a>00119 } <span class="comment">// namespace internal</span>
 <a name="l00121"></a>00121 <span class="comment"></span>
 <a name="l00123"></a>00123 
 <a name="l00128"></a>00128 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00129"></a><a class="code" href="a00265.html">00129</a> <span class="keyword">class </span><a class="code" href="a00265.html">parallel_while</a>: internal::no_copy {
+<a name="l00129"></a><a class="code" href="a00282.html">00129</a> <span class="keyword">class </span><a class="code" href="a00282.html">parallel_while</a>: internal::no_copy {
 <a name="l00130"></a>00130 <span class="keyword">public</span>:
-<a name="l00132"></a><a class="code" href="a00265.html#36e26ba3880c7bcf804a97ba0cbe133f">00132</a>     <a class="code" href="a00265.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>() : my_body(NULL), my_barrier(NULL) {}
+<a name="l00132"></a><a class="code" href="a00282.html#36e26ba3880c7bcf804a97ba0cbe133f">00132</a>     <a class="code" href="a00282.html#36e26ba3880c7bcf804a97ba0cbe133f">parallel_while</a>() : my_body(NULL), my_barrier(NULL) {}
 <a name="l00133"></a>00133 
-<a name="l00135"></a><a class="code" href="a00265.html#6fcfc973cc56b79c6d0fbb8a31be7e84">00135</a>     <a class="code" href="a00265.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>() {
+<a name="l00135"></a><a class="code" href="a00282.html#6fcfc973cc56b79c6d0fbb8a31be7e84">00135</a>     <a class="code" href="a00282.html#6fcfc973cc56b79c6d0fbb8a31be7e84">~parallel_while</a>() {
 <a name="l00136"></a>00136         <span class="keywordflow">if</span>( my_barrier ) {
-<a name="l00137"></a>00137             my_barrier-><a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(*my_barrier);    
+<a name="l00137"></a>00137             my_barrier-><a class="code" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(*my_barrier);    
 <a name="l00138"></a>00138             my_barrier = NULL;
 <a name="l00139"></a>00139         }
 <a name="l00140"></a>00140     }
 <a name="l00141"></a>00141 
-<a name="l00143"></a><a class="code" href="a00265.html#fa297e53d3af2a101e712bc200233e9c">00143</a>     <span class="keyword">typedef</span> <span class="keyword">typename</span> Body::argument_type <a class="code" href="a00265.html#fa297e53d3af2a101e712bc200233e9c">value_type</a>;
+<a name="l00143"></a><a class="code" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">00143</a>     <span class="keyword">typedef</span> <span class="keyword">typename</span> Body::argument_type <a class="code" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">value_type</a>;
 <a name="l00144"></a>00144 
 <a name="l00146"></a>00146 
 <a name="l00149"></a>00149     <span class="keyword">template</span><<span class="keyword">typename</span> Stream>
-<a name="l00150"></a>00150     <span class="keywordtype">void</span> <a class="code" href="a00265.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a>( Stream& stream, <span class="keyword">const</span> Body& body );
+<a name="l00150"></a>00150     <span class="keywordtype">void</span> <a class="code" href="a00282.html#b32a0a6e5e09ebb7fad3e6652c19afe5">run</a>( Stream& stream, <span class="keyword">const</span> Body& body );
 <a name="l00151"></a>00151 
 <a name="l00153"></a>00153 
-<a name="l00154"></a>00154     <span class="keywordtype">void</span> <a class="code" href="a00265.html#e131c560057a58229992b61eb8dba4c6">add</a>( <span class="keyword">const</span> <a class="code" href="a00265.html#fa297e53d3af2a101e712bc200233e9c">value_type</a>& item );
+<a name="l00154"></a>00154     <span class="keywordtype">void</span> <a class="code" href="a00282.html#e131c560057a58229992b61eb8dba4c6">add</a>( <span class="keyword">const</span> <a class="code" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">value_type</a>& item );
 <a name="l00155"></a>00155 
 <a name="l00156"></a>00156 <span class="keyword">private</span>:
 <a name="l00157"></a>00157     <span class="keyword">const</span> Body* my_body;
-<a name="l00158"></a>00158     <a class="code" href="a00242.html">empty_task</a>* my_barrier;
+<a name="l00158"></a>00158     <a class="code" href="a00254.html">empty_task</a>* my_barrier;
 <a name="l00159"></a>00159 };
 <a name="l00160"></a>00160 
 <a name="l00161"></a>00161 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
 <a name="l00162"></a>00162 <span class="keyword">template</span><<span class="keyword">typename</span> Stream>
-<a name="l00163"></a><a class="code" href="a00265.html#b32a0a6e5e09ebb7fad3e6652c19afe5">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00265.html">parallel_while<Body>::run</a>( Stream& stream, <span class="keyword">const</span> Body& body ) {
+<a name="l00163"></a><a class="code" href="a00282.html#b32a0a6e5e09ebb7fad3e6652c19afe5">00163</a> <span class="keywordtype">void</span> <a class="code" href="a00282.html">parallel_while<Body>::run</a>( Stream& stream, <span class="keyword">const</span> Body& body ) {
 <a name="l00164"></a>00164     <span class="keyword">using namespace </span>internal;
-<a name="l00165"></a>00165     <a class="code" href="a00242.html">empty_task</a>& barrier = *<span class="keyword">new</span>( <a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>() ) <a class="code" href="a00242.html">empty_task</a>();
+<a name="l00165"></a>00165     <a class="code" href="a00254.html">empty_task</a>& barrier = *<span class="keyword">new</span>( <a class="code" href="a00311.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>() ) <a class="code" href="a00254.html">empty_task</a>();
 <a name="l00166"></a>00166     my_body = &body;
 <a name="l00167"></a>00167     my_barrier = &barrier;
-<a name="l00168"></a>00168     my_barrier-><a class="code" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(2);
-<a name="l00169"></a>00169     while_task<Stream,Body>& w = *<span class="keyword">new</span>( my_barrier-><a class="code" href="a00291.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>() ) while_task<Stream,Body>( stream, body, barrier );
-<a name="l00170"></a>00170     my_barrier-><a class="code" href="a00291.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(w);
-<a name="l00171"></a>00171     my_barrier-><a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(*my_barrier);
+<a name="l00168"></a>00168     my_barrier-><a class="code" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(2);
+<a name="l00169"></a>00169     while_task<Stream,Body>& w = *<span class="keyword">new</span>( my_barrier-><a class="code" href="a00311.html#1ff794f7053cd9148d5f280fbf07377f">allocate_child</a>() ) while_task<Stream,Body>( stream, body, barrier );
+<a name="l00170"></a>00170     my_barrier-><a class="code" href="a00311.html#3ce28ca9baa771cfc37ecd72e69c4f3c">spawn_and_wait_for_all</a>(w);
+<a name="l00171"></a>00171     my_barrier-><a class="code" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>(*my_barrier);
 <a name="l00172"></a>00172     my_barrier = NULL;
 <a name="l00173"></a>00173     my_body = NULL;
 <a name="l00174"></a>00174 }
 <a name="l00175"></a>00175 
 <a name="l00176"></a>00176 <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00177"></a><a class="code" href="a00265.html#e131c560057a58229992b61eb8dba4c6">00177</a> <span class="keywordtype">void</span> <a class="code" href="a00265.html">parallel_while<Body>::add</a>( <span class="keyword">const</span> value_type& item ) {
+<a name="l00177"></a><a class="code" href="a00282.html#e131c560057a58229992b61eb8dba4c6">00177</a> <span class="keywordtype">void</span> <a class="code" href="a00282.html">parallel_while<Body>::add</a>( <span class="keyword">const</span> value_type& item ) {
 <a name="l00178"></a>00178     __TBB_ASSERT(my_barrier,<span class="stringliteral">"attempt to add to parallel_while that is not running"</span>);
 <a name="l00179"></a>00179     <span class="keyword">typedef</span> internal::while_iteration_task<Body> iteration_type;
 <a name="l00180"></a>00180     iteration_type& i = *<span class="keyword">new</span>( task::allocate_additional_child_of(*my_barrier) ) iteration_type(item,*my_body);
-<a name="l00181"></a>00181     <a class="code" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().spawn( i );
+<a name="l00181"></a>00181     <a class="code" href="a00311.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().spawn( i );
 <a name="l00182"></a>00182 }
 <a name="l00183"></a>00183 
 <a name="l00184"></a>00184 } <span class="comment">// namespace </span>
diff --git a/doc/html/a00528.html b/doc/html/a00528.html
deleted file mode 100644
index b8c18db..0000000
--- a/doc/html/a00528.html
+++ /dev/null
@@ -1,341 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>parallel_scan.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>parallel_scan.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_parallel_scan_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_parallel_scan_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include <new></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#include "partitioner.h"</span>
-<a name="l00028"></a>00028 
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb {
-<a name="l00030"></a>00030 
-<a name="l00032"></a>00032 
-<a name="l00033"></a><a class="code" href="a00267.html">00033</a> <span class="keyword">struct </span><a class="code" href="a00267.html">pre_scan_tag</a> {
-<a name="l00034"></a>00034     <span class="keyword">static</span> <span class="keywordtype">bool</span> is_final_scan() {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00035"></a>00035 };
-<a name="l00036"></a>00036 
-<a name="l00038"></a>00038 
-<a name="l00039"></a><a class="code" href="a00247.html">00039</a> <span class="keyword">struct </span><a class="code" href="a00247.html">final_scan_tag</a> {
-<a name="l00040"></a>00040     <span class="keyword">static</span> <span class="keywordtype">bool</span> is_final_scan() {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
-<a name="l00041"></a>00041 };
-<a name="l00042"></a>00042 
-<a name="l00044"></a>00044 <span class="keyword">namespace </span>internal {
-<a name="l00045"></a>00045 
-<a name="l00047"></a>00047 
-<a name="l00048"></a>00048     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00049"></a>00049     <span class="keyword">class </span>final_sum: <span class="keyword">public</span> <a class="code" href="a00291.html">task</a> {
-<a name="l00050"></a>00050     <span class="keyword">public</span>:
-<a name="l00051"></a>00051         Body body;
-<a name="l00052"></a>00052     <span class="keyword">private</span>:
-<a name="l00053"></a>00053         <a class="code" href="a00215.html">aligned_space<Range,1></a> range;
-<a name="l00055"></a>00055         Body* stuff_last;
-<a name="l00056"></a>00056     <span class="keyword">public</span>:
-<a name="l00057"></a>00057         final_sum( Body& body_ ) :
-<a name="l00058"></a>00058             body(body_,<a class="code" href="a00290.html">split</a>())
-<a name="l00059"></a>00059         {
-<a name="l00060"></a>00060             poison_pointer(stuff_last);
-<a name="l00061"></a>00061         }
-<a name="l00062"></a>00062         ~final_sum() {
-<a name="l00063"></a>00063             range.begin()->~Range();
-<a name="l00064"></a>00064         }     
-<a name="l00065"></a>00065         <span class="keywordtype">void</span> finish_construction( <span class="keyword">const</span> Range& range_, Body* stuff_last_ ) {
-<a name="l00066"></a>00066             <span class="keyword">new</span>( range.begin() ) Range(range_);
-<a name="l00067"></a>00067             stuff_last = stuff_last_;
-<a name="l00068"></a>00068         }
-<a name="l00069"></a>00069     <span class="keyword">private</span>:
-<a name="l00070"></a>00070         <span class="comment">/*override*/</span> task* execute() {
-<a name="l00071"></a>00071             body( *range.begin(), final_scan_tag() );
-<a name="l00072"></a>00072             <span class="keywordflow">if</span>( stuff_last )
-<a name="l00073"></a>00073                 stuff_last->assign(body);
-<a name="l00074"></a>00074             <span class="keywordflow">return</span> NULL;
-<a name="l00075"></a>00075         }
-<a name="l00076"></a>00076     };       
-<a name="l00077"></a>00077 
-<a name="l00079"></a>00079 
-<a name="l00080"></a>00080     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00081"></a>00081     <span class="keyword">class </span>sum_node: <span class="keyword">public</span> task {
-<a name="l00082"></a>00082         <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
-<a name="l00083"></a>00083     <span class="keyword">public</span>:
-<a name="l00084"></a>00084         final_sum_type *incoming; 
-<a name="l00085"></a>00085         final_sum_type *body;
-<a name="l00086"></a>00086         Body *stuff_last;
-<a name="l00087"></a>00087     <span class="keyword">private</span>:
-<a name="l00088"></a>00088         final_sum_type *left_sum;
-<a name="l00089"></a>00089         sum_node *left;
-<a name="l00090"></a>00090         sum_node *right;     
-<a name="l00091"></a>00091         <span class="keywordtype">bool</span> left_is_final;
-<a name="l00092"></a>00092         Range range;
-<a name="l00093"></a>00093         sum_node( <span class="keyword">const</span> Range range_, <span class="keywordtype">bool</span> left_is_final_ ) : 
-<a name="l00094"></a>00094             left_sum(NULL), 
-<a name="l00095"></a>00095             left(NULL), 
-<a name="l00096"></a>00096             right(NULL), 
-<a name="l00097"></a>00097             left_is_final(left_is_final_), 
-<a name="l00098"></a>00098             range(range_)
-<a name="l00099"></a>00099         {
-<a name="l00100"></a>00100             <span class="comment">// Poison fields that will be set by second pass.</span>
-<a name="l00101"></a>00101             poison_pointer(body);
-<a name="l00102"></a>00102             poison_pointer(incoming);
-<a name="l00103"></a>00103         }
-<a name="l00104"></a>00104         task* create_child( <span class="keyword">const</span> Range& range_, final_sum_type& f, sum_node* n, final_sum_type* incoming_, Body* stuff_last_ ) {
-<a name="l00105"></a>00105             <span class="keywordflow">if</span>( !n ) {
-<a name="l00106"></a>00106                 f.recycle_as_child_of( *<span class="keyword">this</span> );
-<a name="l00107"></a>00107                 f.finish_construction( range_, stuff_last_ );
-<a name="l00108"></a>00108                 <span class="keywordflow">return</span> &f;
-<a name="l00109"></a>00109             } <span class="keywordflow">else</span> {
-<a name="l00110"></a>00110                 n->body = &f;
-<a name="l00111"></a>00111                 n->incoming = incoming_;
-<a name="l00112"></a>00112                 n->stuff_last = stuff_last_;
-<a name="l00113"></a>00113                 <span class="keywordflow">return</span> n;
-<a name="l00114"></a>00114             }
-<a name="l00115"></a>00115         }
-<a name="l00116"></a>00116         <span class="comment">/*override*/</span> task* execute() {
-<a name="l00117"></a>00117             <span class="keywordflow">if</span>( body ) {
-<a name="l00118"></a>00118                 <span class="keywordflow">if</span>( incoming )
-<a name="l00119"></a>00119                     left_sum->body.reverse_join( incoming->body );
-<a name="l00120"></a>00120                 recycle_as_continuation();
-<a name="l00121"></a>00121                 sum_node& c = *<span class="keyword">this</span>;
-<a name="l00122"></a>00122                 task* b = c.create_child(Range(range,split()),*left_sum,right,left_sum,stuff_last);
-<a name="l00123"></a>00123                 task* a = left_is_final ? NULL : c.create_child(range,*body,left,incoming,NULL);
-<a name="l00124"></a>00124                 set_ref_count( (a!=NULL)+(b!=NULL) );
-<a name="l00125"></a>00125                 body = NULL; 
-<a name="l00126"></a>00126                 <span class="keywordflow">if</span>( a ) spawn(*b);
-<a name="l00127"></a>00127                 <span class="keywordflow">else</span> a = b;
-<a name="l00128"></a>00128                 <span class="keywordflow">return</span> a;
-<a name="l00129"></a>00129             } <span class="keywordflow">else</span> {
-<a name="l00130"></a>00130                 <span class="keywordflow">return</span> NULL;
-<a name="l00131"></a>00131             }
-<a name="l00132"></a>00132         }
-<a name="l00133"></a>00133         <span class="keyword">template</span><<span class="keyword">typename</span> Range_,<span class="keyword">typename</span> Body_,<span class="keyword">typename</span> Partitioner_>
-<a name="l00134"></a>00134         <span class="keyword">friend</span> <span class="keyword">class </span>start_scan;
-<a name="l00135"></a>00135 
-<a name="l00136"></a>00136         <span class="keyword">template</span><<span class="keyword">typename</span> Range_,<span class="keyword">typename</span> Body_>
-<a name="l00137"></a>00137         <span class="keyword">friend</span> <span class="keyword">class </span>finish_scan;
-<a name="l00138"></a>00138     };
-<a name="l00139"></a>00139 
-<a name="l00141"></a>00141 
-<a name="l00142"></a>00142     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00143"></a>00143     <span class="keyword">class </span>finish_scan: <span class="keyword">public</span> task {
-<a name="l00144"></a>00144         <span class="keyword">typedef</span> sum_node<Range,Body> sum_node_type;
-<a name="l00145"></a>00145         <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
-<a name="l00146"></a>00146         final_sum_type** <span class="keyword">const</span> sum;
-<a name="l00147"></a>00147         sum_node_type*& return_slot;
-<a name="l00148"></a>00148     <span class="keyword">public</span>:
-<a name="l00149"></a>00149         final_sum_type* right_zombie;
-<a name="l00150"></a>00150         sum_node_type& result;
-<a name="l00151"></a>00151 
-<a name="l00152"></a>00152         <span class="comment">/*override*/</span> task* execute() {
-<a name="l00153"></a>00153             __TBB_ASSERT( result.ref_count()==(result.left!=NULL)+(result.right!=NULL), NULL );
-<a name="l00154"></a>00154             <span class="keywordflow">if</span>( result.left )
-<a name="l00155"></a>00155                 result.left_is_final = <span class="keyword">false</span>;
-<a name="l00156"></a>00156             <span class="keywordflow">if</span>( right_zombie && sum ) 
-<a name="l00157"></a>00157                 ((*sum)->body).reverse_join(result.left_sum->body);
-<a name="l00158"></a>00158             __TBB_ASSERT( !return_slot, NULL );
-<a name="l00159"></a>00159             <span class="keywordflow">if</span>( right_zombie || result.right ) {
-<a name="l00160"></a>00160                 return_slot = &result;
-<a name="l00161"></a>00161             } <span class="keywordflow">else</span> {
-<a name="l00162"></a>00162                 destroy( result );
-<a name="l00163"></a>00163             }
-<a name="l00164"></a>00164             <span class="keywordflow">if</span>( right_zombie && !sum && !result.right ) destroy(*right_zombie);
-<a name="l00165"></a>00165             <span class="keywordflow">return</span> NULL;
-<a name="l00166"></a>00166         }
-<a name="l00167"></a>00167 
-<a name="l00168"></a>00168         finish_scan( sum_node_type*& return_slot_, final_sum_type** sum_, sum_node_type& result_ ) : 
-<a name="l00169"></a>00169             sum(sum_),
-<a name="l00170"></a>00170             return_slot(return_slot_), 
-<a name="l00171"></a>00171             right_zombie(NULL),
-<a name="l00172"></a>00172             result(result_)
-<a name="l00173"></a>00173         {
-<a name="l00174"></a>00174             __TBB_ASSERT( !return_slot, NULL );
-<a name="l00175"></a>00175         }
-<a name="l00176"></a>00176     };
-<a name="l00177"></a>00177 
-<a name="l00179"></a>00179 
-<a name="l00180"></a>00180     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner=simple_partitioner>
-<a name="l00181"></a>00181     <span class="keyword">class </span>start_scan: <span class="keyword">public</span> task {
-<a name="l00182"></a>00182         <span class="keyword">typedef</span> sum_node<Range,Body> sum_node_type;
-<a name="l00183"></a>00183         <span class="keyword">typedef</span> final_sum<Range,Body> final_sum_type;
-<a name="l00184"></a>00184         final_sum_type* body;
-<a name="l00186"></a>00186         final_sum_type** sum; 
-<a name="l00187"></a>00187         sum_node_type** return_slot;
-<a name="l00189"></a>00189         sum_node_type* parent_sum;
-<a name="l00190"></a>00190         <span class="keywordtype">bool</span> is_final;
-<a name="l00191"></a>00191         <span class="keywordtype">bool</span> is_right_child;
-<a name="l00192"></a>00192         Range range;
-<a name="l00193"></a>00193         <span class="keyword">typename</span> Partitioner::partition_type partition;
-<a name="l00194"></a>00194         <span class="comment">/*override*/</span> task* execute();
-<a name="l00195"></a>00195     <span class="keyword">public</span>:
-<a name="l00196"></a>00196         start_scan( sum_node_type*& return_slot_, start_scan& parent_, sum_node_type* parent_sum_ ) :
-<a name="l00197"></a>00197             body(parent_.body),
-<a name="l00198"></a>00198             sum(parent_.sum),
-<a name="l00199"></a>00199             return_slot(&return_slot_),
-<a name="l00200"></a>00200             parent_sum(parent_sum_),
-<a name="l00201"></a>00201             is_final(parent_.is_final),
-<a name="l00202"></a>00202             is_right_child(false),
-<a name="l00203"></a>00203             range(parent_.range,split()),
-<a name="l00204"></a>00204             partition(parent_.partition,split())
-<a name="l00205"></a>00205         {
-<a name="l00206"></a>00206             __TBB_ASSERT( !*return_slot, NULL );
-<a name="l00207"></a>00207         }
-<a name="l00208"></a>00208 
-<a name="l00209"></a>00209         start_scan( sum_node_type*& return_slot_, <span class="keyword">const</span> Range& range_, final_sum_type& body_, <span class="keyword">const</span> Partitioner& partitioner_) :
-<a name="l00210"></a>00210             body(&body_),
-<a name="l00211"></a>00211             sum(NULL),
-<a name="l00212"></a>00212             return_slot(&return_slot_),
-<a name="l00213"></a>00213             parent_sum(NULL),
-<a name="l00214"></a>00214             is_final(true),
-<a name="l00215"></a>00215             is_right_child(false),
-<a name="l00216"></a>00216             range(range_),
-<a name="l00217"></a>00217             partition(partitioner_)
-<a name="l00218"></a>00218         {
-<a name="l00219"></a>00219             __TBB_ASSERT( !*return_slot, NULL );
-<a name="l00220"></a>00220         }
-<a name="l00221"></a>00221 
-<a name="l00222"></a>00222         <span class="keyword">static</span> <span class="keywordtype">void</span> run(  <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> Partitioner& partitioner ) {
-<a name="l00223"></a>00223             <span class="keywordflow">if</span>( !range.empty() ) {
-<a name="l00224"></a>00224                 <span class="keyword">typedef</span> internal::start_scan<Range,Body,Partitioner> start_pass1_type;
-<a name="l00225"></a>00225                 internal::sum_node<Range,Body>* root = NULL;
-<a name="l00226"></a>00226                 <span class="keyword">typedef</span> internal::final_sum<Range,Body> final_sum_type;
-<a name="l00227"></a>00227                 final_sum_type* temp_body = <span class="keyword">new</span>(<a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) final_sum_type( body );
-<a name="l00228"></a>00228                 start_pass1_type& pass1 = *<span class="keyword">new</span>(<a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) start_pass1_type(
-<a name="l00229"></a>00229                     <span class="comment">/*return_slot=*/</span>root,
-<a name="l00230"></a>00230                     range,
-<a name="l00231"></a>00231                     *temp_body,
-<a name="l00232"></a>00232                     partitioner );
-<a name="l00233"></a>00233                 <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( pass1 );
-<a name="l00234"></a>00234                 <span class="keywordflow">if</span>( root ) {
-<a name="l00235"></a>00235                     root->body = temp_body;
-<a name="l00236"></a>00236                     root->incoming = NULL;
-<a name="l00237"></a>00237                     root->stuff_last = &body;
-<a name="l00238"></a>00238                     <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( *root );
-<a name="l00239"></a>00239                 } <span class="keywordflow">else</span> {
-<a name="l00240"></a>00240                     body.assign(temp_body->body);
-<a name="l00241"></a>00241                     temp_body->finish_construction( range, NULL );
-<a name="l00242"></a>00242                     temp_body->destroy(*temp_body);
-<a name="l00243"></a>00243                 }
-<a name="l00244"></a>00244             }
-<a name="l00245"></a>00245         }
-<a name="l00246"></a>00246     };
-<a name="l00247"></a>00247 
-<a name="l00248"></a>00248     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner>
-<a name="l00249"></a>00249     task* start_scan<Range,Body,Partitioner>::execute() {
-<a name="l00250"></a>00250         <span class="keyword">typedef</span> internal::finish_scan<Range,Body> finish_pass1_type;
-<a name="l00251"></a>00251         finish_pass1_type* p = parent_sum ? static_cast<finish_pass1_type*>( parent() ) : NULL;
-<a name="l00252"></a>00252         <span class="comment">// Inspecting p->result.left_sum would ordinarily be a race condition.</span>
-<a name="l00253"></a>00253         <span class="comment">// But we inspect it only if we are not a stolen task, in which case we</span>
-<a name="l00254"></a>00254         <span class="comment">// know that task assigning to p->result.left_sum has completed.</span>
-<a name="l00255"></a>00255         <span class="keywordtype">bool</span> treat_as_stolen = is_right_child && (is_stolen_task() || body!=p->result.left_sum);
-<a name="l00256"></a>00256         <span class="keywordflow">if</span>( treat_as_stolen ) {
-<a name="l00257"></a>00257             <span class="comment">// Invocation is for right child that has been really stolen or needs to be virtually stolen</span>
-<a name="l00258"></a>00258             p->right_zombie = body = <span class="keyword">new</span>( allocate_root() ) final_sum_type(body->body);
-<a name="l00259"></a>00259             is_final = <span class="keyword">false</span>;
-<a name="l00260"></a>00260         }
-<a name="l00261"></a>00261         task* next_task = NULL;
-<a name="l00262"></a>00262         <span class="keywordflow">if</span>( (is_right_child && !treat_as_stolen) || !range.is_divisible() || partition.should_execute_range(*<span class="keyword">this</span>) ) {
-<a name="l00263"></a>00263             <span class="keywordflow">if</span>( is_final )
-<a name="l00264"></a>00264                 (body->body)( range, final_scan_tag() );
-<a name="l00265"></a>00265             <span class="keywordflow">else</span> <span class="keywordflow">if</span>( sum )
-<a name="l00266"></a>00266                 (body->body)( range, pre_scan_tag() );
-<a name="l00267"></a>00267             <span class="keywordflow">if</span>( sum ) 
-<a name="l00268"></a>00268                 *sum = body;
-<a name="l00269"></a>00269             __TBB_ASSERT( !*return_slot, NULL );
-<a name="l00270"></a>00270         } <span class="keywordflow">else</span> {
-<a name="l00271"></a>00271             sum_node_type* result;
-<a name="l00272"></a>00272             <span class="keywordflow">if</span>( parent_sum ) 
-<a name="l00273"></a>00273                 result = <span class="keyword">new</span>(allocate_additional_child_of(*parent_sum)) sum_node_type(range,<span class="comment">/*left_is_final=*/</span>is_final);
-<a name="l00274"></a>00274             <span class="keywordflow">else</span>
-<a name="l00275"></a>00275                 result = <span class="keyword">new</span>(<a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>()) sum_node_type(range,<span class="comment">/*left_is_final=*/</span>is_final);
-<a name="l00276"></a>00276             finish_pass1_type& c = *<span class="keyword">new</span>( allocate_continuation()) finish_pass1_type(*return_slot,sum,*result);
-<a name="l00277"></a>00277             <span class="comment">// Split off right child</span>
-<a name="l00278"></a>00278             start_scan& b = *<span class="keyword">new</span>( c.allocate_child() ) start_scan( <span class="comment">/*return_slot=*/</span>result->right, *<span class="keyword">this</span>, result );
-<a name="l00279"></a>00279             b.is_right_child = <span class="keyword">true</span>;    
-<a name="l00280"></a>00280             <span class="comment">// Left child is recycling of *this.  Must recycle this before spawning b, </span>
-<a name="l00281"></a>00281             <span class="comment">// otherwise b might complete and decrement c.ref_count() to zero, which</span>
-<a name="l00282"></a>00282             <span class="comment">// would cause c.execute() to run prematurely.</span>
-<a name="l00283"></a>00283             recycle_as_child_of(c);
-<a name="l00284"></a>00284             c.set_ref_count(2);
-<a name="l00285"></a>00285             c.spawn(b);
-<a name="l00286"></a>00286             sum = &result->left_sum;
-<a name="l00287"></a>00287             return_slot = &result->left;
-<a name="l00288"></a>00288             is_right_child = <span class="keyword">false</span>;
-<a name="l00289"></a>00289             next_task = <span class="keyword">this</span>;
-<a name="l00290"></a>00290             parent_sum = result; 
-<a name="l00291"></a>00291             __TBB_ASSERT( !*return_slot, NULL );
-<a name="l00292"></a>00292         }
-<a name="l00293"></a>00293         <span class="keywordflow">return</span> next_task;
-<a name="l00294"></a>00294     } 
-<a name="l00295"></a>00295 } <span class="comment">// namespace internal</span>
-<a name="l00297"></a>00297 <span class="comment"></span>
-<a name="l00298"></a>00298 <span class="comment">// Requirements on Range concept are documented in blocked_range.h</span>
-<a name="l00299"></a>00299 
-<a name="l00317"></a>00317 
-<a name="l00319"></a>00319 
-<a name="l00320"></a>00320 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00321"></a><a class="code" href="a00371.html#ged143f31dd3d96ded02ab3db915b91c7">00321</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body ) {
-<a name="l00322"></a>00322     internal::start_scan<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());
-<a name="l00323"></a>00323 }
-<a name="l00324"></a>00324 
-<a name="l00326"></a>00326 
-<a name="l00327"></a>00327 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00328"></a><a class="code" href="a00371.html#gc9fac8870b2e6365fb337014404529df">00328</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>& partitioner ) {
-<a name="l00329"></a>00329     internal::start_scan<Range,Body,simple_partitioner>::run(range,body,partitioner);
-<a name="l00330"></a>00330 }
-<a name="l00331"></a>00331 
-<a name="l00333"></a>00333 
-<a name="l00334"></a>00334 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body>
-<a name="l00335"></a><a class="code" href="a00371.html#g62fde400a37bbca1a2fddc8e3d22f556">00335</a> <span class="keywordtype">void</span> <a class="code" href="a00371.html#ged143f31dd3d96ded02ab3db915b91c7">parallel_scan</a>( <span class="keyword">const</span> Range& range, Body& body, <span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>& partitioner ) {
-<a name="l00336"></a>00336     internal::start_scan<Range,Body,auto_partitioner>::run(range,body,partitioner);
-<a name="l00337"></a>00337 }
-<a name="l00339"></a>00339 
-<a name="l00340"></a>00340 } <span class="comment">// namespace tbb</span>
-<a name="l00341"></a>00341 
-<a name="l00342"></a>00342 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_parallel_scan_H */</span>
-<a name="l00343"></a>00343 
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00531.html b/doc/html/a00531.html
new file mode 100644
index 0000000..a62ae53
--- /dev/null
+++ b/doc/html/a00531.html
@@ -0,0 +1,500 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>partitioner.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+<link href="tabs.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.4.7 -->
+<div class="tabs">
+  <ul>
+    <li><a href="index.html"><span>Main Page</span></a></li>
+    <li><a href="modules.html"><span>Modules</span></a></li>
+    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+    <li><a href="annotated.html"><span>Classes</span></a></li>
+    <li id="current"><a href="files.html"><span>Files</span></a></li>
+    <li><a href="pages.html"><span>Related Pages</span></a></li>
+  </ul></div>
+<div class="tabs">
+  <ul>
+    <li><a href="files.html"><span>File List</span></a></li>
+    <li><a href="globals.html"><span>File Members</span></a></li>
+  </ul></div>
+<h1>partitioner.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
+<a name="l00003"></a>00003 <span class="comment"></span>
+<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
+<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
+<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
+<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
+<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
+<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
+<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
+<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
+<a name="l00012"></a>00012 <span class="comment"></span>
+<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
+<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
+<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
+<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
+<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
+<a name="l00018"></a>00018 <span class="comment">    writing.</span>
+<a name="l00019"></a>00019 <span class="comment">*/</span>
+<a name="l00020"></a>00020 
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_partitioner_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_partitioner_H</span>
+<a name="l00023"></a>00023 <span class="preprocessor"></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#ifndef __TBB_INITIAL_CHUNKS</span>
+<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_INITIAL_CHUNKS 2</span>
+<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_RANGE_POOL_CAPACITY</span>
+<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_RANGE_POOL_CAPACITY 8</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_INIT_DEPTH</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_INIT_DEPTH 5</span>
+<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span>
+<a name="l00034"></a>00034 <span class="preprocessor">#include "task.h"</span>
+<a name="l00035"></a>00035 <span class="preprocessor">#include "aligned_space.h"</span>
+<a name="l00036"></a>00036 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00037"></a>00037 
+<a name="l00038"></a>00038 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span>    <span class="comment">// Workaround for overzealous compiler warnings </span>
+<a name="l00040"></a>00040 <span class="preprocessor">    #pragma warning (push)</span>
+<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4244)</span>
+<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span>
+<a name="l00044"></a>00044 <span class="keyword">namespace </span>tbb {
+<a name="l00045"></a>00045 
+<a name="l00046"></a>00046 <span class="keyword">class </span>auto_partitioner;
+<a name="l00047"></a>00047 <span class="keyword">class </span>simple_partitioner;
+<a name="l00048"></a>00048 <span class="keyword">class </span>affinity_partitioner;
+<a name="l00049"></a>00049 <span class="keyword">namespace </span>interface6 {
+<a name="l00050"></a>00050     <span class="keyword">namespace </span>internal {
+<a name="l00051"></a>00051         <span class="keyword">class </span>affinity_partition_type;
+<a name="l00052"></a>00052     }
+<a name="l00053"></a>00053 }
+<a name="l00054"></a>00054 
+<a name="l00055"></a>00055 <span class="keyword">namespace </span>internal {
+<a name="l00056"></a>00056 size_t __TBB_EXPORTED_FUNC get_initial_auto_partitioner_divisor();
+<a name="l00057"></a>00057 
+<a name="l00059"></a><a class="code" href="a00226.html">00059</a> <span class="keyword">class </span><a class="code" href="a00226.html">affinity_partitioner_base_v3</a>: no_copy {
+<a name="l00060"></a>00060     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00225.html">tbb::affinity_partitioner</a>;
+<a name="l00061"></a>00061     <span class="keyword">friend</span> <span class="keyword">class </span>tbb::interface6::internal::affinity_partition_type;
+<a name="l00063"></a>00063 
+<a name="l00064"></a>00064     affinity_id* my_array;
+<a name="l00066"></a>00066     size_t my_size;
+<a name="l00068"></a>00068     <a class="code" href="a00226.html">affinity_partitioner_base_v3</a>() : my_array(NULL), my_size(0) {}
+<a name="l00070"></a>00070     ~<a class="code" href="a00226.html">affinity_partitioner_base_v3</a>() {resize(0);}
+<a name="l00072"></a>00072 
+<a name="l00073"></a>00073     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD resize( <span class="keywordtype">unsigned</span> factor );
+<a name="l00074"></a>00074 };
+<a name="l00075"></a>00075 
+<a name="l00077"></a><a class="code" href="a00283.html">00077</a> <span class="keyword">class </span><a class="code" href="a00283.html">partition_type_base</a> {
+<a name="l00078"></a>00078 <span class="keyword">public</span>:
+<a name="l00079"></a>00079     <span class="keywordtype">void</span> set_affinity( <a class="code" href="a00311.html">task</a> & ) {}
+<a name="l00080"></a>00080     <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> ) {}
+<a name="l00081"></a>00081     <a class="code" href="a00311.html">task</a>* continue_after_execute_range() {<span class="keywordflow">return</span> NULL;}
+<a name="l00082"></a>00082     <span class="keywordtype">bool</span> decide_whether_to_delay() {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
+<a name="l00083"></a>00083     <span class="keywordtype">void</span> spawn_or_delay( <span class="keywordtype">bool</span>, <a class="code" href="a00311.html">task</a>& b ) {
+<a name="l00084"></a>00084         task::spawn(b);
+<a name="l00085"></a>00085     }
+<a name="l00086"></a>00086 };
+<a name="l00087"></a>00087 
+<a name="l00088"></a>00088 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_scan;
+<a name="l00089"></a>00089 
+<a name="l00090"></a>00090 } <span class="comment">// namespace internal</span>
+<a name="l00092"></a>00092 <span class="comment"></span>
+<a name="l00093"></a>00093 <span class="keyword">namespace </span>serial {
+<a name="l00094"></a>00094 <span class="keyword">namespace </span>interface6 {
+<a name="l00095"></a>00095 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_for;
+<a name="l00096"></a>00096 }
+<a name="l00097"></a>00097 }
+<a name="l00098"></a>00098 
+<a name="l00099"></a>00099 <span class="keyword">namespace </span>interface6 {
+<a name="l00101"></a>00101 <span class="keyword">namespace </span>internal {
+<a name="l00102"></a>00102 <span class="keyword">using namespace </span>tbb::internal;
+<a name="l00103"></a>00103 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_for;
+<a name="l00104"></a>00104 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_reduce;
+<a name="l00105"></a>00105 
+<a name="l00107"></a>00107 <span class="keyword">class </span>flag_task: <span class="keyword">public</span> task {
+<a name="l00108"></a>00108 <span class="keyword">public</span>:
+<a name="l00109"></a>00109     <a class="code" href="a00228.html">tbb::atomic<bool></a> child_stolen;
+<a name="l00110"></a>00110     flag_task() { child_stolen = <span class="keyword">false</span>; }
+<a name="l00111"></a>00111     task* execute() { <span class="keywordflow">return</span> NULL; }
+<a name="l00112"></a>00112 };
+<a name="l00113"></a>00113 
+<a name="l00115"></a>00115 <span class="keyword">class </span>signal_task: <span class="keyword">public</span> task {
+<a name="l00116"></a>00116 <span class="keyword">public</span>:
+<a name="l00117"></a>00117     task* execute() {
+<a name="l00118"></a>00118         <span class="keywordflow">if</span>( is_stolen_task() ) {
+<a name="l00119"></a>00119             static_cast<flag_task*>(parent())->child_stolen = <span class="keyword">true</span>;
+<a name="l00120"></a>00120         }
+<a name="l00121"></a>00121         <span class="keywordflow">return</span> NULL;
+<a name="l00122"></a>00122     }
+<a name="l00123"></a>00123 };
+<a name="l00124"></a>00124 
+<a name="l00128"></a>00128 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> depth_t;
+<a name="l00129"></a>00129 
+<a name="l00131"></a>00131 <span class="keyword">template</span> <<span class="keyword">typename</span> T, depth_t MaxCapacity>
+<a name="l00132"></a>00132 <span class="keyword">class </span>range_vector {
+<a name="l00133"></a>00133     depth_t my_head;
+<a name="l00134"></a>00134     depth_t my_tail;
+<a name="l00135"></a>00135     depth_t my_size;
+<a name="l00136"></a>00136     depth_t my_depth[MaxCapacity]; <span class="comment">// relative depths of stored ranges</span>
+<a name="l00137"></a>00137     <a class="code" href="a00227.html">tbb::aligned_space<T, MaxCapacity></a> my_pool;
+<a name="l00138"></a>00138 
+<a name="l00139"></a>00139 <span class="keyword">public</span>:
+<a name="l00141"></a>00141     range_vector(<span class="keyword">const</span> T& elem) : my_head(0), my_tail(0), my_size(1) {
+<a name="l00142"></a>00142         my_depth[0] = 0;
+<a name="l00143"></a>00143         <span class="keyword">new</span>( my_pool.begin() ) T(elem);<span class="comment">//TODO: std::move?</span>
+<a name="l00144"></a>00144     }
+<a name="l00145"></a>00145     ~range_vector() {
+<a name="l00146"></a>00146         <span class="keywordflow">while</span>( !empty() ) pop_back();
+<a name="l00147"></a>00147     }
+<a name="l00148"></a>00148     <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size == 0; }
+<a name="l00149"></a>00149     depth_t size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_size; }
+<a name="l00152"></a>00152     <span class="keywordtype">void</span> split_to_fill(depth_t max_depth) {
+<a name="l00153"></a>00153         <span class="keywordflow">while</span>( my_size < MaxCapacity && my_depth[my_head] < max_depth
+<a name="l00154"></a>00154           && my_pool.begin()[my_head].is_divisible() ) {
+<a name="l00155"></a>00155             depth_t prev = my_head;
+<a name="l00156"></a>00156             my_head = (my_head + 1) % MaxCapacity;
+<a name="l00157"></a>00157             <span class="keyword">new</span>(my_pool.begin()+my_head) T(my_pool.begin()[prev]); <span class="comment">// copy TODO: std::move?</span>
+<a name="l00158"></a>00158             my_pool.begin()[prev].~T(); <span class="comment">// instead of assignment</span>
+<a name="l00159"></a>00159             <span class="keyword">new</span>(my_pool.begin()+prev) T(my_pool.begin()[my_head], split()); <span class="comment">// do 'inverse' split</span>
+<a name="l00160"></a>00160             my_depth[my_head] = ++my_depth[prev];
+<a name="l00161"></a>00161             my_size++;
+<a name="l00162"></a>00162         }
+<a name="l00163"></a>00163     }
+<a name="l00164"></a>00164     <span class="keywordtype">void</span> pop_back() {
+<a name="l00165"></a>00165         __TBB_ASSERT(my_size > 0, <span class="stringliteral">"range_vector::pop_back() with empty size"</span>);
+<a name="l00166"></a>00166         my_pool.begin()[my_head].~T();
+<a name="l00167"></a>00167         my_size--;
+<a name="l00168"></a>00168         my_head = (my_head + MaxCapacity - 1) % MaxCapacity;
+<a name="l00169"></a>00169     }
+<a name="l00170"></a>00170     <span class="keywordtype">void</span> pop_front() {
+<a name="l00171"></a>00171         __TBB_ASSERT(my_size > 0, <span class="stringliteral">"range_vector::pop_front() with empty size"</span>);
+<a name="l00172"></a>00172         my_pool.begin()[my_tail].~T();
+<a name="l00173"></a>00173         my_size--;
+<a name="l00174"></a>00174         my_tail = (my_tail + 1) % MaxCapacity;
+<a name="l00175"></a>00175     }
+<a name="l00176"></a>00176     T& back() {
+<a name="l00177"></a>00177         __TBB_ASSERT(my_size > 0, <span class="stringliteral">"range_vector::back() with empty size"</span>);
+<a name="l00178"></a>00178         <span class="keywordflow">return</span> my_pool.begin()[my_head];
+<a name="l00179"></a>00179     }
+<a name="l00180"></a>00180     T& front() {
+<a name="l00181"></a>00181         __TBB_ASSERT(my_size > 0, <span class="stringliteral">"range_vector::front() with empty size"</span>);
+<a name="l00182"></a>00182         <span class="keywordflow">return</span> my_pool.begin()[my_tail];
+<a name="l00183"></a>00183     }
+<a name="l00185"></a>00185     depth_t front_depth() {
+<a name="l00186"></a>00186         __TBB_ASSERT(my_size > 0, <span class="stringliteral">"range_vector::front_depth() with empty size"</span>);
+<a name="l00187"></a>00187         <span class="keywordflow">return</span> my_depth[my_tail];
+<a name="l00188"></a>00188     }
+<a name="l00189"></a>00189 };
+<a name="l00190"></a>00190 
+<a name="l00192"></a>00192 <span class="keyword">template</span> <<span class="keyword">typename</span> Partition>
+<a name="l00193"></a>00193 <span class="keyword">struct </span>partition_type_base {
+<a name="l00194"></a>00194     <span class="comment">// decision makers</span>
+<a name="l00195"></a>00195     <span class="keywordtype">void</span> set_affinity( task & ) {}
+<a name="l00196"></a>00196     <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> ) {}
+<a name="l00197"></a>00197     <span class="keywordtype">bool</span> check_being_stolen(task &) { <span class="keywordflow">return</span> <span class="keyword">false</span>; } <span class="comment">// part of old should_execute_range()</span>
+<a name="l00198"></a>00198     <span class="keywordtype">bool</span> check_for_demand(task &) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00199"></a>00199     <span class="keywordtype">bool</span> divisions_left() { <span class="keywordflow">return</span> <span class="keyword">true</span>; } <span class="comment">// part of old should_execute_range()</span>
+<a name="l00200"></a>00200     <span class="keywordtype">bool</span> should_create_trap() { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00201"></a>00201     depth_t max_depth() { <span class="keywordflow">return</span> 0; }
+<a name="l00202"></a>00202     <span class="keywordtype">void</span> align_depth(depth_t) { }
+<a name="l00203"></a>00203     <span class="comment">// common function blocks</span>
+<a name="l00204"></a>00204     Partition& derived() { <span class="keywordflow">return</span> *static_cast<Partition*>(<span class="keyword">this</span>); }
+<a name="l00205"></a>00205     <span class="keyword">template</span><<span class="keyword">typename</span> StartType>
+<a name="l00206"></a>00206     flag_task* split_work(StartType &start) {
+<a name="l00207"></a>00207         flag_task* parent_ptr = start.create_continuation(); <span class="comment">// the type here is to express expectation</span>
+<a name="l00208"></a>00208         start.set_parent(parent_ptr);
+<a name="l00209"></a>00209         parent_ptr->set_ref_count(2);
+<a name="l00210"></a>00210         StartType& right_work = *<span class="keyword">new</span>( parent_ptr->allocate_child() ) StartType(start, split());
+<a name="l00211"></a>00211         start.spawn(right_work);
+<a name="l00212"></a>00212         <span class="keywordflow">return</span> parent_ptr;
+<a name="l00213"></a>00213     }
+<a name="l00214"></a>00214     <span class="keyword">template</span><<span class="keyword">typename</span> StartType, <span class="keyword">typename</span> Range>
+<a name="l00215"></a>00215     <span class="keywordtype">void</span> execute(StartType &start, Range &range) {
+<a name="l00216"></a>00216         <span class="comment">// The algorithm in a few words ([]-denotes calls to decision mathods of partitioner):</span>
+<a name="l00217"></a>00217         <span class="comment">// [If this task is stolen, adjust depth and divisions if necessary, set flag].</span>
+<a name="l00218"></a>00218         <span class="comment">// If range is divisible {</span>
+<a name="l00219"></a>00219         <span class="comment">//    Spread the work while [initial divisions left];</span>
+<a name="l00220"></a>00220         <span class="comment">//    Create trap task [if necessary];</span>
+<a name="l00221"></a>00221         <span class="comment">// }</span>
+<a name="l00222"></a>00222         <span class="comment">// If not divisible or [max depth is reached], execute, else do the range pool part</span>
+<a name="l00223"></a>00223         task* parent_ptr = start.parent();
+<a name="l00224"></a>00224         <span class="keywordflow">if</span>( range.is_divisible() ) {
+<a name="l00225"></a>00225             <span class="keywordflow">if</span>( derived().divisions_left() )
+<a name="l00226"></a>00226                 <span class="keywordflow">do</span> parent_ptr = split_work(start); <span class="comment">// split until divisions_left()</span>
+<a name="l00227"></a>00227                 <span class="keywordflow">while</span>( range.is_divisible() && derived().divisions_left() );
+<a name="l00228"></a>00228             <span class="keywordflow">if</span>( derived().should_create_trap() ) { <span class="comment">// only for range pool</span>
+<a name="l00229"></a>00229                 <span class="keywordflow">if</span>( parent_ptr->ref_count() > 1 ) { <span class="comment">// create new parent if necessary</span>
+<a name="l00230"></a>00230                     parent_ptr = start.create_continuation();
+<a name="l00231"></a>00231                     start.set_parent(parent_ptr);
+<a name="l00232"></a>00232                 } <span class="keywordflow">else</span> __TBB_ASSERT(parent_ptr->ref_count() == 1, NULL);
+<a name="l00233"></a>00233                 parent_ptr->set_ref_count(2); <span class="comment">// safe because parent has only one reference</span>
+<a name="l00234"></a>00234                 signal_task& right_signal = *<span class="keyword">new</span>( parent_ptr->allocate_child() ) signal_task();
+<a name="l00235"></a>00235                 start.spawn(right_signal); <span class="comment">// pure signal is to avoid deep recursion in the end</span>
+<a name="l00236"></a>00236             }
+<a name="l00237"></a>00237         }
+<a name="l00238"></a>00238         <span class="keywordflow">if</span>( !range.is_divisible() || !derived().max_depth() )
+<a name="l00239"></a>00239             start.run_body( range ); <span class="comment">// simple partitioner goes always here</span>
+<a name="l00240"></a>00240         <span class="keywordflow">else</span> { <span class="comment">// do range pool</span>
+<a name="l00241"></a>00241             internal::range_vector<Range, Partition::range_pool_size> range_pool(range);
+<a name="l00242"></a>00242             <span class="keywordflow">do</span> {
+<a name="l00243"></a>00243                 range_pool.split_to_fill(derived().max_depth()); <span class="comment">// fill range pool</span>
+<a name="l00244"></a>00244                 <span class="keywordflow">if</span>( derived().check_for_demand( start ) ) {
+<a name="l00245"></a>00245                     <span class="keywordflow">if</span>( range_pool.size() > 1 ) {
+<a name="l00246"></a>00246                         parent_ptr = start.create_continuation();
+<a name="l00247"></a>00247                         start.set_parent(parent_ptr);
+<a name="l00248"></a>00248                         parent_ptr->set_ref_count(2);
+<a name="l00249"></a>00249                         StartType& right_work = *<span class="keyword">new</span>( parent_ptr->allocate_child() ) StartType(start, range_pool.front(), range_pool.front_depth());
+<a name="l00250"></a>00250                         start.spawn(right_work);
+<a name="l00251"></a>00251                         range_pool.pop_front();
+<a name="l00252"></a>00252                         <span class="keywordflow">continue</span>;
+<a name="l00253"></a>00253                     }
+<a name="l00254"></a>00254                     <span class="keywordflow">if</span>( range_pool.back().is_divisible() ) <span class="comment">// was not enough depth to fork a task</span>
+<a name="l00255"></a>00255                         <span class="keywordflow">continue</span>; <span class="comment">// note: check_for_demand() should guarantee increasing max_depth() next time</span>
+<a name="l00256"></a>00256                 }
+<a name="l00257"></a>00257                 start.run_body( range_pool.back() );
+<a name="l00258"></a>00258                 range_pool.pop_back();  
+<a name="l00259"></a>00259             } <span class="keywordflow">while</span>( !range_pool.empty() && !start.is_cancelled() );
+<a name="l00260"></a>00260         }
+<a name="l00261"></a>00261     }
+<a name="l00262"></a>00262 };
+<a name="l00263"></a>00263 
+<a name="l00265"></a>00265 <span class="keyword">template</span> <<span class="keyword">typename</span> Partition>
+<a name="l00266"></a>00266 <span class="keyword">struct </span>auto_partition_type_base : partition_type_base<Partition> {
+<a name="l00267"></a>00267     size_t my_divisor;
+<a name="l00268"></a>00268     depth_t my_max_depth;
+<a name="l00269"></a>00269     auto_partition_type_base() : my_max_depth(__TBB_INIT_DEPTH) {
+<a name="l00270"></a>00270         my_divisor = tbb::internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4;
+<a name="l00271"></a>00271         __TBB_ASSERT(my_divisor, <span class="stringliteral">"initial value of get_initial_auto_partitioner_divisor() is not valid"</span>);
+<a name="l00272"></a>00272     }
+<a name="l00273"></a>00273     auto_partition_type_base(auto_partition_type_base &src, split) {
+<a name="l00274"></a>00274         my_max_depth = src.my_max_depth;
+<a name="l00275"></a>00275 <span class="preprocessor">#if __TBB_INITIAL_TASK_IMBALANCE</span>
+<a name="l00276"></a>00276 <span class="preprocessor"></span>        <span class="keywordflow">if</span>( src.my_divisor <= 1 ) my_divisor = 0;
+<a name="l00277"></a>00277         <span class="keywordflow">else</span> my_divisor = src.my_divisor = (src.my_divisor+1u) / 2u;
+<a name="l00278"></a>00278 <span class="preprocessor">#else</span>
+<a name="l00279"></a>00279 <span class="preprocessor"></span>        my_divisor = src.my_divisor / 2u;
+<a name="l00280"></a>00280         src.my_divisor = src.my_divisor - my_divisor; <span class="comment">// TODO: check the effect separately</span>
+<a name="l00281"></a>00281         <span class="keywordflow">if</span>(my_divisor) src.my_max_depth += static_cast<depth_t>(__TBB_Log2(src.my_divisor/my_divisor));
+<a name="l00282"></a>00282 <span class="preprocessor">#endif</span>
+<a name="l00283"></a>00283 <span class="preprocessor"></span>    }
+<a name="l00284"></a>00284     <span class="keywordtype">bool</span> check_being_stolen( task &t) { <span class="comment">// part of old should_execute_range()</span>
+<a name="l00285"></a>00285         <span class="keywordflow">if</span>( !my_divisor ) {
+<a name="l00286"></a>00286             my_divisor = 1; <span class="comment">// todo: replace by on-stack flag (partition_state's member)?</span>
+<a name="l00287"></a>00287             <span class="keywordflow">if</span>( t.is_stolen_task() ) {
+<a name="l00288"></a>00288 #<span class="keywordflow">if</span> TBB_USE_EXCEPTIONS
+<a name="l00289"></a>00289                 <span class="comment">// RTTI is available, check whether the cast is valid</span>
+<a name="l00290"></a>00290                 __TBB_ASSERT(dynamic_cast<flag_task*>(t.parent()), 0);
+<a name="l00291"></a>00291                 <span class="comment">// correctess of the cast rely on avoiding the root task for which:</span>
+<a name="l00292"></a>00292                 <span class="comment">// - initial value of my_divisor != 0 (protected by separate assertion)</span>
+<a name="l00293"></a>00293                 <span class="comment">// - is_stolen_task() always return false for the root task.</span>
+<a name="l00294"></a>00294 <span class="preprocessor">#endif</span>
+<a name="l00295"></a>00295 <span class="preprocessor"></span>                static_cast<flag_task*>(t.parent())->child_stolen = <span class="keyword">true</span>;
+<a name="l00296"></a>00296                 my_max_depth++;
+<a name="l00297"></a>00297                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00298"></a>00298             }
+<a name="l00299"></a>00299         }
+<a name="l00300"></a>00300         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00301"></a>00301     }
+<a name="l00302"></a>00302     <span class="keywordtype">bool</span> divisions_left() { <span class="comment">// part of old should_execute_range()</span>
+<a name="l00303"></a>00303         <span class="keywordflow">if</span>( my_divisor > 1 ) <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00304"></a>00304         <span class="keywordflow">if</span>( my_divisor && my_max_depth > 1 ) { <span class="comment">// can split the task and once more internally. TODO: on-stack flag instead</span>
+<a name="l00305"></a>00305             <span class="comment">// keep same fragmentation while splitting for the local task pool</span>
+<a name="l00306"></a>00306             my_max_depth--;
+<a name="l00307"></a>00307             my_divisor = 0;
+<a name="l00308"></a>00308             <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00309"></a>00309         } <span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00310"></a>00310     }
+<a name="l00311"></a>00311     <span class="keywordtype">bool</span> should_create_trap() {
+<a name="l00312"></a>00312         <span class="keywordflow">return</span> my_divisor > 0;
+<a name="l00313"></a>00313     }
+<a name="l00314"></a>00314     <span class="keywordtype">bool</span> check_for_demand(task &t) {
+<a name="l00315"></a>00315         <span class="keywordflow">if</span>( static_cast<flag_task*>(t.parent())->child_stolen ) {
+<a name="l00316"></a>00316             my_max_depth++;
+<a name="l00317"></a>00317             <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00318"></a>00318         } <span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00319"></a>00319     }
+<a name="l00320"></a>00320     <span class="keywordtype">void</span> align_depth(depth_t base) {
+<a name="l00321"></a>00321         __TBB_ASSERT(base <= my_max_depth, 0);
+<a name="l00322"></a>00322         my_max_depth -= base;
+<a name="l00323"></a>00323     }
+<a name="l00324"></a>00324     depth_t max_depth() { <span class="keywordflow">return</span> my_max_depth; }
+<a name="l00325"></a>00325 };
+<a name="l00326"></a>00326 
+<a name="l00328"></a>00328 <span class="keyword">class </span>affinity_partition_type : <span class="keyword">public</span> auto_partition_type_base<affinity_partition_type> {
+<a name="l00329"></a>00329     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> factor_power = 4;
+<a name="l00330"></a>00330     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> factor = 1<<factor_power;
+<a name="l00331"></a>00331     <span class="keywordtype">bool</span> my_delay;
+<a name="l00332"></a>00332     <span class="keywordtype">unsigned</span> map_begin, map_end, map_mid;
+<a name="l00333"></a>00333     tbb::internal::affinity_id* my_array;
+<a name="l00334"></a>00334     <span class="keywordtype">void</span> set_mid() {
+<a name="l00335"></a>00335         <span class="keywordtype">unsigned</span> d = (map_end - map_begin)/2; <span class="comment">// we could add 1 but it is rather for LIFO affinity</span>
+<a name="l00336"></a>00336         <span class="keywordflow">if</span>( d > factor )
+<a name="l00337"></a>00337             d &= 0u-factor;
+<a name="l00338"></a>00338         map_mid = map_end - d;
+<a name="l00339"></a>00339     }
+<a name="l00340"></a>00340 <span class="keyword">public</span>:
+<a name="l00341"></a>00341     affinity_partition_type( <a class="code" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a>& ap ) {
+<a name="l00342"></a>00342         __TBB_ASSERT( (factor&(factor-1))==0, <span class="stringliteral">"factor must be power of two"</span> ); 
+<a name="l00343"></a>00343         ap.<a class="code" href="a00226.html#d9122ca5725982c602da44dae0acc603">resize</a>(factor);
+<a name="l00344"></a>00344         my_array = ap.<a class="code" href="a00226.html#8681a00f14b6ad375d63b104c24bef17">my_array</a>;
+<a name="l00345"></a>00345         map_begin = 0;
+<a name="l00346"></a>00346         map_end = unsigned(ap.<a class="code" href="a00226.html#8562953693788ae691865453b1ff3a5d">my_size</a>);
+<a name="l00347"></a>00347         set_mid();
+<a name="l00348"></a>00348         my_delay = <span class="keyword">true</span>;
+<a name="l00349"></a>00349         my_divisor /= __TBB_INITIAL_CHUNKS; <span class="comment">// let excatly P tasks to be distributed across workers</span>
+<a name="l00350"></a>00350         my_max_depth = factor_power+1; <span class="comment">// the first factor_power ranges will be spawned, and >=1 ranges should left</span>
+<a name="l00351"></a>00351         __TBB_ASSERT( my_max_depth < __TBB_RANGE_POOL_CAPACITY, 0 );
+<a name="l00352"></a>00352     }
+<a name="l00353"></a>00353     affinity_partition_type(affinity_partition_type& p, split)
+<a name="l00354"></a>00354         : auto_partition_type_base<affinity_partition_type>(p, split()), my_array(p.my_array) {
+<a name="l00355"></a>00355         __TBB_ASSERT( p.map_end-p.map_begin<factor || (p.map_end-p.map_begin)%factor==0, NULL );
+<a name="l00356"></a>00356         map_end = p.map_end;
+<a name="l00357"></a>00357         map_begin = p.map_end = p.map_mid;
+<a name="l00358"></a>00358         set_mid(); p.set_mid();
+<a name="l00359"></a>00359         my_delay = p.my_delay;
+<a name="l00360"></a>00360     }
+<a name="l00361"></a>00361     <span class="keywordtype">void</span> set_affinity( task &t ) {
+<a name="l00362"></a>00362         <span class="keywordflow">if</span>( map_begin<map_end )
+<a name="l00363"></a>00363             t.set_affinity( my_array[map_begin] );
+<a name="l00364"></a>00364     }
+<a name="l00365"></a>00365     <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> <span class="keywordtype">id</span> ) {
+<a name="l00366"></a>00366         <span class="keywordflow">if</span>( map_begin<map_end ) 
+<a name="l00367"></a>00367             my_array[map_begin] = id;
+<a name="l00368"></a>00368     }
+<a name="l00369"></a>00369     <span class="keywordtype">bool</span> check_for_demand( task &t ) {
+<a name="l00370"></a>00370         <span class="keywordflow">if</span>( !my_delay ) {
+<a name="l00371"></a>00371             <span class="keywordflow">if</span>( map_mid<map_end ) {
+<a name="l00372"></a>00372                 __TBB_ASSERT(my_max_depth>__TBB_Log2(map_end-map_mid), 0);
+<a name="l00373"></a>00373                 <span class="keywordflow">return</span> <span class="keyword">true</span>;<span class="comment">// do not do my_max_depth++ here, but be sure my_max_depth is big enough</span>
+<a name="l00374"></a>00374             }
+<a name="l00375"></a>00375             <span class="keywordflow">if</span>( static_cast<flag_task*>(t.parent())->child_stolen ) {
+<a name="l00376"></a>00376                 my_max_depth++;
+<a name="l00377"></a>00377                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00378"></a>00378             }
+<a name="l00379"></a>00379         } <span class="keywordflow">else</span> my_delay = <span class="keyword">false</span>;
+<a name="l00380"></a>00380         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00381"></a>00381     }
+<a name="l00382"></a>00382     <span class="keywordtype">bool</span> divisions_left() { <span class="comment">// part of old should_execute_range()</span>
+<a name="l00383"></a>00383         <span class="keywordflow">return</span> my_divisor > 1;
+<a name="l00384"></a>00384     }
+<a name="l00385"></a>00385     <span class="keywordtype">bool</span> should_create_trap() {
+<a name="l00386"></a>00386         <span class="keywordflow">return</span> <span class="keyword">true</span>; <span class="comment">// TODO: rethink for the stage after memorizing level</span>
+<a name="l00387"></a>00387     }
+<a name="l00388"></a>00388     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> range_pool_size = __TBB_RANGE_POOL_CAPACITY;
+<a name="l00389"></a>00389 };
+<a name="l00390"></a>00390 
+<a name="l00391"></a>00391 <span class="keyword">class </span>auto_partition_type: <span class="keyword">public</span> auto_partition_type_base<auto_partition_type> {
+<a name="l00392"></a>00392 <span class="keyword">public</span>:
+<a name="l00393"></a>00393     auto_partition_type( <span class="keyword">const</span> auto_partitioner& ) {}
+<a name="l00394"></a>00394     auto_partition_type( auto_partition_type& src, split)
+<a name="l00395"></a>00395       : auto_partition_type_base<auto_partition_type>(src, split()) {}
+<a name="l00396"></a>00396     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> range_pool_size = __TBB_RANGE_POOL_CAPACITY;
+<a name="l00397"></a>00397 };
+<a name="l00398"></a>00398 
+<a name="l00399"></a>00399 <span class="keyword">class </span>simple_partition_type: <span class="keyword">public</span> partition_type_base<simple_partition_type> {
+<a name="l00400"></a>00400 <span class="keyword">public</span>:
+<a name="l00401"></a>00401     simple_partition_type( <span class="keyword">const</span> simple_partitioner& ) {}
+<a name="l00402"></a>00402     simple_partition_type( <span class="keyword">const</span> simple_partition_type&, split ) {}
+<a name="l00404"></a>00404     <span class="keyword">template</span><<span class="keyword">typename</span> StartType, <span class="keyword">typename</span> Range>
+<a name="l00405"></a>00405     <span class="keywordtype">void</span> execute(StartType &start, Range &range) {
+<a name="l00406"></a>00406         <span class="keywordflow">while</span>( range.is_divisible() )
+<a name="l00407"></a>00407             split_work( start );
+<a name="l00408"></a>00408         start.run_body( range );
+<a name="l00409"></a>00409     }
+<a name="l00410"></a>00410     <span class="comment">//static const unsigned range_pool_size = 1; - not necessary because execute() is overridden</span>
+<a name="l00411"></a>00411 };
+<a name="l00412"></a>00412 
+<a name="l00414"></a>00414 <span class="keyword">class </span>old_auto_partition_type: <span class="keyword">public</span> tbb::internal::partition_type_base {
+<a name="l00415"></a>00415     size_t num_chunks;
+<a name="l00416"></a>00416     <span class="keyword">static</span> <span class="keyword">const</span> size_t VICTIM_CHUNKS = 4;
+<a name="l00417"></a>00417 <span class="keyword">public</span>:
+<a name="l00418"></a>00418     <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> task &t) {
+<a name="l00419"></a>00419         <span class="keywordflow">if</span>( num_chunks<VICTIM_CHUNKS && t.is_stolen_task() )
+<a name="l00420"></a>00420             num_chunks = VICTIM_CHUNKS;
+<a name="l00421"></a>00421         <span class="keywordflow">return</span> num_chunks==1;
+<a name="l00422"></a>00422     }
+<a name="l00423"></a>00423     old_auto_partition_type( <span class="keyword">const</span> auto_partitioner& )
+<a name="l00424"></a>00424       : num_chunks(internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4) {}
+<a name="l00425"></a>00425     old_auto_partition_type( <span class="keyword">const</span> affinity_partitioner& )
+<a name="l00426"></a>00426       : num_chunks(internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4) {}
+<a name="l00427"></a>00427     old_auto_partition_type( old_auto_partition_type& pt, split ) {
+<a name="l00428"></a>00428         num_chunks = pt.num_chunks = (pt.num_chunks+1u) / 2u;
+<a name="l00429"></a>00429     }
+<a name="l00430"></a>00430 };
+<a name="l00431"></a>00431 
+<a name="l00432"></a>00432 } <span class="comment">// namespace interfaceX::internal</span>
+<a name="l00434"></a>00434 <span class="comment"></span>} <span class="comment">// namespace interfaceX</span>
+<a name="l00435"></a>00435 
+<a name="l00437"></a>00437 
+<a name="l00439"></a><a class="code" href="a00303.html">00439</a> <span class="keyword">class </span><a class="code" href="a00303.html">simple_partitioner</a> {
+<a name="l00440"></a>00440 <span class="keyword">public</span>:
+<a name="l00441"></a>00441     <a class="code" href="a00303.html">simple_partitioner</a>() {}
+<a name="l00442"></a>00442 <span class="keyword">private</span>:
+<a name="l00443"></a>00443     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>serial::interface6::start_for;
+<a name="l00444"></a>00444     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>interface6::internal::start_for;
+<a name="l00445"></a>00445     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>interface6::internal::start_reduce;
+<a name="l00446"></a>00446     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
+<a name="l00447"></a>00447     <span class="comment">// backward compatibility</span>
+<a name="l00448"></a>00448     <span class="keyword">class </span>partition_type: <span class="keyword">public</span> internal::partition_type_base {
+<a name="l00449"></a>00449     <span class="keyword">public</span>:
+<a name="l00450"></a>00450         <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00311.html">task</a>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
+<a name="l00451"></a>00451         partition_type( <span class="keyword">const</span> <a class="code" href="a00303.html">simple_partitioner</a>& ) {}
+<a name="l00452"></a>00452         partition_type( <span class="keyword">const</span> partition_type&, <a class="code" href="a00309.html">split</a> ) {}
+<a name="l00453"></a>00453     };
+<a name="l00454"></a>00454     <span class="comment">// new implementation just extends existing interface</span>
+<a name="l00455"></a>00455     <span class="keyword">typedef</span> interface6::internal::simple_partition_type task_partition_type;
+<a name="l00456"></a>00456 };
+<a name="l00457"></a>00457 
+<a name="l00459"></a>00459 
+<a name="l00462"></a><a class="code" href="a00231.html">00462</a> <span class="keyword">class </span><a class="code" href="a00231.html">auto_partitioner</a> {
+<a name="l00463"></a>00463 <span class="keyword">public</span>:
+<a name="l00464"></a>00464     <a class="code" href="a00231.html">auto_partitioner</a>() {}
+<a name="l00465"></a>00465 
+<a name="l00466"></a>00466 <span class="keyword">private</span>:
+<a name="l00467"></a>00467     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>serial::interface6::start_for;
+<a name="l00468"></a>00468     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>interface6::internal::start_for;
+<a name="l00469"></a>00469     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>interface6::internal::start_reduce;
+<a name="l00470"></a>00470     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
+<a name="l00471"></a>00471     <span class="comment">// backward compatibility</span>
+<a name="l00472"></a>00472     <span class="keyword">typedef</span> interface6::internal::old_auto_partition_type partition_type;
+<a name="l00473"></a>00473     <span class="comment">// new implementation just extends existing interface</span>
+<a name="l00474"></a>00474     <span class="keyword">typedef</span> interface6::internal::auto_partition_type task_partition_type;
+<a name="l00475"></a>00475 };
+<a name="l00476"></a>00476 
+<a name="l00478"></a><a class="code" href="a00225.html">00478</a> <span class="keyword">class </span><a class="code" href="a00225.html">affinity_partitioner</a>: internal::affinity_partitioner_base_v3 {
+<a name="l00479"></a>00479 <span class="keyword">public</span>:
+<a name="l00480"></a>00480     <a class="code" href="a00225.html">affinity_partitioner</a>() {}
+<a name="l00481"></a>00481 
+<a name="l00482"></a>00482 <span class="keyword">private</span>:
+<a name="l00483"></a>00483     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>serial::interface6::start_for;
+<a name="l00484"></a>00484     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>interface6::internal::start_for;
+<a name="l00485"></a>00485     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>interface6::internal::start_reduce;
+<a name="l00486"></a>00486     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
+<a name="l00487"></a>00487     <span class="comment">// backward compatibility - for parallel_scan only</span>
+<a name="l00488"></a>00488     <span class="keyword">typedef</span> interface6::internal::old_auto_partition_type partition_type;
+<a name="l00489"></a>00489     <span class="comment">// new implementation just extends existing interface</span>
+<a name="l00490"></a>00490     <span class="keyword">typedef</span> interface6::internal::affinity_partition_type task_partition_type;
+<a name="l00491"></a>00491 };
+<a name="l00492"></a>00492 
+<a name="l00493"></a>00493 } <span class="comment">// namespace tbb</span>
+<a name="l00494"></a>00494 
+<a name="l00495"></a>00495 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
+<a name="l00496"></a>00496 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
+<a name="l00497"></a>00497 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4244 is back</span>
+<a name="l00498"></a>00498 <span class="preprocessor"></span><span class="preprocessor">#undef __TBB_INITIAL_CHUNKS</span>
+<a name="l00499"></a>00499 <span class="preprocessor"></span><span class="preprocessor">#undef __TBB_RANGE_POOL_CAPACITY</span>
+<a name="l00500"></a>00500 <span class="preprocessor"></span><span class="preprocessor">#undef __TBB_INIT_DEPTH</span>
+<a name="l00501"></a>00501 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_partitioner_H */</span>
+</pre></div><hr>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<p></p>
+Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
+registered trademarks or trademarks of Intel Corporation or its
+subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00541.html b/doc/html/a00541.html
deleted file mode 100644
index 76fd8ca..0000000
--- a/doc/html/a00541.html
+++ /dev/null
@@ -1,230 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>partitioner.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>partitioner.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_partitioner_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_partitioner_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
-<a name="l00025"></a>00025 
-<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
-<a name="l00027"></a>00027 <span class="keyword">class </span>affinity_partitioner;
-<a name="l00028"></a>00028 
-<a name="l00030"></a>00030 <span class="keyword">namespace </span>internal {
-<a name="l00031"></a>00031 size_t __TBB_EXPORTED_FUNC get_initial_auto_partitioner_divisor();
-<a name="l00032"></a>00032 
-<a name="l00034"></a>00034 
-<a name="l00035"></a>00035 <span class="keyword">class </span>affinity_partitioner_base_v3: no_copy {
-<a name="l00036"></a>00036     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00212.html">tbb::affinity_partitioner</a>;
-<a name="l00038"></a>00038 
-<a name="l00039"></a>00039     affinity_id* my_array;
-<a name="l00041"></a>00041     size_t my_size;
-<a name="l00043"></a>00043     affinity_partitioner_base_v3() : my_array(NULL), my_size(0) {}
-<a name="l00045"></a>00045     ~affinity_partitioner_base_v3() {resize(0);}
-<a name="l00047"></a>00047 
-<a name="l00048"></a>00048     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD resize( <span class="keywordtype">unsigned</span> factor );
-<a name="l00049"></a>00049     <span class="keyword">friend</span> <span class="keyword">class </span>affinity_partition_type;
-<a name="l00050"></a>00050 };
-<a name="l00051"></a>00051 
-<a name="l00053"></a>00053 <span class="keyword">class </span>partition_type_base {
-<a name="l00054"></a>00054 <span class="keyword">public</span>:
-<a name="l00055"></a>00055     <span class="keywordtype">void</span> set_affinity( task & ) {}
-<a name="l00056"></a>00056     <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> ) {}
-<a name="l00057"></a>00057     task* continue_after_execute_range() {<span class="keywordflow">return</span> NULL;}
-<a name="l00058"></a>00058     <span class="keywordtype">bool</span> decide_whether_to_delay() {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00059"></a>00059     <span class="keywordtype">void</span> spawn_or_delay( <span class="keywordtype">bool</span>, task& b ) {
-<a name="l00060"></a>00060         task::spawn(b);
-<a name="l00061"></a>00061     }
-<a name="l00062"></a>00062 };
-<a name="l00063"></a>00063 
-<a name="l00064"></a>00064 <span class="keyword">class </span>affinity_partition_type;
-<a name="l00065"></a>00065 
-<a name="l00066"></a>00066 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_for;
-<a name="l00067"></a>00067 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_reduce;
-<a name="l00068"></a>00068 <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">class </span>start_scan;
-<a name="l00069"></a>00069 
-<a name="l00070"></a>00070 } <span class="comment">// namespace internal</span>
-<a name="l00072"></a>00072 <span class="comment"></span>
-<a name="l00074"></a>00074 
-<a name="l00076"></a><a class="code" href="a00284.html">00076</a> <span class="keyword">class </span><a class="code" href="a00284.html">simple_partitioner</a> {
-<a name="l00077"></a>00077 <span class="keyword">public</span>:
-<a name="l00078"></a>00078     <a class="code" href="a00284.html">simple_partitioner</a>() {}
-<a name="l00079"></a>00079 <span class="keyword">private</span>:
-<a name="l00080"></a>00080     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_for;
-<a name="l00081"></a>00081     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_reduce;
-<a name="l00082"></a>00082     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
-<a name="l00083"></a>00083 
-<a name="l00084"></a>00084     <span class="keyword">class </span>partition_type: <span class="keyword">public</span> internal::partition_type_base {
-<a name="l00085"></a>00085     <span class="keyword">public</span>:
-<a name="l00086"></a>00086         <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00291.html">task</a>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00087"></a>00087         partition_type( <span class="keyword">const</span> <a class="code" href="a00284.html">simple_partitioner</a>& ) {}
-<a name="l00088"></a>00088         partition_type( <span class="keyword">const</span> partition_type&, <a class="code" href="a00290.html">split</a> ) {}
-<a name="l00089"></a>00089     };
-<a name="l00090"></a>00090 };
-<a name="l00091"></a>00091 
-<a name="l00093"></a>00093 
-<a name="l00096"></a><a class="code" href="a00219.html">00096</a> <span class="keyword">class </span><a class="code" href="a00219.html">auto_partitioner</a> {
-<a name="l00097"></a>00097 <span class="keyword">public</span>:
-<a name="l00098"></a>00098     <a class="code" href="a00219.html">auto_partitioner</a>() {}
-<a name="l00099"></a>00099 
-<a name="l00100"></a>00100 <span class="keyword">private</span>:
-<a name="l00101"></a>00101     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_for;
-<a name="l00102"></a>00102     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_reduce;
-<a name="l00103"></a>00103     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
-<a name="l00104"></a>00104 
-<a name="l00105"></a>00105     <span class="keyword">class </span>partition_type: <span class="keyword">public</span> internal::partition_type_base {
-<a name="l00106"></a>00106         size_t num_chunks;
-<a name="l00107"></a>00107         <span class="keyword">static</span> <span class="keyword">const</span> size_t VICTIM_CHUNKS = 4;
-<a name="l00108"></a>00108 <span class="keyword">public</span>:
-<a name="l00109"></a>00109         <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> <a class="code" href="a00291.html">task</a> &t) {
-<a name="l00110"></a>00110             <span class="keywordflow">if</span>( num_chunks<VICTIM_CHUNKS && t.<a class="code" href="a00291.html#f9169402702f56bf519448aaf34450aa">is_stolen_task</a>() )
-<a name="l00111"></a>00111                 num_chunks = VICTIM_CHUNKS;
-<a name="l00112"></a>00112             <span class="keywordflow">return</span> num_chunks==1;
-<a name="l00113"></a>00113         }
-<a name="l00114"></a>00114         partition_type( <span class="keyword">const</span> <a class="code" href="a00219.html">auto_partitioner</a>& ) : num_chunks(internal::get_initial_auto_partitioner_divisor()) {}
-<a name="l00115"></a>00115         partition_type( partition_type& pt, <a class="code" href="a00290.html">split</a> ) {
-<a name="l00116"></a>00116             num_chunks = pt.num_chunks /= 2u;
-<a name="l00117"></a>00117         }
-<a name="l00118"></a>00118     };
-<a name="l00119"></a>00119 };
-<a name="l00120"></a>00120 
-<a name="l00122"></a><a class="code" href="a00212.html">00122</a> <span class="keyword">class </span><a class="code" href="a00212.html">affinity_partitioner</a>: internal::affinity_partitioner_base_v3 {
-<a name="l00123"></a>00123 <span class="keyword">public</span>:
-<a name="l00124"></a>00124     <a class="code" href="a00212.html">affinity_partitioner</a>() {}
-<a name="l00125"></a>00125 
-<a name="l00126"></a>00126 <span class="keyword">private</span>:
-<a name="l00127"></a>00127     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_for;
-<a name="l00128"></a>00128     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_reduce;
-<a name="l00129"></a>00129     <span class="keyword">template</span><<span class="keyword">typename</span> Range, <span class="keyword">typename</span> Body, <span class="keyword">typename</span> Partitioner> <span class="keyword">friend</span> <span class="keyword">class </span>internal::start_scan;
-<a name="l00130"></a>00130 
-<a name="l00131"></a>00131     <span class="keyword">typedef</span> internal::affinity_partition_type partition_type;
-<a name="l00132"></a>00132     <span class="keyword">friend</span> <span class="keyword">class </span>internal::affinity_partition_type;
-<a name="l00133"></a>00133 };
-<a name="l00134"></a>00134 
-<a name="l00136"></a>00136 <span class="keyword">namespace </span>internal {
-<a name="l00137"></a>00137 
-<a name="l00138"></a>00138 <span class="keyword">class </span>affinity_partition_type: <span class="keyword">public</span> no_copy {
-<a name="l00140"></a>00140     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> factor = 16;
-<a name="l00141"></a>00141     <span class="keyword">static</span> <span class="keyword">const</span> size_t VICTIM_CHUNKS = 4;
-<a name="l00142"></a>00142 
-<a name="l00143"></a>00143     internal::affinity_id* my_array;
-<a name="l00144"></a>00144     <a class="code" href="a00294.html">task_list</a> delay_list;
-<a name="l00145"></a>00145     <span class="keywordtype">unsigned</span> map_begin, map_end;
-<a name="l00146"></a>00146     size_t num_chunks;
-<a name="l00147"></a>00147 <span class="keyword">public</span>:
-<a name="l00148"></a>00148     affinity_partition_type( <a class="code" href="a00212.html">affinity_partitioner</a>& ap ) {
-<a name="l00149"></a>00149         __TBB_ASSERT( (factor&(factor-1))==0, <span class="stringliteral">"factor must be power of two"</span> ); 
-<a name="l00150"></a>00150         ap.resize(factor);
-<a name="l00151"></a>00151         my_array = ap.my_array;
-<a name="l00152"></a>00152         map_begin = 0;
-<a name="l00153"></a>00153         map_end = unsigned(ap.my_size);
-<a name="l00154"></a>00154         num_chunks = internal::get_initial_auto_partitioner_divisor();
-<a name="l00155"></a>00155     }
-<a name="l00156"></a>00156     affinity_partition_type(affinity_partition_type& p, split) : my_array(p.my_array) {
-<a name="l00157"></a>00157         __TBB_ASSERT( p.map_end-p.map_begin<factor || (p.map_end-p.map_begin)%factor==0, NULL );
-<a name="l00158"></a>00158         num_chunks = p.num_chunks /= 2;
-<a name="l00159"></a>00159         <span class="keywordtype">unsigned</span> e = p.map_end;
-<a name="l00160"></a>00160         <span class="keywordtype">unsigned</span> d = (e - p.map_begin)/2;
-<a name="l00161"></a>00161         <span class="keywordflow">if</span>( d>factor ) 
-<a name="l00162"></a>00162             d &= 0u-factor;
-<a name="l00163"></a>00163         map_end = e;
-<a name="l00164"></a>00164         map_begin = p.map_end = e-d;
-<a name="l00165"></a>00165     }
-<a name="l00166"></a>00166 
-<a name="l00167"></a>00167     <span class="keywordtype">bool</span> should_execute_range(<span class="keyword">const</span> task &t) {
-<a name="l00168"></a>00168         <span class="keywordflow">if</span>( num_chunks < VICTIM_CHUNKS && t.is_stolen_task() )
-<a name="l00169"></a>00169             num_chunks = VICTIM_CHUNKS;
-<a name="l00170"></a>00170         <span class="keywordflow">return</span> num_chunks == 1;
-<a name="l00171"></a>00171     }
-<a name="l00172"></a>00172 
-<a name="l00173"></a>00173     <span class="keywordtype">void</span> set_affinity( task &t ) {
-<a name="l00174"></a>00174         <span class="keywordflow">if</span>( map_begin<map_end )
-<a name="l00175"></a>00175             t.set_affinity( my_array[map_begin] );
-<a name="l00176"></a>00176     }
-<a name="l00177"></a>00177     <span class="keywordtype">void</span> note_affinity( <a class="code" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">task::affinity_id</a> <span class="keywordtype">id</span> ) {
-<a name="l00178"></a>00178         <span class="keywordflow">if</span>( map_begin<map_end ) 
-<a name="l00179"></a>00179             my_array[map_begin] = id;
-<a name="l00180"></a>00180     }
-<a name="l00181"></a>00181     task* continue_after_execute_range() {
-<a name="l00182"></a>00182         task* first = NULL;
-<a name="l00183"></a>00183         <span class="keywordflow">if</span>( !delay_list.empty() ) {
-<a name="l00184"></a>00184             first = &delay_list.pop_front();
-<a name="l00185"></a>00185             <span class="keywordflow">while</span>( !delay_list.empty() ) {
-<a name="l00186"></a>00186                 task::spawn(*first);
-<a name="l00187"></a>00187                 first = &delay_list.pop_front();
-<a name="l00188"></a>00188             }
-<a name="l00189"></a>00189         }
-<a name="l00190"></a>00190         <span class="keywordflow">return</span> first;
-<a name="l00191"></a>00191     }
-<a name="l00192"></a>00192     <span class="keywordtype">bool</span> decide_whether_to_delay() {
-<a name="l00193"></a>00193         <span class="comment">// The possible underflow caused by "-1u" is deliberate</span>
-<a name="l00194"></a>00194         <span class="keywordflow">return</span> (map_begin&(factor-1))==0 && map_end-map_begin-1u<factor;
-<a name="l00195"></a>00195     }
-<a name="l00196"></a>00196     <span class="keywordtype">void</span> spawn_or_delay( <span class="keywordtype">bool</span> delay, task& b ) {
-<a name="l00197"></a>00197         <span class="keywordflow">if</span>( delay )  
-<a name="l00198"></a>00198             delay_list.push_back(b);
-<a name="l00199"></a>00199         <span class="keywordflow">else</span> 
-<a name="l00200"></a>00200             task::spawn(b);
-<a name="l00201"></a>00201     }
-<a name="l00202"></a>00202 
-<a name="l00203"></a>00203     ~affinity_partition_type() {
-<a name="l00204"></a>00204         <span class="comment">// The delay_list can be non-empty if an exception is thrown.</span>
-<a name="l00205"></a>00205         <span class="keywordflow">while</span>( !delay_list.empty() ) {
-<a name="l00206"></a>00206             task& t = delay_list.pop_front();
-<a name="l00207"></a>00207             t.destroy(t);
-<a name="l00208"></a>00208         } 
-<a name="l00209"></a>00209     }
-<a name="l00210"></a>00210 };
-<a name="l00211"></a>00211 
-<a name="l00212"></a>00212 } <span class="comment">// namespace internal</span>
-<a name="l00214"></a>00214 <span class="comment"></span>
-<a name="l00215"></a>00215 
-<a name="l00216"></a>00216 } <span class="comment">// namespace tbb</span>
-<a name="l00217"></a>00217 
-<a name="l00218"></a>00218 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_partitioner_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00546.html b/doc/html/a00543.html
similarity index 87%
rename from doc/html/a00546.html
rename to doc/html/a00543.html
index a78de64..3d01e0f 100644
--- a/doc/html/a00546.html
+++ b/doc/html/a00543.html
@@ -76,20 +76,20 @@
 <a name="l00056"></a>00056 
 <a name="l00058"></a>00058 
 <a name="l00060"></a>00060 
-<a name="l00061"></a><a class="code" href="a00245.html">00061</a> <span class="keyword">class </span><a class="code" href="a00245.html">filter</a>: internal::no_copy {
+<a name="l00061"></a><a class="code" href="a00256.html">00061</a> <span class="keyword">class </span><a class="code" href="a00256.html">filter</a>: internal::no_copy {
 <a name="l00062"></a>00062 <span class="keyword">private</span>:
-<a name="l00064"></a>00064     <span class="keyword">static</span> <a class="code" href="a00245.html">filter</a>* not_in_pipeline() {<span class="keywordflow">return</span> reinterpret_cast<filter*>(intptr_t(-1));}
+<a name="l00064"></a>00064     <span class="keyword">static</span> <a class="code" href="a00256.html">filter</a>* not_in_pipeline() {<span class="keywordflow">return</span> reinterpret_cast<filter*>(intptr_t(-1));}
 <a name="l00065"></a>00065 <span class="keyword">protected</span>:    
-<a name="l00067"></a><a class="code" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">00067</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> = 0x1; 
+<a name="l00067"></a><a class="code" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">00067</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> = 0x1; 
 <a name="l00068"></a>00068 
 <a name="l00070"></a>00070 
-<a name="l00072"></a><a class="code" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">00072</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a> = 0x1<<4;  
+<a name="l00072"></a><a class="code" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">00072</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a> = 0x1<<4;  
 <a name="l00073"></a>00073 
-<a name="l00075"></a><a class="code" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">00075</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> = 0x1<<5;  
+<a name="l00075"></a><a class="code" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">00075</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> = 0x1<<5;  
 <a name="l00076"></a>00076 
-<a name="l00078"></a><a class="code" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">00078</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> = 0x1<<6;
+<a name="l00078"></a><a class="code" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">00078</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> = 0x1<<6;
 <a name="l00079"></a>00079 
-<a name="l00081"></a><a class="code" href="a00245.html#f17200974c33be21f42a5f00893de028">00081</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a> =
+<a name="l00081"></a><a class="code" href="a00256.html#f17200974c33be21f42a5f00893de028">00081</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="a00256.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a> =
 <a name="l00082"></a>00082 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
 <a name="l00083"></a>00083 <span class="preprocessor"></span>            0x0;
 <a name="l00084"></a>00084 <span class="preprocessor">#else</span>
@@ -100,16 +100,16 @@
 <a name="l00089"></a>00089     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> version_mask = 0x7<<1; <span class="comment">// bits 1-3 are for version</span>
 <a name="l00090"></a>00090 <span class="keyword">public</span>:
 <a name="l00091"></a>00091     <span class="keyword">enum</span> mode {
-<a name="l00093"></a>00093         parallel = current_version | <a class="code" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>, 
-<a name="l00095"></a>00095         serial_in_order = current_version | <a class="code" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>,
-<a name="l00097"></a>00097         serial_out_of_order = current_version | <a class="code" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> | <a class="code" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>,
+<a name="l00093"></a>00093         parallel = current_version | <a class="code" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>, 
+<a name="l00095"></a>00095         serial_in_order = current_version | <a class="code" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>,
+<a name="l00097"></a>00097         serial_out_of_order = current_version | <a class="code" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> | <a class="code" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>,
 <a name="l00099"></a>00099         serial = serial_in_order
 <a name="l00100"></a>00100     };
 <a name="l00101"></a>00101 <span class="keyword">protected</span>:
-<a name="l00102"></a>00102     <a class="code" href="a00245.html">filter</a>( <span class="keywordtype">bool</span> is_serial_ ) : 
+<a name="l00102"></a>00102     <a class="code" href="a00256.html">filter</a>( <span class="keywordtype">bool</span> is_serial_ ) : 
 <a name="l00103"></a>00103         next_filter_in_pipeline(not_in_pipeline()),
 <a name="l00104"></a>00104         my_input_buffer(NULL),
-<a name="l00105"></a>00105         my_filter_mode(static_cast<unsigned char>((is_serial_ ? serial : parallel) | <a class="code" href="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>)),
+<a name="l00105"></a>00105         my_filter_mode(static_cast<unsigned char>((is_serial_ ? serial : parallel) | <a class="code" href="a00256.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>)),
 <a name="l00106"></a>00106         prev_filter_in_pipeline(not_in_pipeline()),
 <a name="l00107"></a>00107         my_pipeline(NULL),
 <a name="l00108"></a>00108         next_segment(NULL)
@@ -118,7 +118,7 @@
 <a name="l00111"></a>00111     filter( mode filter_mode ) :
 <a name="l00112"></a>00112         next_filter_in_pipeline(not_in_pipeline()),
 <a name="l00113"></a>00113         my_input_buffer(NULL),
-<a name="l00114"></a>00114         my_filter_mode(static_cast<unsigned char>(filter_mode | <a class="code" href="a00245.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>)),
+<a name="l00114"></a>00114         my_filter_mode(static_cast<unsigned char>(filter_mode | <a class="code" href="a00256.html#f17200974c33be21f42a5f00893de028">exact_exception_propagation</a>)),
 <a name="l00115"></a>00115         prev_filter_in_pipeline(not_in_pipeline()),
 <a name="l00116"></a>00116         my_pipeline(NULL),
 <a name="l00117"></a>00117         next_segment(NULL)
@@ -128,35 +128,35 @@
 <a name="l00121"></a>00121     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD set_end_of_input();
 <a name="l00122"></a>00122 
 <a name="l00123"></a>00123 <span class="keyword">public</span>:
-<a name="l00125"></a><a class="code" href="a00245.html#fcfec27656a69ff2072802ac001e936f">00125</a>     <span class="keywordtype">bool</span> <a class="code" href="a00245.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>()<span class="keyword"> const </span>{
-<a name="l00126"></a>00126         <span class="keywordflow">return</span> bool( my_filter_mode & <a class="code" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> );
+<a name="l00125"></a><a class="code" href="a00256.html#fcfec27656a69ff2072802ac001e936f">00125</a>     <span class="keywordtype">bool</span> <a class="code" href="a00256.html#fcfec27656a69ff2072802ac001e936f">is_serial</a>()<span class="keyword"> const </span>{
+<a name="l00126"></a>00126         <span class="keywordflow">return</span> bool( my_filter_mode & <a class="code" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a> );
 <a name="l00127"></a>00127     }  
 <a name="l00128"></a>00128     
-<a name="l00130"></a><a class="code" href="a00245.html#cd53206c4795ef2df5df26b795caf692">00130</a>     <span class="keywordtype">bool</span> <a class="code" href="a00245.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>()<span class="keyword"> const </span>{
-<a name="l00131"></a>00131         <span class="keywordflow">return</span> (my_filter_mode & (<a class="code" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>|<a class="code" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>))==<a class="code" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>;
+<a name="l00130"></a><a class="code" href="a00256.html#cd53206c4795ef2df5df26b795caf692">00130</a>     <span class="keywordtype">bool</span> <a class="code" href="a00256.html#cd53206c4795ef2df5df26b795caf692">is_ordered</a>()<span class="keyword"> const </span>{
+<a name="l00131"></a>00131         <span class="keywordflow">return</span> (my_filter_mode & (<a class="code" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">filter_is_out_of_order</a>|<a class="code" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>))==<a class="code" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">filter_is_serial</a>;
 <a name="l00132"></a>00132     }
 <a name="l00133"></a>00133 
-<a name="l00135"></a><a class="code" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">00135</a>     <span class="keywordtype">bool</span> <a class="code" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>()<span class="keyword"> const </span>{
-<a name="l00136"></a>00136         <span class="keywordflow">return</span> ( my_filter_mode & <a class="code" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> )==filter_is_bound;
+<a name="l00135"></a><a class="code" href="a00256.html#15c29cae5d237e6d63dbfe5c94af89d5">00135</a>     <span class="keywordtype">bool</span> <a class="code" href="a00256.html#15c29cae5d237e6d63dbfe5c94af89d5">is_bound</a>()<span class="keyword"> const </span>{
+<a name="l00136"></a>00136         <span class="keywordflow">return</span> ( my_filter_mode & <a class="code" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter_is_bound</a> )==filter_is_bound;
 <a name="l00137"></a>00137     }
 <a name="l00138"></a>00138 
-<a name="l00140"></a><a class="code" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">00140</a>     <span class="keywordtype">bool</span> <a class="code" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>() { 
-<a name="l00141"></a>00141         <span class="keywordflow">return</span> ( my_filter_mode & <a class="code" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> ) == filter_may_emit_null;
+<a name="l00140"></a><a class="code" href="a00256.html#8ec4dfe053e94a2349d56781ddea8477">00140</a>     <span class="keywordtype">bool</span> <a class="code" href="a00256.html#8ec4dfe053e94a2349d56781ddea8477">object_may_be_null</a>() { 
+<a name="l00141"></a>00141         <span class="keywordflow">return</span> ( my_filter_mode & <a class="code" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">filter_may_emit_null</a> ) == filter_may_emit_null;
 <a name="l00142"></a>00142     }
 <a name="l00143"></a>00143 
 <a name="l00145"></a>00145 
-<a name="l00146"></a>00146     <span class="keyword">virtual</span> <span class="keywordtype">void</span>* <a class="code" href="a00245.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>( <span class="keywordtype">void</span>* item ) = 0;
+<a name="l00146"></a>00146     <span class="keyword">virtual</span> <span class="keywordtype">void</span>* <a class="code" href="a00256.html#fa1b3dc1f4f47563ccab7f4d92f5b543">operator()</a>( <span class="keywordtype">void</span>* item ) = 0;
 <a name="l00147"></a>00147 
 <a name="l00149"></a>00149 
-<a name="l00150"></a>00150     <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00245.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>();
+<a name="l00150"></a>00150     <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00256.html#66d159f362293e3964ba3da8bc1d2604">~filter</a>();
 <a name="l00151"></a>00151 
 <a name="l00152"></a>00152 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
 <a name="l00154"></a>00154 <span class="preprocessor"></span>
-<a name="l00156"></a><a class="code" href="a00245.html#56275eb889c77c4807967133e21401bd">00156</a> <span class="preprocessor">    virtual void finalize( void* </span><span class="comment">/*item*/</span> ) {};
+<a name="l00156"></a><a class="code" href="a00256.html#56275eb889c77c4807967133e21401bd">00156</a> <span class="preprocessor">    virtual void finalize( void* </span><span class="comment">/*item*/</span> ) {};
 <a name="l00157"></a>00157 <span class="preprocessor">#endif</span>
 <a name="l00158"></a>00158 <span class="preprocessor"></span>
 <a name="l00159"></a>00159 <span class="keyword">private</span>:
-<a name="l00161"></a>00161     <a class="code" href="a00245.html">filter</a>* next_filter_in_pipeline;
+<a name="l00161"></a>00161     <a class="code" href="a00256.html">filter</a>* next_filter_in_pipeline;
 <a name="l00162"></a>00162 
 <a name="l00164"></a>00164     <span class="comment">//  (pipeline has not yet reached end_of_input or this filter has not yet</span>
 <a name="l00165"></a>00165     <span class="comment">//  seen the last token produced by input_filter)</span>
@@ -167,21 +167,21 @@
 <a name="l00171"></a>00171 
 <a name="l00172"></a>00172     <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
 <a name="l00173"></a>00173     <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
-<a name="l00174"></a>00174     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00266.html">pipeline</a>;
-<a name="l00175"></a>00175     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00301.html">thread_bound_filter</a>;
+<a name="l00174"></a>00174     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00284.html">pipeline</a>;
+<a name="l00175"></a>00175     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00322.html">thread_bound_filter</a>;
 <a name="l00176"></a>00176 
 <a name="l00178"></a>00178     <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> my_filter_mode;
 <a name="l00179"></a>00179 
-<a name="l00181"></a>00181     <a class="code" href="a00245.html">filter</a>* prev_filter_in_pipeline;
+<a name="l00181"></a>00181     <a class="code" href="a00256.html">filter</a>* prev_filter_in_pipeline;
 <a name="l00182"></a>00182 
-<a name="l00184"></a>00184     <a class="code" href="a00266.html">pipeline</a>* my_pipeline;
+<a name="l00184"></a>00184     <a class="code" href="a00284.html">pipeline</a>* my_pipeline;
 <a name="l00185"></a>00185 
 <a name="l00187"></a>00187 
-<a name="l00188"></a>00188     <a class="code" href="a00245.html">filter</a>* next_segment;
+<a name="l00188"></a>00188     <a class="code" href="a00256.html">filter</a>* next_segment;
 <a name="l00189"></a>00189 };
 <a name="l00190"></a>00190 
 <a name="l00192"></a>00192 
-<a name="l00193"></a><a class="code" href="a00301.html">00193</a> <span class="keyword">class </span><a class="code" href="a00301.html">thread_bound_filter</a>: <span class="keyword">public</span> <a class="code" href="a00245.html">filter</a> {
+<a name="l00193"></a><a class="code" href="a00322.html">00193</a> <span class="keyword">class </span><a class="code" href="a00322.html">thread_bound_filter</a>: <span class="keyword">public</span> <a class="code" href="a00256.html">filter</a> {
 <a name="l00194"></a>00194 <span class="keyword">public</span>:
 <a name="l00195"></a>00195     <span class="keyword">enum</span> result_type {
 <a name="l00196"></a>00196         <span class="comment">// item was processed</span>
@@ -192,62 +192,62 @@
 <a name="l00201"></a>00201         end_of_stream
 <a name="l00202"></a>00202     };
 <a name="l00203"></a>00203 <span class="keyword">protected</span>:
-<a name="l00204"></a>00204     <a class="code" href="a00301.html">thread_bound_filter</a>(mode filter_mode): 
-<a name="l00205"></a>00205          <a class="code" href="a00245.html">filter</a>(static_cast<mode>(filter_mode | <a class="code" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter::filter_is_bound</a>))
+<a name="l00204"></a>00204     <a class="code" href="a00322.html">thread_bound_filter</a>(mode filter_mode): 
+<a name="l00205"></a>00205          <a class="code" href="a00256.html">filter</a>(static_cast<mode>(filter_mode | <a class="code" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">filter::filter_is_bound</a>))
 <a name="l00206"></a>00206     {}
 <a name="l00207"></a>00207 <span class="keyword">public</span>:
 <a name="l00209"></a>00209 
-<a name="l00214"></a>00214     result_type __TBB_EXPORTED_METHOD <a class="code" href="a00301.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>(); 
+<a name="l00214"></a>00214     result_type __TBB_EXPORTED_METHOD <a class="code" href="a00322.html#c4f90f2c771bce748beb9be734fa286c">try_process_item</a>(); 
 <a name="l00215"></a>00215 
 <a name="l00217"></a>00217 
-<a name="l00221"></a>00221     result_type __TBB_EXPORTED_METHOD <a class="code" href="a00301.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>();
+<a name="l00221"></a>00221     result_type __TBB_EXPORTED_METHOD <a class="code" href="a00322.html#5e726bdc7fbd924c0b07bd558b1d4d5d">process_item</a>();
 <a name="l00222"></a>00222 
 <a name="l00223"></a>00223 <span class="keyword">private</span>:
 <a name="l00225"></a>00225     result_type internal_process_item(<span class="keywordtype">bool</span> is_blocking);
 <a name="l00226"></a>00226 };
 <a name="l00227"></a>00227 
 <a name="l00229"></a>00229 
-<a name="l00230"></a><a class="code" href="a00266.html">00230</a> <span class="keyword">class </span><a class="code" href="a00266.html">pipeline</a> {
+<a name="l00230"></a><a class="code" href="a00284.html">00230</a> <span class="keyword">class </span><a class="code" href="a00284.html">pipeline</a> {
 <a name="l00231"></a>00231 <span class="keyword">public</span>:
-<a name="l00233"></a>00233     __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>();
+<a name="l00233"></a>00233     __TBB_EXPORTED_METHOD <a class="code" href="a00284.html#596dc3beba27099c4c8581cb419e1a59">pipeline</a>();
 <a name="l00234"></a>00234 
-<a name="l00237"></a>00237     <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>();
+<a name="l00237"></a>00237     <span class="keyword">virtual</span> __TBB_EXPORTED_METHOD <a class="code" href="a00284.html#49513c6c24f9d5bbbb27edca5efe01c9">~pipeline</a>();
 <a name="l00238"></a>00238 
-<a name="l00240"></a>00240     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>( <a class="code" href="a00245.html">filter</a>& filter_ );
+<a name="l00240"></a>00240     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00284.html#38fb5c9c8395dd6f89a4ae2011a83e0d">add_filter</a>( <a class="code" href="a00256.html">filter</a>& filter_ );
 <a name="l00241"></a>00241 
-<a name="l00243"></a>00243     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#f627616049b3fe36801f37ee40403ef8">run</a>( size_t max_number_of_live_tokens );
+<a name="l00243"></a>00243     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00284.html#f627616049b3fe36801f37ee40403ef8">run</a>( size_t max_number_of_live_tokens );
 <a name="l00244"></a>00244 
 <a name="l00245"></a>00245 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
 <a name="l00247"></a>00247 <span class="preprocessor">    void __TBB_EXPORTED_METHOD run( size_t max_number_of_live_tokens, tbb::task_group_context& context );</span>
 <a name="l00248"></a>00248 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
 <a name="l00249"></a>00249 <span class="preprocessor"></span>
-<a name="l00251"></a>00251     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00266.html#2c84aef5b834b555ee220b176e25931e">clear</a>();
+<a name="l00251"></a>00251     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00284.html#2c84aef5b834b555ee220b176e25931e">clear</a>();
 <a name="l00252"></a>00252 
 <a name="l00253"></a>00253 <span class="keyword">private</span>:
 <a name="l00254"></a>00254     <span class="keyword">friend</span> <span class="keyword">class </span>internal::stage_task;
 <a name="l00255"></a>00255     <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_root_task;
-<a name="l00256"></a>00256     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00245.html">filter</a>;
-<a name="l00257"></a>00257     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00301.html">thread_bound_filter</a>;
+<a name="l00256"></a>00256     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00256.html">filter</a>;
+<a name="l00257"></a>00257     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00322.html">thread_bound_filter</a>;
 <a name="l00258"></a>00258     <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_cleaner;
 <a name="l00259"></a>00259     <span class="keyword">friend</span> <span class="keyword">class </span>tbb::interface6::internal::pipeline_proxy;
 <a name="l00260"></a>00260 
-<a name="l00262"></a>00262     <a class="code" href="a00245.html">filter</a>* filter_list;
+<a name="l00262"></a>00262     <a class="code" href="a00256.html">filter</a>* filter_list;
 <a name="l00263"></a>00263 
-<a name="l00265"></a>00265     <a class="code" href="a00245.html">filter</a>* filter_end;
+<a name="l00265"></a>00265     <a class="code" href="a00256.html">filter</a>* filter_end;
 <a name="l00266"></a>00266 
-<a name="l00268"></a>00268     <a class="code" href="a00291.html">task</a>* end_counter;
+<a name="l00268"></a>00268     <a class="code" href="a00311.html">task</a>* end_counter;
 <a name="l00269"></a>00269 
-<a name="l00271"></a>00271     <a class="code" href="a00216.html">atomic<internal::Token></a> input_tokens;
+<a name="l00271"></a>00271     <a class="code" href="a00228.html">atomic<internal::Token></a> input_tokens;
 <a name="l00272"></a>00272 
-<a name="l00274"></a>00274     <a class="code" href="a00216.html">atomic<internal::Token></a> token_counter;
+<a name="l00274"></a>00274     <a class="code" href="a00228.html">atomic<internal::Token></a> token_counter;
 <a name="l00275"></a>00275 
 <a name="l00277"></a>00277     <span class="keywordtype">bool</span> end_of_input;
 <a name="l00278"></a>00278 
 <a name="l00280"></a>00280     <span class="keywordtype">bool</span> has_thread_bound_filters;
 <a name="l00281"></a>00281 
-<a name="l00283"></a>00283     <span class="keywordtype">void</span> remove_filter( <a class="code" href="a00245.html">filter</a>& filter_ );
+<a name="l00283"></a>00283     <span class="keywordtype">void</span> remove_filter( <a class="code" href="a00256.html">filter</a>& filter_ );
 <a name="l00284"></a>00284 
-<a name="l00286"></a>00286     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD inject_token( <a class="code" href="a00291.html">task</a>& <span class="keyword">self</span> );
+<a name="l00286"></a>00286     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD inject_token( <a class="code" href="a00311.html">task</a>& <span class="keyword">self</span> );
 <a name="l00287"></a>00287 
 <a name="l00288"></a>00288 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
 <a name="l00290"></a>00290 <span class="preprocessor">    void clear_filters();</span>
@@ -264,9 +264,9 @@
 <a name="l00301"></a>00301     <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body> <span class="keyword">class </span>concrete_filter;
 <a name="l00302"></a>00302 }
 <a name="l00303"></a>00303 
-<a name="l00305"></a><a class="code" href="a00248.html">00305</a> <span class="keyword">class </span><a class="code" href="a00248.html">flow_control</a> {
+<a name="l00305"></a><a class="code" href="a00259.html">00305</a> <span class="keyword">class </span><a class="code" href="a00259.html">flow_control</a> {
 <a name="l00306"></a>00306     <span class="keywordtype">bool</span> is_pipeline_stopped;
-<a name="l00307"></a>00307     <a class="code" href="a00248.html">flow_control</a>() { is_pipeline_stopped = <span class="keyword">false</span>; }
+<a name="l00307"></a>00307     <a class="code" href="a00259.html">flow_control</a>() { is_pipeline_stopped = <span class="keyword">false</span>; }
 <a name="l00308"></a>00308     <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body> <span class="keyword">friend</span> <span class="keyword">class </span>internal::concrete_filter;
 <a name="l00309"></a>00309 <span class="keyword">public</span>:
 <a name="l00310"></a>00310     <span class="keywordtype">void</span> stop() { is_pipeline_stopped = <span class="keyword">true</span>; }
@@ -282,7 +282,7 @@
 <a name="l00321"></a>00321 <span class="keyword">template</span><<span class="keyword">typename</span> T>
 <a name="l00322"></a>00322 <span class="keyword">class </span>token_helper<T, true> {
 <a name="l00323"></a>00323     <span class="keyword">public</span>:
-<a name="l00324"></a>00324     <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00296.html">tbb::tbb_allocator<T></a> allocator;
+<a name="l00324"></a>00324     <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00317.html">tbb::tbb_allocator<T></a> allocator;
 <a name="l00325"></a>00325     <span class="keyword">typedef</span> T* pointer;
 <a name="l00326"></a>00326     <span class="keyword">typedef</span> T value_type;
 <a name="l00327"></a>00327     <span class="keyword">static</span> pointer create_token(<span class="keyword">const</span> value_type & source) {
@@ -414,19 +414,19 @@
 <a name="l00454"></a>00454 
 <a name="l00456"></a>00456 
 <a name="l00457"></a>00457 <span class="keyword">class </span>pipeline_proxy {
-<a name="l00458"></a>00458     <a class="code" href="a00266.html">tbb::pipeline</a> my_pipe;
+<a name="l00458"></a>00458     <a class="code" href="a00284.html">tbb::pipeline</a> my_pipe;
 <a name="l00459"></a>00459 <span class="keyword">public</span>:
 <a name="l00460"></a>00460     pipeline_proxy( <span class="keyword">const</span> filter_t<void,void>& filter_chain );
 <a name="l00461"></a>00461     ~pipeline_proxy() {
 <a name="l00462"></a>00462         <span class="keywordflow">while</span>( filter* f = my_pipe.filter_list ) 
 <a name="l00463"></a>00463             <span class="keyword">delete</span> f; <span class="comment">// filter destructor removes it from the pipeline</span>
 <a name="l00464"></a>00464     }
-<a name="l00465"></a>00465     <a class="code" href="a00266.html">tbb::pipeline</a>* operator->() { <span class="keywordflow">return</span> &my_pipe; }
+<a name="l00465"></a>00465     <a class="code" href="a00284.html">tbb::pipeline</a>* operator->() { <span class="keywordflow">return</span> &my_pipe; }
 <a name="l00466"></a>00466 };
 <a name="l00467"></a>00467 
 <a name="l00469"></a>00469 
 <a name="l00470"></a>00470 <span class="keyword">class </span>filter_node: tbb::internal::no_copy {
-<a name="l00472"></a>00472     <a class="code" href="a00216.html">tbb::atomic<intptr_t></a> ref_count;
+<a name="l00472"></a>00472     <a class="code" href="a00228.html">tbb::atomic<intptr_t></a> ref_count;
 <a name="l00473"></a>00473 <span class="keyword">protected</span>:
 <a name="l00474"></a>00474     filter_node() {
 <a name="l00475"></a>00475         ref_count = 0;
@@ -483,49 +483,49 @@
 <a name="l00531"></a>00531 } <span class="comment">// namespace internal</span>
 <a name="l00533"></a>00533 <span class="comment"></span>
 <a name="l00535"></a>00535 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U, <span class="keyword">typename</span> Body>
-<a name="l00536"></a><a class="code" href="a00246.html#85c2892eff1fddcd06e28911e75838bd">00536</a> <a class="code" href="a00246.html">filter_t<T,U></a> make_filter(tbb::filter::mode mode, <span class="keyword">const</span> Body& body) {
+<a name="l00536"></a><a class="code" href="a00257.html#85c2892eff1fddcd06e28911e75838bd">00536</a> <a class="code" href="a00257.html">filter_t<T,U></a> make_filter(tbb::filter::mode mode, <span class="keyword">const</span> Body& body) {
 <a name="l00537"></a>00537     <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_leaf<T,U,Body>(mode, body);
 <a name="l00538"></a>00538 }
 <a name="l00539"></a>00539 
 <a name="l00540"></a>00540 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V, <span class="keyword">typename</span> U>
-<a name="l00541"></a>00541 <a class="code" href="a00246.html">filter_t<T,U></a> operator& (<span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<T,V></a>& left, <span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<V,U></a>& right) {
-<a name="l00542"></a>00542     __TBB_ASSERT(left.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,<span class="stringliteral">"cannot use default-constructed filter_t as left argument of '&'"</span>);
-<a name="l00543"></a>00543     __TBB_ASSERT(right.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,<span class="stringliteral">"cannot use default-constructed filter_t as right argument of '&'"</span>);
-<a name="l00544"></a>00544     <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_join(*left.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,*right.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>);
+<a name="l00541"></a>00541 <a class="code" href="a00257.html">filter_t<T,U></a> operator& (<span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<T,V></a>& left, <span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<V,U></a>& right) {
+<a name="l00542"></a>00542     __TBB_ASSERT(left.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,<span class="stringliteral">"cannot use default-constructed filter_t as left argument of '&'"</span>);
+<a name="l00543"></a>00543     __TBB_ASSERT(right.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,<span class="stringliteral">"cannot use default-constructed filter_t as right argument of '&'"</span>);
+<a name="l00544"></a>00544     <span class="keywordflow">return</span> <span class="keyword">new</span> internal::filter_node_join(*left.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>,*right.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>);
 <a name="l00545"></a>00545 }
 <a name="l00546"></a>00546 
 <a name="l00548"></a>00548 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00549"></a><a class="code" href="a00246.html">00549</a> <span class="keyword">class </span><a class="code" href="a00246.html">filter_t</a> {
+<a name="l00549"></a><a class="code" href="a00257.html">00549</a> <span class="keyword">class </span><a class="code" href="a00257.html">filter_t</a> {
 <a name="l00550"></a>00550     <span class="keyword">typedef</span> internal::filter_node filter_node;
 <a name="l00551"></a>00551     filter_node* root;
-<a name="l00552"></a>00552     <a class="code" href="a00246.html">filter_t</a>( filter_node* root_ ) : root(root_) {
+<a name="l00552"></a>00552     <a class="code" href="a00257.html">filter_t</a>( filter_node* root_ ) : root(root_) {
 <a name="l00553"></a>00553         root->add_ref();
 <a name="l00554"></a>00554     }
 <a name="l00555"></a>00555     <span class="keyword">friend</span> <span class="keyword">class </span>internal::pipeline_proxy;
 <a name="l00556"></a>00556     <span class="keyword">template</span><<span class="keyword">typename</span> T_, <span class="keyword">typename</span> U_, <span class="keyword">typename</span> Body>
-<a name="l00557"></a>00557     <span class="keyword">friend</span> <a class="code" href="a00246.html">filter_t<T_,U_></a> <a class="code" href="a00246.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a>(tbb::filter::mode, <span class="keyword">const</span> Body& );
+<a name="l00557"></a>00557     <span class="keyword">friend</span> <a class="code" href="a00257.html">filter_t<T_,U_></a> <a class="code" href="a00257.html#85c2892eff1fddcd06e28911e75838bd">make_filter</a>(tbb::filter::mode, <span class="keyword">const</span> Body& );
 <a name="l00558"></a>00558     <span class="keyword">template</span><<span class="keyword">typename</span> T_, <span class="keyword">typename</span> V_, <span class="keyword">typename</span> U_>
-<a name="l00559"></a>00559     <span class="keyword">friend</span> <a class="code" href="a00246.html">filter_t<T_,U_></a> operator& (<span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<T_,V_></a>& , <span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<V_,U_></a>& );
+<a name="l00559"></a>00559     <span class="keyword">friend</span> <a class="code" href="a00257.html">filter_t<T_,U_></a> operator& (<span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<T_,V_></a>& , <span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<V_,U_></a>& );
 <a name="l00560"></a>00560 <span class="keyword">public</span>:
-<a name="l00561"></a>00561     <a class="code" href="a00246.html">filter_t</a>() : root(NULL) {}
-<a name="l00562"></a>00562     <a class="code" href="a00246.html">filter_t</a>( <span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<T,U></a>& rhs ) : root(rhs.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>) {
+<a name="l00561"></a>00561     <a class="code" href="a00257.html">filter_t</a>() : root(NULL) {}
+<a name="l00562"></a>00562     <a class="code" href="a00257.html">filter_t</a>( <span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<T,U></a>& rhs ) : root(rhs.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>) {
 <a name="l00563"></a>00563         <span class="keywordflow">if</span>( root ) root->add_ref();
 <a name="l00564"></a>00564     }
 <a name="l00565"></a>00565     <span class="keyword">template</span><<span class="keyword">typename</span> Body>
-<a name="l00566"></a>00566     <a class="code" href="a00246.html">filter_t</a>( tbb::filter::mode mode, <span class="keyword">const</span> Body& body ) :
+<a name="l00566"></a>00566     <a class="code" href="a00257.html">filter_t</a>( tbb::filter::mode mode, <span class="keyword">const</span> Body& body ) :
 <a name="l00567"></a>00567         root( <span class="keyword">new</span> internal::filter_node_leaf<T,U,Body>(mode, body) ) {
 <a name="l00568"></a>00568         root->add_ref();
 <a name="l00569"></a>00569     }
 <a name="l00570"></a>00570 
-<a name="l00571"></a>00571     <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<T,U></a>& rhs ) {
+<a name="l00571"></a>00571     <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<T,U></a>& rhs ) {
 <a name="l00572"></a>00572         <span class="comment">// Order of operations below carefully chosen so that reference counts remain correct</span>
 <a name="l00573"></a>00573         <span class="comment">// in unlikely event that remove_ref throws exception.</span>
 <a name="l00574"></a>00574         filter_node* old = root;
-<a name="l00575"></a>00575         root = rhs.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>; 
+<a name="l00575"></a>00575         root = rhs.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>; 
 <a name="l00576"></a>00576         <span class="keywordflow">if</span>( root ) root->add_ref();
 <a name="l00577"></a>00577         <span class="keywordflow">if</span>( old ) old->remove_ref();
 <a name="l00578"></a>00578     }
-<a name="l00579"></a>00579     ~<a class="code" href="a00246.html">filter_t</a>() {
+<a name="l00579"></a>00579     ~<a class="code" href="a00257.html">filter_t</a>() {
 <a name="l00580"></a>00580         <span class="keywordflow">if</span>( root ) root->remove_ref();
 <a name="l00581"></a>00581     }
 <a name="l00582"></a>00582     <span class="keywordtype">void</span> clear() {
@@ -538,14 +538,14 @@
 <a name="l00589"></a>00589     }
 <a name="l00590"></a>00590 };
 <a name="l00591"></a>00591 
-<a name="l00592"></a>00592 <span class="keyword">inline</span> internal::pipeline_proxy::pipeline_proxy( <span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<void,void></a>& filter_chain ) : my_pipe() {
-<a name="l00593"></a>00593     __TBB_ASSERT( filter_chain.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>, <span class="stringliteral">"cannot apply parallel_pipeline to default-constructed filter_t"</span>  );
-<a name="l00594"></a>00594     filter_chain.<a class="code" href="a00246.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>->add_to(my_pipe);
+<a name="l00592"></a>00592 <span class="keyword">inline</span> internal::pipeline_proxy::pipeline_proxy( <span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<void,void></a>& filter_chain ) : my_pipe() {
+<a name="l00593"></a>00593     __TBB_ASSERT( filter_chain.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>, <span class="stringliteral">"cannot apply parallel_pipeline to default-constructed filter_t"</span>  );
+<a name="l00594"></a>00594     filter_chain.<a class="code" href="a00257.html#756d88b0cb01ed3cb9af741c1c4bed52">root</a>->add_to(my_pipe);
 <a name="l00595"></a>00595 }
 <a name="l00596"></a>00596 
-<a name="l00597"></a>00597 <span class="keyword">inline</span> <span class="keywordtype">void</span> parallel_pipeline(size_t max_number_of_live_tokens, <span class="keyword">const</span> <a class="code" href="a00246.html">filter_t<void,void></a>& filter_chain
+<a name="l00597"></a>00597 <span class="keyword">inline</span> <span class="keywordtype">void</span> parallel_pipeline(size_t max_number_of_live_tokens, <span class="keyword">const</span> <a class="code" href="a00257.html">filter_t<void,void></a>& filter_chain
 <a name="l00598"></a>00598 #<span class="keywordflow">if</span> __TBB_TASK_GROUP_CONTEXT
-<a name="l00599"></a>00599     , <a class="code" href="a00293.html">tbb::task_group_context</a>& context
+<a name="l00599"></a>00599     , <a class="code" href="a00314.html">tbb::task_group_context</a>& context
 <a name="l00600"></a>00600 #endif
 <a name="l00601"></a>00601     ) {
 <a name="l00602"></a>00602     internal::pipeline_proxy pipe(filter_chain);
@@ -559,7 +559,7 @@
 <a name="l00610"></a>00610 
 <a name="l00611"></a>00611 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
 <a name="l00612"></a>00612 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> parallel_pipeline(size_t max_number_of_live_tokens, <span class="keyword">const</span> filter_t<void,void>& filter_chain) {
-<a name="l00613"></a>00613     <a class="code" href="a00293.html">tbb::task_group_context</a> context;
+<a name="l00613"></a>00613     <a class="code" href="a00314.html">tbb::task_group_context</a> context;
 <a name="l00614"></a>00614     parallel_pipeline(max_number_of_live_tokens, filter_chain, context);
 <a name="l00615"></a>00615 }
 <a name="l00616"></a>00616 <span class="preprocessor">#endif // __TBB_TASK_GROUP_CONTEXT</span>
diff --git a/doc/html/a00560.html b/doc/html/a00557.html
similarity index 81%
copy from doc/html/a00560.html
copy to doc/html/a00557.html
index c0a44a9..efc804c 100644
--- a/doc/html/a00560.html
+++ b/doc/html/a00557.html
@@ -62,9 +62,9 @@
 <a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
 <a name="l00042"></a>00042 
 <a name="l00044"></a>00044 
-<a name="l00045"></a><a class="code" href="a00270.html">00045</a> <span class="keyword">class </span><a class="code" href="a00270.html">queuing_mutex</a> {
+<a name="l00045"></a><a class="code" href="a00288.html">00045</a> <span class="keyword">class </span><a class="code" href="a00288.html">queuing_mutex</a> {
 <a name="l00046"></a>00046 <span class="keyword">public</span>:
-<a name="l00048"></a><a class="code" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">00048</a>     <a class="code" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>() {
+<a name="l00048"></a><a class="code" href="a00288.html#b389ad9c4db7293e4bdb5b8cda69ec04">00048</a>     <a class="code" href="a00288.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>() {
 <a name="l00049"></a>00049         q_tail = NULL;
 <a name="l00050"></a>00050 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
 <a name="l00051"></a>00051 <span class="preprocessor"></span>        internal_construct();
@@ -72,36 +72,36 @@
 <a name="l00053"></a>00053 <span class="preprocessor"></span>    }
 <a name="l00054"></a>00054 
 <a name="l00056"></a>00056 
-<a name="l00058"></a><a class="code" href="a00271.html">00058</a>     <span class="keyword">class </span><a class="code" href="a00271.html">scoped_lock</a>: internal::no_copy {
+<a name="l00058"></a><a class="code" href="a00289.html">00058</a>     <span class="keyword">class </span><a class="code" href="a00289.html">scoped_lock</a>: internal::no_copy {
 <a name="l00060"></a>00060         <span class="keywordtype">void</span> initialize() {
-<a name="l00061"></a>00061             <a class="code" href="a00258.html">mutex</a> = NULL;
+<a name="l00061"></a>00061             <a class="code" href="a00275.html">mutex</a> = NULL;
 <a name="l00062"></a>00062 <span class="preprocessor">#if TBB_USE_ASSERT</span>
 <a name="l00063"></a>00063 <span class="preprocessor"></span>            internal::poison_pointer(next);
 <a name="l00064"></a>00064 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
 <a name="l00065"></a>00065         }
 <a name="l00066"></a>00066     <span class="keyword">public</span>:
 <a name="l00068"></a>00068 
-<a name="l00069"></a><a class="code" href="a00271.html#db0fa3967491014572e24d6607bdc971">00069</a>         <a class="code" href="a00271.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>() {initialize();}
+<a name="l00069"></a><a class="code" href="a00289.html#db0fa3967491014572e24d6607bdc971">00069</a>         <a class="code" href="a00289.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>() {initialize();}
 <a name="l00070"></a>00070 
-<a name="l00072"></a><a class="code" href="a00271.html#9b51ef972f5618ac17caadb58841ab6d">00072</a>         <a class="code" href="a00271.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>( <a class="code" href="a00270.html">queuing_mutex</a>& m ) {
+<a name="l00072"></a><a class="code" href="a00289.html#9b51ef972f5618ac17caadb58841ab6d">00072</a>         <a class="code" href="a00289.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>( <a class="code" href="a00288.html">queuing_mutex</a>& m ) {
 <a name="l00073"></a>00073             initialize();
-<a name="l00074"></a>00074             <a class="code" href="a00271.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(m);
+<a name="l00074"></a>00074             <a class="code" href="a00289.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(m);
 <a name="l00075"></a>00075         }
 <a name="l00076"></a>00076 
-<a name="l00078"></a><a class="code" href="a00271.html#ac2c576a93570957d694192a5f491443">00078</a>         <a class="code" href="a00271.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>() {
-<a name="l00079"></a>00079             <span class="keywordflow">if</span>( <a class="code" href="a00258.html">mutex</a> ) <a class="code" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
+<a name="l00078"></a><a class="code" href="a00289.html#ac2c576a93570957d694192a5f491443">00078</a>         <a class="code" href="a00289.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>() {
+<a name="l00079"></a>00079             <span class="keywordflow">if</span>( <a class="code" href="a00275.html">mutex</a> ) <a class="code" href="a00289.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
 <a name="l00080"></a>00080         }
 <a name="l00081"></a>00081 
-<a name="l00083"></a>00083         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00271.html#533e4fc8355ee321206a0609c42d909d">acquire</a>( <a class="code" href="a00270.html">queuing_mutex</a>& m );
+<a name="l00083"></a>00083         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00289.html#533e4fc8355ee321206a0609c42d909d">acquire</a>( <a class="code" href="a00288.html">queuing_mutex</a>& m );
 <a name="l00084"></a>00084 
-<a name="l00086"></a>00086         <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00271.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>( <a class="code" href="a00270.html">queuing_mutex</a>& m );
+<a name="l00086"></a>00086         <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00289.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>( <a class="code" href="a00288.html">queuing_mutex</a>& m );
 <a name="l00087"></a>00087 
-<a name="l00089"></a>00089         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
+<a name="l00089"></a>00089         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00289.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
 <a name="l00090"></a>00090 
 <a name="l00091"></a>00091     <span class="keyword">private</span>:
-<a name="l00093"></a>00093         <a class="code" href="a00270.html">queuing_mutex</a>* <a class="code" href="a00258.html">mutex</a>;
+<a name="l00093"></a>00093         <a class="code" href="a00288.html">queuing_mutex</a>* <a class="code" href="a00275.html">mutex</a>;
 <a name="l00094"></a>00094 
-<a name="l00096"></a>00096         <a class="code" href="a00271.html">scoped_lock</a> *next;
+<a name="l00096"></a>00096         <a class="code" href="a00289.html">scoped_lock</a> *next;
 <a name="l00097"></a>00097 
 <a name="l00099"></a>00099 
 <a name="l00102"></a>00102         uintptr_t going;
@@ -113,18 +113,16 @@
 <a name="l00108"></a>00108     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
 <a name="l00109"></a>00109     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
 <a name="l00110"></a>00110     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
-<a name="l00111"></a>00111 
-<a name="l00112"></a>00112     <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00113"></a>00113 <span class="keyword">private</span>:
-<a name="l00115"></a>00115     <a class="code" href="a00216.html">atomic<scoped_lock*></a> q_tail;
+<a name="l00111"></a>00111 <span class="keyword">private</span>:
+<a name="l00113"></a>00113     <a class="code" href="a00228.html">atomic<scoped_lock*></a> q_tail;
+<a name="l00114"></a>00114 
+<a name="l00115"></a>00115 };
 <a name="l00116"></a>00116 
-<a name="l00117"></a>00117 };
+<a name="l00117"></a>00117 __TBB_DEFINE_PROFILING_SET_NAME(queuing_mutex)
 <a name="l00118"></a>00118 
-<a name="l00119"></a>00119 __TBB_DEFINE_PROFILING_SET_NAME(queuing_mutex)
+<a name="l00119"></a>00119 } <span class="comment">// namespace tbb</span>
 <a name="l00120"></a>00120 
-<a name="l00121"></a>00121 } <span class="comment">// namespace tbb</span>
-<a name="l00122"></a>00122 
-<a name="l00123"></a>00123 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_mutex_H */</span>
+<a name="l00121"></a>00121 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_mutex_H */</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00561.html b/doc/html/a00558.html
similarity index 82%
copy from doc/html/a00561.html
copy to doc/html/a00558.html
index 26c60be..18f42a9 100644
--- a/doc/html/a00561.html
+++ b/doc/html/a00558.html
@@ -62,16 +62,16 @@
 <a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
 <a name="l00042"></a>00042 
 <a name="l00044"></a>00044 
-<a name="l00047"></a><a class="code" href="a00272.html">00047</a> <span class="keyword">class </span><a class="code" href="a00272.html">queuing_rw_mutex</a> {
+<a name="l00047"></a><a class="code" href="a00290.html">00047</a> <span class="keyword">class </span><a class="code" href="a00290.html">queuing_rw_mutex</a> {
 <a name="l00048"></a>00048 <span class="keyword">public</span>:
-<a name="l00050"></a><a class="code" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">00050</a>     <a class="code" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>() {
+<a name="l00050"></a><a class="code" href="a00290.html#85c90877c3447690ac4e2ac4ff8dea5e">00050</a>     <a class="code" href="a00290.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>() {
 <a name="l00051"></a>00051         q_tail = NULL;
 <a name="l00052"></a>00052 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
 <a name="l00053"></a>00053 <span class="preprocessor"></span>        internal_construct();
 <a name="l00054"></a>00054 <span class="preprocessor">#endif</span>
 <a name="l00055"></a>00055 <span class="preprocessor"></span>    }
 <a name="l00056"></a>00056 
-<a name="l00058"></a><a class="code" href="a00272.html#1ba73e3d95cfdf8323880bc623af9099">00058</a>     <a class="code" href="a00272.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>() {
+<a name="l00058"></a><a class="code" href="a00290.html#1ba73e3d95cfdf8323880bc623af9099">00058</a>     <a class="code" href="a00290.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>() {
 <a name="l00059"></a>00059 <span class="preprocessor">#if TBB_USE_ASSERT</span>
 <a name="l00060"></a>00060 <span class="preprocessor"></span>        __TBB_ASSERT( !q_tail, <span class="stringliteral">"destruction of an acquired mutex"</span>);
 <a name="l00061"></a>00061 <span class="preprocessor">#endif</span>
@@ -81,52 +81,52 @@
 <a name="l00065"></a>00065     <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
 <a name="l00066"></a>00066 
 <a name="l00068"></a>00068 
-<a name="l00070"></a><a class="code" href="a00273.html">00070</a>     <span class="keyword">class </span><a class="code" href="a00273.html">scoped_lock</a>: internal::no_copy {
+<a name="l00070"></a><a class="code" href="a00291.html">00070</a>     <span class="keyword">class </span><a class="code" href="a00291.html">scoped_lock</a>: internal::no_copy {
 <a name="l00072"></a>00072         <span class="keywordtype">void</span> initialize() {
-<a name="l00073"></a>00073             <a class="code" href="a00258.html">mutex</a> = NULL;
+<a name="l00073"></a>00073             my_mutex = NULL;
 <a name="l00074"></a>00074 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00075"></a>00075 <span class="preprocessor"></span>            state = 0xFF; <span class="comment">// Set to invalid state</span>
-<a name="l00076"></a>00076             internal::poison_pointer(next);
-<a name="l00077"></a>00077             internal::poison_pointer(prev);
+<a name="l00075"></a>00075 <span class="preprocessor"></span>            my_state = 0xFF; <span class="comment">// Set to invalid state</span>
+<a name="l00076"></a>00076             internal::poison_pointer(my_next);
+<a name="l00077"></a>00077             internal::poison_pointer(my_prev);
 <a name="l00078"></a>00078 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
 <a name="l00079"></a>00079         }
 <a name="l00080"></a>00080     <span class="keyword">public</span>:
 <a name="l00082"></a>00082 
-<a name="l00083"></a><a class="code" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">00083</a>         <a class="code" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>() {initialize();}
+<a name="l00083"></a><a class="code" href="a00291.html#c62e365be7bcbba091c9ea7454a4d22c">00083</a>         <a class="code" href="a00291.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>() {initialize();}
 <a name="l00084"></a>00084 
-<a name="l00086"></a><a class="code" href="a00273.html#fbb8798792d3aebb136c46fc63d2529e">00086</a>         <a class="code" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>( <a class="code" href="a00272.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> ) {
+<a name="l00086"></a><a class="code" href="a00291.html#fbb8798792d3aebb136c46fc63d2529e">00086</a>         <a class="code" href="a00291.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>( <a class="code" href="a00290.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> ) {
 <a name="l00087"></a>00087             initialize();
-<a name="l00088"></a>00088             <a class="code" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(m,write);
+<a name="l00088"></a>00088             <a class="code" href="a00291.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(m,write);
 <a name="l00089"></a>00089         }
 <a name="l00090"></a>00090 
-<a name="l00092"></a><a class="code" href="a00273.html#32c7d67a660d23ebbaab1a1d2826d31a">00092</a>         <a class="code" href="a00273.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>() {
-<a name="l00093"></a>00093             <span class="keywordflow">if</span>( <a class="code" href="a00258.html">mutex</a> ) <a class="code" href="a00273.html#67ae221109ddc69510ab593874e435d4">release</a>();
+<a name="l00092"></a><a class="code" href="a00291.html#32c7d67a660d23ebbaab1a1d2826d31a">00092</a>         <a class="code" href="a00291.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>() {
+<a name="l00093"></a>00093             <span class="keywordflow">if</span>( my_mutex ) <a class="code" href="a00291.html#67ae221109ddc69510ab593874e435d4">release</a>();
 <a name="l00094"></a>00094         }
 <a name="l00095"></a>00095 
-<a name="l00097"></a>00097         <span class="keywordtype">void</span> <a class="code" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>( <a class="code" href="a00272.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
+<a name="l00097"></a>00097         <span class="keywordtype">void</span> <a class="code" href="a00291.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>( <a class="code" href="a00290.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
 <a name="l00098"></a>00098 
-<a name="l00100"></a>00100         <span class="keywordtype">bool</span> <a class="code" href="a00273.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>( <a class="code" href="a00272.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
+<a name="l00100"></a>00100         <span class="keywordtype">bool</span> <a class="code" href="a00291.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>( <a class="code" href="a00290.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
 <a name="l00101"></a>00101 
-<a name="l00103"></a>00103         <span class="keywordtype">void</span> <a class="code" href="a00273.html#67ae221109ddc69510ab593874e435d4">release</a>();
+<a name="l00103"></a>00103         <span class="keywordtype">void</span> <a class="code" href="a00291.html#67ae221109ddc69510ab593874e435d4">release</a>();
 <a name="l00104"></a>00104 
 <a name="l00106"></a>00106 
-<a name="l00107"></a>00107         <span class="keywordtype">bool</span> <a class="code" href="a00273.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>();
+<a name="l00107"></a>00107         <span class="keywordtype">bool</span> <a class="code" href="a00291.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>();
 <a name="l00108"></a>00108 
-<a name="l00110"></a>00110         <span class="keywordtype">bool</span> <a class="code" href="a00273.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>();
+<a name="l00110"></a>00110         <span class="keywordtype">bool</span> <a class="code" href="a00291.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>();
 <a name="l00111"></a>00111 
 <a name="l00112"></a>00112     <span class="keyword">private</span>:
-<a name="l00114"></a>00114         <a class="code" href="a00272.html">queuing_rw_mutex</a>* <a class="code" href="a00258.html">mutex</a>;
+<a name="l00114"></a>00114         <a class="code" href="a00290.html">queuing_rw_mutex</a>* my_mutex;
 <a name="l00115"></a>00115 
-<a name="l00117"></a>00117         <a class="code" href="a00273.html">scoped_lock</a> * prev, * next;
+<a name="l00117"></a>00117         <a class="code" href="a00291.html">scoped_lock</a> *__TBB_atomic my_prev, *__TBB_atomic my_next;
 <a name="l00118"></a>00118 
 <a name="l00119"></a>00119         <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state_t;
 <a name="l00120"></a>00120 
-<a name="l00122"></a>00122         <a class="code" href="a00216.html">atomic<state_t></a> state;
+<a name="l00122"></a>00122         <a class="code" href="a00228.html">atomic<state_t></a> my_state;
 <a name="l00123"></a>00123 
 <a name="l00125"></a>00125 
-<a name="l00126"></a>00126         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> going;
+<a name="l00126"></a>00126         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __TBB_atomic my_going;
 <a name="l00127"></a>00127 
-<a name="l00129"></a>00129         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> internal_lock;
+<a name="l00129"></a>00129         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> my_internal_lock;
 <a name="l00130"></a>00130 
 <a name="l00132"></a>00132         <span class="keywordtype">void</span> acquire_internal_lock();
 <a name="l00133"></a>00133 
@@ -148,7 +148,7 @@
 <a name="l00153"></a>00153     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
 <a name="l00154"></a>00154 
 <a name="l00155"></a>00155 <span class="keyword">private</span>:
-<a name="l00157"></a>00157     <a class="code" href="a00216.html">atomic<scoped_lock*></a> q_tail;
+<a name="l00157"></a>00157     <a class="code" href="a00228.html">atomic<scoped_lock*></a> q_tail;
 <a name="l00158"></a>00158 
 <a name="l00159"></a>00159 };
 <a name="l00160"></a>00160 
diff --git a/doc/html/a00562.html b/doc/html/a00559.html
similarity index 82%
copy from doc/html/a00562.html
copy to doc/html/a00559.html
index 738d3ed..2ed52ff 100644
--- a/doc/html/a00562.html
+++ b/doc/html/a00559.html
@@ -49,31 +49,31 @@
 <a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
 <a name="l00029"></a>00029 <span class="keyword">namespace </span>interface5 {
 <a name="l00031"></a>00031 
-<a name="l00034"></a><a class="code" href="a00274.html">00034</a>     <span class="keyword">class </span><a class="code" href="a00274.html">reader_writer_lock</a> : tbb::internal::no_copy {
+<a name="l00034"></a><a class="code" href="a00292.html">00034</a>     <span class="keyword">class </span><a class="code" href="a00292.html">reader_writer_lock</a> : tbb::internal::no_copy {
 <a name="l00035"></a>00035  <span class="keyword">public</span>:
-<a name="l00036"></a>00036     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00275.html">scoped_lock</a>;
-<a name="l00037"></a>00037     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00276.html">scoped_lock_read</a>;
+<a name="l00036"></a>00036     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00293.html">scoped_lock</a>;
+<a name="l00037"></a>00037     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00294.html">scoped_lock_read</a>;
 <a name="l00039"></a>00039 
-<a name="l00074"></a><a class="code" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">00074</a>     <span class="keyword">enum</span> <a class="code" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> { waiting_nonblocking, waiting, active, invalid };
+<a name="l00074"></a><a class="code" href="a00292.html#6f921f0d7c1812ceb5674418c8b6ccaf">00074</a>     <span class="keyword">enum</span> <a class="code" href="a00292.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> { waiting_nonblocking, waiting, active, invalid };
 <a name="l00075"></a>00075 
-<a name="l00077"></a><a class="code" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">00077</a>     <a class="code" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a>() {
+<a name="l00077"></a><a class="code" href="a00292.html#c1431c4293e777efd9aab9a95c2a46e1">00077</a>     <a class="code" href="a00292.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a>() {
 <a name="l00078"></a>00078         internal_construct();
 <a name="l00079"></a>00079     }
 <a name="l00080"></a>00080 
-<a name="l00082"></a><a class="code" href="a00274.html#5135f64f7b7339017f33d956445edbee">00082</a>     <a class="code" href="a00274.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a>() {
+<a name="l00082"></a><a class="code" href="a00292.html#5135f64f7b7339017f33d956445edbee">00082</a>     <a class="code" href="a00292.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a>() {
 <a name="l00083"></a>00083         internal_destroy();
 <a name="l00084"></a>00084     }
 <a name="l00085"></a>00085 
 <a name="l00087"></a>00087 
-<a name="l00089"></a><a class="code" href="a00275.html">00089</a>     <span class="keyword">class </span><a class="code" href="a00275.html">scoped_lock</a> : tbb::internal::no_copy {
+<a name="l00089"></a><a class="code" href="a00293.html">00089</a>     <span class="keyword">class </span><a class="code" href="a00293.html">scoped_lock</a> : tbb::internal::no_copy {
 <a name="l00090"></a>00090     <span class="keyword">public</span>:
-<a name="l00091"></a>00091         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00274.html">reader_writer_lock</a>;
+<a name="l00091"></a>00091         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00292.html">reader_writer_lock</a>;
 <a name="l00092"></a>00092  
-<a name="l00094"></a><a class="code" href="a00275.html#cf19f20e082887c1bb0ba6b0911c3583">00094</a>         <a class="code" href="a00275.html">scoped_lock</a>(<a class="code" href="a00274.html">reader_writer_lock</a>& <a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
-<a name="l00095"></a>00095             internal_construct(<a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
+<a name="l00094"></a><a class="code" href="a00293.html#cf19f20e082887c1bb0ba6b0911c3583">00094</a>         <a class="code" href="a00293.html">scoped_lock</a>(<a class="code" href="a00292.html">reader_writer_lock</a>& <a class="code" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
+<a name="l00095"></a>00095             internal_construct(<a class="code" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
 <a name="l00096"></a>00096         }
 <a name="l00097"></a>00097         
-<a name="l00099"></a><a class="code" href="a00275.html#70246e0260493625ff956fa5926fc71f">00099</a>         <a class="code" href="a00275.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>() {
+<a name="l00099"></a><a class="code" href="a00293.html#70246e0260493625ff956fa5926fc71f">00099</a>         <a class="code" href="a00293.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>() {
 <a name="l00100"></a>00100             internal_destroy();
 <a name="l00101"></a>00101         }
 <a name="l00102"></a>00102 
@@ -85,25 +85,25 @@
 <a name="l00108"></a>00108         }
 <a name="l00109"></a>00109 
 <a name="l00110"></a>00110     <span class="keyword">private</span>:
-<a name="l00112"></a>00112         <a class="code" href="a00274.html">reader_writer_lock</a> *<a class="code" href="a00258.html">mutex</a>;
+<a name="l00112"></a>00112         <a class="code" href="a00292.html">reader_writer_lock</a> *<a class="code" href="a00275.html">mutex</a>;
 <a name="l00114"></a>00114         scoped_lock* next;
-<a name="l00116"></a>00116         <a class="code" href="a00216.html">atomic<status_t></a> status;
+<a name="l00116"></a>00116         <a class="code" href="a00228.html">atomic<status_t></a> status;
 <a name="l00117"></a>00117 
 <a name="l00119"></a>00119         scoped_lock();
 <a name="l00120"></a>00120 
-<a name="l00121"></a>00121         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct(<a class="code" href="a00274.html">reader_writer_lock</a>&);
+<a name="l00121"></a>00121         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct(<a class="code" href="a00292.html">reader_writer_lock</a>&);
 <a name="l00122"></a>00122         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
 <a name="l00123"></a>00123    };
 <a name="l00124"></a>00124 
-<a name="l00126"></a><a class="code" href="a00276.html">00126</a>     <span class="keyword">class </span><a class="code" href="a00276.html">scoped_lock_read</a> : tbb::internal::no_copy {
+<a name="l00126"></a><a class="code" href="a00294.html">00126</a>     <span class="keyword">class </span><a class="code" href="a00294.html">scoped_lock_read</a> : tbb::internal::no_copy {
 <a name="l00127"></a>00127     <span class="keyword">public</span>:
-<a name="l00128"></a>00128         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00274.html">reader_writer_lock</a>;
+<a name="l00128"></a>00128         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00292.html">reader_writer_lock</a>;
 <a name="l00129"></a>00129 
-<a name="l00131"></a><a class="code" href="a00276.html#87ab0dc8f7216e6ba0f7acd6aec33064">00131</a>         <a class="code" href="a00276.html">scoped_lock_read</a>(<a class="code" href="a00274.html">reader_writer_lock</a>& <a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
-<a name="l00132"></a>00132             internal_construct(<a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
+<a name="l00131"></a><a class="code" href="a00294.html#87ab0dc8f7216e6ba0f7acd6aec33064">00131</a>         <a class="code" href="a00294.html">scoped_lock_read</a>(<a class="code" href="a00292.html">reader_writer_lock</a>& <a class="code" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
+<a name="l00132"></a>00132             internal_construct(<a class="code" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
 <a name="l00133"></a>00133         }
 <a name="l00134"></a>00134 
-<a name="l00136"></a><a class="code" href="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">00136</a>         <a class="code" href="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a>() { 
+<a name="l00136"></a><a class="code" href="a00294.html#bd21c5f3d555d64d1de8658e15bf4966">00136</a>         <a class="code" href="a00294.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a>() { 
 <a name="l00137"></a>00137             internal_destroy();
 <a name="l00138"></a>00138         }
 <a name="l00139"></a>00139         
@@ -115,29 +115,29 @@
 <a name="l00145"></a>00145         }
 <a name="l00146"></a>00146 
 <a name="l00147"></a>00147     <span class="keyword">private</span>:
-<a name="l00149"></a>00149         <a class="code" href="a00274.html">reader_writer_lock</a> *<a class="code" href="a00258.html">mutex</a>;
+<a name="l00149"></a>00149         <a class="code" href="a00292.html">reader_writer_lock</a> *<a class="code" href="a00275.html">mutex</a>;
 <a name="l00151"></a>00151         scoped_lock_read *next;
-<a name="l00153"></a>00153         <a class="code" href="a00216.html">atomic<status_t></a> status;
+<a name="l00153"></a>00153         <a class="code" href="a00228.html">atomic<status_t></a> status;
 <a name="l00154"></a>00154 
 <a name="l00156"></a>00156         scoped_lock_read();
 <a name="l00157"></a>00157 
-<a name="l00158"></a>00158         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct(<a class="code" href="a00274.html">reader_writer_lock</a>&);
+<a name="l00158"></a>00158         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct(<a class="code" href="a00292.html">reader_writer_lock</a>&);
 <a name="l00159"></a>00159         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
 <a name="l00160"></a>00160     };
 <a name="l00161"></a>00161     
 <a name="l00163"></a>00163 
-<a name="l00168"></a>00168     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>();
+<a name="l00168"></a>00168     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>();
 <a name="l00169"></a>00169 
 <a name="l00171"></a>00171 
-<a name="l00175"></a>00175     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00274.html#721eb173e154ab38292273e9266a9b07">try_lock</a>();
+<a name="l00175"></a>00175     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00292.html#721eb173e154ab38292273e9266a9b07">try_lock</a>();
 <a name="l00176"></a>00176 
 <a name="l00178"></a>00178 
-<a name="l00182"></a>00182     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00274.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a>(); 
+<a name="l00182"></a>00182     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00292.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a>(); 
 <a name="l00183"></a>00183 
 <a name="l00185"></a>00185 
-<a name="l00187"></a>00187     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00274.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a>();
+<a name="l00187"></a>00187     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00292.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a>();
 <a name="l00188"></a>00188 
-<a name="l00190"></a>00190     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00274.html#5113b32689305599b2c36b5831547704">unlock</a>();
+<a name="l00190"></a>00190     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00292.html#5113b32689305599b2c36b5831547704">unlock</a>();
 <a name="l00191"></a>00191 
 <a name="l00192"></a>00192  <span class="keyword">private</span>:
 <a name="l00193"></a>00193     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
diff --git a/doc/html/a00560.html b/doc/html/a00560.html
index c0a44a9..38f7304 100644
--- a/doc/html/a00560.html
+++ b/doc/html/a00560.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>queuing_mutex.h Source File</title>
+<title>recursive_mutex.h Source File</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -19,7 +19,7 @@
     <li><a href="files.html"><span>File List</span></a></li>
     <li><a href="globals.html"><span>File Members</span></a></li>
   </ul></div>
-<h1>queuing_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>recursive_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
 <a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
 <a name="l00003"></a>00003 <span class="comment"></span>
 <a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
@@ -39,92 +39,197 @@
 <a name="l00018"></a>00018 <span class="comment">    writing.</span>
 <a name="l00019"></a>00019 <span class="comment">*/</span>
 <a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_queuing_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_queuing_mutex_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_recursive_mutex_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_recursive_mutex_H</span>
 <a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_config.h"</span>
-<a name="l00025"></a>00025 
-<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>    <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00028"></a>00028 <span class="preprocessor">    #pragma warning (push)</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4530)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <cstring></span>
-<a name="l00033"></a>00033 
-<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span>
-<a name="l00038"></a>00038 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00040"></a>00040 
-<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
-<a name="l00042"></a>00042 
-<a name="l00044"></a>00044 
-<a name="l00045"></a><a class="code" href="a00270.html">00045</a> <span class="keyword">class </span><a class="code" href="a00270.html">queuing_mutex</a> {
-<a name="l00046"></a>00046 <span class="keyword">public</span>:
-<a name="l00048"></a><a class="code" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">00048</a>     <a class="code" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">queuing_mutex</a>() {
-<a name="l00049"></a>00049         q_tail = NULL;
-<a name="l00050"></a>00050 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span>        internal_construct();
-<a name="l00052"></a>00052 <span class="preprocessor">#endif</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span>    }
-<a name="l00054"></a>00054 
-<a name="l00056"></a>00056 
-<a name="l00058"></a><a class="code" href="a00271.html">00058</a>     <span class="keyword">class </span><a class="code" href="a00271.html">scoped_lock</a>: internal::no_copy {
-<a name="l00060"></a>00060         <span class="keywordtype">void</span> initialize() {
-<a name="l00061"></a>00061             <a class="code" href="a00258.html">mutex</a> = NULL;
-<a name="l00062"></a>00062 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span>            internal::poison_pointer(next);
-<a name="l00064"></a>00064 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00065"></a>00065         }
-<a name="l00066"></a>00066     <span class="keyword">public</span>:
-<a name="l00068"></a>00068 
-<a name="l00069"></a><a class="code" href="a00271.html#db0fa3967491014572e24d6607bdc971">00069</a>         <a class="code" href="a00271.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>() {initialize();}
-<a name="l00070"></a>00070 
-<a name="l00072"></a><a class="code" href="a00271.html#9b51ef972f5618ac17caadb58841ab6d">00072</a>         <a class="code" href="a00271.html#db0fa3967491014572e24d6607bdc971">scoped_lock</a>( <a class="code" href="a00270.html">queuing_mutex</a>& m ) {
-<a name="l00073"></a>00073             initialize();
-<a name="l00074"></a>00074             <a class="code" href="a00271.html#533e4fc8355ee321206a0609c42d909d">acquire</a>(m);
-<a name="l00075"></a>00075         }
+<a name="l00024"></a>00024 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_api.h"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#else</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
+<a name="l00028"></a>00028 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00029"></a>00029 
+<a name="l00030"></a>00030 <span class="preprocessor">#include <new></span>
+<a name="l00031"></a>00031 <span class="preprocessor">#include "aligned_space.h"</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00033"></a>00033 <span class="preprocessor">#include "tbb_profiling.h"</span>
+<a name="l00034"></a>00034 
+<a name="l00035"></a>00035 <span class="keyword">namespace </span>tbb {
+<a name="l00037"></a>00037 
+<a name="l00039"></a><a class="code" href="a00296.html">00039</a> <span class="keyword">class </span><a class="code" href="a00296.html">recursive_mutex</a> {
+<a name="l00040"></a>00040 <span class="keyword">public</span>:
+<a name="l00042"></a><a class="code" href="a00296.html#d2fceb7f95c24a8cd1457d4527e4b8c6">00042</a>     <a class="code" href="a00296.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a>() {
+<a name="l00043"></a>00043 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_THREADING_TOOLS</span>
+<a name="l00044"></a>00044 <span class="preprocessor"></span>        internal_construct();
+<a name="l00045"></a>00045 <span class="preprocessor">#else</span>
+<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">  #if _WIN32||_WIN64</span>
+<a name="l00047"></a>00047 <span class="preprocessor"></span>        InitializeCriticalSection(&impl);
+<a name="l00048"></a>00048 <span class="preprocessor">  #else</span>
+<a name="l00049"></a>00049 <span class="preprocessor"></span>        pthread_mutexattr_t mtx_attr;
+<a name="l00050"></a>00050         <span class="keywordtype">int</span> error_code = pthread_mutexattr_init( &mtx_attr );
+<a name="l00051"></a>00051         <span class="keywordflow">if</span>( error_code )
+<a name="l00052"></a>00052             tbb::internal::handle_perror(error_code,<span class="stringliteral">"recursive_mutex: pthread_mutexattr_init failed"</span>);
+<a name="l00053"></a>00053 
+<a name="l00054"></a>00054         pthread_mutexattr_settype( &mtx_attr, PTHREAD_MUTEX_RECURSIVE );
+<a name="l00055"></a>00055         error_code = pthread_mutex_init( &impl, &mtx_attr );
+<a name="l00056"></a>00056         <span class="keywordflow">if</span>( error_code )
+<a name="l00057"></a>00057             tbb::internal::handle_perror(error_code,<span class="stringliteral">"recursive_mutex: pthread_mutex_init failed"</span>);
+<a name="l00058"></a>00058 
+<a name="l00059"></a>00059         pthread_mutexattr_destroy( &mtx_attr );
+<a name="l00060"></a>00060 <span class="preprocessor">  #endif </span><span class="comment">/* _WIN32||_WIN64*/</span>
+<a name="l00061"></a>00061 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00062"></a>00062     };
+<a name="l00063"></a>00063 
+<a name="l00064"></a>00064     ~<a class="code" href="a00296.html">recursive_mutex</a>() {
+<a name="l00065"></a>00065 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00066"></a>00066 <span class="preprocessor"></span>        internal_destroy();
+<a name="l00067"></a>00067 <span class="preprocessor">#else</span>
+<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor">  #if _WIN32||_WIN64</span>
+<a name="l00069"></a>00069 <span class="preprocessor"></span>        DeleteCriticalSection(&impl);
+<a name="l00070"></a>00070 <span class="preprocessor">  #else</span>
+<a name="l00071"></a>00071 <span class="preprocessor"></span>        pthread_mutex_destroy(&impl); 
+<a name="l00072"></a>00072 
+<a name="l00073"></a>00073 <span class="preprocessor">  #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00074"></a>00074 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00075"></a>00075     };
 <a name="l00076"></a>00076 
-<a name="l00078"></a><a class="code" href="a00271.html#ac2c576a93570957d694192a5f491443">00078</a>         <a class="code" href="a00271.html#ac2c576a93570957d694192a5f491443">~scoped_lock</a>() {
-<a name="l00079"></a>00079             <span class="keywordflow">if</span>( <a class="code" href="a00258.html">mutex</a> ) <a class="code" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
-<a name="l00080"></a>00080         }
+<a name="l00077"></a>00077     <span class="keyword">class </span>scoped_lock;
+<a name="l00078"></a>00078     <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
+<a name="l00079"></a>00079 
 <a name="l00081"></a>00081 
-<a name="l00083"></a>00083         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00271.html#533e4fc8355ee321206a0609c42d909d">acquire</a>( <a class="code" href="a00270.html">queuing_mutex</a>& m );
-<a name="l00084"></a>00084 
-<a name="l00086"></a>00086         <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00271.html#e5a014fb817599386a87170cf2cf51a9">try_acquire</a>( <a class="code" href="a00270.html">queuing_mutex</a>& m );
+<a name="l00083"></a><a class="code" href="a00297.html">00083</a>     <span class="keyword">class </span><a class="code" href="a00297.html">scoped_lock</a>: internal::no_copy {
+<a name="l00084"></a>00084     <span class="keyword">public</span>:
+<a name="l00086"></a><a class="code" href="a00297.html#d82d4d36fbf9727a493d26ae50855fe7">00086</a>         <a class="code" href="a00297.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>() : my_mutex(NULL) {};
 <a name="l00087"></a>00087 
-<a name="l00089"></a>00089         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">release</a>();
-<a name="l00090"></a>00090 
-<a name="l00091"></a>00091     <span class="keyword">private</span>:
-<a name="l00093"></a>00093         <a class="code" href="a00270.html">queuing_mutex</a>* <a class="code" href="a00258.html">mutex</a>;
-<a name="l00094"></a>00094 
-<a name="l00096"></a>00096         <a class="code" href="a00271.html">scoped_lock</a> *next;
-<a name="l00097"></a>00097 
-<a name="l00099"></a>00099 
-<a name="l00102"></a>00102         uintptr_t going;
-<a name="l00103"></a>00103     };
-<a name="l00104"></a>00104 
-<a name="l00105"></a>00105     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00106"></a>00106 
-<a name="l00107"></a>00107     <span class="comment">// Mutex traits</span>
-<a name="l00108"></a>00108     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
-<a name="l00109"></a>00109     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
-<a name="l00110"></a>00110     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
+<a name="l00089"></a><a class="code" href="a00297.html#dec17713c4c1321ac8fec66816d0c602">00089</a>         <a class="code" href="a00297.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>( <a class="code" href="a00296.html">recursive_mutex</a>& <a class="code" href="a00275.html">mutex</a> ) {
+<a name="l00090"></a>00090 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00091"></a>00091 <span class="preprocessor"></span>            my_mutex = &mutex; 
+<a name="l00092"></a>00092 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00093"></a>00093             <a class="code" href="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( mutex );
+<a name="l00094"></a>00094         }
+<a name="l00095"></a>00095 
+<a name="l00097"></a><a class="code" href="a00297.html#c1197ffb8f3cd9d4fed71d7e06265b7c">00097</a>         <a class="code" href="a00297.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>() {
+<a name="l00098"></a>00098             <span class="keywordflow">if</span>( my_mutex ) 
+<a name="l00099"></a>00099                 <a class="code" href="a00297.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>();
+<a name="l00100"></a>00100         }
+<a name="l00101"></a>00101 
+<a name="l00103"></a><a class="code" href="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">00103</a>         <span class="keywordtype">void</span> <a class="code" href="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( <a class="code" href="a00296.html">recursive_mutex</a>& <a class="code" href="a00275.html">mutex</a> ) {
+<a name="l00104"></a>00104 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00105"></a>00105 <span class="preprocessor"></span>            internal_acquire( mutex );
+<a name="l00106"></a>00106 <span class="preprocessor">#else</span>
+<a name="l00107"></a>00107 <span class="preprocessor"></span>            my_mutex = &mutex;
+<a name="l00108"></a>00108             mutex.<a class="code" href="a00296.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>();
+<a name="l00109"></a>00109 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00110"></a>00110         }
 <a name="l00111"></a>00111 
-<a name="l00112"></a>00112     <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00113"></a>00113 <span class="keyword">private</span>:
-<a name="l00115"></a>00115     <a class="code" href="a00216.html">atomic<scoped_lock*></a> q_tail;
-<a name="l00116"></a>00116 
-<a name="l00117"></a>00117 };
-<a name="l00118"></a>00118 
-<a name="l00119"></a>00119 __TBB_DEFINE_PROFILING_SET_NAME(queuing_mutex)
-<a name="l00120"></a>00120 
-<a name="l00121"></a>00121 } <span class="comment">// namespace tbb</span>
-<a name="l00122"></a>00122 
-<a name="l00123"></a>00123 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_mutex_H */</span>
+<a name="l00113"></a><a class="code" href="a00297.html#36bfc3e93e3ef6340abef4901444d340">00113</a>         <span class="keywordtype">bool</span> <a class="code" href="a00297.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>( <a class="code" href="a00296.html">recursive_mutex</a>& <a class="code" href="a00275.html">mutex</a> ) {
+<a name="l00114"></a>00114 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00115"></a>00115 <span class="preprocessor"></span>            <span class="keywordflow">return</span> internal_try_acquire( mutex );
+<a name="l00116"></a>00116 <span class="preprocessor">#else</span>
+<a name="l00117"></a>00117 <span class="preprocessor"></span>            <span class="keywordtype">bool</span> result = mutex.<a class="code" href="a00296.html#86e719b0afee25704af11ab97694d240">try_lock</a>();
+<a name="l00118"></a>00118             <span class="keywordflow">if</span>( result )
+<a name="l00119"></a>00119                 my_mutex = &mutex;
+<a name="l00120"></a>00120             <span class="keywordflow">return</span> result;
+<a name="l00121"></a>00121 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00122"></a>00122         }
+<a name="l00123"></a>00123 
+<a name="l00125"></a><a class="code" href="a00297.html#ac480ea0e9d5ea0345a67d57008b6263">00125</a>         <span class="keywordtype">void</span> <a class="code" href="a00297.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>() {
+<a name="l00126"></a>00126 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00127"></a>00127 <span class="preprocessor"></span>            internal_release();
+<a name="l00128"></a>00128 <span class="preprocessor">#else</span>
+<a name="l00129"></a>00129 <span class="preprocessor"></span>            my_mutex-><a class="code" href="a00296.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>();
+<a name="l00130"></a>00130             my_mutex = NULL;
+<a name="l00131"></a>00131 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00132"></a>00132         }
+<a name="l00133"></a>00133 
+<a name="l00134"></a>00134     <span class="keyword">private</span>:
+<a name="l00136"></a>00136         <a class="code" href="a00296.html">recursive_mutex</a>* my_mutex;
+<a name="l00137"></a>00137 
+<a name="l00139"></a>00139         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00296.html">recursive_mutex</a>& m );
+<a name="l00140"></a>00140 
+<a name="l00142"></a>00142         <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00296.html">recursive_mutex</a>& m );
+<a name="l00143"></a>00143 
+<a name="l00145"></a>00145         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release();
+<a name="l00146"></a>00146 
+<a name="l00147"></a>00147         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00296.html">recursive_mutex</a>;
+<a name="l00148"></a>00148     };
+<a name="l00149"></a>00149 
+<a name="l00150"></a>00150     <span class="comment">// Mutex traits</span>
+<a name="l00151"></a>00151     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
+<a name="l00152"></a>00152     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">true</span>;
+<a name="l00153"></a>00153     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">false</span>;
+<a name="l00154"></a>00154 
+<a name="l00155"></a>00155     <span class="comment">// C++0x compatibility interface</span>
+<a name="l00156"></a>00156     
+<a name="l00158"></a><a class="code" href="a00296.html#4c342c69d47f4bb0b393535dee4015d6">00158</a>     <span class="keywordtype">void</span> <a class="code" href="a00296.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>() {
+<a name="l00159"></a>00159 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00160"></a>00160 <span class="preprocessor"></span>        <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00161"></a>00161         <span class="keyword">new</span>(tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00297.html">scoped_lock</a>(*<span class="keyword">this</span>);
+<a name="l00162"></a>00162 <span class="preprocessor">#else</span>
+<a name="l00163"></a>00163 <span class="preprocessor"></span><span class="preprocessor">  #if _WIN32||_WIN64</span>
+<a name="l00164"></a>00164 <span class="preprocessor"></span>        EnterCriticalSection(&impl);
+<a name="l00165"></a>00165 <span class="preprocessor">  #else</span>
+<a name="l00166"></a>00166 <span class="preprocessor"></span>        pthread_mutex_lock(&impl);
+<a name="l00167"></a>00167 <span class="preprocessor">  #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00168"></a>00168 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00169"></a>00169     }
+<a name="l00170"></a>00170 
+<a name="l00172"></a>00172 
+<a name="l00173"></a><a class="code" href="a00296.html#86e719b0afee25704af11ab97694d240">00173</a>     <span class="keywordtype">bool</span> <a class="code" href="a00296.html#86e719b0afee25704af11ab97694d240">try_lock</a>() {
+<a name="l00174"></a>00174 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00175"></a>00175 <span class="preprocessor"></span>        <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00176"></a>00176         <span class="keywordflow">return</span> (<span class="keyword">new</span>(tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00297.html">scoped_lock</a>)->internal_try_acquire(*<span class="keyword">this</span>);
+<a name="l00177"></a>00177 <span class="preprocessor">#else        </span>
+<a name="l00178"></a>00178 <span class="preprocessor"></span><span class="preprocessor">  #if _WIN32||_WIN64</span>
+<a name="l00179"></a>00179 <span class="preprocessor"></span>        <span class="keywordflow">return</span> TryEnterCriticalSection(&impl)!=0;
+<a name="l00180"></a>00180 <span class="preprocessor">  #else</span>
+<a name="l00181"></a>00181 <span class="preprocessor"></span>        <span class="keywordflow">return</span> pthread_mutex_trylock(&impl)==0;
+<a name="l00182"></a>00182 <span class="preprocessor">  #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00183"></a>00183 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00184"></a>00184     }
+<a name="l00185"></a>00185 
+<a name="l00187"></a><a class="code" href="a00296.html#f0a96e26b7f074588dc31e32524856ae">00187</a>     <span class="keywordtype">void</span> <a class="code" href="a00296.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>() {
+<a name="l00188"></a>00188 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00189"></a>00189 <span class="preprocessor"></span>        <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00190"></a>00190         <a class="code" href="a00297.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00191"></a>00191         s.<a class="code" href="a00297.html#3efd10a49e2435ea5215b49907f93ba2">my_mutex</a> = <span class="keyword">this</span>;
+<a name="l00192"></a>00192         s.<a class="code" href="a00297.html#43ed37cec508072e53a52113c8040137">internal_release</a>();
+<a name="l00193"></a>00193 <span class="preprocessor">#else</span>
+<a name="l00194"></a>00194 <span class="preprocessor"></span><span class="preprocessor">  #if _WIN32||_WIN64</span>
+<a name="l00195"></a>00195 <span class="preprocessor"></span>        LeaveCriticalSection(&impl);
+<a name="l00196"></a>00196 <span class="preprocessor">  #else</span>
+<a name="l00197"></a>00197 <span class="preprocessor"></span>        pthread_mutex_unlock(&impl);
+<a name="l00198"></a>00198 <span class="preprocessor">  #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00199"></a>00199 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00200"></a>00200     }
+<a name="l00201"></a>00201 
+<a name="l00203"></a>00203 <span class="preprocessor">  #if _WIN32||_WIN64</span>
+<a name="l00204"></a><a class="code" href="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">00204</a> <span class="preprocessor"></span>    <span class="keyword">typedef</span> LPCRITICAL_SECTION <a class="code" href="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a>;
+<a name="l00205"></a>00205 <span class="preprocessor">  #else</span>
+<a name="l00206"></a>00206 <span class="preprocessor"></span>    <span class="keyword">typedef</span> pthread_mutex_t* <a class="code" href="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a>;
+<a name="l00207"></a>00207 <span class="preprocessor">  #endif</span>
+<a name="l00208"></a>00208 <span class="preprocessor"></span>    <a class="code" href="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> native_handle() { <span class="keywordflow">return</span> (<a class="code" href="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a>) &impl; }
+<a name="l00209"></a>00209 
+<a name="l00210"></a>00210 <span class="keyword">private</span>:
+<a name="l00211"></a>00211 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00212"></a>00212 <span class="preprocessor"></span>    CRITICAL_SECTION impl;
+<a name="l00213"></a>00213     <span class="keyword">enum</span> state_t {
+<a name="l00214"></a>00214         INITIALIZED=0x1234,
+<a name="l00215"></a>00215         DESTROYED=0x789A,
+<a name="l00216"></a>00216     } state;
+<a name="l00217"></a>00217 <span class="preprocessor">#else</span>
+<a name="l00218"></a>00218 <span class="preprocessor"></span>    pthread_mutex_t impl;
+<a name="l00219"></a>00219 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
+<a name="l00220"></a>00220 
+<a name="l00222"></a>00222     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
+<a name="l00223"></a>00223 
+<a name="l00225"></a>00225     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
+<a name="l00226"></a>00226 };
+<a name="l00227"></a>00227 
+<a name="l00228"></a>00228 __TBB_DEFINE_PROFILING_SET_NAME(recursive_mutex)
+<a name="l00229"></a>00229 
+<a name="l00230"></a>00230 } <span class="comment">// namespace tbb </span>
+<a name="l00231"></a>00231 
+<a name="l00232"></a>00232 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_recursive_mutex_H */</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00561.html b/doc/html/a00561.html
index 26c60be..0ffc1de 100644
--- a/doc/html/a00561.html
+++ b/doc/html/a00561.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>queuing_rw_mutex.h Source File</title>
+<title>runtime_loader.h Source File</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -19,7 +19,7 @@
     <li><a href="files.html"><span>File List</span></a></li>
     <li><a href="globals.html"><span>File Members</span></a></li>
   </ul></div>
-<h1>queuing_rw_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>runtime_loader.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
 <a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
 <a name="l00003"></a>00003 <span class="comment"></span>
 <a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
@@ -39,124 +39,93 @@
 <a name="l00018"></a>00018 <span class="comment">    writing.</span>
 <a name="l00019"></a>00019 <span class="comment">*/</span>
 <a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_queuing_rw_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_queuing_rw_mutex_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_runtime_loader_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_runtime_loader_H</span>
 <a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_config.h"</span>
-<a name="l00025"></a>00025 
-<a name="l00026"></a>00026 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>    <span class="comment">// Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers</span>
-<a name="l00028"></a>00028 <span class="preprocessor">    #pragma warning (push)</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4530)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include <cstring></span>
-<a name="l00033"></a>00033 
-<a name="l00034"></a>00034 <span class="preprocessor">#if !TBB_USE_EXCEPTIONS && _MSC_VER</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span>
-<a name="l00038"></a>00038 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00040"></a>00040 
-<a name="l00041"></a>00041 <span class="keyword">namespace </span>tbb {
-<a name="l00042"></a>00042 
+<a name="l00024"></a>00024 <span class="preprocessor">#if ! TBB_PREVIEW_RUNTIME_LOADER</span>
+<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">    #error Set TBB_PREVIEW_RUNTIME_LOADER to include runtime_loader.h</span>
+<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span>
+<a name="l00028"></a>00028 <span class="preprocessor">#include "tbb/tbb_stddef.h"</span>
+<a name="l00029"></a>00029 <span class="preprocessor">#include <climits></span>
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">    #if ! __TBB_NO_IMPLICIT_LINKAGE</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">        #ifdef _DEBUG</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">            #pragma comment( linker, "/nodefaultlib:tbb_debug.lib" )</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">            #pragma comment( linker, "/defaultlib:tbbproxy_debug.lib" )</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">        #else</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">            #pragma comment( linker, "/nodefaultlib:tbb.lib" )</span>
+<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">            #pragma comment( linker, "/defaultlib:tbbproxy.lib" )</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">        #endif</span>
+<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
+<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00042"></a>00042 <span class="preprocessor"></span>
+<a name="l00043"></a>00043 <span class="keyword">namespace </span>tbb {
 <a name="l00044"></a>00044 
-<a name="l00047"></a><a class="code" href="a00272.html">00047</a> <span class="keyword">class </span><a class="code" href="a00272.html">queuing_rw_mutex</a> {
-<a name="l00048"></a>00048 <span class="keyword">public</span>:
-<a name="l00050"></a><a class="code" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">00050</a>     <a class="code" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">queuing_rw_mutex</a>() {
-<a name="l00051"></a>00051         q_tail = NULL;
-<a name="l00052"></a>00052 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span>        internal_construct();
-<a name="l00054"></a>00054 <span class="preprocessor">#endif</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span>    }
-<a name="l00056"></a>00056 
-<a name="l00058"></a><a class="code" href="a00272.html#1ba73e3d95cfdf8323880bc623af9099">00058</a>     <a class="code" href="a00272.html#1ba73e3d95cfdf8323880bc623af9099">~queuing_rw_mutex</a>() {
-<a name="l00059"></a>00059 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span>        __TBB_ASSERT( !q_tail, <span class="stringliteral">"destruction of an acquired mutex"</span>);
-<a name="l00061"></a>00061 <span class="preprocessor">#endif</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span>    }
-<a name="l00063"></a>00063 
-<a name="l00064"></a>00064     <span class="keyword">class </span>scoped_lock;
-<a name="l00065"></a>00065     <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00066"></a>00066 
-<a name="l00068"></a>00068 
-<a name="l00070"></a><a class="code" href="a00273.html">00070</a>     <span class="keyword">class </span><a class="code" href="a00273.html">scoped_lock</a>: internal::no_copy {
-<a name="l00072"></a>00072         <span class="keywordtype">void</span> initialize() {
-<a name="l00073"></a>00073             <a class="code" href="a00258.html">mutex</a> = NULL;
-<a name="l00074"></a>00074 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00075"></a>00075 <span class="preprocessor"></span>            state = 0xFF; <span class="comment">// Set to invalid state</span>
-<a name="l00076"></a>00076             internal::poison_pointer(next);
-<a name="l00077"></a>00077             internal::poison_pointer(prev);
-<a name="l00078"></a>00078 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00079"></a>00079         }
-<a name="l00080"></a>00080     <span class="keyword">public</span>:
-<a name="l00082"></a>00082 
-<a name="l00083"></a><a class="code" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">00083</a>         <a class="code" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>() {initialize();}
-<a name="l00084"></a>00084 
-<a name="l00086"></a><a class="code" href="a00273.html#fbb8798792d3aebb136c46fc63d2529e">00086</a>         <a class="code" href="a00273.html#c62e365be7bcbba091c9ea7454a4d22c">scoped_lock</a>( <a class="code" href="a00272.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> ) {
-<a name="l00087"></a>00087             initialize();
-<a name="l00088"></a>00088             <a class="code" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>(m,write);
-<a name="l00089"></a>00089         }
-<a name="l00090"></a>00090 
-<a name="l00092"></a><a class="code" href="a00273.html#32c7d67a660d23ebbaab1a1d2826d31a">00092</a>         <a class="code" href="a00273.html#32c7d67a660d23ebbaab1a1d2826d31a">~scoped_lock</a>() {
-<a name="l00093"></a>00093             <span class="keywordflow">if</span>( <a class="code" href="a00258.html">mutex</a> ) <a class="code" href="a00273.html#67ae221109ddc69510ab593874e435d4">release</a>();
-<a name="l00094"></a>00094         }
+<a name="l00045"></a>00045 <span class="keyword">namespace </span>interface6 {
+<a name="l00046"></a>00046 
+<a name="l00048"></a>00048 
+<a name="l00085"></a><a class="code" href="a00298.html">00085</a> <span class="keyword">class </span><a class="code" href="a00298.html">runtime_loader</a> : tbb::internal::no_copy {
+<a name="l00086"></a>00086 
+<a name="l00087"></a>00087     <span class="keyword">public</span>:
+<a name="l00088"></a>00088 
+<a name="l00090"></a><a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb">00090</a>         <span class="keyword">enum</span> <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> {
+<a name="l00091"></a>00091             <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">em_status</a>,     
+<a name="l00092"></a>00092             <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">em_throw</a>,      
+<a name="l00093"></a><a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">00093</a>             <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a>       
+<a name="l00094"></a>00094         }; <span class="comment">// error_mode</span>
 <a name="l00095"></a>00095 
-<a name="l00097"></a>00097         <span class="keywordtype">void</span> <a class="code" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">acquire</a>( <a class="code" href="a00272.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
-<a name="l00098"></a>00098 
-<a name="l00100"></a>00100         <span class="keywordtype">bool</span> <a class="code" href="a00273.html#2e4ff6c9ec2fee6682f95290d1f42baa">try_acquire</a>( <a class="code" href="a00272.html">queuing_rw_mutex</a>& m, <span class="keywordtype">bool</span> write=<span class="keyword">true</span> );
-<a name="l00101"></a>00101 
-<a name="l00103"></a>00103         <span class="keywordtype">void</span> <a class="code" href="a00273.html#67ae221109ddc69510ab593874e435d4">release</a>();
-<a name="l00104"></a>00104 
-<a name="l00106"></a>00106 
-<a name="l00107"></a>00107         <span class="keywordtype">bool</span> <a class="code" href="a00273.html#11ba1da4a722c9e6f73339a52c487e82">upgrade_to_writer</a>();
+<a name="l00097"></a><a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde018789">00097</a>         <span class="keyword">enum</span> <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> {
+<a name="l00098"></a>00098             <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">ec_ok</a>,         
+<a name="l00099"></a>00099             <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">ec_bad_call</a>,   
+<a name="l00100"></a>00100             <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">ec_bad_arg</a>,    
+<a name="l00101"></a>00101             <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">ec_bad_lib</a>,    
+<a name="l00102"></a>00102             <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">ec_bad_ver</a>,    
+<a name="l00103"></a><a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">00103</a>             <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">ec_no_lib</a>      
+<a name="l00104"></a>00104         }; <span class="comment">// error_code</span>
+<a name="l00105"></a>00105 
+<a name="l00107"></a>00107         <a class="code" href="a00298.html#7caa4ff6e44c2348e67f601cc5d97c34">runtime_loader</a>( <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> mode = <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a> );
 <a name="l00108"></a>00108 
-<a name="l00110"></a>00110         <span class="keywordtype">bool</span> <a class="code" href="a00273.html#0d2f93edf7b15ec4bcee138823220c52">downgrade_to_reader</a>();
-<a name="l00111"></a>00111 
-<a name="l00112"></a>00112     <span class="keyword">private</span>:
-<a name="l00114"></a>00114         <a class="code" href="a00272.html">queuing_rw_mutex</a>* <a class="code" href="a00258.html">mutex</a>;
-<a name="l00115"></a>00115 
-<a name="l00117"></a>00117         <a class="code" href="a00273.html">scoped_lock</a> * prev, * next;
-<a name="l00118"></a>00118 
-<a name="l00119"></a>00119         <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state_t;
-<a name="l00120"></a>00120 
-<a name="l00122"></a>00122         <a class="code" href="a00216.html">atomic<state_t></a> state;
-<a name="l00123"></a>00123 
-<a name="l00125"></a>00125 
-<a name="l00126"></a>00126         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> going;
-<a name="l00127"></a>00127 
-<a name="l00129"></a>00129         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> internal_lock;
-<a name="l00130"></a>00130 
-<a name="l00132"></a>00132         <span class="keywordtype">void</span> acquire_internal_lock();
-<a name="l00133"></a>00133 
-<a name="l00135"></a>00135 
-<a name="l00136"></a>00136         <span class="keywordtype">bool</span> try_acquire_internal_lock();
-<a name="l00137"></a>00137 
-<a name="l00139"></a>00139         <span class="keywordtype">void</span> release_internal_lock();
-<a name="l00140"></a>00140 
-<a name="l00142"></a>00142         <span class="keywordtype">void</span> wait_for_release_of_internal_lock();
-<a name="l00143"></a>00143 
-<a name="l00145"></a>00145         <span class="keywordtype">void</span> unblock_or_wait_on_internal_lock( uintptr_t );
-<a name="l00146"></a>00146     };
-<a name="l00147"></a>00147 
-<a name="l00148"></a>00148     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00149"></a>00149 
-<a name="l00150"></a>00150     <span class="comment">// Mutex traits</span>
-<a name="l00151"></a>00151     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">true</span>;
-<a name="l00152"></a>00152     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">false</span>;
-<a name="l00153"></a>00153     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">true</span>;
-<a name="l00154"></a>00154 
-<a name="l00155"></a>00155 <span class="keyword">private</span>:
-<a name="l00157"></a>00157     <a class="code" href="a00216.html">atomic<scoped_lock*></a> q_tail;
+<a name="l00110"></a>00110 
+<a name="l00115"></a>00115         <a class="code" href="a00298.html#7caa4ff6e44c2348e67f601cc5d97c34">runtime_loader</a>(
+<a name="l00116"></a>00116             <span class="keywordtype">char</span> <span class="keyword">const</span> * path[],                           
+<a name="l00117"></a>00117             <span class="keywordtype">int</span>          min_ver = TBB_INTERFACE_VERSION,  
+<a name="l00118"></a>00118             <span class="keywordtype">int</span>          max_ver = INT_MAX,                
+<a name="l00119"></a>00119             <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a>   mode    = <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">em_abort</a>                
+<a name="l00120"></a>00120         );
+<a name="l00121"></a>00121 
+<a name="l00123"></a>00123         <a class="code" href="a00298.html#c25fec923a751a3e03f5cbe969f1f0c5">~runtime_loader</a>();
+<a name="l00124"></a>00124 
+<a name="l00126"></a>00126 
+<a name="l00150"></a>00150         <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a>
+<a name="l00151"></a>00151         <a class="code" href="a00298.html#5f3f6f1683386705a6931acae45f0862">load</a>(
+<a name="l00152"></a>00152             <span class="keywordtype">char</span> <span class="keyword">const</span> * path[],                           
+<a name="l00153"></a>00153             <span class="keywordtype">int</span>          min_ver = TBB_INTERFACE_VERSION,  
+<a name="l00154"></a>00154             <span class="keywordtype">int</span>          max_ver = INT_MAX                 
+<a name="l00155"></a>00155 
+<a name="l00156"></a>00156         );
+<a name="l00157"></a>00157 
 <a name="l00158"></a>00158 
-<a name="l00159"></a>00159 };
 <a name="l00160"></a>00160 
-<a name="l00161"></a>00161 __TBB_DEFINE_PROFILING_SET_NAME(queuing_rw_mutex)
-<a name="l00162"></a>00162 
-<a name="l00163"></a>00163 } <span class="comment">// namespace tbb</span>
+<a name="l00163"></a>00163         <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a> <a class="code" href="a00298.html#78d938ed2e54d38dd38d6609e6c60389">status</a>();
 <a name="l00164"></a>00164 
-<a name="l00165"></a>00165 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_queuing_rw_mutex_H */</span>
+<a name="l00165"></a>00165     <span class="keyword">private</span>:
+<a name="l00166"></a>00166 
+<a name="l00167"></a>00167         <a class="code" href="a00298.html#bb0130fe0f596399707e61431231ebcb">error_mode</a> <span class="keyword">const</span> my_mode;
+<a name="l00168"></a>00168         <a class="code" href="a00298.html#6831be91cdc64e57e565ce0dde018789">error_code</a>       my_status;
+<a name="l00169"></a>00169         <span class="keywordtype">bool</span>             my_loaded;
+<a name="l00170"></a>00170 
+<a name="l00171"></a>00171 }; <span class="comment">// class runtime_loader</span>
+<a name="l00172"></a>00172 
+<a name="l00173"></a>00173 } <span class="comment">// namespace interface6</span>
+<a name="l00174"></a>00174 
+<a name="l00175"></a>00175 <span class="keyword">using</span> interface6::runtime_loader;
+<a name="l00176"></a>00176 
+<a name="l00177"></a>00177 } <span class="comment">// namespace tbb</span>
+<a name="l00178"></a>00178 
+<a name="l00179"></a>00179 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_runtime_loader_H */</span>
+<a name="l00180"></a>00180 
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00562.html b/doc/html/a00562.html
index 738d3ed..f804ef8 100644
--- a/doc/html/a00562.html
+++ b/doc/html/a00562.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>reader_writer_lock.h Source File</title>
+<title>scalable_allocator.h Source File</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -19,7 +19,7 @@
     <li><a href="files.html"><span>File List</span></a></li>
     <li><a href="globals.html"><span>File Members</span></a></li>
   </ul></div>
-<h1>reader_writer_lock.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>scalable_allocator.h</h1><a href="a00363.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
 <a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
 <a name="l00003"></a>00003 <span class="comment"></span>
 <a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
@@ -39,135 +39,181 @@
 <a name="l00018"></a>00018 <span class="comment">    writing.</span>
 <a name="l00019"></a>00019 <span class="comment">*/</span>
 <a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_reader_writer_lock_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_reader_writer_lock_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_scalable_allocator_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_scalable_allocator_H</span>
 <a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_thread.h"</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_allocator.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00027"></a>00027 
-<a name="l00028"></a>00028 <span class="keyword">namespace </span>tbb {
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>interface5 {
-<a name="l00031"></a>00031 
-<a name="l00034"></a><a class="code" href="a00274.html">00034</a>     <span class="keyword">class </span><a class="code" href="a00274.html">reader_writer_lock</a> : tbb::internal::no_copy {
-<a name="l00035"></a>00035  <span class="keyword">public</span>:
-<a name="l00036"></a>00036     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00275.html">scoped_lock</a>;
-<a name="l00037"></a>00037     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00276.html">scoped_lock_read</a>;
-<a name="l00039"></a>00039 
-<a name="l00074"></a><a class="code" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">00074</a>     <span class="keyword">enum</span> <a class="code" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">status_t</a> { waiting_nonblocking, waiting, active, invalid };
-<a name="l00075"></a>00075 
-<a name="l00077"></a><a class="code" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">00077</a>     <a class="code" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">reader_writer_lock</a>() {
-<a name="l00078"></a>00078         internal_construct();
-<a name="l00079"></a>00079     }
-<a name="l00080"></a>00080 
-<a name="l00082"></a><a class="code" href="a00274.html#5135f64f7b7339017f33d956445edbee">00082</a>     <a class="code" href="a00274.html#5135f64f7b7339017f33d956445edbee">~reader_writer_lock</a>() {
-<a name="l00083"></a>00083         internal_destroy();
-<a name="l00084"></a>00084     }
-<a name="l00085"></a>00085 
-<a name="l00087"></a>00087 
-<a name="l00089"></a><a class="code" href="a00275.html">00089</a>     <span class="keyword">class </span><a class="code" href="a00275.html">scoped_lock</a> : tbb::internal::no_copy {
-<a name="l00090"></a>00090     <span class="keyword">public</span>:
-<a name="l00091"></a>00091         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00274.html">reader_writer_lock</a>;
-<a name="l00092"></a>00092  
-<a name="l00094"></a><a class="code" href="a00275.html#cf19f20e082887c1bb0ba6b0911c3583">00094</a>         <a class="code" href="a00275.html">scoped_lock</a>(<a class="code" href="a00274.html">reader_writer_lock</a>& <a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
-<a name="l00095"></a>00095             internal_construct(<a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
-<a name="l00096"></a>00096         }
-<a name="l00097"></a>00097         
-<a name="l00099"></a><a class="code" href="a00275.html#70246e0260493625ff956fa5926fc71f">00099</a>         <a class="code" href="a00275.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>() {
-<a name="l00100"></a>00100             internal_destroy();
-<a name="l00101"></a>00101         }
-<a name="l00102"></a>00102 
-<a name="l00103"></a>00103         <span class="keywordtype">void</span>* operator new(size_t s) {
-<a name="l00104"></a>00104             <span class="keywordflow">return</span> tbb::internal::allocate_via_handler_v3(s);
-<a name="l00105"></a>00105         }
-<a name="l00106"></a>00106         <span class="keywordtype">void</span> operator delete(<span class="keywordtype">void</span>* p) {
-<a name="l00107"></a>00107             tbb::internal::deallocate_via_handler_v3(p);
-<a name="l00108"></a>00108         }
-<a name="l00109"></a>00109 
-<a name="l00110"></a>00110     <span class="keyword">private</span>:
-<a name="l00112"></a>00112         <a class="code" href="a00274.html">reader_writer_lock</a> *<a class="code" href="a00258.html">mutex</a>;
-<a name="l00114"></a>00114         scoped_lock* next;
-<a name="l00116"></a>00116         <a class="code" href="a00216.html">atomic<status_t></a> status;
-<a name="l00117"></a>00117 
-<a name="l00119"></a>00119         scoped_lock();
-<a name="l00120"></a>00120 
-<a name="l00121"></a>00121         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct(<a class="code" href="a00274.html">reader_writer_lock</a>&);
-<a name="l00122"></a>00122         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
-<a name="l00123"></a>00123    };
-<a name="l00124"></a>00124 
-<a name="l00126"></a><a class="code" href="a00276.html">00126</a>     <span class="keyword">class </span><a class="code" href="a00276.html">scoped_lock_read</a> : tbb::internal::no_copy {
-<a name="l00127"></a>00127     <span class="keyword">public</span>:
-<a name="l00128"></a>00128         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00274.html">reader_writer_lock</a>;
-<a name="l00129"></a>00129 
-<a name="l00131"></a><a class="code" href="a00276.html#87ab0dc8f7216e6ba0f7acd6aec33064">00131</a>         <a class="code" href="a00276.html">scoped_lock_read</a>(<a class="code" href="a00274.html">reader_writer_lock</a>& <a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>) {
-<a name="l00132"></a>00132             internal_construct(<a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>);
-<a name="l00133"></a>00133         }
-<a name="l00134"></a>00134 
-<a name="l00136"></a><a class="code" href="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">00136</a>         <a class="code" href="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">~scoped_lock_read</a>() { 
-<a name="l00137"></a>00137             internal_destroy();
-<a name="l00138"></a>00138         }
-<a name="l00139"></a>00139         
-<a name="l00140"></a>00140         <span class="keywordtype">void</span>* operator new(size_t s) {
-<a name="l00141"></a>00141             <span class="keywordflow">return</span> tbb::internal::allocate_via_handler_v3(s);
-<a name="l00142"></a>00142         }
-<a name="l00143"></a>00143         <span class="keywordtype">void</span> operator delete(<span class="keywordtype">void</span>* p) {
-<a name="l00144"></a>00144             tbb::internal::deallocate_via_handler_v3(p);
-<a name="l00145"></a>00145         }
-<a name="l00146"></a>00146 
-<a name="l00147"></a>00147     <span class="keyword">private</span>:
-<a name="l00149"></a>00149         <a class="code" href="a00274.html">reader_writer_lock</a> *<a class="code" href="a00258.html">mutex</a>;
-<a name="l00151"></a>00151         scoped_lock_read *next;
-<a name="l00153"></a>00153         <a class="code" href="a00216.html">atomic<status_t></a> status;
-<a name="l00154"></a>00154 
-<a name="l00156"></a>00156         scoped_lock_read();
-<a name="l00157"></a>00157 
-<a name="l00158"></a>00158         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct(<a class="code" href="a00274.html">reader_writer_lock</a>&);
-<a name="l00159"></a>00159         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
-<a name="l00160"></a>00160     };
-<a name="l00161"></a>00161     
-<a name="l00163"></a>00163 
-<a name="l00168"></a>00168     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">lock</a>();
-<a name="l00169"></a>00169 
-<a name="l00171"></a>00171 
-<a name="l00175"></a>00175     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00274.html#721eb173e154ab38292273e9266a9b07">try_lock</a>();
-<a name="l00176"></a>00176 
-<a name="l00178"></a>00178 
-<a name="l00182"></a>00182     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00274.html#d9d16a24d9f6c3dada73c6b9ff214f5b">lock_read</a>(); 
-<a name="l00183"></a>00183 
-<a name="l00185"></a>00185 
-<a name="l00187"></a>00187     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD <a class="code" href="a00274.html#595fb23952e3b89426b1f7938dea9b11">try_lock_read</a>();
-<a name="l00188"></a>00188 
-<a name="l00190"></a>00190     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00274.html#5113b32689305599b2c36b5831547704">unlock</a>();
-<a name="l00191"></a>00191 
-<a name="l00192"></a>00192  <span class="keyword">private</span>:
-<a name="l00193"></a>00193     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00194"></a>00194     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
+<a name="l00025"></a>00025 <span class="preprocessor">#include <stddef.h></span> <span class="comment">/* Need ptrdiff_t and size_t from here. */</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#if !_MSC_VER</span>
+<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#include <stdint.h></span> <span class="comment">/* Need intptr_t from here. */</span>
+<a name="l00028"></a>00028 <span class="preprocessor">#endif</span>
+<a name="l00029"></a>00029 <span class="preprocessor"></span>
+<a name="l00030"></a>00030 <span class="preprocessor">#if !defined(__cplusplus) && __ICC==1100</span>
+<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (push)</span>
+<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 991)</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00034"></a>00034 <span class="preprocessor"></span>
+<a name="l00035"></a>00035 <span class="preprocessor">#ifdef __cplusplus</span>
+<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
+<a name="l00037"></a>00037 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
+<a name="l00038"></a>00038 
+<a name="l00039"></a>00039 <span class="preprocessor">#if _MSC_VER >= 1400</span>
+<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC   __cdecl</span>
+<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00044"></a>00044 <span class="preprocessor"></span>
+<a name="l00047"></a>00047 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00397.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size);
+<a name="l00048"></a>00048 
+<a name="l00051"></a>00051 <span class="keywordtype">void</span>   __TBB_EXPORTED_FUNC <a class="code" href="a00397.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (<span class="keywordtype">void</span>* ptr);
+<a name="l00052"></a>00052 
+<a name="l00055"></a>00055 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00397.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size);
+<a name="l00056"></a>00056 
+<a name="l00059"></a>00059 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00397.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size);
+<a name="l00060"></a>00060 
+<a name="l00063"></a>00063 <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00397.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (<span class="keywordtype">void</span>** memptr, size_t alignment, size_t size);
+<a name="l00064"></a>00064 
+<a name="l00067"></a>00067 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00397.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment);
+<a name="l00068"></a>00068 
+<a name="l00071"></a>00071 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00397.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size, size_t alignment);
+<a name="l00072"></a>00072 
+<a name="l00075"></a>00075 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00397.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (<span class="keywordtype">void</span>* ptr);
+<a name="l00076"></a>00076 
+<a name="l00081"></a>00081 size_t __TBB_EXPORTED_FUNC <a class="code" href="a00397.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (<span class="keywordtype">void</span>* ptr);
+<a name="l00082"></a>00082 
+<a name="l00083"></a>00083 <span class="preprocessor">#ifdef __cplusplus</span>
+<a name="l00084"></a>00084 <span class="preprocessor"></span>} <span class="comment">/* extern "C" */</span>
+<a name="l00085"></a>00085 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
+<a name="l00086"></a>00086 
+<a name="l00087"></a>00087 <span class="preprocessor">#ifdef __cplusplus</span>
+<a name="l00088"></a>00088 <span class="preprocessor"></span>
+<a name="l00089"></a>00089 <span class="keyword">namespace </span>rml {
+<a name="l00090"></a>00090 <span class="keyword">class </span>MemoryPool;
+<a name="l00091"></a>00091 
+<a name="l00092"></a>00092 <span class="preprocessor">#define MEM_POLICY_DEFINED 1</span>
+<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keywordtype">void</span> *(*rawAllocType)(intptr_t pool_id, size_t &bytes);
+<a name="l00094"></a>00094 <span class="keyword">typedef</span> int   (*rawFreeType)(intptr_t pool_id, <span class="keywordtype">void</span>* raw_ptr, size_t raw_bytes);
+<a name="l00095"></a>00095 
+<a name="l00096"></a>00096 <span class="keyword">struct </span>MemPoolPolicy {
+<a name="l00097"></a>00097     rawAllocType pAlloc;
+<a name="l00098"></a>00098     rawFreeType  pFree;
+<a name="l00099"></a>00099     size_t       granularity;   <span class="comment">// granularity of pAlloc allocations</span>
+<a name="l00100"></a>00100     <span class="keywordtype">void</span>        *pReserved;     <span class="comment">// reserved for future extensions</span>
+<a name="l00101"></a>00101     size_t       szReserved;    <span class="comment">// size of pReserved data</span>
+<a name="l00102"></a>00102 };
+<a name="l00103"></a>00103 
+<a name="l00104"></a>00104 MemoryPool *pool_create(intptr_t pool_id, <span class="keyword">const</span> MemPoolPolicy* memPoolPolicy);
+<a name="l00105"></a>00105 <span class="keywordtype">bool</span>  pool_destroy(MemoryPool* memPool);
+<a name="l00106"></a>00106 <span class="keywordtype">void</span> *pool_malloc(MemoryPool* memPool, size_t size);
+<a name="l00107"></a>00107 <span class="keywordtype">void</span> *pool_realloc(MemoryPool* memPool, <span class="keywordtype">void</span> *object, size_t size);
+<a name="l00108"></a>00108 <span class="keywordtype">bool</span>  pool_reset(MemoryPool* memPool);
+<a name="l00109"></a>00109 <span class="keywordtype">bool</span>  pool_free(MemoryPool *memPool, <span class="keywordtype">void</span> *object);
+<a name="l00110"></a>00110 }
+<a name="l00111"></a>00111 
+<a name="l00112"></a>00112 <span class="preprocessor">#include <new></span>      <span class="comment">/* To use new with the placement argument */</span>
+<a name="l00113"></a>00113 
+<a name="l00114"></a>00114 <span class="comment">/* Ensure that including this header does not cause implicit linkage with TBB */</span>
+<a name="l00115"></a>00115 <span class="preprocessor">#ifndef __TBB_NO_IMPLICIT_LINKAGE</span>
+<a name="l00116"></a>00116 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_NO_IMPLICIT_LINKAGE 1</span>
+<a name="l00117"></a>00117 <span class="preprocessor"></span><span class="preprocessor">    #include "tbb_stddef.h"</span>
+<a name="l00118"></a>00118 <span class="preprocessor">    #undef  __TBB_NO_IMPLICIT_LINKAGE</span>
+<a name="l00119"></a>00119 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00120"></a>00120 <span class="preprocessor"></span><span class="preprocessor">    #include "tbb_stddef.h"</span>
+<a name="l00121"></a>00121 <span class="preprocessor">#endif</span>
+<a name="l00122"></a>00122 <span class="preprocessor"></span>
+<a name="l00123"></a>00123 
+<a name="l00124"></a>00124 <span class="keyword">namespace </span>tbb {
+<a name="l00125"></a>00125 
+<a name="l00126"></a>00126 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00127"></a>00127 <span class="preprocessor"></span>    <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</span>
+<a name="l00128"></a>00128 <span class="preprocessor">    #pragma warning (push)</span>
+<a name="l00129"></a>00129 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4100)</span>
+<a name="l00130"></a>00130 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00131"></a>00131 <span class="preprocessor"></span>
+<a name="l00133"></a>00133 
+<a name="l00136"></a>00136 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00137"></a><a class="code" href="a00299.html">00137</a> <span class="keyword">class </span><a class="code" href="a00299.html">scalable_allocator</a> {
+<a name="l00138"></a>00138 <span class="keyword">public</span>:
+<a name="l00139"></a>00139     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
+<a name="l00140"></a>00140     <span class="keyword">typedef</span> value_type* pointer;
+<a name="l00141"></a>00141     <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
+<a name="l00142"></a>00142     <span class="keyword">typedef</span> value_type& reference;
+<a name="l00143"></a>00143     <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
+<a name="l00144"></a>00144     <span class="keyword">typedef</span> size_t size_type;
+<a name="l00145"></a>00145     <span class="keyword">typedef</span> ptrdiff_t difference_type;
+<a name="l00146"></a>00146     <span class="keyword">template</span><<span class="keyword">class</span> U> <span class="keyword">struct </span>rebind {
+<a name="l00147"></a>00147         <span class="keyword">typedef</span> <a class="code" href="a00299.html">scalable_allocator<U></a> other;
+<a name="l00148"></a>00148     };
+<a name="l00149"></a>00149 
+<a name="l00150"></a>00150     <a class="code" href="a00299.html">scalable_allocator</a>() <span class="keywordflow">throw</span>() {}
+<a name="l00151"></a>00151     <a class="code" href="a00299.html">scalable_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00299.html">scalable_allocator</a>& ) <span class="keywordflow">throw</span>() {}
+<a name="l00152"></a>00152     <span class="keyword">template</span><<span class="keyword">typename</span> U> <a class="code" href="a00299.html">scalable_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00299.html">scalable_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
+<a name="l00153"></a>00153 
+<a name="l00154"></a>00154     pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
+<a name="l00155"></a>00155     const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
+<a name="l00156"></a>00156 
+<a name="l00158"></a><a class="code" href="a00299.html#726b1586d05d44665a36e1c7b2699bfd">00158</a>     pointer <a class="code" href="a00299.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* <span class="comment">/*hint*/</span> =0 ) {
+<a name="l00159"></a>00159         <span class="keywordflow">return</span> static_cast<pointer>( <a class="code" href="a00397.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a>( n * <span class="keyword">sizeof</span>(value_type) ) );
+<a name="l00160"></a>00160     }
+<a name="l00161"></a>00161 
+<a name="l00163"></a><a class="code" href="a00299.html#f806a238c18cbcfb531e1e0a0d2ec59d">00163</a>     <span class="keywordtype">void</span> <a class="code" href="a00299.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>( pointer p, size_type ) {
+<a name="l00164"></a>00164         <a class="code" href="a00397.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a>( p );
+<a name="l00165"></a>00165     }
+<a name="l00166"></a>00166 
+<a name="l00168"></a><a class="code" href="a00299.html#880e766f1d913988c21973dbdd874fd5">00168</a>     size_type <a class="code" href="a00299.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const throw() {
+<a name="l00169"></a>00169         size_type absolutemax = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
+<a name="l00170"></a>00170         <span class="keywordflow">return</span> (absolutemax > 0 ? absolutemax : 1);
+<a name="l00171"></a>00171     }
+<a name="l00172"></a>00172     <span class="keywordtype">void</span> construct( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
+<a name="l00173"></a>00173     <span class="keywordtype">void</span> destroy( pointer p ) {p->~value_type();}
+<a name="l00174"></a>00174 };
+<a name="l00175"></a>00175 
+<a name="l00176"></a>00176 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
+<a name="l00177"></a>00177 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
+<a name="l00178"></a>00178 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
+<a name="l00179"></a>00179 <span class="preprocessor"></span>
+<a name="l00181"></a>00181 
+<a name="l00182"></a>00182 <span class="keyword">template</span><>
+<a name="l00183"></a><a class="code" href="a00300.html">00183</a> <span class="keyword">class </span><a class="code" href="a00299.html">scalable_allocator</a><void> {
+<a name="l00184"></a>00184 <span class="keyword">public</span>:
+<a name="l00185"></a>00185     <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
+<a name="l00186"></a>00186     <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
+<a name="l00187"></a>00187     <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
+<a name="l00188"></a>00188     <span class="keyword">template</span><<span class="keyword">class</span> U> <span class="keyword">struct </span>rebind {
+<a name="l00189"></a>00189         <span class="keyword">typedef</span> <a class="code" href="a00299.html">scalable_allocator<U></a> other;
+<a name="l00190"></a>00190     };
+<a name="l00191"></a>00191 };
+<a name="l00192"></a>00192 
+<a name="l00193"></a>00193 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00194"></a>00194 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00299.html">scalable_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00299.html">scalable_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
 <a name="l00195"></a>00195 
-<a name="l00197"></a>00197 
-<a name="l00198"></a>00198     <span class="keywordtype">bool</span> start_write(scoped_lock *);
-<a name="l00200"></a>00200     <span class="keywordtype">void</span> set_next_writer(scoped_lock *w);
-<a name="l00202"></a>00202     <span class="keywordtype">void</span> end_write(scoped_lock *);
-<a name="l00204"></a>00204     <span class="keywordtype">bool</span> is_current_writer();
-<a name="l00205"></a>00205 
-<a name="l00207"></a>00207 
-<a name="l00208"></a>00208     <span class="keywordtype">void</span> start_read(scoped_lock_read *);
-<a name="l00210"></a>00210     <span class="keywordtype">void</span> unblock_readers();
-<a name="l00212"></a>00212     <span class="keywordtype">void</span> end_read();
-<a name="l00213"></a>00213 
-<a name="l00215"></a>00215     atomic<scoped_lock_read*> reader_head;
-<a name="l00217"></a>00217     atomic<scoped_lock*> writer_head;
-<a name="l00219"></a>00219     atomic<scoped_lock*> writer_tail;
-<a name="l00221"></a>00221     tbb_thread::id my_current_writer;
-<a name="l00223"></a>00223     atomic<unsigned> rdr_count_and_flags;
-<a name="l00224"></a>00224 };
-<a name="l00225"></a>00225 
-<a name="l00226"></a>00226 } <span class="comment">// namespace interface5</span>
-<a name="l00227"></a>00227 
-<a name="l00228"></a>00228 <span class="keyword">using</span> interface5::reader_writer_lock;
-<a name="l00229"></a>00229 
-<a name="l00230"></a>00230 } <span class="comment">// namespace tbb</span>
-<a name="l00231"></a>00231 
-<a name="l00232"></a>00232 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_reader_writer_lock_H */</span>
+<a name="l00196"></a>00196 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00197"></a>00197 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> scalable_allocator<T>&, <span class="keyword">const</span> scalable_allocator<U>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
+<a name="l00198"></a>00198 
+<a name="l00199"></a>00199 } <span class="comment">// namespace tbb</span>
+<a name="l00200"></a>00200 
+<a name="l00201"></a>00201 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00202"></a>00202 <span class="preprocessor"></span><span class="preprocessor">    #if __TBB_BUILD && !defined(__TBBMALLOC_NO_IMPLICIT_LINKAGE)</span>
+<a name="l00203"></a>00203 <span class="preprocessor"></span><span class="preprocessor">        #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1</span>
+<a name="l00204"></a>00204 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
+<a name="l00205"></a>00205 <span class="preprocessor"></span>
+<a name="l00206"></a>00206 <span class="preprocessor">    #if !__TBBMALLOC_NO_IMPLICIT_LINKAGE</span>
+<a name="l00207"></a>00207 <span class="preprocessor"></span><span class="preprocessor">        #ifdef _DEBUG</span>
+<a name="l00208"></a>00208 <span class="preprocessor"></span><span class="preprocessor">            #pragma comment(lib, "tbbmalloc_debug.lib")</span>
+<a name="l00209"></a>00209 <span class="preprocessor"></span><span class="preprocessor">        #else</span>
+<a name="l00210"></a>00210 <span class="preprocessor"></span><span class="preprocessor">            #pragma comment(lib, "tbbmalloc.lib")</span>
+<a name="l00211"></a>00211 <span class="preprocessor"></span><span class="preprocessor">        #endif</span>
+<a name="l00212"></a>00212 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
+<a name="l00213"></a>00213 <span class="preprocessor"></span>
+<a name="l00214"></a>00214 
+<a name="l00215"></a>00215 <span class="preprocessor">#endif</span>
+<a name="l00216"></a>00216 <span class="preprocessor"></span>
+<a name="l00217"></a>00217 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
+<a name="l00218"></a>00218 
+<a name="l00219"></a>00219 <span class="preprocessor">#if !defined(__cplusplus) && __ICC==1100</span>
+<a name="l00220"></a>00220 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
+<a name="l00221"></a>00221 <span class="preprocessor"></span><span class="preprocessor">#endif // ICC 11.0 warning 991 is back</span>
+<a name="l00222"></a>00222 <span class="preprocessor"></span>
+<a name="l00223"></a>00223 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_scalable_allocator_H */</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00563.html b/doc/html/a00563.html
deleted file mode 100644
index bf595a7..0000000
--- a/doc/html/a00563.html
+++ /dev/null
@@ -1,241 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>recursive_mutex.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>recursive_mutex.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_recursive_mutex_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_recursive_mutex_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_api.h"</span>
-<a name="l00026"></a>00026 <span class="preprocessor">#else</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00029"></a>00029 
-<a name="l00030"></a>00030 <span class="preprocessor">#include <new></span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include "aligned_space.h"</span>
-<a name="l00032"></a>00032 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00033"></a>00033 <span class="preprocessor">#include "tbb_profiling.h"</span>
-<a name="l00034"></a>00034 
-<a name="l00035"></a>00035 <span class="keyword">namespace </span>tbb {
-<a name="l00037"></a>00037 
-<a name="l00039"></a><a class="code" href="a00278.html">00039</a> <span class="keyword">class </span><a class="code" href="a00278.html">recursive_mutex</a> {
-<a name="l00040"></a>00040 <span class="keyword">public</span>:
-<a name="l00042"></a><a class="code" href="a00278.html#d2fceb7f95c24a8cd1457d4527e4b8c6">00042</a>     <a class="code" href="a00278.html#d2fceb7f95c24a8cd1457d4527e4b8c6">recursive_mutex</a>() {
-<a name="l00043"></a>00043 <span class="preprocessor">#if TBB_USE_ASSERT || TBB_USE_THREADING_TOOLS</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span>        internal_construct();
-<a name="l00045"></a>00045 <span class="preprocessor">#else</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">  #if _WIN32||_WIN64</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span>        InitializeCriticalSection(&impl);
-<a name="l00048"></a>00048 <span class="preprocessor">  #else</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span>        pthread_mutexattr_t mtx_attr;
-<a name="l00050"></a>00050         <span class="keywordtype">int</span> error_code = pthread_mutexattr_init( &mtx_attr );
-<a name="l00051"></a>00051         <span class="keywordflow">if</span>( error_code )
-<a name="l00052"></a>00052             tbb::internal::handle_perror(error_code,<span class="stringliteral">"recursive_mutex: pthread_mutexattr_init failed"</span>);
-<a name="l00053"></a>00053 
-<a name="l00054"></a>00054         pthread_mutexattr_settype( &mtx_attr, PTHREAD_MUTEX_RECURSIVE );
-<a name="l00055"></a>00055         error_code = pthread_mutex_init( &impl, &mtx_attr );
-<a name="l00056"></a>00056         <span class="keywordflow">if</span>( error_code )
-<a name="l00057"></a>00057             tbb::internal::handle_perror(error_code,<span class="stringliteral">"recursive_mutex: pthread_mutex_init failed"</span>);
-<a name="l00058"></a>00058 
-<a name="l00059"></a>00059         pthread_mutexattr_destroy( &mtx_attr );
-<a name="l00060"></a>00060 <span class="preprocessor">  #endif </span><span class="comment">/* _WIN32||_WIN64*/</span>
-<a name="l00061"></a>00061 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00062"></a>00062     };
-<a name="l00063"></a>00063 
-<a name="l00064"></a>00064     ~<a class="code" href="a00278.html">recursive_mutex</a>() {
-<a name="l00065"></a>00065 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00066"></a>00066 <span class="preprocessor"></span>        internal_destroy();
-<a name="l00067"></a>00067 <span class="preprocessor">#else</span>
-<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor">  #if _WIN32||_WIN64</span>
-<a name="l00069"></a>00069 <span class="preprocessor"></span>        DeleteCriticalSection(&impl);
-<a name="l00070"></a>00070 <span class="preprocessor">  #else</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span>        pthread_mutex_destroy(&impl); 
-<a name="l00072"></a>00072 
-<a name="l00073"></a>00073 <span class="preprocessor">  #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00074"></a>00074 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00075"></a>00075     };
-<a name="l00076"></a>00076 
-<a name="l00077"></a>00077     <span class="keyword">class </span>scoped_lock;
-<a name="l00078"></a>00078     <span class="keyword">friend</span> <span class="keyword">class </span>scoped_lock;
-<a name="l00079"></a>00079 
-<a name="l00081"></a>00081 
-<a name="l00083"></a><a class="code" href="a00279.html">00083</a>     <span class="keyword">class </span><a class="code" href="a00279.html">scoped_lock</a>: internal::no_copy {
-<a name="l00084"></a>00084     <span class="keyword">public</span>:
-<a name="l00086"></a><a class="code" href="a00279.html#d82d4d36fbf9727a493d26ae50855fe7">00086</a>         <a class="code" href="a00279.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>() : my_mutex(NULL) {};
-<a name="l00087"></a>00087 
-<a name="l00089"></a><a class="code" href="a00279.html#dec17713c4c1321ac8fec66816d0c602">00089</a>         <a class="code" href="a00279.html#d82d4d36fbf9727a493d26ae50855fe7">scoped_lock</a>( <a class="code" href="a00278.html">recursive_mutex</a>& <a class="code" href="a00258.html">mutex</a> ) {
-<a name="l00090"></a>00090 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00091"></a>00091 <span class="preprocessor"></span>            my_mutex = &mutex; 
-<a name="l00092"></a>00092 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00093"></a>00093             <a class="code" href="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( mutex );
-<a name="l00094"></a>00094         }
-<a name="l00095"></a>00095 
-<a name="l00097"></a><a class="code" href="a00279.html#c1197ffb8f3cd9d4fed71d7e06265b7c">00097</a>         <a class="code" href="a00279.html#c1197ffb8f3cd9d4fed71d7e06265b7c">~scoped_lock</a>() {
-<a name="l00098"></a>00098             <span class="keywordflow">if</span>( my_mutex ) 
-<a name="l00099"></a>00099                 <a class="code" href="a00279.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>();
-<a name="l00100"></a>00100         }
-<a name="l00101"></a>00101 
-<a name="l00103"></a><a class="code" href="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">00103</a>         <span class="keywordtype">void</span> <a class="code" href="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">acquire</a>( <a class="code" href="a00278.html">recursive_mutex</a>& <a class="code" href="a00258.html">mutex</a> ) {
-<a name="l00104"></a>00104 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span>            internal_acquire( mutex );
-<a name="l00106"></a>00106 <span class="preprocessor">#else</span>
-<a name="l00107"></a>00107 <span class="preprocessor"></span>            my_mutex = &mutex;
-<a name="l00108"></a>00108             mutex.<a class="code" href="a00278.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>();
-<a name="l00109"></a>00109 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00110"></a>00110         }
-<a name="l00111"></a>00111 
-<a name="l00113"></a><a class="code" href="a00279.html#36bfc3e93e3ef6340abef4901444d340">00113</a>         <span class="keywordtype">bool</span> <a class="code" href="a00279.html#36bfc3e93e3ef6340abef4901444d340">try_acquire</a>( <a class="code" href="a00278.html">recursive_mutex</a>& <a class="code" href="a00258.html">mutex</a> ) {
-<a name="l00114"></a>00114 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span>            <span class="keywordflow">return</span> internal_try_acquire( mutex );
-<a name="l00116"></a>00116 <span class="preprocessor">#else</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span>            <span class="keywordtype">bool</span> result = mutex.<a class="code" href="a00278.html#86e719b0afee25704af11ab97694d240">try_lock</a>();
-<a name="l00118"></a>00118             <span class="keywordflow">if</span>( result )
-<a name="l00119"></a>00119                 my_mutex = &mutex;
-<a name="l00120"></a>00120             <span class="keywordflow">return</span> result;
-<a name="l00121"></a>00121 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00122"></a>00122         }
-<a name="l00123"></a>00123 
-<a name="l00125"></a><a class="code" href="a00279.html#ac480ea0e9d5ea0345a67d57008b6263">00125</a>         <span class="keywordtype">void</span> <a class="code" href="a00279.html#ac480ea0e9d5ea0345a67d57008b6263">release</a>() {
-<a name="l00126"></a>00126 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00127"></a>00127 <span class="preprocessor"></span>            internal_release();
-<a name="l00128"></a>00128 <span class="preprocessor">#else</span>
-<a name="l00129"></a>00129 <span class="preprocessor"></span>            my_mutex-><a class="code" href="a00278.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>();
-<a name="l00130"></a>00130             my_mutex = NULL;
-<a name="l00131"></a>00131 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00132"></a>00132         }
-<a name="l00133"></a>00133 
-<a name="l00134"></a>00134     <span class="keyword">private</span>:
-<a name="l00136"></a>00136         <a class="code" href="a00278.html">recursive_mutex</a>* my_mutex;
-<a name="l00137"></a>00137 
-<a name="l00139"></a>00139         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00278.html">recursive_mutex</a>& m );
-<a name="l00140"></a>00140 
-<a name="l00142"></a>00142         <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00278.html">recursive_mutex</a>& m );
-<a name="l00143"></a>00143 
-<a name="l00145"></a>00145         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release();
-<a name="l00146"></a>00146 
-<a name="l00147"></a>00147         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00278.html">recursive_mutex</a>;
-<a name="l00148"></a>00148     };
-<a name="l00149"></a>00149 
-<a name="l00150"></a>00150     <span class="comment">// Mutex traits</span>
-<a name="l00151"></a>00151     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_rw_mutex = <span class="keyword">false</span>;
-<a name="l00152"></a>00152     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_recursive_mutex = <span class="keyword">true</span>;
-<a name="l00153"></a>00153     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> is_fair_mutex = <span class="keyword">false</span>;
-<a name="l00154"></a>00154 
-<a name="l00155"></a>00155     <span class="comment">// C++0x compatibility interface</span>
-<a name="l00156"></a>00156     
-<a name="l00158"></a><a class="code" href="a00278.html#4c342c69d47f4bb0b393535dee4015d6">00158</a>     <span class="keywordtype">void</span> <a class="code" href="a00278.html#4c342c69d47f4bb0b393535dee4015d6">lock</a>() {
-<a name="l00159"></a>00159 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00160"></a>00160 <span class="preprocessor"></span>        <a class="code" href="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00161"></a>00161         <span class="keyword">new</span>(tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00279.html">scoped_lock</a>(*<span class="keyword">this</span>);
-<a name="l00162"></a>00162 <span class="preprocessor">#else</span>
-<a name="l00163"></a>00163 <span class="preprocessor"></span><span class="preprocessor">  #if _WIN32||_WIN64</span>
-<a name="l00164"></a>00164 <span class="preprocessor"></span>        EnterCriticalSection(&impl);
-<a name="l00165"></a>00165 <span class="preprocessor">  #else</span>
-<a name="l00166"></a>00166 <span class="preprocessor"></span>        pthread_mutex_lock(&impl);
-<a name="l00167"></a>00167 <span class="preprocessor">  #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00168"></a>00168 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00169"></a>00169     }
-<a name="l00170"></a>00170 
-<a name="l00172"></a>00172 
-<a name="l00173"></a><a class="code" href="a00278.html#86e719b0afee25704af11ab97694d240">00173</a>     <span class="keywordtype">bool</span> <a class="code" href="a00278.html#86e719b0afee25704af11ab97694d240">try_lock</a>() {
-<a name="l00174"></a>00174 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00175"></a>00175 <span class="preprocessor"></span>        <a class="code" href="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00176"></a>00176         <span class="keywordflow">return</span> (<span class="keyword">new</span>(tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00279.html">scoped_lock</a>)->internal_try_acquire(*<span class="keyword">this</span>);
-<a name="l00177"></a>00177 <span class="preprocessor">#else        </span>
-<a name="l00178"></a>00178 <span class="preprocessor"></span><span class="preprocessor">  #if _WIN32||_WIN64</span>
-<a name="l00179"></a>00179 <span class="preprocessor"></span>        <span class="keywordflow">return</span> TryEnterCriticalSection(&impl)!=0;
-<a name="l00180"></a>00180 <span class="preprocessor">  #else</span>
-<a name="l00181"></a>00181 <span class="preprocessor"></span>        <span class="keywordflow">return</span> pthread_mutex_trylock(&impl)==0;
-<a name="l00182"></a>00182 <span class="preprocessor">  #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00183"></a>00183 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00184"></a>00184     }
-<a name="l00185"></a>00185 
-<a name="l00187"></a><a class="code" href="a00278.html#f0a96e26b7f074588dc31e32524856ae">00187</a>     <span class="keywordtype">void</span> <a class="code" href="a00278.html#f0a96e26b7f074588dc31e32524856ae">unlock</a>() {
-<a name="l00188"></a>00188 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00189"></a>00189 <span class="preprocessor"></span>        <a class="code" href="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00190"></a>00190         <a class="code" href="a00279.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00191"></a>00191         s.<a class="code" href="a00279.html#3efd10a49e2435ea5215b49907f93ba2">my_mutex</a> = <span class="keyword">this</span>;
-<a name="l00192"></a>00192         s.<a class="code" href="a00279.html#43ed37cec508072e53a52113c8040137">internal_release</a>();
-<a name="l00193"></a>00193 <span class="preprocessor">#else</span>
-<a name="l00194"></a>00194 <span class="preprocessor"></span><span class="preprocessor">  #if _WIN32||_WIN64</span>
-<a name="l00195"></a>00195 <span class="preprocessor"></span>        LeaveCriticalSection(&impl);
-<a name="l00196"></a>00196 <span class="preprocessor">  #else</span>
-<a name="l00197"></a>00197 <span class="preprocessor"></span>        pthread_mutex_unlock(&impl);
-<a name="l00198"></a>00198 <span class="preprocessor">  #endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00199"></a>00199 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00200"></a>00200     }
-<a name="l00201"></a>00201 
-<a name="l00203"></a>00203 <span class="preprocessor">  #if _WIN32||_WIN64</span>
-<a name="l00204"></a><a class="code" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">00204</a> <span class="preprocessor"></span>    <span class="keyword">typedef</span> LPCRITICAL_SECTION <a class="code" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a>;
-<a name="l00205"></a>00205 <span class="preprocessor">  #else</span>
-<a name="l00206"></a>00206 <span class="preprocessor"></span>    <span class="keyword">typedef</span> pthread_mutex_t* <a class="code" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a>;
-<a name="l00207"></a>00207 <span class="preprocessor">  #endif</span>
-<a name="l00208"></a>00208 <span class="preprocessor"></span>    <a class="code" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a> native_handle() { <span class="keywordflow">return</span> (<a class="code" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">native_handle_type</a>) &impl; }
-<a name="l00209"></a>00209 
-<a name="l00210"></a>00210 <span class="keyword">private</span>:
-<a name="l00211"></a>00211 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00212"></a>00212 <span class="preprocessor"></span>    CRITICAL_SECTION impl;
-<a name="l00213"></a>00213     <span class="keyword">enum</span> state_t {
-<a name="l00214"></a>00214         INITIALIZED=0x1234,
-<a name="l00215"></a>00215         DESTROYED=0x789A,
-<a name="l00216"></a>00216     } state;
-<a name="l00217"></a>00217 <span class="preprocessor">#else</span>
-<a name="l00218"></a>00218 <span class="preprocessor"></span>    pthread_mutex_t impl;
-<a name="l00219"></a>00219 <span class="preprocessor">#endif </span><span class="comment">/* _WIN32||_WIN64 */</span>
-<a name="l00220"></a>00220 
-<a name="l00222"></a>00222     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_construct();
-<a name="l00223"></a>00223 
-<a name="l00225"></a>00225     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_destroy();
-<a name="l00226"></a>00226 };
-<a name="l00227"></a>00227 
-<a name="l00228"></a>00228 __TBB_DEFINE_PROFILING_SET_NAME(recursive_mutex)
-<a name="l00229"></a>00229 
-<a name="l00230"></a>00230 } <span class="comment">// namespace tbb </span>
-<a name="l00231"></a>00231 
-<a name="l00232"></a>00232 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_recursive_mutex_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00564.html b/doc/html/a00564.html
deleted file mode 100644
index 2401ba2..0000000
--- a/doc/html/a00564.html
+++ /dev/null
@@ -1,199 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>scalable_allocator.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>scalable_allocator.h</h1><a href="a00344.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_scalable_allocator_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_scalable_allocator_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00025"></a>00025 <span class="preprocessor">#include <stddef.h></span> <span class="comment">/* Need ptrdiff_t and size_t from here. */</span>
-<a name="l00026"></a>00026 
-<a name="l00027"></a>00027 <span class="preprocessor">#if !defined(__cplusplus) && __ICC==1100</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (push)</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 991)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#ifdef __cplusplus</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {
-<a name="l00034"></a>00034 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
-<a name="l00035"></a>00035 
-<a name="l00036"></a>00036 <span class="preprocessor">#if _MSC_VER >= 1400</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC   __cdecl</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span>
-<a name="l00044"></a>00044 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a> (size_t size);
-<a name="l00045"></a>00045 
-<a name="l00048"></a>00048 <span class="keywordtype">void</span>   __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a> (<span class="keywordtype">void</span>* ptr);
-<a name="l00049"></a>00049 
-<a name="l00052"></a>00052 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size);
-<a name="l00053"></a>00053 
-<a name="l00056"></a>00056 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_calloc</a> (size_t nobj, size_t size);
-<a name="l00057"></a>00057 
-<a name="l00060"></a>00060 <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#g05dcec987480bb2c82ecdead6a085899">scalable_posix_memalign</a> (<span class="keywordtype">void</span>** memptr, size_t alignment, size_t size);
-<a name="l00061"></a>00061 
-<a name="l00064"></a>00064 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_aligned_malloc</a> (size_t size, size_t alignment);
-<a name="l00065"></a>00065 
-<a name="l00068"></a>00068 <span class="keywordtype">void</span> * __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_aligned_realloc</a> (<span class="keywordtype">void</span>* ptr, size_t size, size_t alignment);
-<a name="l00069"></a>00069 
-<a name="l00072"></a>00072 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_aligned_free</a> (<span class="keywordtype">void</span>* ptr);
-<a name="l00073"></a>00073 
-<a name="l00078"></a>00078 size_t __TBB_EXPORTED_FUNC <a class="code" href="a00373.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_msize</a> (<span class="keywordtype">void</span>* ptr);
-<a name="l00079"></a>00079 
-<a name="l00080"></a>00080 <span class="preprocessor">#ifdef __cplusplus</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span>} <span class="comment">/* extern "C" */</span>
-<a name="l00082"></a>00082 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
-<a name="l00083"></a>00083 
-<a name="l00084"></a>00084 <span class="preprocessor">#ifdef __cplusplus</span>
-<a name="l00085"></a>00085 <span class="preprocessor"></span>
-<a name="l00086"></a>00086 <span class="preprocessor">#include <new></span>      <span class="comment">/* To use new with the placement argument */</span>
-<a name="l00087"></a>00087 
-<a name="l00088"></a>00088 <span class="comment">/* Ensure that including this header does not cause implicit linkage with TBB */</span>
-<a name="l00089"></a>00089 <span class="preprocessor">#ifndef __TBB_NO_IMPLICIT_LINKAGE</span>
-<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00091"></a>00091 <span class="preprocessor"></span><span class="preprocessor">    #include "tbb_stddef.h"</span>
-<a name="l00092"></a>00092 <span class="preprocessor">    #undef  __TBB_NO_IMPLICIT_LINKAGE</span>
-<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="preprocessor">    #include "tbb_stddef.h"</span>
-<a name="l00095"></a>00095 <span class="preprocessor">#endif</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span>
-<a name="l00097"></a>00097 
-<a name="l00098"></a>00098 <span class="keyword">namespace </span>tbb {
-<a name="l00099"></a>00099 
-<a name="l00100"></a>00100 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00101"></a>00101 <span class="preprocessor"></span>    <span class="comment">// Workaround for erroneous "unreferenced parameter" warning in method destroy.</span>
-<a name="l00102"></a>00102 <span class="preprocessor">    #pragma warning (push)</span>
-<a name="l00103"></a>00103 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (disable: 4100)</span>
-<a name="l00104"></a>00104 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span>
-<a name="l00107"></a>00107 
-<a name="l00110"></a>00110 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00111"></a><a class="code" href="a00280.html">00111</a> <span class="keyword">class </span><a class="code" href="a00280.html">scalable_allocator</a> {
-<a name="l00112"></a>00112 <span class="keyword">public</span>:
-<a name="l00113"></a>00113     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
-<a name="l00114"></a>00114     <span class="keyword">typedef</span> value_type* pointer;
-<a name="l00115"></a>00115     <span class="keyword">typedef</span> <span class="keyword">const</span> value_type* const_pointer;
-<a name="l00116"></a>00116     <span class="keyword">typedef</span> value_type& reference;
-<a name="l00117"></a>00117     <span class="keyword">typedef</span> <span class="keyword">const</span> value_type& const_reference;
-<a name="l00118"></a>00118     <span class="keyword">typedef</span> size_t size_type;
-<a name="l00119"></a>00119     <span class="keyword">typedef</span> ptrdiff_t difference_type;
-<a name="l00120"></a>00120     <span class="keyword">template</span><<span class="keyword">class</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00121"></a>00121         <span class="keyword">typedef</span> <a class="code" href="a00280.html">scalable_allocator<U></a> other;
-<a name="l00122"></a>00122     };
-<a name="l00123"></a>00123 
-<a name="l00124"></a>00124     <a class="code" href="a00280.html">scalable_allocator</a>() <span class="keywordflow">throw</span>() {}
-<a name="l00125"></a>00125     <a class="code" href="a00280.html">scalable_allocator</a>( <span class="keyword">const</span> <a class="code" href="a00280.html">scalable_allocator</a>& ) <span class="keywordflow">throw</span>() {}
-<a name="l00126"></a>00126     <span class="keyword">template</span><<span class="keyword">typename</span> U> <a class="code" href="a00280.html">scalable_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00280.html">scalable_allocator<U></a>&) <span class="keywordflow">throw</span>() {}
-<a name="l00127"></a>00127 
-<a name="l00128"></a>00128     pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00129"></a>00129     const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
-<a name="l00130"></a>00130 
-<a name="l00132"></a><a class="code" href="a00280.html#726b1586d05d44665a36e1c7b2699bfd">00132</a>     pointer <a class="code" href="a00280.html#726b1586d05d44665a36e1c7b2699bfd">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* <span class="comment">/*hint*/</span> =0 ) {
-<a name="l00133"></a>00133         <span class="keywordflow">return</span> static_cast<pointer>( <a class="code" href="a00373.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_malloc</a>( n * <span class="keyword">sizeof</span>(value_type) ) );
-<a name="l00134"></a>00134     }
-<a name="l00135"></a>00135 
-<a name="l00137"></a><a class="code" href="a00280.html#f806a238c18cbcfb531e1e0a0d2ec59d">00137</a>     <span class="keywordtype">void</span> <a class="code" href="a00280.html#f806a238c18cbcfb531e1e0a0d2ec59d">deallocate</a>( pointer p, size_type ) {
-<a name="l00138"></a>00138         <a class="code" href="a00373.html#gca3579c21244dba9f0c351e5984d4565">scalable_free</a>( p );
-<a name="l00139"></a>00139     }
-<a name="l00140"></a>00140 
-<a name="l00142"></a><a class="code" href="a00280.html#880e766f1d913988c21973dbdd874fd5">00142</a>     size_type <a class="code" href="a00280.html#880e766f1d913988c21973dbdd874fd5">max_size</a>() const throw() {
-<a name="l00143"></a>00143         size_type absolutemax = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
-<a name="l00144"></a>00144         <span class="keywordflow">return</span> (absolutemax > 0 ? absolutemax : 1);
-<a name="l00145"></a>00145     }
-<a name="l00146"></a>00146     <span class="keywordtype">void</span> construct( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
-<a name="l00147"></a>00147     <span class="keywordtype">void</span> destroy( pointer p ) {p->~value_type();}
-<a name="l00148"></a>00148 };
-<a name="l00149"></a>00149 
-<a name="l00150"></a>00150 <span class="preprocessor">#if _MSC_VER && !defined(__INTEL_COMPILER)</span>
-<a name="l00151"></a>00151 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
-<a name="l00152"></a>00152 <span class="preprocessor"></span><span class="preprocessor">#endif // warning 4100 is back</span>
-<a name="l00153"></a>00153 <span class="preprocessor"></span>
-<a name="l00155"></a>00155 
-<a name="l00156"></a>00156 <span class="keyword">template</span><>
-<a name="l00157"></a><a class="code" href="a00281.html">00157</a> <span class="keyword">class </span><a class="code" href="a00280.html">scalable_allocator</a><void> {
-<a name="l00158"></a>00158 <span class="keyword">public</span>:
-<a name="l00159"></a>00159     <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
-<a name="l00160"></a>00160     <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
-<a name="l00161"></a>00161     <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
-<a name="l00162"></a>00162     <span class="keyword">template</span><<span class="keyword">class</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00163"></a>00163         <span class="keyword">typedef</span> <a class="code" href="a00280.html">scalable_allocator<U></a> other;
-<a name="l00164"></a>00164     };
-<a name="l00165"></a>00165 };
-<a name="l00166"></a>00166 
-<a name="l00167"></a>00167 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00168"></a>00168 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00280.html">scalable_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00280.html">scalable_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
-<a name="l00169"></a>00169 
-<a name="l00170"></a>00170 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00171"></a>00171 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> scalable_allocator<T>&, <span class="keyword">const</span> scalable_allocator<U>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
-<a name="l00172"></a>00172 
-<a name="l00173"></a>00173 } <span class="comment">// namespace tbb</span>
-<a name="l00174"></a>00174 
-<a name="l00175"></a>00175 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00176"></a>00176 <span class="preprocessor"></span><span class="preprocessor">    #if __TBB_BUILD && !defined(__TBBMALLOC_NO_IMPLICIT_LINKAGE)</span>
-<a name="l00177"></a>00177 <span class="preprocessor"></span><span class="preprocessor">        #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00178"></a>00178 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
-<a name="l00179"></a>00179 <span class="preprocessor"></span>
-<a name="l00180"></a>00180 <span class="preprocessor">    #if !__TBBMALLOC_NO_IMPLICIT_LINKAGE</span>
-<a name="l00181"></a>00181 <span class="preprocessor"></span><span class="preprocessor">        #ifdef _DEBUG</span>
-<a name="l00182"></a>00182 <span class="preprocessor"></span><span class="preprocessor">            #pragma comment(lib, "tbbmalloc_debug.lib")</span>
-<a name="l00183"></a>00183 <span class="preprocessor"></span><span class="preprocessor">        #else</span>
-<a name="l00184"></a>00184 <span class="preprocessor"></span><span class="preprocessor">            #pragma comment(lib, "tbbmalloc.lib")</span>
-<a name="l00185"></a>00185 <span class="preprocessor"></span><span class="preprocessor">        #endif</span>
-<a name="l00186"></a>00186 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span>
-<a name="l00188"></a>00188 
-<a name="l00189"></a>00189 <span class="preprocessor">#endif</span>
-<a name="l00190"></a>00190 <span class="preprocessor"></span>
-<a name="l00191"></a>00191 <span class="preprocessor">#endif </span><span class="comment">/* __cplusplus */</span>
-<a name="l00192"></a>00192 
-<a name="l00193"></a>00193 <span class="preprocessor">#if !defined(__cplusplus) && __ICC==1100</span>
-<a name="l00194"></a>00194 <span class="preprocessor"></span><span class="preprocessor">    #pragma warning (pop)</span>
-<a name="l00195"></a>00195 <span class="preprocessor"></span><span class="preprocessor">#endif // ICC 11.0 warning 991 is back</span>
-<a name="l00196"></a>00196 <span class="preprocessor"></span>
-<a name="l00197"></a>00197 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_scalable_allocator_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00565.html b/doc/html/a00565.html
index c26624c..a0ae60b 100644
--- a/doc/html/a00565.html
+++ b/doc/html/a00565.html
@@ -52,59 +52,59 @@
 <a name="l00031"></a>00031 <span class="keyword">namespace </span>tbb {
 <a name="l00032"></a>00032 
 <a name="l00034"></a>00034 
-<a name="l00039"></a><a class="code" href="a00286.html">00039</a> <span class="keyword">class </span><a class="code" href="a00286.html">spin_mutex</a> {
-<a name="l00041"></a>00041     __TBB_Byte flag;
+<a name="l00039"></a><a class="code" href="a00305.html">00039</a> <span class="keyword">class </span><a class="code" href="a00305.html">spin_mutex</a> {
+<a name="l00041"></a>00041     __TBB_atomic_flag flag;
 <a name="l00042"></a>00042 
 <a name="l00043"></a>00043 <span class="keyword">public</span>:
 <a name="l00045"></a>00045 
-<a name="l00046"></a><a class="code" href="a00286.html#3d8fb44644fd8d41ada1fbeba7409be3">00046</a>     <a class="code" href="a00286.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>() : flag(0) {
+<a name="l00046"></a><a class="code" href="a00305.html#3d8fb44644fd8d41ada1fbeba7409be3">00046</a>     <a class="code" href="a00305.html#3d8fb44644fd8d41ada1fbeba7409be3">spin_mutex</a>() : flag(0) {
 <a name="l00047"></a>00047 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
 <a name="l00048"></a>00048 <span class="preprocessor"></span>        internal_construct();
 <a name="l00049"></a>00049 <span class="preprocessor">#endif</span>
 <a name="l00050"></a>00050 <span class="preprocessor"></span>    }
 <a name="l00051"></a>00051 
-<a name="l00053"></a><a class="code" href="a00287.html">00053</a>     <span class="keyword">class </span><a class="code" href="a00287.html">scoped_lock</a> : internal::no_copy {
+<a name="l00053"></a><a class="code" href="a00306.html">00053</a>     <span class="keyword">class </span><a class="code" href="a00306.html">scoped_lock</a> : internal::no_copy {
 <a name="l00054"></a>00054     <span class="keyword">private</span>:
-<a name="l00056"></a>00056         <a class="code" href="a00286.html">spin_mutex</a>* my_mutex; 
+<a name="l00056"></a>00056         <a class="code" href="a00305.html">spin_mutex</a>* my_mutex; 
 <a name="l00057"></a>00057 
-<a name="l00059"></a>00059         uintptr_t my_unlock_value;
+<a name="l00059"></a>00059         __TBB_Flag my_unlock_value;
 <a name="l00060"></a>00060 
-<a name="l00062"></a>00062         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00286.html">spin_mutex</a>& m );
+<a name="l00062"></a>00062         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_acquire( <a class="code" href="a00305.html">spin_mutex</a>& m );
 <a name="l00063"></a>00063 
-<a name="l00065"></a>00065         <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00286.html">spin_mutex</a>& m );
+<a name="l00065"></a>00065         <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire( <a class="code" href="a00305.html">spin_mutex</a>& m );
 <a name="l00066"></a>00066 
 <a name="l00068"></a>00068         <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_release();
 <a name="l00069"></a>00069 
-<a name="l00070"></a>00070         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00286.html">spin_mutex</a>;
+<a name="l00070"></a>00070         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00305.html">spin_mutex</a>;
 <a name="l00071"></a>00071 
 <a name="l00072"></a>00072     <span class="keyword">public</span>:
-<a name="l00074"></a><a class="code" href="a00287.html#29ae680ae7f5e685c2e15535b9c855b3">00074</a>         <a class="code" href="a00287.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>() : my_mutex(NULL), my_unlock_value(0) {}
+<a name="l00074"></a><a class="code" href="a00306.html#29ae680ae7f5e685c2e15535b9c855b3">00074</a>         <a class="code" href="a00306.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>() : my_mutex(NULL), my_unlock_value(0) {}
 <a name="l00075"></a>00075 
-<a name="l00077"></a><a class="code" href="a00287.html#5ce6807050a9e8f87bcb4a65dccb12ef">00077</a>         <a class="code" href="a00287.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>( <a class="code" href="a00286.html">spin_mutex</a>& m ) { 
+<a name="l00077"></a><a class="code" href="a00306.html#5ce6807050a9e8f87bcb4a65dccb12ef">00077</a>         <a class="code" href="a00306.html#29ae680ae7f5e685c2e15535b9c855b3">scoped_lock</a>( <a class="code" href="a00305.html">spin_mutex</a>& m ) { 
 <a name="l00078"></a>00078 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
 <a name="l00079"></a>00079 <span class="preprocessor"></span>            my_mutex=NULL;
 <a name="l00080"></a>00080             internal_acquire(m);
 <a name="l00081"></a>00081 <span class="preprocessor">#else</span>
-<a name="l00082"></a>00082 <span class="preprocessor"></span>            my_unlock_value = __TBB_LockByte(m.<a class="code" href="a00286.html#6e46896ee0f1e342d5505deece72af66">flag</a>);
+<a name="l00082"></a>00082 <span class="preprocessor"></span>            my_unlock_value = __TBB_LockByte(m.<a class="code" href="a00305.html#0a6204153f18f3a7816faa95b2c1626d">flag</a>);
 <a name="l00083"></a>00083             my_mutex=&m;
 <a name="l00084"></a>00084 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/</span>
 <a name="l00085"></a>00085         }
 <a name="l00086"></a>00086 
-<a name="l00088"></a><a class="code" href="a00287.html#3ee3c338732b1f64b0b32a757807a30d">00088</a>         <span class="keywordtype">void</span> <a class="code" href="a00287.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>( <a class="code" href="a00286.html">spin_mutex</a>& m ) {
+<a name="l00088"></a><a class="code" href="a00306.html#3ee3c338732b1f64b0b32a757807a30d">00088</a>         <span class="keywordtype">void</span> <a class="code" href="a00306.html#3ee3c338732b1f64b0b32a757807a30d">acquire</a>( <a class="code" href="a00305.html">spin_mutex</a>& m ) {
 <a name="l00089"></a>00089 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
 <a name="l00090"></a>00090 <span class="preprocessor"></span>            internal_acquire(m);
 <a name="l00091"></a>00091 <span class="preprocessor">#else</span>
-<a name="l00092"></a>00092 <span class="preprocessor"></span>            my_unlock_value = __TBB_LockByte(m.<a class="code" href="a00286.html#6e46896ee0f1e342d5505deece72af66">flag</a>);
+<a name="l00092"></a>00092 <span class="preprocessor"></span>            my_unlock_value = __TBB_LockByte(m.<a class="code" href="a00305.html#0a6204153f18f3a7816faa95b2c1626d">flag</a>);
 <a name="l00093"></a>00093             my_mutex = &m;
 <a name="l00094"></a>00094 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/</span>
 <a name="l00095"></a>00095         }
 <a name="l00096"></a>00096 
 <a name="l00098"></a>00098 
-<a name="l00099"></a><a class="code" href="a00287.html#9297ec188534b45dc0ca48f2f39a0501">00099</a>         <span class="keywordtype">bool</span> <a class="code" href="a00287.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>( <a class="code" href="a00286.html">spin_mutex</a>& m ) {
+<a name="l00099"></a><a class="code" href="a00306.html#9297ec188534b45dc0ca48f2f39a0501">00099</a>         <span class="keywordtype">bool</span> <a class="code" href="a00306.html#9297ec188534b45dc0ca48f2f39a0501">try_acquire</a>( <a class="code" href="a00305.html">spin_mutex</a>& m ) {
 <a name="l00100"></a>00100 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
 <a name="l00101"></a>00101 <span class="preprocessor"></span>            <span class="keywordflow">return</span> internal_try_acquire(m);
 <a name="l00102"></a>00102 <span class="preprocessor">#else</span>
-<a name="l00103"></a>00103 <span class="preprocessor"></span>            <span class="keywordtype">bool</span> result = __TBB_TryLockByte(m.<a class="code" href="a00286.html#6e46896ee0f1e342d5505deece72af66">flag</a>);
+<a name="l00103"></a>00103 <span class="preprocessor"></span>            <span class="keywordtype">bool</span> result = __TBB_TryLockByte(m.<a class="code" href="a00305.html#0a6204153f18f3a7816faa95b2c1626d">flag</a>);
 <a name="l00104"></a>00104             <span class="keywordflow">if</span>( result ) {
 <a name="l00105"></a>00105                 my_unlock_value = 0;
 <a name="l00106"></a>00106                 my_mutex = &m;
@@ -113,21 +113,21 @@
 <a name="l00109"></a>00109 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/</span>
 <a name="l00110"></a>00110         }
 <a name="l00111"></a>00111 
-<a name="l00113"></a><a class="code" href="a00287.html#eeb615e68e963e6bf8d9c11402d0ce8e">00113</a>         <span class="keywordtype">void</span> <a class="code" href="a00287.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>() {
+<a name="l00113"></a><a class="code" href="a00306.html#eeb615e68e963e6bf8d9c11402d0ce8e">00113</a>         <span class="keywordtype">void</span> <a class="code" href="a00306.html#eeb615e68e963e6bf8d9c11402d0ce8e">release</a>() {
 <a name="l00114"></a>00114 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
 <a name="l00115"></a>00115 <span class="preprocessor"></span>            internal_release();
 <a name="l00116"></a>00116 <span class="preprocessor">#else</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span>            __TBB_UnlockByte(my_mutex-><a class="code" href="a00286.html#6e46896ee0f1e342d5505deece72af66">flag</a>, static_cast<__TBB_Byte>(my_unlock_value));
+<a name="l00117"></a>00117 <span class="preprocessor"></span>            __TBB_UnlockByte(my_mutex-><a class="code" href="a00305.html#0a6204153f18f3a7816faa95b2c1626d">flag</a>, my_unlock_value);
 <a name="l00118"></a>00118             my_mutex = NULL;
 <a name="l00119"></a>00119 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
 <a name="l00120"></a>00120         }
 <a name="l00121"></a>00121 
-<a name="l00123"></a><a class="code" href="a00287.html#ac6fa425d1f06c56d8b70abc51aac844">00123</a>         <a class="code" href="a00287.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>() {
+<a name="l00123"></a><a class="code" href="a00306.html#ac6fa425d1f06c56d8b70abc51aac844">00123</a>         <a class="code" href="a00306.html#ac6fa425d1f06c56d8b70abc51aac844">~scoped_lock</a>() {
 <a name="l00124"></a>00124             <span class="keywordflow">if</span>( my_mutex ) {
 <a name="l00125"></a>00125 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
 <a name="l00126"></a>00126 <span class="preprocessor"></span>                internal_release();
 <a name="l00127"></a>00127 <span class="preprocessor">#else</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span>                __TBB_UnlockByte(my_mutex-><a class="code" href="a00286.html#6e46896ee0f1e342d5505deece72af66">flag</a>, static_cast<__TBB_Byte>(my_unlock_value));
+<a name="l00128"></a>00128 <span class="preprocessor"></span>                __TBB_UnlockByte(my_mutex-><a class="code" href="a00305.html#0a6204153f18f3a7816faa95b2c1626d">flag</a>, my_unlock_value);
 <a name="l00129"></a>00129 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
 <a name="l00130"></a>00130             }
 <a name="l00131"></a>00131         }
@@ -142,32 +142,32 @@
 <a name="l00140"></a>00140 
 <a name="l00141"></a>00141     <span class="comment">// ISO C++0x compatibility methods</span>
 <a name="l00142"></a>00142 
-<a name="l00144"></a><a class="code" href="a00286.html#4f748989e19b6045e3a2d2ee73626a28">00144</a>     <span class="keywordtype">void</span> <a class="code" href="a00286.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>() {
+<a name="l00144"></a><a class="code" href="a00305.html#4f748989e19b6045e3a2d2ee73626a28">00144</a>     <span class="keywordtype">void</span> <a class="code" href="a00305.html#4f748989e19b6045e3a2d2ee73626a28">lock</a>() {
 <a name="l00145"></a>00145 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00146"></a>00146 <span class="preprocessor"></span>        <a class="code" href="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00147"></a>00147         <span class="keyword">new</span>(tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00287.html">scoped_lock</a>(*<span class="keyword">this</span>);
+<a name="l00146"></a>00146 <span class="preprocessor"></span>        <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00147"></a>00147         <span class="keyword">new</span>(tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00306.html">scoped_lock</a>(*<span class="keyword">this</span>);
 <a name="l00148"></a>00148 <span class="preprocessor">#else</span>
 <a name="l00149"></a>00149 <span class="preprocessor"></span>        __TBB_LockByte(flag);
 <a name="l00150"></a>00150 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS*/</span>
 <a name="l00151"></a>00151     }
 <a name="l00152"></a>00152 
 <a name="l00154"></a>00154 
-<a name="l00155"></a><a class="code" href="a00286.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">00155</a>     <span class="keywordtype">bool</span> <a class="code" href="a00286.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>() {
+<a name="l00155"></a><a class="code" href="a00305.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">00155</a>     <span class="keywordtype">bool</span> <a class="code" href="a00305.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">try_lock</a>() {
 <a name="l00156"></a>00156 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00157"></a>00157 <span class="preprocessor"></span>        <a class="code" href="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00158"></a>00158         <span class="keywordflow">return</span> (<span class="keyword">new</span>(tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00287.html">scoped_lock</a>)->internal_try_acquire(*<span class="keyword">this</span>);
+<a name="l00157"></a>00157 <span class="preprocessor"></span>        <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00158"></a>00158         <span class="keywordflow">return</span> (<span class="keyword">new</span>(tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>()) <a class="code" href="a00306.html">scoped_lock</a>)->internal_try_acquire(*<span class="keyword">this</span>);
 <a name="l00159"></a>00159 <span class="preprocessor">#else</span>
 <a name="l00160"></a>00160 <span class="preprocessor"></span>        <span class="keywordflow">return</span> __TBB_TryLockByte(flag);
 <a name="l00161"></a>00161 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS*/</span>
 <a name="l00162"></a>00162     }
 <a name="l00163"></a>00163 
-<a name="l00165"></a><a class="code" href="a00286.html#0e843ee6265f57f27d228ba91e7308ef">00165</a>     <span class="keywordtype">void</span> <a class="code" href="a00286.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>() {
+<a name="l00165"></a><a class="code" href="a00305.html#0e843ee6265f57f27d228ba91e7308ef">00165</a>     <span class="keywordtype">void</span> <a class="code" href="a00305.html#0e843ee6265f57f27d228ba91e7308ef">unlock</a>() {
 <a name="l00166"></a>00166 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00167"></a>00167 <span class="preprocessor"></span>        <a class="code" href="a00215.html">aligned_space<scoped_lock,1></a> tmp;
-<a name="l00168"></a>00168         <a class="code" href="a00287.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
-<a name="l00169"></a>00169         s.<a class="code" href="a00287.html#d968921bed018503214f36e09007ee7b">my_mutex</a> = <span class="keyword">this</span>;
-<a name="l00170"></a>00170         s.<a class="code" href="a00287.html#43a6f8977cd1ed2752f417f3ad9fc4af">my_unlock_value</a> = 0;
-<a name="l00171"></a>00171         s.<a class="code" href="a00287.html#8f4d19aa2d6d112034d281eed0dab5fa">internal_release</a>();
+<a name="l00167"></a>00167 <span class="preprocessor"></span>        <a class="code" href="a00227.html">aligned_space<scoped_lock,1></a> tmp;
+<a name="l00168"></a>00168         <a class="code" href="a00306.html">scoped_lock</a>& s = *tmp.<a class="code" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">begin</a>();
+<a name="l00169"></a>00169         s.<a class="code" href="a00306.html#d968921bed018503214f36e09007ee7b">my_mutex</a> = <span class="keyword">this</span>;
+<a name="l00170"></a>00170         s.<a class="code" href="a00306.html#96af1c1af58988d527102379c3d4c831">my_unlock_value</a> = 0;
+<a name="l00171"></a>00171         s.<a class="code" href="a00306.html#8f4d19aa2d6d112034d281eed0dab5fa">internal_release</a>();
 <a name="l00172"></a>00172 <span class="preprocessor">#else</span>
 <a name="l00173"></a>00173 <span class="preprocessor"></span>        __TBB_store_with_release(flag, 0);
 <a name="l00174"></a>00174 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
diff --git a/doc/html/a00566.html b/doc/html/a00566.html
index f3fe59d..347145e 100644
--- a/doc/html/a00566.html
+++ b/doc/html/a00566.html
@@ -52,7 +52,7 @@
 <a name="l00031"></a>00031 <span class="keyword">typedef</span> spin_rw_mutex_v3 spin_rw_mutex;
 <a name="l00032"></a>00032 
 <a name="l00034"></a>00034 
-<a name="l00035"></a><a class="code" href="a00288.html">00035</a> <span class="keyword">class </span><a class="code" href="a00288.html">spin_rw_mutex_v3</a> {
+<a name="l00035"></a><a class="code" href="a00307.html">00035</a> <span class="keyword">class </span><a class="code" href="a00307.html">spin_rw_mutex_v3</a> {
 <a name="l00037"></a>00037 
 <a name="l00039"></a>00039     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_acquire_writer();
 <a name="l00040"></a>00040 
@@ -73,90 +73,90 @@
 <a name="l00062"></a>00062     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD internal_try_acquire_reader();
 <a name="l00063"></a>00063 
 <a name="l00065"></a>00065 <span class="keyword">public</span>:
-<a name="l00067"></a><a class="code" href="a00288.html#61332b2756de89f3f5f69310cbb6e70c">00067</a>     <a class="code" href="a00288.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>() : state(0) {
+<a name="l00067"></a><a class="code" href="a00307.html#61332b2756de89f3f5f69310cbb6e70c">00067</a>     <a class="code" href="a00307.html#61332b2756de89f3f5f69310cbb6e70c">spin_rw_mutex_v3</a>() : state(0) {
 <a name="l00068"></a>00068 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
 <a name="l00069"></a>00069 <span class="preprocessor"></span>        internal_construct();
 <a name="l00070"></a>00070 <span class="preprocessor">#endif</span>
 <a name="l00071"></a>00071 <span class="preprocessor"></span>    }
 <a name="l00072"></a>00072 
 <a name="l00073"></a>00073 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00075"></a><a class="code" href="a00288.html#9a815fb2759e55072ed413f1b6970cf3">00075</a> <span class="preprocessor">    ~spin_rw_mutex_v3() {</span>
+<a name="l00075"></a><a class="code" href="a00307.html#9a815fb2759e55072ed413f1b6970cf3">00075</a> <span class="preprocessor">    ~spin_rw_mutex_v3() {</span>
 <a name="l00076"></a>00076 <span class="preprocessor"></span>        __TBB_ASSERT( !state, <span class="stringliteral">"destruction of an acquired mutex"</span>);
 <a name="l00077"></a>00077     };
 <a name="l00078"></a>00078 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
 <a name="l00079"></a>00079 
 <a name="l00081"></a>00081 
-<a name="l00083"></a><a class="code" href="a00289.html">00083</a>     <span class="keyword">class </span><a class="code" href="a00289.html">scoped_lock</a> : internal::no_copy {
+<a name="l00083"></a><a class="code" href="a00308.html">00083</a>     <span class="keyword">class </span><a class="code" href="a00308.html">scoped_lock</a> : internal::no_copy {
 <a name="l00084"></a>00084     <span class="keyword">public</span>:
 <a name="l00086"></a>00086 
-<a name="l00087"></a><a class="code" href="a00289.html#d6ea60dee5563f702379bf5e51aa8806">00087</a>         <a class="code" href="a00289.html">scoped_lock</a>() : <a class="code" href="a00258.html">mutex</a>(NULL), is_writer(false) {}
+<a name="l00087"></a><a class="code" href="a00308.html#d6ea60dee5563f702379bf5e51aa8806">00087</a>         <a class="code" href="a00308.html">scoped_lock</a>() : <a class="code" href="a00275.html">mutex</a>(NULL), is_writer(false) {}
 <a name="l00088"></a>00088 
-<a name="l00090"></a><a class="code" href="a00289.html#42a92d4f8fdde425b111cfa8a9228071">00090</a>         <a class="code" href="a00289.html">scoped_lock</a>( <a class="code" href="a00288.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) : <a class="code" href="a00258.html">mutex</a>(NULL) {
-<a name="l00091"></a>00091             <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>(m, write);
+<a name="l00090"></a><a class="code" href="a00308.html#42a92d4f8fdde425b111cfa8a9228071">00090</a>         <a class="code" href="a00308.html">scoped_lock</a>( <a class="code" href="a00307.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) : <a class="code" href="a00275.html">mutex</a>(NULL) {
+<a name="l00091"></a>00091             <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>(m, write);
 <a name="l00092"></a>00092         }
 <a name="l00093"></a>00093 
-<a name="l00095"></a><a class="code" href="a00289.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">00095</a>         <a class="code" href="a00275.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>() {
-<a name="l00096"></a>00096             <span class="keywordflow">if</span>( <a class="code" href="a00258.html">mutex</a> ) <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>();
+<a name="l00095"></a><a class="code" href="a00308.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">00095</a>         <a class="code" href="a00293.html#70246e0260493625ff956fa5926fc71f">~scoped_lock</a>() {
+<a name="l00096"></a>00096             <span class="keywordflow">if</span>( <a class="code" href="a00275.html">mutex</a> ) <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>();
 <a name="l00097"></a>00097         }
 <a name="l00098"></a>00098 
-<a name="l00100"></a><a class="code" href="a00289.html#b0b646ec5be02a127d159bbb7ca65353">00100</a>         <span class="keywordtype">void</span> <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00288.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
-<a name="l00101"></a>00101             __TBB_ASSERT( !<a class="code" href="a00258.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
+<a name="l00100"></a><a class="code" href="a00308.html#b0b646ec5be02a127d159bbb7ca65353">00100</a>         <span class="keywordtype">void</span> <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">acquire</a>( <a class="code" href="a00307.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
+<a name="l00101"></a>00101             __TBB_ASSERT( !<a class="code" href="a00275.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
 <a name="l00102"></a>00102             is_writer = write; 
-<a name="l00103"></a>00103             <a class="code" href="a00258.html">mutex</a> = &m;
-<a name="l00104"></a>00104             <span class="keywordflow">if</span>( write ) <a class="code" href="a00258.html">mutex</a>->internal_acquire_writer();
-<a name="l00105"></a>00105             <span class="keywordflow">else</span>        <a class="code" href="a00258.html">mutex</a>->internal_acquire_reader();
+<a name="l00103"></a>00103             <a class="code" href="a00275.html">mutex</a> = &m;
+<a name="l00104"></a>00104             <span class="keywordflow">if</span>( write ) <a class="code" href="a00275.html">mutex</a>->internal_acquire_writer();
+<a name="l00105"></a>00105             <span class="keywordflow">else</span>        <a class="code" href="a00275.html">mutex</a>->internal_acquire_reader();
 <a name="l00106"></a>00106         }
 <a name="l00107"></a>00107 
 <a name="l00109"></a>00109 
-<a name="l00110"></a><a class="code" href="a00289.html#3f0b1e3f2efab63336400348bd070226">00110</a>         <span class="keywordtype">bool</span> upgrade_to_writer() {
-<a name="l00111"></a>00111             __TBB_ASSERT( <a class="code" href="a00258.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
+<a name="l00110"></a><a class="code" href="a00308.html#3f0b1e3f2efab63336400348bd070226">00110</a>         <span class="keywordtype">bool</span> upgrade_to_writer() {
+<a name="l00111"></a>00111             __TBB_ASSERT( <a class="code" href="a00275.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
 <a name="l00112"></a>00112             __TBB_ASSERT( !is_writer, <span class="stringliteral">"not a reader"</span> );
 <a name="l00113"></a>00113             is_writer = <span class="keyword">true</span>; 
-<a name="l00114"></a>00114             <span class="keywordflow">return</span> <a class="code" href="a00258.html">mutex</a>->internal_upgrade();
+<a name="l00114"></a>00114             <span class="keywordflow">return</span> <a class="code" href="a00275.html">mutex</a>->internal_upgrade();
 <a name="l00115"></a>00115         }
 <a name="l00116"></a>00116 
-<a name="l00118"></a><a class="code" href="a00289.html#61b14d00a78185c9b2d206ebfc379124">00118</a>         <span class="keywordtype">void</span> <a class="code" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
-<a name="l00119"></a>00119             __TBB_ASSERT( <a class="code" href="a00258.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
-<a name="l00120"></a>00120             <a class="code" href="a00288.html">spin_rw_mutex</a> *m = <a class="code" href="a00258.html">mutex</a>; 
-<a name="l00121"></a>00121             <a class="code" href="a00258.html">mutex</a> = NULL;
+<a name="l00118"></a><a class="code" href="a00308.html#61b14d00a78185c9b2d206ebfc379124">00118</a>         <span class="keywordtype">void</span> <a class="code" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">release</a>() {
+<a name="l00119"></a>00119             __TBB_ASSERT( <a class="code" href="a00275.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
+<a name="l00120"></a>00120             <a class="code" href="a00307.html">spin_rw_mutex</a> *m = <a class="code" href="a00275.html">mutex</a>; 
+<a name="l00121"></a>00121             <a class="code" href="a00275.html">mutex</a> = NULL;
 <a name="l00122"></a>00122 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
 <a name="l00123"></a>00123 <span class="preprocessor"></span>            <span class="keywordflow">if</span>( is_writer ) m->internal_release_writer();
 <a name="l00124"></a>00124             <span class="keywordflow">else</span>            m->internal_release_reader();
 <a name="l00125"></a>00125 <span class="preprocessor">#else</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span>            <span class="keywordflow">if</span>( is_writer ) __TBB_AtomicAND( &m-><a class="code" href="a00288.html#621b900d5fef23d2e401aabcbb777c76">state</a>, READERS ); 
-<a name="l00127"></a>00127             <span class="keywordflow">else</span>            __TBB_FetchAndAddWrelease( &m-><a class="code" href="a00288.html#621b900d5fef23d2e401aabcbb777c76">state</a>, -(intptr_t)ONE_READER);
+<a name="l00126"></a>00126 <span class="preprocessor"></span>            <span class="keywordflow">if</span>( is_writer ) __TBB_AtomicAND( &m-><a class="code" href="a00307.html#621b900d5fef23d2e401aabcbb777c76">state</a>, READERS ); 
+<a name="l00127"></a>00127             <span class="keywordflow">else</span>            __TBB_FetchAndAddWrelease( &m-><a class="code" href="a00307.html#621b900d5fef23d2e401aabcbb777c76">state</a>, -(intptr_t)ONE_READER);
 <a name="l00128"></a>00128 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
 <a name="l00129"></a>00129         }
 <a name="l00130"></a>00130 
-<a name="l00132"></a><a class="code" href="a00289.html#c2c2c38a08cb9080e87099fac3e5bc94">00132</a>         <span class="keywordtype">bool</span> downgrade_to_reader() {
+<a name="l00132"></a><a class="code" href="a00308.html#c2c2c38a08cb9080e87099fac3e5bc94">00132</a>         <span class="keywordtype">bool</span> downgrade_to_reader() {
 <a name="l00133"></a>00133 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00134"></a>00134 <span class="preprocessor"></span>            __TBB_ASSERT( <a class="code" href="a00258.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
+<a name="l00134"></a>00134 <span class="preprocessor"></span>            __TBB_ASSERT( <a class="code" href="a00275.html">mutex</a>, <span class="stringliteral">"lock is not acquired"</span> );
 <a name="l00135"></a>00135             __TBB_ASSERT( is_writer, <span class="stringliteral">"not a writer"</span> );
-<a name="l00136"></a>00136             <a class="code" href="a00258.html">mutex</a>->internal_downgrade();
+<a name="l00136"></a>00136             <a class="code" href="a00275.html">mutex</a>->internal_downgrade();
 <a name="l00137"></a>00137 <span class="preprocessor">#else</span>
-<a name="l00138"></a>00138 <span class="preprocessor"></span>            __TBB_FetchAndAddW( &<a class="code" href="a00258.html">mutex</a>->state, ((intptr_t)ONE_READER-WRITER));
+<a name="l00138"></a>00138 <span class="preprocessor"></span>            __TBB_FetchAndAddW( &<a class="code" href="a00275.html">mutex</a>->state, ((intptr_t)ONE_READER-WRITER));
 <a name="l00139"></a>00139 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
 <a name="l00140"></a>00140             is_writer = <span class="keyword">false</span>;
 <a name="l00141"></a>00141 
 <a name="l00142"></a>00142             <span class="keywordflow">return</span> <span class="keyword">true</span>;
 <a name="l00143"></a>00143         }
 <a name="l00144"></a>00144 
-<a name="l00146"></a><a class="code" href="a00289.html#9879626968d9b9a04cd2ec0fb2e84ae1">00146</a>         <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00288.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
-<a name="l00147"></a>00147             __TBB_ASSERT( !<a class="code" href="a00258.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
+<a name="l00146"></a><a class="code" href="a00308.html#9879626968d9b9a04cd2ec0fb2e84ae1">00146</a>         <span class="keywordtype">bool</span> try_acquire( <a class="code" href="a00307.html">spin_rw_mutex</a>& m, <span class="keywordtype">bool</span> write = <span class="keyword">true</span> ) {
+<a name="l00147"></a>00147             __TBB_ASSERT( !<a class="code" href="a00275.html">mutex</a>, <span class="stringliteral">"holding mutex already"</span> );
 <a name="l00148"></a>00148             <span class="keywordtype">bool</span> result;
 <a name="l00149"></a>00149             is_writer = write; 
 <a name="l00150"></a>00150             result = write? m.internal_try_acquire_writer()
 <a name="l00151"></a>00151                           : m.internal_try_acquire_reader();
 <a name="l00152"></a>00152             <span class="keywordflow">if</span>( result ) 
-<a name="l00153"></a>00153                 <a class="code" href="a00258.html">mutex</a> = &m;
+<a name="l00153"></a>00153                 <a class="code" href="a00275.html">mutex</a> = &m;
 <a name="l00154"></a>00154             <span class="keywordflow">return</span> result;
 <a name="l00155"></a>00155         }
 <a name="l00156"></a>00156 
 <a name="l00157"></a>00157     <span class="keyword">protected</span>:
-<a name="l00159"></a><a class="code" href="a00289.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">00159</a>         <a class="code" href="a00288.html">spin_rw_mutex</a>* <a class="code" href="a00258.html">mutex</a>;
+<a name="l00159"></a><a class="code" href="a00308.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">00159</a>         <a class="code" href="a00307.html">spin_rw_mutex</a>* <a class="code" href="a00275.html">mutex</a>;
 <a name="l00160"></a>00160 
 <a name="l00162"></a>00162 
-<a name="l00163"></a><a class="code" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">00163</a>         <span class="keywordtype">bool</span> is_writer;
+<a name="l00163"></a><a class="code" href="a00308.html#6b5a7c3c67a36b05c4df8410d32627d8">00163</a>         <span class="keywordtype">bool</span> is_writer;
 <a name="l00164"></a>00164     };
 <a name="l00165"></a>00165 
 <a name="l00166"></a>00166     <span class="comment">// Mutex traits</span>
@@ -166,12 +166,12 @@
 <a name="l00170"></a>00170 
 <a name="l00171"></a>00171     <span class="comment">// ISO C++0x compatibility methods</span>
 <a name="l00172"></a>00172 
-<a name="l00174"></a><a class="code" href="a00288.html#4007d6e1523dbc3c2bb7f889ab789a8a">00174</a>     <span class="keywordtype">void</span> lock() {internal_acquire_writer();}
+<a name="l00174"></a><a class="code" href="a00307.html#4007d6e1523dbc3c2bb7f889ab789a8a">00174</a>     <span class="keywordtype">void</span> lock() {internal_acquire_writer();}
 <a name="l00175"></a>00175 
 <a name="l00177"></a>00177 
-<a name="l00178"></a><a class="code" href="a00288.html#088bb256be794cc47d3b83791632fdfc">00178</a>     <span class="keywordtype">bool</span> try_lock() {<span class="keywordflow">return</span> internal_try_acquire_writer();}
+<a name="l00178"></a><a class="code" href="a00307.html#088bb256be794cc47d3b83791632fdfc">00178</a>     <span class="keywordtype">bool</span> try_lock() {<span class="keywordflow">return</span> internal_try_acquire_writer();}
 <a name="l00179"></a>00179 
-<a name="l00181"></a><a class="code" href="a00288.html#f9f52ead2098eb5fb12da59d5ae53b55">00181</a>     <span class="keywordtype">void</span> unlock() {
+<a name="l00181"></a><a class="code" href="a00307.html#f9f52ead2098eb5fb12da59d5ae53b55">00181</a>     <span class="keywordtype">void</span> unlock() {
 <a name="l00182"></a>00182 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
 <a name="l00183"></a>00183 <span class="preprocessor"></span>        <span class="keywordflow">if</span>( state&WRITER ) internal_release_writer();
 <a name="l00184"></a>00184         <span class="keywordflow">else</span>               internal_release_reader();
@@ -183,10 +183,10 @@
 <a name="l00190"></a>00190 
 <a name="l00191"></a>00191     <span class="comment">// Methods for reader locks that resemble ISO C++0x compatibility methods.</span>
 <a name="l00192"></a>00192 
-<a name="l00194"></a><a class="code" href="a00288.html#13f799708ac4ca437a16be202e263e18">00194</a>     <span class="keywordtype">void</span> lock_read() {internal_acquire_reader();}
+<a name="l00194"></a><a class="code" href="a00307.html#13f799708ac4ca437a16be202e263e18">00194</a>     <span class="keywordtype">void</span> lock_read() {internal_acquire_reader();}
 <a name="l00195"></a>00195 
 <a name="l00197"></a>00197 
-<a name="l00198"></a><a class="code" href="a00288.html#b8667415869013f840d976aa406d385a">00198</a>     <span class="keywordtype">bool</span> try_lock_read() {<span class="keywordflow">return</span> internal_try_acquire_reader();}
+<a name="l00198"></a><a class="code" href="a00307.html#b8667415869013f840d976aa406d385a">00198</a>     <span class="keywordtype">bool</span> try_lock_read() {<span class="keywordflow">return</span> internal_try_acquire_reader();}
 <a name="l00199"></a>00199 
 <a name="l00200"></a>00200 <span class="keyword">private</span>:
 <a name="l00201"></a>00201     <span class="keyword">typedef</span> intptr_t state_t;
diff --git a/doc/html/a00567.html b/doc/html/a00567.html
index d15aefb..50cc5ff 100644
--- a/doc/html/a00567.html
+++ b/doc/html/a00567.html
@@ -57,7 +57,7 @@
 <a name="l00036"></a>00036 <span class="preprocessor"></span><span class="keyword">class </span>task_group_context;
 <a name="l00037"></a>00037 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
 <a name="l00038"></a>00038 
-<a name="l00039"></a>00039 <span class="comment">// MSVC does not allow taking the address of a member that was defined </span>
+<a name="l00039"></a>00039 <span class="comment">// MSVC does not allow taking the address of a member that was defined</span>
 <a name="l00040"></a>00040 <span class="comment">// privately in task_base and made public in class task via a using declaration.</span>
 <a name="l00041"></a>00041 <span class="preprocessor">#if _MSC_VER || (__GNUC__==3 && __GNUC_MINOR__<3)</span>
 <a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TASK_BASE_ACCESS public</span>
@@ -81,22 +81,22 @@
 <a name="l00061"></a>00061 <span class="keyword">namespace </span>interface5 {
 <a name="l00062"></a>00062     <span class="keyword">namespace </span>internal {
 <a name="l00064"></a>00064 
-<a name="l00069"></a><a class="code" href="a00292.html">00069</a>         <span class="keyword">class </span><a class="code" href="a00292.html">task_base</a>: tbb::internal::no_copy {
+<a name="l00069"></a><a class="code" href="a00312.html">00069</a>         <span class="keyword">class </span><a class="code" href="a00312.html">task_base</a>: tbb::internal::no_copy {
 <a name="l00070"></a>00070         __TBB_TASK_BASE_ACCESS:
-<a name="l00071"></a>00071             <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00291.html">tbb::task</a>;
+<a name="l00071"></a>00071             <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00311.html">tbb::task</a>;
 <a name="l00072"></a>00072 
-<a name="l00074"></a>00074             <span class="keyword">static</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00291.html">task</a>& t );
-<a name="l00075"></a>00075  
-<a name="l00077"></a>00077             <span class="keyword">static</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00294.html">task_list</a>& list );
+<a name="l00074"></a>00074             <span class="keyword">static</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00311.html">task</a>& t );
+<a name="l00075"></a>00075 
+<a name="l00077"></a>00077             <span class="keyword">static</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00315.html">task_list</a>& list );
 <a name="l00078"></a>00078 
 <a name="l00080"></a>00080 
-<a name="l00082"></a>00082             <span class="keyword">static</span> tbb::internal::allocate_additional_child_of_proxy allocate_additional_child_of( <a class="code" href="a00291.html">task</a>& t ) {
+<a name="l00082"></a>00082             <span class="keyword">static</span> tbb::internal::allocate_additional_child_of_proxy allocate_additional_child_of( <a class="code" href="a00311.html">task</a>& t ) {
 <a name="l00083"></a>00083                 <span class="keywordflow">return</span> tbb::internal::allocate_additional_child_of_proxy(t);
 <a name="l00084"></a>00084             }
 <a name="l00085"></a>00085 
 <a name="l00087"></a>00087 
-<a name="l00091"></a>00091             <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>( <a class="code" href="a00291.html">task</a>& victim );
-<a name="l00092"></a>00092         }; 
+<a name="l00091"></a>00091             <span class="keyword">static</span> <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">destroy</a>( <a class="code" href="a00311.html">task</a>& victim );
+<a name="l00092"></a>00092         };
 <a name="l00093"></a>00093     } <span class="comment">// internal</span>
 <a name="l00094"></a>00094 } <span class="comment">// interface5</span>
 <a name="l00095"></a>00095 
@@ -104,16 +104,16 @@
 <a name="l00098"></a>00098 
 <a name="l00099"></a>00099     <span class="keyword">class </span>scheduler: no_copy {
 <a name="l00100"></a>00100     <span class="keyword">public</span>:
-<a name="l00102"></a>00102         <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00291.html">task</a>& first, <a class="code" href="a00291.html">task</a>*& next ) = 0;
+<a name="l00102"></a>00102         <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn( <a class="code" href="a00311.html">task</a>& first, <a class="code" href="a00311.html">task</a>*& next ) = 0;
 <a name="l00103"></a>00103 
-<a name="l00105"></a>00105         <span class="keyword">virtual</span> <span class="keywordtype">void</span> wait_for_all( <a class="code" href="a00291.html">task</a>& parent, <a class="code" href="a00291.html">task</a>* child ) = 0;
+<a name="l00105"></a>00105         <span class="keyword">virtual</span> <span class="keywordtype">void</span> wait_for_all( <a class="code" href="a00311.html">task</a>& parent, <a class="code" href="a00311.html">task</a>* child ) = 0;
 <a name="l00106"></a>00106 
-<a name="l00108"></a>00108         <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00291.html">task</a>& first, <a class="code" href="a00291.html">task</a>*& next ) = 0;
+<a name="l00108"></a>00108         <span class="keyword">virtual</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00311.html">task</a>& first, <a class="code" href="a00311.html">task</a>*& next ) = 0;
 <a name="l00109"></a>00109 
 <a name="l00111"></a>00111         <span class="comment">//  Have to have it just to shut up overzealous compilation warnings</span>
 <a name="l00112"></a>00112         <span class="keyword">virtual</span> ~scheduler() = 0;
 <a name="l00113"></a>00113 
-<a name="l00115"></a>00115         <span class="keyword">virtual</span> <span class="keywordtype">void</span> enqueue( <a class="code" href="a00291.html">task</a>& t, <span class="keywordtype">void</span>* reserved ) = 0;
+<a name="l00115"></a>00115         <span class="keyword">virtual</span> <span class="keywordtype">void</span> enqueue( <a class="code" href="a00311.html">task</a>& t, <span class="keywordtype">void</span>* reserved ) = 0;
 <a name="l00116"></a>00116     };
 <a name="l00117"></a>00117 
 <a name="l00119"></a>00119 
@@ -157,564 +157,571 @@
 <a name="l00158"></a>00158     };
 <a name="l00159"></a>00159 
 <a name="l00161"></a>00161 
-<a name="l00166"></a>00166     <span class="keyword">class </span>task_prefix {
-<a name="l00167"></a>00167     <span class="keyword">private</span>:
-<a name="l00168"></a>00168         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00291.html">tbb::task</a>;
-<a name="l00169"></a>00169         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00292.html">tbb::interface5::internal::task_base</a>;
-<a name="l00170"></a>00170         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00294.html">tbb::task_list</a>;
-<a name="l00171"></a>00171         <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
-<a name="l00172"></a>00172         <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
-<a name="l00173"></a>00173         <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
-<a name="l00174"></a>00174         <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
-<a name="l00175"></a>00175         <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
-<a name="l00176"></a>00176 
-<a name="l00177"></a>00177 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00179"></a>00179 <span class="preprocessor"></span>
-<a name="l00182"></a>00182 <span class="preprocessor">        task_group_context  *context;</span>
-<a name="l00183"></a>00183 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00184"></a>00184         
-<a name="l00186"></a>00186 
-<a name="l00191"></a>00191         scheduler* origin;
+<a name="l00172"></a>00172     <span class="keyword">class </span>task_prefix {
+<a name="l00173"></a>00173     <span class="keyword">private</span>:
+<a name="l00174"></a>00174         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00311.html">tbb::task</a>;
+<a name="l00175"></a>00175         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00312.html">tbb::interface5::internal::task_base</a>;
+<a name="l00176"></a>00176         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00315.html">tbb::task_list</a>;
+<a name="l00177"></a>00177         <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
+<a name="l00178"></a>00178         <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
+<a name="l00179"></a>00179         <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
+<a name="l00180"></a>00180         <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
+<a name="l00181"></a>00181         <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
+<a name="l00182"></a>00182 
+<a name="l00183"></a>00183 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00185"></a>00185 <span class="preprocessor"></span>
+<a name="l00188"></a>00188 <span class="preprocessor">        task_group_context  *context;</span>
+<a name="l00189"></a>00189 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00190"></a>00190 
 <a name="l00192"></a>00192 
-<a name="l00193"></a>00193 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00194"></a>00194 <span class="preprocessor"></span>        <span class="keyword">union </span>{
-<a name="l00195"></a>00195 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00197"></a>00197 
-<a name="l00199"></a>00199         scheduler* owner;
-<a name="l00200"></a>00200 
-<a name="l00201"></a>00201 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00203"></a>00203 <span class="preprocessor"></span>
-<a name="l00204"></a>00204 <span class="preprocessor">        task* next_offloaded;</span>
-<a name="l00205"></a>00205 <span class="preprocessor"></span>        };
-<a name="l00206"></a>00206 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00207"></a>00207 
-<a name="l00209"></a>00209 
-<a name="l00212"></a>00212         <a class="code" href="a00291.html">tbb::task</a>* parent;
+<a name="l00197"></a>00197         scheduler* origin;
+<a name="l00198"></a>00198 
+<a name="l00199"></a>00199 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00200"></a>00200 <span class="preprocessor"></span>        <span class="keyword">union </span>{
+<a name="l00201"></a>00201 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
+<a name="l00203"></a>00203 
+<a name="l00205"></a>00205         scheduler* owner;
+<a name="l00206"></a>00206 
+<a name="l00207"></a>00207 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00209"></a>00209 <span class="preprocessor"></span>
+<a name="l00210"></a>00210 <span class="preprocessor">        task* next_offloaded;</span>
+<a name="l00211"></a>00211 <span class="preprocessor"></span>        };
+<a name="l00212"></a>00212 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
 <a name="l00213"></a>00213 
 <a name="l00215"></a>00215 
-<a name="l00219"></a>00219         reference_count ref_count;
-<a name="l00220"></a>00220 
-<a name="l00222"></a>00222 
-<a name="l00224"></a>00224         <span class="keywordtype">int</span> depth;
-<a name="l00225"></a>00225 
-<a name="l00227"></a>00227 
-<a name="l00228"></a>00228         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state;
-<a name="l00229"></a>00229 
+<a name="l00218"></a>00218         <a class="code" href="a00311.html">tbb::task</a>* parent;
+<a name="l00219"></a>00219 
+<a name="l00221"></a>00221 
+<a name="l00225"></a>00225         __TBB_atomic reference_count ref_count;
+<a name="l00226"></a>00226 
+<a name="l00228"></a>00228 
+<a name="l00230"></a>00230         <span class="keywordtype">int</span> depth;
 <a name="l00231"></a>00231 
-<a name="l00236"></a>00236         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> extra_state;
+<a name="l00233"></a>00233 
+<a name="l00234"></a>00234         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> state;
+<a name="l00235"></a>00235 
 <a name="l00237"></a>00237 
-<a name="l00238"></a>00238         affinity_id affinity;
-<a name="l00239"></a>00239 
-<a name="l00241"></a>00241         <a class="code" href="a00291.html">tbb::task</a>* next;
-<a name="l00242"></a>00242 
-<a name="l00244"></a>00244         <a class="code" href="a00291.html">tbb::task</a>& task() {<span class="keywordflow">return</span> *reinterpret_cast<tbb::task*>(<span class="keyword">this</span>+1);}
-<a name="l00245"></a>00245     };
-<a name="l00246"></a>00246 
-<a name="l00247"></a>00247 } <span class="comment">// namespace internal</span>
-<a name="l00249"></a>00249 <span class="comment"></span>
-<a name="l00250"></a>00250 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00251"></a>00251 <span class="preprocessor"></span>
-<a name="l00252"></a>00252 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00253"></a>00253 <span class="preprocessor"></span><span class="keyword">namespace </span>internal {
-<a name="l00254"></a>00254     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> priority_stride_v4 = INT_MAX / 4;
-<a name="l00255"></a>00255 }
-<a name="l00256"></a>00256 
-<a name="l00257"></a>00257 <span class="keyword">enum</span> priority_t {
-<a name="l00258"></a>00258     priority_normal = internal::priority_stride_v4 * 2,
-<a name="l00259"></a>00259     priority_low = priority_normal - internal::priority_stride_v4,
-<a name="l00260"></a>00260     priority_high = priority_normal + internal::priority_stride_v4
-<a name="l00261"></a>00261 };
+<a name="l00242"></a>00242         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> extra_state;
+<a name="l00243"></a>00243 
+<a name="l00244"></a>00244         affinity_id affinity;
+<a name="l00245"></a>00245 
+<a name="l00247"></a>00247         <a class="code" href="a00311.html">tbb::task</a>* next;
+<a name="l00248"></a>00248 
+<a name="l00250"></a>00250         <a class="code" href="a00311.html">tbb::task</a>& task() {<span class="keywordflow">return</span> *reinterpret_cast<tbb::task*>(<span class="keyword">this</span>+1);}
+<a name="l00251"></a>00251     };
+<a name="l00252"></a>00252 
+<a name="l00253"></a>00253 } <span class="comment">// namespace internal</span>
+<a name="l00255"></a>00255 <span class="comment"></span>
+<a name="l00256"></a>00256 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00257"></a>00257 <span class="preprocessor"></span>
+<a name="l00258"></a>00258 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00259"></a>00259 <span class="preprocessor"></span><span class="keyword">namespace </span>internal {
+<a name="l00260"></a>00260     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> priority_stride_v4 = INT_MAX / 4;
+<a name="l00261"></a>00261 }
 <a name="l00262"></a>00262 
-<a name="l00263"></a>00263 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00264"></a>00264 
-<a name="l00265"></a>00265 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00266"></a>00266 <span class="preprocessor"></span>    <span class="keyword">class </span>tbb_exception;
-<a name="l00267"></a>00267 <span class="preprocessor">#else</span>
-<a name="l00268"></a>00268 <span class="preprocessor"></span>    <span class="keyword">namespace </span>internal {
-<a name="l00269"></a>00269         <span class="keyword">class </span>tbb_exception_ptr;
-<a name="l00270"></a>00270     }
-<a name="l00271"></a>00271 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00272"></a>00272 
-<a name="l00273"></a>00273 <span class="keyword">class </span>task_scheduler_init;
-<a name="l00274"></a>00274 
-<a name="l00276"></a>00276 
-<a name="l00296"></a><a class="code" href="a00293.html">00296</a> <span class="keyword">class </span><a class="code" href="a00293.html">task_group_context</a> : internal::no_copy {
-<a name="l00297"></a>00297 <span class="keyword">private</span>:
-<a name="l00298"></a>00298     <span class="keyword">friend</span> <span class="keyword">class </span>internal::generic_scheduler;
-<a name="l00299"></a>00299     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00295.html">task_scheduler_init</a>;
-<a name="l00300"></a>00300 
-<a name="l00301"></a>00301 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00302"></a>00302 <span class="preprocessor"></span>    <span class="keyword">typedef</span> <a class="code" href="a00298.html">tbb_exception</a> <a class="code" href="a00298.html">exception_container_type</a>;
-<a name="l00303"></a>00303 <span class="preprocessor">#else</span>
-<a name="l00304"></a>00304 <span class="preprocessor"></span>    <span class="keyword">typedef</span> <a class="code" href="a00299.html">internal::tbb_exception_ptr</a> <a class="code" href="a00298.html">exception_container_type</a>;
-<a name="l00305"></a>00305 <span class="preprocessor">#endif</span>
-<a name="l00306"></a>00306 <span class="preprocessor"></span>
-<a name="l00307"></a>00307     <span class="keyword">enum</span> version_traits_word_layout {
-<a name="l00308"></a>00308         traits_offset = 16,
-<a name="l00309"></a>00309         version_mask = 0xFFFF,
-<a name="l00310"></a>00310         traits_mask = 0xFFFFul << traits_offset
-<a name="l00311"></a>00311     };
-<a name="l00312"></a>00312 
-<a name="l00313"></a>00313 <span class="keyword">public</span>:
-<a name="l00314"></a>00314     <span class="keyword">enum</span> kind_type {
-<a name="l00315"></a>00315         isolated,
-<a name="l00316"></a>00316         bound
+<a name="l00263"></a>00263 <span class="keyword">enum</span> priority_t {
+<a name="l00264"></a>00264     priority_normal = internal::priority_stride_v4 * 2,
+<a name="l00265"></a>00265     priority_low = priority_normal - internal::priority_stride_v4,
+<a name="l00266"></a>00266     priority_high = priority_normal + internal::priority_stride_v4
+<a name="l00267"></a>00267 };
+<a name="l00268"></a>00268 
+<a name="l00269"></a>00269 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
+<a name="l00270"></a>00270 
+<a name="l00271"></a>00271 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00272"></a>00272 <span class="preprocessor"></span>    <span class="keyword">class </span>tbb_exception;
+<a name="l00273"></a>00273 <span class="preprocessor">#else</span>
+<a name="l00274"></a>00274 <span class="preprocessor"></span>    <span class="keyword">namespace </span>internal {
+<a name="l00275"></a>00275         <span class="keyword">class </span>tbb_exception_ptr;
+<a name="l00276"></a>00276     }
+<a name="l00277"></a>00277 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00278"></a>00278 
+<a name="l00279"></a>00279 <span class="keyword">class </span>task_scheduler_init;
+<a name="l00280"></a>00280 
+<a name="l00282"></a>00282 
+<a name="l00302"></a><a class="code" href="a00313.html">00302</a> <span class="keyword">class </span><a class="code" href="a00314.html">task_group_context</a> : internal::no_copy {
+<a name="l00303"></a>00303 <span class="keyword">private</span>:
+<a name="l00304"></a>00304     <span class="keyword">friend</span> <span class="keyword">class </span>internal::generic_scheduler;
+<a name="l00305"></a>00305     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00316.html">task_scheduler_init</a>;
+<a name="l00306"></a>00306 
+<a name="l00307"></a>00307 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00308"></a>00308 <span class="preprocessor"></span>    <span class="keyword">typedef</span> <a class="code" href="a00319.html">tbb_exception</a> <a class="code" href="a00319.html">exception_container_type</a>;
+<a name="l00309"></a>00309 <span class="preprocessor">#else</span>
+<a name="l00310"></a>00310 <span class="preprocessor"></span>    <span class="keyword">typedef</span> <a class="code" href="a00320.html">internal::tbb_exception_ptr</a> <a class="code" href="a00319.html">exception_container_type</a>;
+<a name="l00311"></a>00311 <span class="preprocessor">#endif</span>
+<a name="l00312"></a>00312 <span class="preprocessor"></span>
+<a name="l00313"></a>00313     <span class="keyword">enum</span> version_traits_word_layout {
+<a name="l00314"></a>00314         traits_offset = 16,
+<a name="l00315"></a>00315         version_mask = 0xFFFF,
+<a name="l00316"></a>00316         traits_mask = 0xFFFFul << traits_offset
 <a name="l00317"></a>00317     };
 <a name="l00318"></a>00318 
-<a name="l00319"></a>00319     <span class="keyword">enum</span> traits_type {
-<a name="l00320"></a>00320         exact_exception = 0x0001ul << traits_offset,
-<a name="l00321"></a>00321         concurrent_wait = 0x0004ul << traits_offset,
-<a name="l00322"></a>00322 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00323"></a>00323 <span class="preprocessor"></span>        default_traits = 0
-<a name="l00324"></a>00324 <span class="preprocessor">#else</span>
-<a name="l00325"></a>00325 <span class="preprocessor"></span>        default_traits = exact_exception
-<a name="l00326"></a>00326 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00327"></a>00327     };
-<a name="l00328"></a>00328 
-<a name="l00329"></a>00329 <span class="keyword">private</span>:
-<a name="l00330"></a>00330     <span class="keyword">enum</span> state {
-<a name="l00331"></a>00331         may_have_children = 1
-<a name="l00332"></a>00332     };
-<a name="l00333"></a>00333 
-<a name="l00334"></a>00334     <span class="keyword">union </span>{
-<a name="l00336"></a>00336         kind_type my_kind;
-<a name="l00337"></a>00337         uintptr_t _my_kind_aligner;
+<a name="l00319"></a>00319 <span class="keyword">public</span>:
+<a name="l00320"></a>00320     <span class="keyword">enum</span> kind_type {
+<a name="l00321"></a>00321         isolated,
+<a name="l00322"></a>00322         bound
+<a name="l00323"></a>00323     };
+<a name="l00324"></a>00324 
+<a name="l00325"></a>00325     <span class="keyword">enum</span> traits_type {
+<a name="l00326"></a>00326         exact_exception = 0x0001ul << traits_offset,
+<a name="l00327"></a>00327         concurrent_wait = 0x0004ul << traits_offset,
+<a name="l00328"></a>00328 <span class="preprocessor">#if TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00329"></a>00329 <span class="preprocessor"></span>        default_traits = 0
+<a name="l00330"></a>00330 <span class="preprocessor">#else</span>
+<a name="l00331"></a>00331 <span class="preprocessor"></span>        default_traits = exact_exception
+<a name="l00332"></a>00332 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00333"></a>00333     };
+<a name="l00334"></a>00334 
+<a name="l00335"></a>00335 <span class="keyword">private</span>:
+<a name="l00336"></a>00336     <span class="keyword">enum</span> state {
+<a name="l00337"></a>00337         may_have_children = 1
 <a name="l00338"></a>00338     };
 <a name="l00339"></a>00339 
-<a name="l00341"></a>00341     <a class="code" href="a00293.html">task_group_context</a> *my_parent;
-<a name="l00342"></a>00342 
-<a name="l00344"></a>00344 
-<a name="l00346"></a>00346     internal::context_list_node_t my_node;
-<a name="l00347"></a>00347 
-<a name="l00349"></a>00349     __itt_caller itt_caller;
+<a name="l00340"></a>00340     <span class="keyword">union </span>{
+<a name="l00342"></a>00342         kind_type my_kind;
+<a name="l00343"></a>00343         uintptr_t _my_kind_aligner;
+<a name="l00344"></a>00344     };
+<a name="l00345"></a>00345 
+<a name="l00347"></a>00347     <a class="code" href="a00314.html">task_group_context</a> *my_parent;
+<a name="l00348"></a>00348 
 <a name="l00350"></a>00350 
-<a name="l00352"></a>00352 
-<a name="l00355"></a>00355     <span class="keywordtype">char</span> _leading_padding[internal::NFS_MaxLineSize
-<a name="l00356"></a>00356                           - 2 * <span class="keyword">sizeof</span>(uintptr_t)- <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*) - <span class="keyword">sizeof</span>(internal::context_list_node_t)
-<a name="l00357"></a>00357                           - <span class="keyword">sizeof</span>(__itt_caller)];
-<a name="l00358"></a>00358     
-<a name="l00360"></a>00360     uintptr_t my_cancellation_requested;
-<a name="l00361"></a>00361     
-<a name="l00363"></a>00363 
-<a name="l00366"></a>00366     uintptr_t  my_version_and_traits;
+<a name="l00352"></a>00352     internal::context_list_node_t my_node;
+<a name="l00353"></a>00353 
+<a name="l00355"></a>00355     __itt_caller itt_caller;
+<a name="l00356"></a>00356 
+<a name="l00358"></a>00358 
+<a name="l00361"></a>00361     <span class="keywordtype">char</span> _leading_padding[internal::NFS_MaxLineSize
+<a name="l00362"></a>00362                           - 2 * <span class="keyword">sizeof</span>(uintptr_t)- <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*) - <span class="keyword">sizeof</span>(internal::context_list_node_t)
+<a name="l00363"></a>00363                           - <span class="keyword">sizeof</span>(__itt_caller)];
+<a name="l00364"></a>00364 
+<a name="l00366"></a>00366     uintptr_t my_cancellation_requested;
 <a name="l00367"></a>00367 
-<a name="l00369"></a>00369     <a class="code" href="a00298.html">exception_container_type</a> *my_exception;
-<a name="l00370"></a>00370 
-<a name="l00372"></a>00372     internal::generic_scheduler *my_owner;
+<a name="l00369"></a>00369 
+<a name="l00372"></a>00372     uintptr_t  my_version_and_traits;
 <a name="l00373"></a>00373 
-<a name="l00375"></a>00375     uintptr_t my_state;
+<a name="l00375"></a>00375     <a class="code" href="a00319.html">exception_container_type</a> *my_exception;
 <a name="l00376"></a>00376 
-<a name="l00377"></a>00377 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00379"></a>00379 <span class="preprocessor">    intptr_t my_priority;</span>
-<a name="l00380"></a>00380 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00381"></a>00381 
-<a name="l00383"></a>00383 
-<a name="l00384"></a>00384     <span class="keywordtype">char</span> _trailing_padding[internal::NFS_MaxLineSize - 2 * <span class="keyword">sizeof</span>(uintptr_t) - 2 * <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)
-<a name="l00385"></a>00385 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00386"></a>00386 <span class="preprocessor"></span>                            - <span class="keyword">sizeof</span>(intptr_t)
-<a name="l00387"></a>00387 #endif <span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00388"></a>00388                           ];
+<a name="l00378"></a>00378     internal::generic_scheduler *my_owner;
+<a name="l00379"></a>00379 
+<a name="l00381"></a>00381     uintptr_t my_state;
+<a name="l00382"></a>00382 
+<a name="l00383"></a>00383 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00385"></a>00385 <span class="preprocessor">    intptr_t my_priority;</span>
+<a name="l00386"></a>00386 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
+<a name="l00387"></a>00387 
 <a name="l00389"></a>00389 
-<a name="l00390"></a>00390 <span class="keyword">public</span>:
-<a name="l00392"></a>00392 
-<a name="l00420"></a><a class="code" href="a00293.html#19fee08fb8ac98adccfe69c1aa63c491">00420</a>     <a class="code" href="a00293.html">task_group_context</a> ( kind_type relation_with_parent = bound,
-<a name="l00421"></a>00421                          uintptr_t traits = default_traits )
-<a name="l00422"></a>00422         : my_kind(relation_with_parent)
-<a name="l00423"></a>00423         , my_version_and_traits(1 | traits)
-<a name="l00424"></a>00424     {
-<a name="l00425"></a>00425         init();
-<a name="l00426"></a>00426     }
-<a name="l00427"></a>00427 
-<a name="l00428"></a>00428     __TBB_EXPORTED_METHOD ~<a class="code" href="a00293.html">task_group_context</a> ();
-<a name="l00429"></a>00429 
-<a name="l00431"></a>00431 
-<a name="l00438"></a>00438     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD reset ();
-<a name="l00439"></a>00439 
-<a name="l00441"></a>00441 
-<a name="l00448"></a>00448     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD cancel_group_execution ();
-<a name="l00449"></a>00449 
-<a name="l00451"></a>00451     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD is_group_execution_cancelled () <span class="keyword">const</span>;
-<a name="l00452"></a>00452 
-<a name="l00454"></a>00454 
-<a name="l00460"></a>00460     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD register_pending_exception ();
-<a name="l00461"></a>00461 
-<a name="l00462"></a>00462 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00464"></a>00464 <span class="preprocessor">    void set_priority ( priority_t );</span>
-<a name="l00465"></a>00465 <span class="preprocessor"></span>
-<a name="l00467"></a>00467     priority_t priority () <span class="keyword">const</span>;
-<a name="l00468"></a>00468 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00469"></a>00469 
-<a name="l00470"></a>00470 <span class="keyword">protected</span>:
-<a name="l00472"></a>00472 
-<a name="l00473"></a>00473     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD init ();
-<a name="l00474"></a>00474 
-<a name="l00475"></a>00475 <span class="keyword">private</span>:
-<a name="l00476"></a>00476     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00291.html">task</a>;
-<a name="l00477"></a>00477     <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
+<a name="l00390"></a>00390     <span class="keywordtype">char</span> _trailing_padding[internal::NFS_MaxLineSize - 2 * <span class="keyword">sizeof</span>(uintptr_t) - 2 * <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*)
+<a name="l00391"></a>00391 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00392"></a>00392 <span class="preprocessor"></span>                            - <span class="keyword">sizeof</span>(intptr_t)
+<a name="l00393"></a>00393 #endif <span class="comment">/* __TBB_TASK_PRIORITY */</span>
+<a name="l00394"></a>00394                           ];
+<a name="l00395"></a>00395 
+<a name="l00396"></a>00396 <span class="keyword">public</span>:
+<a name="l00398"></a>00398 
+<a name="l00426"></a><a class="code" href="a00313.html#19fee08fb8ac98adccfe69c1aa63c491">00426</a>     <a class="code" href="a00314.html">task_group_context</a> ( kind_type relation_with_parent = bound,
+<a name="l00427"></a>00427                          uintptr_t traits = default_traits )
+<a name="l00428"></a>00428         : my_kind(relation_with_parent)
+<a name="l00429"></a>00429         , my_version_and_traits(1 | traits)
+<a name="l00430"></a>00430     {
+<a name="l00431"></a>00431         init();
+<a name="l00432"></a>00432     }
+<a name="l00433"></a>00433 
+<a name="l00434"></a>00434     __TBB_EXPORTED_METHOD ~<a class="code" href="a00314.html">task_group_context</a> ();
+<a name="l00435"></a>00435 
+<a name="l00437"></a>00437 
+<a name="l00444"></a>00444     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD reset ();
+<a name="l00445"></a>00445 
+<a name="l00447"></a>00447 
+<a name="l00454"></a>00454     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD cancel_group_execution ();
+<a name="l00455"></a>00455 
+<a name="l00457"></a>00457     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD is_group_execution_cancelled () <span class="keyword">const</span>;
+<a name="l00458"></a>00458 
+<a name="l00460"></a>00460 
+<a name="l00466"></a>00466     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD register_pending_exception ();
+<a name="l00467"></a>00467 
+<a name="l00468"></a>00468 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00470"></a>00470 <span class="preprocessor">    void set_priority ( priority_t );</span>
+<a name="l00471"></a>00471 <span class="preprocessor"></span>
+<a name="l00473"></a>00473     priority_t priority () <span class="keyword">const</span>;
+<a name="l00474"></a>00474 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
+<a name="l00475"></a>00475 
+<a name="l00476"></a>00476 <span class="keyword">protected</span>:
 <a name="l00478"></a>00478 
-<a name="l00479"></a>00479     <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_required = bound;
-<a name="l00480"></a>00480     <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_completed = kind_type(bound+1);
-<a name="l00481"></a>00481     <span class="keyword">static</span> <span class="keyword">const</span> kind_type detached = kind_type(binding_completed+1);
-<a name="l00482"></a>00482     <span class="keyword">static</span> <span class="keyword">const</span> kind_type dying = kind_type(detached+1);
-<a name="l00483"></a>00483 
-<a name="l00485"></a>00485 
-<a name="l00487"></a>00487     <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00488"></a>00488     <span class="keywordtype">void</span> propagate_state_from_ancestors ( T <a class="code" href="a00293.html">task_group_context</a>::*mptr_state, T new_state );
+<a name="l00479"></a>00479     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD init ();
+<a name="l00480"></a>00480 
+<a name="l00481"></a>00481 <span class="keyword">private</span>:
+<a name="l00482"></a>00482     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00311.html">task</a>;
+<a name="l00483"></a>00483     <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
+<a name="l00484"></a>00484 
+<a name="l00485"></a>00485     <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_required = bound;
+<a name="l00486"></a>00486     <span class="keyword">static</span> <span class="keyword">const</span> kind_type binding_completed = kind_type(bound+1);
+<a name="l00487"></a>00487     <span class="keyword">static</span> <span class="keyword">const</span> kind_type detached = kind_type(binding_completed+1);
+<a name="l00488"></a>00488     <span class="keyword">static</span> <span class="keyword">const</span> kind_type dying = kind_type(detached+1);
 <a name="l00489"></a>00489 
-<a name="l00491"></a>00491     <span class="keyword">inline</span> <span class="keywordtype">void</span> finish_initialization ( internal::generic_scheduler *local_sched );
-<a name="l00492"></a>00492 
-<a name="l00494"></a>00494     <span class="keywordtype">void</span> bind_to ( internal::generic_scheduler *local_sched );
+<a name="l00491"></a>00491 
+<a name="l00493"></a>00493     <span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00494"></a>00494     <span class="keywordtype">void</span> propagate_state_from_ancestors ( T <a class="code" href="a00314.html">task_group_context</a>::*mptr_state, T new_state );
 <a name="l00495"></a>00495 
-<a name="l00497"></a>00497     <span class="keywordtype">void</span> register_with ( internal::generic_scheduler *local_sched );
+<a name="l00497"></a>00497     <span class="keyword">inline</span> <span class="keywordtype">void</span> finish_initialization ( internal::generic_scheduler *local_sched );
 <a name="l00498"></a>00498 
-<a name="l00499"></a>00499 }; <span class="comment">// class task_group_context</span>
-<a name="l00500"></a>00500 
-<a name="l00501"></a>00501 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00502"></a>00502 
+<a name="l00500"></a>00500     <span class="keywordtype">void</span> bind_to ( internal::generic_scheduler *local_sched );
+<a name="l00501"></a>00501 
+<a name="l00503"></a>00503     <span class="keywordtype">void</span> register_with ( internal::generic_scheduler *local_sched );
 <a name="l00504"></a>00504 
-<a name="l00505"></a><a class="code" href="a00291.html">00505</a> <span class="keyword">class </span><a class="code" href="a00291.html">task</a>: __TBB_TASK_BASE_ACCESS interface5::internal::task_base {
+<a name="l00505"></a>00505 }; <span class="comment">// class task_group_context</span>
 <a name="l00506"></a>00506 
-<a name="l00508"></a>00508     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_set_ref_count( <span class="keywordtype">int</span> count );
-<a name="l00509"></a>00509 
-<a name="l00511"></a>00511     internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count();
+<a name="l00507"></a>00507 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00508"></a>00508 
+<a name="l00510"></a>00510 
+<a name="l00511"></a><a class="code" href="a00311.html">00511</a> <span class="keyword">class </span><a class="code" href="a00311.html">task</a>: __TBB_TASK_BASE_ACCESS interface5::internal::task_base {
 <a name="l00512"></a>00512 
-<a name="l00513"></a>00513 <span class="keyword">protected</span>:
-<a name="l00515"></a><a class="code" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">00515</a>     <a class="code" href="a00291.html">task</a>() {prefix().extra_state=1;}
-<a name="l00516"></a>00516 
-<a name="l00517"></a>00517 <span class="keyword">public</span>:
-<a name="l00519"></a><a class="code" href="a00291.html#98245ee0473f84cb19dbbf8c81134908">00519</a>     <span class="keyword">virtual</span> ~<a class="code" href="a00291.html">task</a>() {}
-<a name="l00520"></a>00520 
-<a name="l00522"></a>00522     <span class="keyword">virtual</span> <a class="code" href="a00291.html">task</a>* execute() = 0;
-<a name="l00523"></a>00523 
-<a name="l00525"></a><a class="code" href="a00291.html#4a3c415562d17905390ea5b49d12293e">00525</a>     <span class="keyword">enum</span> <a class="code" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> {
-<a name="l00527"></a>00527         executing,
-<a name="l00529"></a>00529         reexecute,
-<a name="l00531"></a>00531         ready,
-<a name="l00533"></a>00533         allocated,
-<a name="l00535"></a>00535         freed,
-<a name="l00537"></a>00537         recycle 
-<a name="l00538"></a>00538     };
-<a name="l00539"></a>00539 
-<a name="l00540"></a>00540     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00541"></a>00541     <span class="comment">// Allocating tasks</span>
-<a name="l00542"></a>00542     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00543"></a>00543 
-<a name="l00545"></a><a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">00545</a>     <span class="keyword">static</span> internal::allocate_root_proxy allocate_root() {
-<a name="l00546"></a>00546         <span class="keywordflow">return</span> internal::allocate_root_proxy();
-<a name="l00547"></a>00547     }
-<a name="l00548"></a>00548 
-<a name="l00549"></a>00549 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00551"></a><a class="code" href="a00291.html#8ccc518caf31075a3e073996d2d240a4">00551</a> <span class="preprocessor">    static internal::allocate_root_with_context_proxy allocate_root( task_group_context& ctx ) {</span>
-<a name="l00552"></a>00552 <span class="preprocessor"></span>        <span class="keywordflow">return</span> internal::allocate_root_with_context_proxy(ctx);
+<a name="l00514"></a>00514     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD internal_set_ref_count( <span class="keywordtype">int</span> count );
+<a name="l00515"></a>00515 
+<a name="l00517"></a>00517     internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count();
+<a name="l00518"></a>00518 
+<a name="l00519"></a>00519 <span class="keyword">protected</span>:
+<a name="l00521"></a><a class="code" href="a00311.html#2bce8ec6e44706e70128f5cf91b76e67">00521</a>     <a class="code" href="a00311.html">task</a>() {prefix().extra_state=1;}
+<a name="l00522"></a>00522 
+<a name="l00523"></a>00523 <span class="keyword">public</span>:
+<a name="l00525"></a><a class="code" href="a00311.html#98245ee0473f84cb19dbbf8c81134908">00525</a>     <span class="keyword">virtual</span> ~<a class="code" href="a00311.html">task</a>() {}
+<a name="l00526"></a>00526 
+<a name="l00528"></a>00528     <span class="keyword">virtual</span> <a class="code" href="a00311.html">task</a>* execute() = 0;
+<a name="l00529"></a>00529 
+<a name="l00531"></a><a class="code" href="a00311.html#4a3c415562d17905390ea5b49d12293e">00531</a>     <span class="keyword">enum</span> <a class="code" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a> {
+<a name="l00533"></a>00533         executing,
+<a name="l00535"></a>00535         reexecute,
+<a name="l00537"></a>00537         ready,
+<a name="l00539"></a>00539         allocated,
+<a name="l00541"></a>00541         freed,
+<a name="l00543"></a>00543         recycle
+<a name="l00544"></a>00544     };
+<a name="l00545"></a>00545 
+<a name="l00546"></a>00546     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00547"></a>00547     <span class="comment">// Allocating tasks</span>
+<a name="l00548"></a>00548     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00549"></a>00549 
+<a name="l00551"></a><a class="code" href="a00311.html#23acb0da0afd690da797f9f882027d34">00551</a>     <span class="keyword">static</span> internal::allocate_root_proxy allocate_root() {
+<a name="l00552"></a>00552         <span class="keywordflow">return</span> internal::allocate_root_proxy();
 <a name="l00553"></a>00553     }
-<a name="l00554"></a>00554 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00555"></a>00555 
-<a name="l00557"></a>00557 
-<a name="l00558"></a><a class="code" href="a00291.html#1434c79a5138993269d034008bff7329">00558</a>     internal::allocate_continuation_proxy& allocate_continuation() {
-<a name="l00559"></a>00559         <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_continuation_proxy*>(<span class="keyword">this</span>);
-<a name="l00560"></a>00560     }
+<a name="l00554"></a>00554 
+<a name="l00555"></a>00555 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00557"></a><a class="code" href="a00311.html#8ccc518caf31075a3e073996d2d240a4">00557</a> <span class="preprocessor">    static internal::allocate_root_with_context_proxy allocate_root( task_group_context& ctx ) {</span>
+<a name="l00558"></a>00558 <span class="preprocessor"></span>        <span class="keywordflow">return</span> internal::allocate_root_with_context_proxy(ctx);
+<a name="l00559"></a>00559     }
+<a name="l00560"></a>00560 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
 <a name="l00561"></a>00561 
-<a name="l00563"></a><a class="code" href="a00291.html#1ff794f7053cd9148d5f280fbf07377f">00563</a>     internal::allocate_child_proxy& allocate_child() {
-<a name="l00564"></a>00564         <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_child_proxy*>(<span class="keyword">this</span>);
-<a name="l00565"></a>00565     }
-<a name="l00566"></a>00566 
-<a name="l00568"></a>00568     <span class="keyword">using</span> task_base::allocate_additional_child_of;
-<a name="l00569"></a>00569 
-<a name="l00570"></a>00570 <span class="preprocessor">#if __TBB_DEPRECATED_TASK_INTERFACE</span>
-<a name="l00572"></a>00572 <span class="preprocessor"></span>
-<a name="l00576"></a>00576 <span class="preprocessor">    void __TBB_EXPORTED_METHOD destroy( task& t );</span>
-<a name="l00577"></a>00577 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
-<a name="l00579"></a>00579     using task_base::destroy;
-<a name="l00580"></a>00580 <span class="preprocessor">#endif </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
-<a name="l00581"></a>00581 
-<a name="l00582"></a>00582     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00583"></a>00583     <span class="comment">// Recycling of tasks</span>
-<a name="l00584"></a>00584     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00585"></a>00585 
+<a name="l00563"></a>00563 
+<a name="l00564"></a><a class="code" href="a00311.html#1434c79a5138993269d034008bff7329">00564</a>     internal::allocate_continuation_proxy& allocate_continuation() {
+<a name="l00565"></a>00565         <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_continuation_proxy*>(<span class="keyword">this</span>);
+<a name="l00566"></a>00566     }
+<a name="l00567"></a>00567 
+<a name="l00569"></a><a class="code" href="a00311.html#1ff794f7053cd9148d5f280fbf07377f">00569</a>     internal::allocate_child_proxy& allocate_child() {
+<a name="l00570"></a>00570         <span class="keywordflow">return</span> *reinterpret_cast<internal::allocate_child_proxy*>(<span class="keyword">this</span>);
+<a name="l00571"></a>00571     }
+<a name="l00572"></a>00572 
+<a name="l00574"></a>00574     <span class="keyword">using</span> task_base::allocate_additional_child_of;
+<a name="l00575"></a>00575 
+<a name="l00576"></a>00576 <span class="preprocessor">#if __TBB_DEPRECATED_TASK_INTERFACE</span>
+<a name="l00578"></a>00578 <span class="preprocessor"></span>
+<a name="l00582"></a>00582 <span class="preprocessor">    void __TBB_EXPORTED_METHOD destroy( task& t );</span>
+<a name="l00583"></a>00583 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
+<a name="l00585"></a>00585     using task_base::destroy;
+<a name="l00586"></a>00586 <span class="preprocessor">#endif </span><span class="comment">/* !__TBB_DEPRECATED_TASK_INTERFACE */</span>
 <a name="l00587"></a>00587 
-<a name="l00593"></a><a class="code" href="a00291.html#a67a79e18f62b43a623a00cfbd76db4c">00593</a>     <span class="keywordtype">void</span> recycle_as_continuation() {
-<a name="l00594"></a>00594         __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
-<a name="l00595"></a>00595         prefix().state = allocated;
-<a name="l00596"></a>00596     }
-<a name="l00597"></a>00597 
-<a name="l00599"></a>00599 
-<a name="l00601"></a><a class="code" href="a00291.html#3b290d14109704e2b69dc1ac980a7a76">00601</a>     <span class="keywordtype">void</span> recycle_as_safe_continuation() {
-<a name="l00602"></a>00602         __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
-<a name="l00603"></a>00603         prefix().state = recycle;
-<a name="l00604"></a>00604     }
+<a name="l00588"></a>00588     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00589"></a>00589     <span class="comment">// Recycling of tasks</span>
+<a name="l00590"></a>00590     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00591"></a>00591 
+<a name="l00593"></a>00593 
+<a name="l00599"></a><a class="code" href="a00311.html#a67a79e18f62b43a623a00cfbd76db4c">00599</a>     <span class="keywordtype">void</span> recycle_as_continuation() {
+<a name="l00600"></a>00600         __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
+<a name="l00601"></a>00601         prefix().state = allocated;
+<a name="l00602"></a>00602     }
+<a name="l00603"></a>00603 
 <a name="l00605"></a>00605 
-<a name="l00607"></a><a class="code" href="a00291.html#db399855177438bbc9cc61d508dae8d2">00607</a>     <span class="keywordtype">void</span> recycle_as_child_of( <a class="code" href="a00291.html">task</a>& new_parent ) {
-<a name="l00608"></a>00608         internal::task_prefix& p = prefix();
-<a name="l00609"></a>00609         __TBB_ASSERT( prefix().state==executing||prefix().state==allocated, <span class="stringliteral">"execute not running, or already recycled"</span> );
-<a name="l00610"></a>00610         __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled as a child"</span> );
-<a name="l00611"></a>00611         __TBB_ASSERT( p.parent==NULL, <span class="stringliteral">"parent must be null"</span> );
-<a name="l00612"></a>00612         __TBB_ASSERT( new_parent.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state<=recycle, <span class="stringliteral">"corrupt parent's state"</span> );
-<a name="l00613"></a>00613         __TBB_ASSERT( new_parent.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state!=freed, <span class="stringliteral">"parent already freed"</span> );
-<a name="l00614"></a>00614         p.state = allocated;
-<a name="l00615"></a>00615         p.parent = &new_parent;
-<a name="l00616"></a>00616 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00617"></a>00617 <span class="preprocessor"></span>        p.<a class="code" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> = new_parent.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().context;
-<a name="l00618"></a>00618 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00619"></a>00619     }
-<a name="l00620"></a>00620 
-<a name="l00622"></a>00622 
-<a name="l00623"></a><a class="code" href="a00291.html#4f1be9bbcdb487830dbe298b68d85144">00623</a>     <span class="keywordtype">void</span> recycle_to_reexecute() {
-<a name="l00624"></a>00624         __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running, or already recycled"</span> );
-<a name="l00625"></a>00625         __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled for reexecution"</span> );
-<a name="l00626"></a>00626         prefix().state = reexecute;
-<a name="l00627"></a>00627     }
+<a name="l00607"></a><a class="code" href="a00311.html#3b290d14109704e2b69dc1ac980a7a76">00607</a>     <span class="keywordtype">void</span> recycle_as_safe_continuation() {
+<a name="l00608"></a>00608         __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running?"</span> );
+<a name="l00609"></a>00609         prefix().state = recycle;
+<a name="l00610"></a>00610     }
+<a name="l00611"></a>00611 
+<a name="l00613"></a><a class="code" href="a00311.html#db399855177438bbc9cc61d508dae8d2">00613</a>     <span class="keywordtype">void</span> recycle_as_child_of( <a class="code" href="a00311.html">task</a>& new_parent ) {
+<a name="l00614"></a>00614         internal::task_prefix& p = prefix();
+<a name="l00615"></a>00615         __TBB_ASSERT( prefix().state==executing||prefix().state==allocated, <span class="stringliteral">"execute not running, or already recycled"</span> );
+<a name="l00616"></a>00616         __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled as a child"</span> );
+<a name="l00617"></a>00617         __TBB_ASSERT( p.parent==NULL, <span class="stringliteral">"parent must be null"</span> );
+<a name="l00618"></a>00618         __TBB_ASSERT( new_parent.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state<=recycle, <span class="stringliteral">"corrupt parent's state"</span> );
+<a name="l00619"></a>00619         __TBB_ASSERT( new_parent.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().state!=freed, <span class="stringliteral">"parent already freed"</span> );
+<a name="l00620"></a>00620         p.state = allocated;
+<a name="l00621"></a>00621         p.parent = &new_parent;
+<a name="l00622"></a>00622 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00623"></a>00623 <span class="preprocessor"></span>        p.<a class="code" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">context</a> = new_parent.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().context;
+<a name="l00624"></a>00624 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00625"></a>00625     }
+<a name="l00626"></a>00626 
 <a name="l00628"></a>00628 
-<a name="l00629"></a>00629     <span class="comment">// All depth-related methods are obsolete, and are retained for the sake </span>
-<a name="l00630"></a>00630     <span class="comment">// of backward source compatibility only</span>
-<a name="l00631"></a>00631     intptr_t depth()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
-<a name="l00632"></a>00632     <span class="keywordtype">void</span> set_depth( intptr_t ) {}
-<a name="l00633"></a>00633     <span class="keywordtype">void</span> add_to_depth( <span class="keywordtype">int</span> ) {}
+<a name="l00629"></a><a class="code" href="a00311.html#4f1be9bbcdb487830dbe298b68d85144">00629</a>     <span class="keywordtype">void</span> recycle_to_reexecute() {
+<a name="l00630"></a>00630         __TBB_ASSERT( prefix().state==executing, <span class="stringliteral">"execute not running, or already recycled"</span> );
+<a name="l00631"></a>00631         __TBB_ASSERT( prefix().ref_count==0, <span class="stringliteral">"no child tasks allowed when recycled for reexecution"</span> );
+<a name="l00632"></a>00632         prefix().state = reexecute;
+<a name="l00633"></a>00633     }
 <a name="l00634"></a>00634 
-<a name="l00635"></a>00635 
-<a name="l00636"></a>00636     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00637"></a>00637     <span class="comment">// Spawning and blocking</span>
-<a name="l00638"></a>00638     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00639"></a>00639 
-<a name="l00641"></a><a class="code" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">00641</a>     <span class="keywordtype">void</span> set_ref_count( <span class="keywordtype">int</span> count ) {
-<a name="l00642"></a>00642 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00643"></a>00643 <span class="preprocessor"></span>        internal_set_ref_count(count);
-<a name="l00644"></a>00644 <span class="preprocessor">#else</span>
-<a name="l00645"></a>00645 <span class="preprocessor"></span>        prefix().ref_count = count;
-<a name="l00646"></a>00646 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00647"></a>00647     }
-<a name="l00648"></a>00648 
-<a name="l00650"></a>00650 
-<a name="l00651"></a><a class="code" href="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">00651</a>     <span class="keywordtype">void</span> increment_ref_count() {
-<a name="l00652"></a>00652         __TBB_FetchAndIncrementWacquire( &prefix().ref_count );
+<a name="l00635"></a>00635     <span class="comment">// All depth-related methods are obsolete, and are retained for the sake</span>
+<a name="l00636"></a>00636     <span class="comment">// of backward source compatibility only</span>
+<a name="l00637"></a>00637     intptr_t depth()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
+<a name="l00638"></a>00638     <span class="keywordtype">void</span> set_depth( intptr_t ) {}
+<a name="l00639"></a>00639     <span class="keywordtype">void</span> add_to_depth( <span class="keywordtype">int</span> ) {}
+<a name="l00640"></a>00640 
+<a name="l00641"></a>00641 
+<a name="l00642"></a>00642     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00643"></a>00643     <span class="comment">// Spawning and blocking</span>
+<a name="l00644"></a>00644     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00645"></a>00645 
+<a name="l00647"></a><a class="code" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">00647</a>     <span class="keywordtype">void</span> set_ref_count( <span class="keywordtype">int</span> count ) {
+<a name="l00648"></a>00648 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
+<a name="l00649"></a>00649 <span class="preprocessor"></span>        internal_set_ref_count(count);
+<a name="l00650"></a>00650 <span class="preprocessor">#else</span>
+<a name="l00651"></a>00651 <span class="preprocessor"></span>        prefix().ref_count = count;
+<a name="l00652"></a>00652 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
 <a name="l00653"></a>00653     }
 <a name="l00654"></a>00654 
 <a name="l00656"></a>00656 
-<a name="l00657"></a><a class="code" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">00657</a>     <span class="keywordtype">int</span> decrement_ref_count() {
-<a name="l00658"></a>00658 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
-<a name="l00659"></a>00659 <span class="preprocessor"></span>        <span class="keywordflow">return</span> int(internal_decrement_ref_count());
-<a name="l00660"></a>00660 <span class="preprocessor">#else</span>
-<a name="l00661"></a>00661 <span class="preprocessor"></span>        <span class="keywordflow">return</span> int(__TBB_FetchAndDecrementWrelease( &prefix().ref_count ))-1;
-<a name="l00662"></a>00662 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
-<a name="l00663"></a>00663     }
-<a name="l00664"></a>00664 
-<a name="l00666"></a>00666     <span class="keyword">using</span> task_base::spawn;
-<a name="l00667"></a>00667 
-<a name="l00669"></a><a class="code" href="a00291.html#3ce28ca9baa771cfc37ecd72e69c4f3c">00669</a>     <span class="keywordtype">void</span> spawn_and_wait_for_all( <a class="code" href="a00291.html">task</a>& child ) {
-<a name="l00670"></a>00670         prefix().owner->wait_for_all( *<span class="keyword">this</span>, &child );
-<a name="l00671"></a>00671     }
-<a name="l00672"></a>00672 
-<a name="l00674"></a>00674     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD spawn_and_wait_for_all( <a class="code" href="a00294.html">task_list</a>& list );
-<a name="l00675"></a>00675 
-<a name="l00677"></a><a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">00677</a>     <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00291.html">task</a>& root ) {
-<a name="l00678"></a>00678         root.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn_root_and_wait( root, root.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next );
-<a name="l00679"></a>00679     }
-<a name="l00680"></a>00680 
-<a name="l00682"></a>00682 
-<a name="l00684"></a>00684     <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00294.html">task_list</a>& root_list );
-<a name="l00685"></a>00685 
-<a name="l00687"></a>00687 
-<a name="l00688"></a><a class="code" href="a00291.html#53d2615ad9c38859b4c8080936600283">00688</a>     <span class="keywordtype">void</span> wait_for_all() {
-<a name="l00689"></a>00689         prefix().owner->wait_for_all( *<span class="keyword">this</span>, NULL );
-<a name="l00690"></a>00690     }
+<a name="l00657"></a><a class="code" href="a00311.html#f5fb43c7ad0de5a4b95703cebc39e345">00657</a>     <span class="keywordtype">void</span> increment_ref_count() {
+<a name="l00658"></a>00658         __TBB_FetchAndIncrementWacquire( &prefix().ref_count );
+<a name="l00659"></a>00659     }
+<a name="l00660"></a>00660 
+<a name="l00662"></a>00662 
+<a name="l00663"></a><a class="code" href="a00311.html#ef4680f5c148020c5e7e43ddef44cd5d">00663</a>     <span class="keywordtype">int</span> decrement_ref_count() {
+<a name="l00664"></a>00664 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT</span>
+<a name="l00665"></a>00665 <span class="preprocessor"></span>        <span class="keywordflow">return</span> int(internal_decrement_ref_count());
+<a name="l00666"></a>00666 <span class="preprocessor">#else</span>
+<a name="l00667"></a>00667 <span class="preprocessor"></span>        <span class="keywordflow">return</span> int(__TBB_FetchAndDecrementWrelease( &prefix().ref_count ))-1;
+<a name="l00668"></a>00668 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */</span>
+<a name="l00669"></a>00669     }
+<a name="l00670"></a>00670 
+<a name="l00672"></a>00672     <span class="keyword">using</span> task_base::spawn;
+<a name="l00673"></a>00673 
+<a name="l00675"></a><a class="code" href="a00311.html#3ce28ca9baa771cfc37ecd72e69c4f3c">00675</a>     <span class="keywordtype">void</span> spawn_and_wait_for_all( <a class="code" href="a00311.html">task</a>& child ) {
+<a name="l00676"></a>00676         prefix().owner->wait_for_all( *<span class="keyword">this</span>, &child );
+<a name="l00677"></a>00677     }
+<a name="l00678"></a>00678 
+<a name="l00680"></a>00680     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD spawn_and_wait_for_all( <a class="code" href="a00315.html">task_list</a>& list );
+<a name="l00681"></a>00681 
+<a name="l00683"></a><a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">00683</a>     <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00311.html">task</a>& root ) {
+<a name="l00684"></a>00684         root.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn_root_and_wait( root, root.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next );
+<a name="l00685"></a>00685     }
+<a name="l00686"></a>00686 
+<a name="l00688"></a>00688 
+<a name="l00690"></a>00690     <span class="keyword">static</span> <span class="keywordtype">void</span> spawn_root_and_wait( <a class="code" href="a00315.html">task_list</a>& root_list );
 <a name="l00691"></a>00691 
-<a name="l00693"></a>00693 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00694"></a>00694 <span class="preprocessor"></span>
-<a name="l00704"></a>00704 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00705"></a><a class="code" href="a00291.html#8365d063c0cc9d7bd616bca47256b93c">00705</a>     <span class="keyword">static</span> <span class="keywordtype">void</span> enqueue( <a class="code" href="a00291.html">task</a>& t ) {
-<a name="l00706"></a>00706         t.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->enqueue( t, NULL );
-<a name="l00707"></a>00707     }
-<a name="l00708"></a>00708 
-<a name="l00709"></a>00709 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00711"></a><a class="code" href="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">00711</a> <span class="preprocessor">    static void enqueue( task& t, priority_t p ) {</span>
-<a name="l00712"></a>00712 <span class="preprocessor"></span>        __TBB_ASSERT( p == priority_low || p == priority_normal || p == priority_high, <span class="stringliteral">"Invalid priority level value"</span> );
-<a name="l00713"></a>00713         t.prefix().owner->enqueue( t, (<span class="keywordtype">void</span>*)p );
-<a name="l00714"></a>00714     }
-<a name="l00715"></a>00715 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00716"></a>00716 
-<a name="l00718"></a>00718     <span class="keyword">static</span> <a class="code" href="a00291.html">task</a>& __TBB_EXPORTED_FUNC <span class="keyword">self</span>();
-<a name="l00719"></a>00719 
-<a name="l00721"></a><a class="code" href="a00291.html#314e98ee4347ccec83efcb9ee22e8596">00721</a>     <a class="code" href="a00291.html">task</a>* parent()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().parent;}
+<a name="l00693"></a>00693 
+<a name="l00694"></a><a class="code" href="a00311.html#53d2615ad9c38859b4c8080936600283">00694</a>     <span class="keywordtype">void</span> wait_for_all() {
+<a name="l00695"></a>00695         prefix().owner->wait_for_all( *<span class="keyword">this</span>, NULL );
+<a name="l00696"></a>00696     }
+<a name="l00697"></a>00697 
+<a name="l00699"></a>00699 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00700"></a>00700 <span class="preprocessor"></span>
+<a name="l00710"></a>00710 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
+<a name="l00711"></a><a class="code" href="a00311.html#8365d063c0cc9d7bd616bca47256b93c">00711</a>     <span class="keyword">static</span> <span class="keywordtype">void</span> enqueue( <a class="code" href="a00311.html">task</a>& t ) {
+<a name="l00712"></a>00712         t.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->enqueue( t, NULL );
+<a name="l00713"></a>00713     }
+<a name="l00714"></a>00714 
+<a name="l00715"></a>00715 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00717"></a><a class="code" href="a00311.html#fe6bf6aaf84e664134fabb6c4f409ea9">00717</a> <span class="preprocessor">    static void enqueue( task& t, priority_t p ) {</span>
+<a name="l00718"></a>00718 <span class="preprocessor"></span>        __TBB_ASSERT( p == priority_low || p == priority_normal || p == priority_high, <span class="stringliteral">"Invalid priority level value"</span> );
+<a name="l00719"></a>00719         t.prefix().owner->enqueue( t, (<span class="keywordtype">void</span>*)p );
+<a name="l00720"></a>00720     }
+<a name="l00721"></a>00721 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
 <a name="l00722"></a>00722 
-<a name="l00723"></a>00723 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00725"></a>00725 <span class="preprocessor"></span>
-<a name="l00726"></a><a class="code" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">00726</a> <span class="preprocessor">    task_group_context* context() {return prefix().context;}</span>
-<a name="l00727"></a>00727 <span class="preprocessor"></span>
-<a name="l00729"></a><a class="code" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">00729</a>     <a class="code" href="a00293.html">task_group_context</a>* group () { <span class="keywordflow">return</span> prefix().context; }
-<a name="l00730"></a>00730 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>   
-<a name="l00731"></a>00731 
-<a name="l00733"></a><a class="code" href="a00291.html#f9169402702f56bf519448aaf34450aa">00733</a>     <span class="keywordtype">bool</span> is_stolen_task()<span class="keyword"> const </span>{
-<a name="l00734"></a>00734         <span class="keywordflow">return</span> (prefix().extra_state & 0x80)!=0;
+<a name="l00724"></a>00724     <span class="keyword">static</span> <a class="code" href="a00311.html">task</a>& __TBB_EXPORTED_FUNC <span class="keyword">self</span>();
+<a name="l00725"></a>00725 
+<a name="l00727"></a><a class="code" href="a00311.html#314e98ee4347ccec83efcb9ee22e8596">00727</a>     <a class="code" href="a00311.html">task</a>* parent()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().parent;}
+<a name="l00728"></a>00728 
+<a name="l00730"></a><a class="code" href="a00311.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">00730</a>     <span class="keywordtype">void</span> set_parent(<a class="code" href="a00311.html">task</a>* p) {
+<a name="l00731"></a>00731 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00732"></a>00732 <span class="preprocessor"></span>        __TBB_ASSERT(prefix().context == p-><a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().context, <span class="stringliteral">"The tasks must be in the same context"</span>);
+<a name="l00733"></a>00733 <span class="preprocessor">#endif</span>
+<a name="l00734"></a>00734 <span class="preprocessor"></span>        prefix().parent = p;
 <a name="l00735"></a>00735     }
 <a name="l00736"></a>00736 
-<a name="l00737"></a>00737     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00738"></a>00738     <span class="comment">// Debugging</span>
-<a name="l00739"></a>00739     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00740"></a>00740 
-<a name="l00742"></a><a class="code" href="a00291.html#0af7b2d7e6e8b4333b2accfce3dfb374">00742</a>     <a class="code" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a> state()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="a00291.html#4a3c415562d17905390ea5b49d12293e">state_type</a>(prefix().state);}
-<a name="l00743"></a>00743 
-<a name="l00745"></a><a class="code" href="a00291.html#ad774f55eaec008ae02b236423209ced">00745</a>     <span class="keywordtype">int</span> ref_count()<span class="keyword"> const </span>{
-<a name="l00746"></a>00746 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00747"></a>00747 <span class="preprocessor"></span>        internal::reference_count ref_count_ = prefix().ref_count;
-<a name="l00748"></a>00748         __TBB_ASSERT( ref_count_==<span class="keywordtype">int</span>(ref_count_), <span class="stringliteral">"integer overflow error"</span>);
-<a name="l00749"></a>00749 <span class="preprocessor">#endif</span>
-<a name="l00750"></a>00750 <span class="preprocessor"></span>        <span class="keywordflow">return</span> int(prefix().ref_count);
-<a name="l00751"></a>00751     }
-<a name="l00752"></a>00752 
-<a name="l00754"></a>00754     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD is_owned_by_current_thread() <span class="keyword">const</span>;
-<a name="l00755"></a>00755 
-<a name="l00756"></a>00756     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00757"></a>00757     <span class="comment">// Affinity</span>
-<a name="l00758"></a>00758     <span class="comment">//------------------------------------------------------------------------</span>
-<a name="l00759"></a>00759  
-<a name="l00761"></a>00761 
-<a name="l00762"></a><a class="code" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">00762</a>     <span class="keyword">typedef</span> internal::affinity_id affinity_id;
-<a name="l00763"></a>00763 
-<a name="l00765"></a><a class="code" href="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">00765</a>     <span class="keywordtype">void</span> set_affinity( affinity_id <span class="keywordtype">id</span> ) {prefix().affinity = id;}
+<a name="l00737"></a>00737 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00739"></a>00739 <span class="preprocessor"></span>
+<a name="l00740"></a><a class="code" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">00740</a> <span class="preprocessor">    task_group_context* context() {return prefix().context;}</span>
+<a name="l00741"></a>00741 <span class="preprocessor"></span>
+<a name="l00743"></a><a class="code" href="a00311.html#5987123486afca36ddebb9e2a8b7779a">00743</a>     <a class="code" href="a00314.html">task_group_context</a>* group () { <span class="keywordflow">return</span> prefix().<a class="code" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">context</a>; }
+<a name="l00744"></a>00744 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00745"></a>00745 
+<a name="l00747"></a><a class="code" href="a00311.html#f9169402702f56bf519448aaf34450aa">00747</a>     <span class="keywordtype">bool</span> is_stolen_task()<span class="keyword"> const </span>{
+<a name="l00748"></a>00748         <span class="keywordflow">return</span> (prefix().extra_state & 0x80)!=0;
+<a name="l00749"></a>00749     }
+<a name="l00750"></a>00750 
+<a name="l00751"></a>00751     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00752"></a>00752     <span class="comment">// Debugging</span>
+<a name="l00753"></a>00753     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00754"></a>00754 
+<a name="l00756"></a><a class="code" href="a00311.html#0af7b2d7e6e8b4333b2accfce3dfb374">00756</a>     <a class="code" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a> state()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="a00311.html#4a3c415562d17905390ea5b49d12293e">state_type</a>(prefix().state);}
+<a name="l00757"></a>00757 
+<a name="l00759"></a><a class="code" href="a00311.html#ad774f55eaec008ae02b236423209ced">00759</a>     <span class="keywordtype">int</span> ref_count()<span class="keyword"> const </span>{
+<a name="l00760"></a>00760 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00761"></a>00761 <span class="preprocessor"></span>        internal::reference_count ref_count_ = prefix().ref_count;
+<a name="l00762"></a>00762         __TBB_ASSERT( ref_count_==<span class="keywordtype">int</span>(ref_count_), <span class="stringliteral">"integer overflow error"</span>);
+<a name="l00763"></a>00763 <span class="preprocessor">#endif</span>
+<a name="l00764"></a>00764 <span class="preprocessor"></span>        <span class="keywordflow">return</span> int(prefix().ref_count);
+<a name="l00765"></a>00765     }
 <a name="l00766"></a>00766 
-<a name="l00768"></a><a class="code" href="a00291.html#3a920a56b0bcf2801518fb45b2c9d2be">00768</a>     affinity_id affinity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().affinity;}
+<a name="l00768"></a>00768     <span class="keywordtype">bool</span> __TBB_EXPORTED_METHOD is_owned_by_current_thread() <span class="keyword">const</span>;
 <a name="l00769"></a>00769 
-<a name="l00771"></a>00771 
-<a name="l00775"></a>00775     <span class="keyword">virtual</span> <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD note_affinity( affinity_id <span class="keywordtype">id</span> );
-<a name="l00776"></a>00776 
-<a name="l00777"></a>00777 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00779"></a>00779 <span class="preprocessor"></span>
-<a name="l00789"></a>00789 <span class="preprocessor">    void __TBB_EXPORTED_METHOD change_group ( task_group_context& ctx );</span>
-<a name="l00790"></a>00790 <span class="preprocessor"></span>
-<a name="l00792"></a>00792 
-<a name="l00793"></a><a class="code" href="a00291.html#0f3fb4aac549ab642022450a4bd13326">00793</a>     <span class="keywordtype">bool</span> cancel_group_execution () { <span class="keywordflow">return</span> prefix().context->cancel_group_execution(); }
-<a name="l00794"></a>00794 
-<a name="l00796"></a><a class="code" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">00796</a>     <span class="keywordtype">bool</span> is_cancelled ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> prefix().context->is_group_execution_cancelled(); }
-<a name="l00797"></a>00797 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00798"></a>00798 
-<a name="l00799"></a>00799 <span class="preprocessor">#if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00801"></a><a class="code" href="a00291.html#9ac8d1542d67d9d80121ff986801ac26">00801</a> <span class="preprocessor">    void set_group_priority ( priority_t p ) {  prefix().context->set_priority(p); }</span>
-<a name="l00802"></a>00802 <span class="preprocessor"></span>
-<a name="l00804"></a><a class="code" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">00804</a>     priority_t group_priority ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> prefix().context->priority(); }
-<a name="l00805"></a>00805 
-<a name="l00806"></a>00806 <span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00807"></a>00807 
-<a name="l00808"></a>00808 <span class="keyword">private</span>:
-<a name="l00809"></a>00809     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00292.html">interface5::internal::task_base</a>;
-<a name="l00810"></a>00810     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00294.html">task_list</a>;
-<a name="l00811"></a>00811     <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
-<a name="l00812"></a>00812     <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
-<a name="l00813"></a>00813 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00814"></a>00814 <span class="preprocessor"></span>    <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
-<a name="l00815"></a>00815 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00816"></a>00816     <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
-<a name="l00817"></a>00817     <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
-<a name="l00818"></a>00818     <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
-<a name="l00819"></a>00819     
+<a name="l00770"></a>00770     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00771"></a>00771     <span class="comment">// Affinity</span>
+<a name="l00772"></a>00772     <span class="comment">//------------------------------------------------------------------------</span>
+<a name="l00773"></a>00773 
+<a name="l00775"></a>00775 
+<a name="l00776"></a><a class="code" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">00776</a>     <span class="keyword">typedef</span> internal::affinity_id affinity_id;
+<a name="l00777"></a>00777 
+<a name="l00779"></a><a class="code" href="a00311.html#dca19d7a45487a7d67a0db517e2b57c9">00779</a>     <span class="keywordtype">void</span> set_affinity( affinity_id <span class="keywordtype">id</span> ) {prefix().affinity = id;}
+<a name="l00780"></a>00780 
+<a name="l00782"></a><a class="code" href="a00311.html#3a920a56b0bcf2801518fb45b2c9d2be">00782</a>     affinity_id affinity()<span class="keyword"> const </span>{<span class="keywordflow">return</span> prefix().affinity;}
+<a name="l00783"></a>00783 
+<a name="l00785"></a>00785 
+<a name="l00789"></a>00789     <span class="keyword">virtual</span> <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD note_affinity( affinity_id <span class="keywordtype">id</span> );
+<a name="l00790"></a>00790 
+<a name="l00791"></a>00791 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00793"></a>00793 <span class="preprocessor"></span>
+<a name="l00803"></a>00803 <span class="preprocessor">    void __TBB_EXPORTED_METHOD change_group ( task_group_context& ctx );</span>
+<a name="l00804"></a>00804 <span class="preprocessor"></span>
+<a name="l00806"></a>00806 
+<a name="l00807"></a><a class="code" href="a00311.html#0f3fb4aac549ab642022450a4bd13326">00807</a>     <span class="keywordtype">bool</span> cancel_group_execution () { <span class="keywordflow">return</span> prefix().context->cancel_group_execution(); }
+<a name="l00808"></a>00808 
+<a name="l00810"></a><a class="code" href="a00311.html#025f18118c057c4c8db87ff2ce8df975">00810</a>     <span class="keywordtype">bool</span> is_cancelled ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> prefix().context->is_group_execution_cancelled(); }
+<a name="l00811"></a>00811 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00812"></a>00812 
+<a name="l00813"></a>00813 <span class="preprocessor">#if __TBB_TASK_PRIORITY</span>
+<a name="l00815"></a><a class="code" href="a00311.html#9ac8d1542d67d9d80121ff986801ac26">00815</a> <span class="preprocessor">    void set_group_priority ( priority_t p ) {  prefix().context->set_priority(p); }</span>
+<a name="l00816"></a>00816 <span class="preprocessor"></span>
+<a name="l00818"></a><a class="code" href="a00311.html#e1d969a1ccab6796e3b8b2c1a5be33d2">00818</a>     priority_t group_priority ()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> prefix().context->priority(); }
+<a name="l00819"></a>00819 
+<a name="l00820"></a>00820 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
 <a name="l00821"></a>00821 
-<a name="l00822"></a>00822     internal::task_prefix& prefix( internal::version_tag* = NULL )<span class="keyword"> const </span>{
-<a name="l00823"></a>00823         <span class="keywordflow">return</span> reinterpret_cast<internal::task_prefix*>(const_cast<task*>(<span class="keyword">this</span>))[-1];
-<a name="l00824"></a>00824     }
-<a name="l00825"></a>00825 }; <span class="comment">// class task</span>
-<a name="l00826"></a>00826 
-<a name="l00828"></a>00828 
-<a name="l00829"></a><a class="code" href="a00242.html">00829</a> <span class="keyword">class </span><a class="code" href="a00242.html">empty_task</a>: <span class="keyword">public</span> <a class="code" href="a00291.html">task</a> {
-<a name="l00830"></a>00830     <span class="comment">/*override*/</span> <a class="code" href="a00291.html">task</a>* execute() {
-<a name="l00831"></a>00831         <span class="keywordflow">return</span> NULL;
-<a name="l00832"></a>00832     }
-<a name="l00833"></a>00833 };
-<a name="l00834"></a>00834 
-<a name="l00836"></a>00836 
-<a name="l00838"></a><a class="code" href="a00294.html">00838</a> <span class="keyword">class </span><a class="code" href="a00294.html">task_list</a>: internal::no_copy {
-<a name="l00839"></a>00839 <span class="keyword">private</span>:
-<a name="l00840"></a>00840     <a class="code" href="a00291.html">task</a>* first;
-<a name="l00841"></a>00841     <a class="code" href="a00291.html">task</a>** next_ptr;
-<a name="l00842"></a>00842     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00291.html">task</a>;
-<a name="l00843"></a>00843     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00292.html">interface5::internal::task_base</a>;
-<a name="l00844"></a>00844 <span class="keyword">public</span>:
-<a name="l00846"></a><a class="code" href="a00294.html#416341c2047eaef50417b41eaf7e9de6">00846</a>     <a class="code" href="a00294.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>() : first(NULL), next_ptr(&first) {}
-<a name="l00847"></a>00847 
-<a name="l00849"></a><a class="code" href="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">00849</a>     <a class="code" href="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>() {}
+<a name="l00822"></a>00822 <span class="keyword">private</span>:
+<a name="l00823"></a>00823     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00312.html">interface5::internal::task_base</a>;
+<a name="l00824"></a>00824     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00315.html">task_list</a>;
+<a name="l00825"></a>00825     <span class="keyword">friend</span> <span class="keyword">class </span>internal::scheduler;
+<a name="l00826"></a>00826     <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_proxy;
+<a name="l00827"></a>00827 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00828"></a>00828 <span class="preprocessor"></span>    <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_root_with_context_proxy;
+<a name="l00829"></a>00829 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00830"></a>00830     <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_continuation_proxy;
+<a name="l00831"></a>00831     <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_child_proxy;
+<a name="l00832"></a>00832     <span class="keyword">friend</span> <span class="keyword">class </span>internal::allocate_additional_child_of_proxy;
+<a name="l00833"></a>00833 
+<a name="l00835"></a>00835 
+<a name="l00836"></a>00836     internal::task_prefix& prefix( internal::version_tag* = NULL )<span class="keyword"> const </span>{
+<a name="l00837"></a>00837         <span class="keywordflow">return</span> reinterpret_cast<internal::task_prefix*>(const_cast<task*>(<span class="keyword">this</span>))[-1];
+<a name="l00838"></a>00838     }
+<a name="l00839"></a>00839 }; <span class="comment">// class task</span>
+<a name="l00840"></a>00840 
+<a name="l00842"></a>00842 
+<a name="l00843"></a><a class="code" href="a00254.html">00843</a> <span class="keyword">class </span><a class="code" href="a00254.html">empty_task</a>: <span class="keyword">public</span> <a class="code" href="a00311.html">task</a> {
+<a name="l00844"></a>00844     <span class="comment">/*override*/</span> <a class="code" href="a00311.html">task</a>* execute() {
+<a name="l00845"></a>00845         <span class="keywordflow">return</span> NULL;
+<a name="l00846"></a>00846     }
+<a name="l00847"></a>00847 };
+<a name="l00848"></a>00848 
 <a name="l00850"></a>00850 
-<a name="l00852"></a><a class="code" href="a00294.html#f3ac31e092814b90929f81bb30441959">00852</a>     <span class="keywordtype">bool</span> <a class="code" href="a00294.html#f3ac31e092814b90929f81bb30441959">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !first;}
-<a name="l00853"></a>00853 
-<a name="l00855"></a><a class="code" href="a00294.html#4cd34756bc4763dafb8c84838a0124ff">00855</a>     <span class="keywordtype">void</span> <a class="code" href="a00294.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>( <a class="code" href="a00291.html">task</a>& <a class="code" href="a00291.html">task</a> ) {
-<a name="l00856"></a>00856         task.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next = NULL;
-<a name="l00857"></a>00857         *next_ptr = &task;
-<a name="l00858"></a>00858         next_ptr = &task.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
-<a name="l00859"></a>00859     }
-<a name="l00860"></a>00860 
-<a name="l00862"></a><a class="code" href="a00294.html#5fe85df5ed524418389d34051750347d">00862</a>     <a class="code" href="a00291.html">task</a>& <a class="code" href="a00294.html#5fe85df5ed524418389d34051750347d">pop_front</a>() {
-<a name="l00863"></a>00863         __TBB_ASSERT( !<a class="code" href="a00294.html#f3ac31e092814b90929f81bb30441959">empty</a>(), <span class="stringliteral">"attempt to pop item from empty task_list"</span> );
-<a name="l00864"></a>00864         <a class="code" href="a00291.html">task</a>* result = first;
-<a name="l00865"></a>00865         first = result-><a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
-<a name="l00866"></a>00866         <span class="keywordflow">if</span>( !first ) next_ptr = &first;
-<a name="l00867"></a>00867         <span class="keywordflow">return</span> *result;
-<a name="l00868"></a>00868     }
-<a name="l00869"></a>00869 
-<a name="l00871"></a><a class="code" href="a00294.html#fce446ee13e025969945328f3ff59b95">00871</a>     <span class="keywordtype">void</span> <a class="code" href="a00294.html#fce446ee13e025969945328f3ff59b95">clear</a>() {
-<a name="l00872"></a>00872         first=NULL;
-<a name="l00873"></a>00873         next_ptr=&first;
-<a name="l00874"></a>00874     }
-<a name="l00875"></a>00875 };
-<a name="l00876"></a>00876 
-<a name="l00877"></a>00877 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task& t ) {
-<a name="l00878"></a>00878     t.<a class="code" href="a00291.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn( t, t.prefix().next );
-<a name="l00879"></a>00879 }
-<a name="l00880"></a>00880 
-<a name="l00881"></a>00881 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task_list& list ) {
-<a name="l00882"></a>00882     <span class="keywordflow">if</span>( task* t = list.first ) {
-<a name="l00883"></a>00883         t->prefix().owner->spawn( *t, *list.next_ptr );
-<a name="l00884"></a>00884         list.clear();
-<a name="l00885"></a>00885     }
-<a name="l00886"></a>00886 }
-<a name="l00887"></a>00887 
-<a name="l00888"></a><a class="code" href="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">00888</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00291.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( <a class="code" href="a00294.html">task_list</a>& root_list ) {
-<a name="l00889"></a>00889     <span class="keywordflow">if</span>( <a class="code" href="a00291.html">task</a>* t = root_list.<a class="code" href="a00294.html#78fcc389819ee34427d510f7d8cb8b1e">first</a> ) {
-<a name="l00890"></a>00890         t->prefix().owner->spawn_root_and_wait( *t, *root_list.<a class="code" href="a00294.html#21553a32bcd08f980aa28f61254307da">next_ptr</a> );
-<a name="l00891"></a>00891         root_list.<a class="code" href="a00294.html#fce446ee13e025969945328f3ff59b95">clear</a>();
-<a name="l00892"></a>00892     }
+<a name="l00852"></a><a class="code" href="a00315.html">00852</a> <span class="keyword">class </span><a class="code" href="a00315.html">task_list</a>: internal::no_copy {
+<a name="l00853"></a>00853 <span class="keyword">private</span>:
+<a name="l00854"></a>00854     <a class="code" href="a00311.html">task</a>* first;
+<a name="l00855"></a>00855     <a class="code" href="a00311.html">task</a>** next_ptr;
+<a name="l00856"></a>00856     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00311.html">task</a>;
+<a name="l00857"></a>00857     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00312.html">interface5::internal::task_base</a>;
+<a name="l00858"></a>00858 <span class="keyword">public</span>:
+<a name="l00860"></a><a class="code" href="a00315.html#416341c2047eaef50417b41eaf7e9de6">00860</a>     <a class="code" href="a00315.html#416341c2047eaef50417b41eaf7e9de6">task_list</a>() : first(NULL), next_ptr(&first) {}
+<a name="l00861"></a>00861 
+<a name="l00863"></a><a class="code" href="a00315.html#6d438f1499a02db1e59c24ab6043e5ba">00863</a>     <a class="code" href="a00315.html#6d438f1499a02db1e59c24ab6043e5ba">~task_list</a>() {}
+<a name="l00864"></a>00864 
+<a name="l00866"></a><a class="code" href="a00315.html#f3ac31e092814b90929f81bb30441959">00866</a>     <span class="keywordtype">bool</span> <a class="code" href="a00315.html#f3ac31e092814b90929f81bb30441959">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !first;}
+<a name="l00867"></a>00867 
+<a name="l00869"></a><a class="code" href="a00315.html#4cd34756bc4763dafb8c84838a0124ff">00869</a>     <span class="keywordtype">void</span> <a class="code" href="a00315.html#4cd34756bc4763dafb8c84838a0124ff">push_back</a>( <a class="code" href="a00311.html">task</a>& <a class="code" href="a00311.html">task</a> ) {
+<a name="l00870"></a>00870         task.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next = NULL;
+<a name="l00871"></a>00871         *next_ptr = &task;
+<a name="l00872"></a>00872         next_ptr = &task.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
+<a name="l00873"></a>00873     }
+<a name="l00874"></a>00874 
+<a name="l00876"></a><a class="code" href="a00315.html#5fe85df5ed524418389d34051750347d">00876</a>     <a class="code" href="a00311.html">task</a>& <a class="code" href="a00315.html#5fe85df5ed524418389d34051750347d">pop_front</a>() {
+<a name="l00877"></a>00877         __TBB_ASSERT( !<a class="code" href="a00315.html#f3ac31e092814b90929f81bb30441959">empty</a>(), <span class="stringliteral">"attempt to pop item from empty task_list"</span> );
+<a name="l00878"></a>00878         <a class="code" href="a00311.html">task</a>* result = first;
+<a name="l00879"></a>00879         first = result-><a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().next;
+<a name="l00880"></a>00880         <span class="keywordflow">if</span>( !first ) next_ptr = &first;
+<a name="l00881"></a>00881         <span class="keywordflow">return</span> *result;
+<a name="l00882"></a>00882     }
+<a name="l00883"></a>00883 
+<a name="l00885"></a><a class="code" href="a00315.html#fce446ee13e025969945328f3ff59b95">00885</a>     <span class="keywordtype">void</span> <a class="code" href="a00315.html#fce446ee13e025969945328f3ff59b95">clear</a>() {
+<a name="l00886"></a>00886         first=NULL;
+<a name="l00887"></a>00887         next_ptr=&first;
+<a name="l00888"></a>00888     }
+<a name="l00889"></a>00889 };
+<a name="l00890"></a>00890 
+<a name="l00891"></a>00891 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task& t ) {
+<a name="l00892"></a>00892     t.<a class="code" href="a00311.html#ac578940848e9dc8b4f1f2bcf17b627d">prefix</a>().owner->spawn( t, t.prefix().next );
 <a name="l00893"></a>00893 }
 <a name="l00894"></a>00894 
-<a name="l00895"></a>00895 } <span class="comment">// namespace tbb</span>
-<a name="l00896"></a>00896 
-<a name="l00897"></a>00897 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_root_proxy& ) {
-<a name="l00898"></a>00898     <span class="keywordflow">return</span> &tbb::internal::allocate_root_proxy::allocate(bytes);
-<a name="l00899"></a>00899 }
-<a name="l00900"></a>00900 
-<a name="l00901"></a>00901 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_root_proxy& ) {
-<a name="l00902"></a>00902     tbb::internal::allocate_root_proxy::free( *static_cast<tbb::task*>(task) );
-<a name="l00903"></a>00903 }
-<a name="l00904"></a>00904 
-<a name="l00905"></a>00905 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00906"></a>00906 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_root_with_context_proxy& p ) {
-<a name="l00907"></a>00907     <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00908"></a>00908 }
-<a name="l00909"></a>00909 
-<a name="l00910"></a>00910 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_root_with_context_proxy& p ) {
-<a name="l00911"></a>00911     p.free( *static_cast<tbb::task*>(task) );
-<a name="l00912"></a>00912 }
-<a name="l00913"></a>00913 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00895"></a>00895 <span class="keyword">inline</span> <span class="keywordtype">void</span> interface5::internal::task_base::spawn( task_list& list ) {
+<a name="l00896"></a>00896     <span class="keywordflow">if</span>( task* t = list.first ) {
+<a name="l00897"></a>00897         t->prefix().owner->spawn( *t, *list.next_ptr );
+<a name="l00898"></a>00898         list.clear();
+<a name="l00899"></a>00899     }
+<a name="l00900"></a>00900 }
+<a name="l00901"></a>00901 
+<a name="l00902"></a><a class="code" href="a00311.html#c33c7edbaec67aa8a56f48986a9dc69f">00902</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00311.html#ce8ce689c26a4ddf343829bc3c73290a">task::spawn_root_and_wait</a>( <a class="code" href="a00315.html">task_list</a>& root_list ) {
+<a name="l00903"></a>00903     <span class="keywordflow">if</span>( <a class="code" href="a00311.html">task</a>* t = root_list.<a class="code" href="a00315.html#78fcc389819ee34427d510f7d8cb8b1e">first</a> ) {
+<a name="l00904"></a>00904         t->prefix().owner->spawn_root_and_wait( *t, *root_list.<a class="code" href="a00315.html#21553a32bcd08f980aa28f61254307da">next_ptr</a> );
+<a name="l00905"></a>00905         root_list.<a class="code" href="a00315.html#fce446ee13e025969945328f3ff59b95">clear</a>();
+<a name="l00906"></a>00906     }
+<a name="l00907"></a>00907 }
+<a name="l00908"></a>00908 
+<a name="l00909"></a>00909 } <span class="comment">// namespace tbb</span>
+<a name="l00910"></a>00910 
+<a name="l00911"></a>00911 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_root_proxy& ) {
+<a name="l00912"></a>00912     <span class="keywordflow">return</span> &tbb::internal::allocate_root_proxy::allocate(bytes);
+<a name="l00913"></a>00913 }
 <a name="l00914"></a>00914 
-<a name="l00915"></a>00915 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_continuation_proxy& p ) {
-<a name="l00916"></a>00916     <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00915"></a>00915 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_root_proxy& ) {
+<a name="l00916"></a>00916     tbb::internal::allocate_root_proxy::free( *static_cast<tbb::task*>(task) );
 <a name="l00917"></a>00917 }
 <a name="l00918"></a>00918 
-<a name="l00919"></a>00919 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_continuation_proxy& p ) {
-<a name="l00920"></a>00920     p.free( *static_cast<tbb::task*>(task) );
-<a name="l00921"></a>00921 }
-<a name="l00922"></a>00922 
-<a name="l00923"></a>00923 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_child_proxy& p ) {
-<a name="l00924"></a>00924     <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00925"></a>00925 }
-<a name="l00926"></a>00926 
-<a name="l00927"></a>00927 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_child_proxy& p ) {
-<a name="l00928"></a>00928     p.free( *static_cast<tbb::task*>(task) );
-<a name="l00929"></a>00929 }
-<a name="l00930"></a>00930 
-<a name="l00931"></a>00931 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_additional_child_of_proxy& p ) {
-<a name="l00932"></a>00932     <span class="keywordflow">return</span> &p.allocate(bytes);
-<a name="l00933"></a>00933 }
-<a name="l00934"></a>00934 
-<a name="l00935"></a>00935 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_additional_child_of_proxy& p ) {
-<a name="l00936"></a>00936     p.free( *static_cast<tbb::task*>(task) );
-<a name="l00937"></a>00937 }
-<a name="l00938"></a>00938 
-<a name="l00939"></a>00939 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_H */</span>
+<a name="l00919"></a>00919 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00920"></a>00920 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_root_with_context_proxy& p ) {
+<a name="l00921"></a>00921     <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00922"></a>00922 }
+<a name="l00923"></a>00923 
+<a name="l00924"></a>00924 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_root_with_context_proxy& p ) {
+<a name="l00925"></a>00925     p.free( *static_cast<tbb::task*>(task) );
+<a name="l00926"></a>00926 }
+<a name="l00927"></a>00927 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00928"></a>00928 
+<a name="l00929"></a>00929 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_continuation_proxy& p ) {
+<a name="l00930"></a>00930     <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00931"></a>00931 }
+<a name="l00932"></a>00932 
+<a name="l00933"></a>00933 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_continuation_proxy& p ) {
+<a name="l00934"></a>00934     p.free( *static_cast<tbb::task*>(task) );
+<a name="l00935"></a>00935 }
+<a name="l00936"></a>00936 
+<a name="l00937"></a>00937 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_child_proxy& p ) {
+<a name="l00938"></a>00938     <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00939"></a>00939 }
+<a name="l00940"></a>00940 
+<a name="l00941"></a>00941 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_child_proxy& p ) {
+<a name="l00942"></a>00942     p.free( *static_cast<tbb::task*>(task) );
+<a name="l00943"></a>00943 }
+<a name="l00944"></a>00944 
+<a name="l00945"></a>00945 <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator new( size_t bytes, <span class="keyword">const</span> tbb::internal::allocate_additional_child_of_proxy& p ) {
+<a name="l00946"></a>00946     <span class="keywordflow">return</span> &p.allocate(bytes);
+<a name="l00947"></a>00947 }
+<a name="l00948"></a>00948 
+<a name="l00949"></a>00949 <span class="keyword">inline</span> <span class="keywordtype">void</span> operator delete( <span class="keywordtype">void</span>* task, <span class="keyword">const</span> tbb::internal::allocate_additional_child_of_proxy& p ) {
+<a name="l00950"></a>00950     p.free( *static_cast<tbb::task*>(task) );
+<a name="l00951"></a>00951 }
+<a name="l00952"></a>00952 
+<a name="l00953"></a>00953 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_H */</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00577.html b/doc/html/a00577.html
index 8dbaf6a..ce437ea 100644
--- a/doc/html/a00577.html
+++ b/doc/html/a00577.html
@@ -45,220 +45,224 @@
 <a name="l00024"></a>00024 <span class="preprocessor">#include "task.h"</span>
 <a name="l00025"></a>00025 <span class="preprocessor">#include "tbb_exception.h"</span>
 <a name="l00026"></a>00026 
-<a name="l00027"></a>00027 <span class="keyword">namespace </span>tbb {
-<a name="l00028"></a>00028 
-<a name="l00029"></a>00029 <span class="keyword">namespace </span>internal {
-<a name="l00030"></a>00030     <span class="keyword">template</span><<span class="keyword">typename</span> F> <span class="keyword">class </span>task_handle_task;
-<a name="l00031"></a>00031 }
-<a name="l00032"></a>00032 
-<a name="l00033"></a>00033 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00034"></a>00034 <span class="keyword">class </span>task_handle : internal::no_assign {
-<a name="l00035"></a>00035     <span class="keyword">template</span><<span class="keyword">typename</span> _F> <span class="keyword">friend</span> <span class="keyword">class </span>internal::task_handle_task;
-<a name="l00036"></a>00036 
-<a name="l00037"></a>00037     <span class="keyword">static</span> <span class="keyword">const</span> intptr_t scheduled = 0x1;
+<a name="l00027"></a>00027 <span class="preprocessor">#if __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00028"></a>00028 <span class="preprocessor"></span>
+<a name="l00029"></a>00029 <span class="keyword">namespace </span>tbb {
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 <span class="keyword">namespace </span>internal {
+<a name="l00032"></a>00032     <span class="keyword">template</span><<span class="keyword">typename</span> F> <span class="keyword">class </span>task_handle_task;
+<a name="l00033"></a>00033 }
+<a name="l00034"></a>00034 
+<a name="l00035"></a>00035 <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00036"></a>00036 <span class="keyword">class </span>task_handle : internal::no_assign {
+<a name="l00037"></a>00037     <span class="keyword">template</span><<span class="keyword">typename</span> _F> <span class="keyword">friend</span> <span class="keyword">class </span>internal::task_handle_task;
 <a name="l00038"></a>00038 
-<a name="l00039"></a>00039     F my_func;
-<a name="l00040"></a>00040     intptr_t my_state;
-<a name="l00041"></a>00041 
-<a name="l00042"></a>00042     <span class="keywordtype">void</span> mark_scheduled () {
-<a name="l00043"></a>00043         <span class="comment">// The check here is intentionally lax to avoid the impact of interlocked operation</span>
-<a name="l00044"></a>00044         <span class="keywordflow">if</span> ( my_state & scheduled )
-<a name="l00045"></a>00045             internal::throw_exception( internal::eid_invalid_multiple_scheduling );
-<a name="l00046"></a>00046         my_state |= scheduled;
-<a name="l00047"></a>00047     }
-<a name="l00048"></a>00048 <span class="keyword">public</span>:
-<a name="l00049"></a>00049     task_handle( <span class="keyword">const</span> F& f ) : my_func(f), my_state(0) {}
-<a name="l00050"></a>00050 
-<a name="l00051"></a>00051     <span class="keywordtype">void</span> operator() ()<span class="keyword"> const </span>{ my_func(); }
-<a name="l00052"></a>00052 };
-<a name="l00053"></a>00053 
-<a name="l00054"></a>00054 <span class="keyword">enum</span> task_group_status {
-<a name="l00055"></a>00055     not_complete,
-<a name="l00056"></a>00056     complete,
-<a name="l00057"></a>00057     canceled
-<a name="l00058"></a>00058 };
-<a name="l00059"></a>00059 
-<a name="l00060"></a>00060 <span class="keyword">namespace </span>internal {
+<a name="l00039"></a>00039     <span class="keyword">static</span> <span class="keyword">const</span> intptr_t scheduled = 0x1;
+<a name="l00040"></a>00040 
+<a name="l00041"></a>00041     F my_func;
+<a name="l00042"></a>00042     intptr_t my_state;
+<a name="l00043"></a>00043 
+<a name="l00044"></a>00044     <span class="keywordtype">void</span> mark_scheduled () {
+<a name="l00045"></a>00045         <span class="comment">// The check here is intentionally lax to avoid the impact of interlocked operation</span>
+<a name="l00046"></a>00046         <span class="keywordflow">if</span> ( my_state & scheduled )
+<a name="l00047"></a>00047             internal::throw_exception( internal::eid_invalid_multiple_scheduling );
+<a name="l00048"></a>00048         my_state |= scheduled;
+<a name="l00049"></a>00049     }
+<a name="l00050"></a>00050 <span class="keyword">public</span>:
+<a name="l00051"></a>00051     task_handle( <span class="keyword">const</span> F& f ) : my_func(f), my_state(0) {}
+<a name="l00052"></a>00052 
+<a name="l00053"></a>00053     <span class="keywordtype">void</span> operator() ()<span class="keyword"> const </span>{ my_func(); }
+<a name="l00054"></a>00054 };
+<a name="l00055"></a>00055 
+<a name="l00056"></a>00056 <span class="keyword">enum</span> task_group_status {
+<a name="l00057"></a>00057     not_complete,
+<a name="l00058"></a>00058     complete,
+<a name="l00059"></a>00059     canceled
+<a name="l00060"></a>00060 };
 <a name="l00061"></a>00061 
-<a name="l00062"></a>00062 <span class="comment">// Suppress gratuitous warnings from icc 11.0 when lambda expressions are used in instances of function_task.</span>
-<a name="l00063"></a>00063 <span class="comment">//#pragma warning(disable: 588)</span>
-<a name="l00064"></a>00064 
-<a name="l00065"></a>00065 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00066"></a>00066 <span class="keyword">class </span>function_task : <span class="keyword">public</span> task {
-<a name="l00067"></a>00067     F my_func;
-<a name="l00068"></a>00068     <span class="comment">/*override*/</span> <a class="code" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>* execute() {
-<a name="l00069"></a>00069         my_func();
-<a name="l00070"></a>00070         <span class="keywordflow">return</span> NULL;
-<a name="l00071"></a>00071     }
-<a name="l00072"></a>00072 <span class="keyword">public</span>:
-<a name="l00073"></a>00073     function_task( <span class="keyword">const</span> F& f ) : my_func(f) {}
-<a name="l00074"></a>00074 };
-<a name="l00075"></a>00075 
-<a name="l00076"></a>00076 <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00077"></a>00077 <span class="keyword">class </span>task_handle_task : <span class="keyword">public</span> task {
-<a name="l00078"></a>00078     task_handle<F>& my_handle;
-<a name="l00079"></a>00079     <span class="comment">/*override*/</span> <a class="code" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>* execute() {
-<a name="l00080"></a>00080         my_handle();
-<a name="l00081"></a>00081         <span class="keywordflow">return</span> NULL;
-<a name="l00082"></a>00082     }
-<a name="l00083"></a>00083 <span class="keyword">public</span>:
-<a name="l00084"></a>00084     task_handle_task( task_handle<F>& h ) : my_handle(h) { h.mark_scheduled(); }
-<a name="l00085"></a>00085 };
-<a name="l00086"></a>00086 
-<a name="l00087"></a>00087 <span class="keyword">class </span>task_group_base : internal::no_copy {
-<a name="l00088"></a>00088 <span class="keyword">protected</span>:
-<a name="l00089"></a>00089     empty_task* my_root;
-<a name="l00090"></a>00090     task_group_context my_context;
-<a name="l00091"></a>00091 
-<a name="l00092"></a>00092     task& owner () { <span class="keywordflow">return</span> *my_root; }
+<a name="l00062"></a>00062 <span class="keyword">namespace </span>internal {
+<a name="l00063"></a>00063 
+<a name="l00064"></a>00064 <span class="comment">// Suppress gratuitous warnings from icc 11.0 when lambda expressions are used in instances of function_task.</span>
+<a name="l00065"></a>00065 <span class="comment">//#pragma warning(disable: 588)</span>
+<a name="l00066"></a>00066 
+<a name="l00067"></a>00067 <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00068"></a>00068 <span class="keyword">class </span>function_task : <span class="keyword">public</span> task {
+<a name="l00069"></a>00069     F my_func;
+<a name="l00070"></a>00070     <span class="comment">/*override*/</span> <a class="code" href="a00311.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>* execute() {
+<a name="l00071"></a>00071         my_func();
+<a name="l00072"></a>00072         <span class="keywordflow">return</span> NULL;
+<a name="l00073"></a>00073     }
+<a name="l00074"></a>00074 <span class="keyword">public</span>:
+<a name="l00075"></a>00075     function_task( <span class="keyword">const</span> F& f ) : my_func(f) {}
+<a name="l00076"></a>00076 };
+<a name="l00077"></a>00077 
+<a name="l00078"></a>00078 <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00079"></a>00079 <span class="keyword">class </span>task_handle_task : <span class="keyword">public</span> task {
+<a name="l00080"></a>00080     task_handle<F>& my_handle;
+<a name="l00081"></a>00081     <span class="comment">/*override*/</span> <a class="code" href="a00311.html#2bce8ec6e44706e70128f5cf91b76e67">task</a>* execute() {
+<a name="l00082"></a>00082         my_handle();
+<a name="l00083"></a>00083         <span class="keywordflow">return</span> NULL;
+<a name="l00084"></a>00084     }
+<a name="l00085"></a>00085 <span class="keyword">public</span>:
+<a name="l00086"></a>00086     task_handle_task( task_handle<F>& h ) : my_handle(h) { h.mark_scheduled(); }
+<a name="l00087"></a>00087 };
+<a name="l00088"></a>00088 
+<a name="l00089"></a>00089 <span class="keyword">class </span>task_group_base : internal::no_copy {
+<a name="l00090"></a>00090 <span class="keyword">protected</span>:
+<a name="l00091"></a>00091     empty_task* my_root;
+<a name="l00092"></a>00092     task_group_context my_context;
 <a name="l00093"></a>00093 
-<a name="l00094"></a>00094     <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00095"></a>00095     task_group_status internal_run_and_wait( F& f ) {
-<a name="l00096"></a>00096         __TBB_TRY {
-<a name="l00097"></a>00097             <span class="keywordflow">if</span> ( !my_context.is_group_execution_cancelled() )
-<a name="l00098"></a>00098                 f();
-<a name="l00099"></a>00099         } __TBB_CATCH( ... ) {
-<a name="l00100"></a>00100             my_context.register_pending_exception();
-<a name="l00101"></a>00101         }
-<a name="l00102"></a>00102         <span class="keywordflow">return</span> wait();
-<a name="l00103"></a>00103     }
-<a name="l00104"></a>00104 
-<a name="l00105"></a>00105     <span class="keyword">template</span><<span class="keyword">typename</span> F, <span class="keyword">typename</span> Task>
-<a name="l00106"></a>00106     <span class="keywordtype">void</span> internal_run( F& f ) {
-<a name="l00107"></a>00107         owner().spawn( *<span class="keyword">new</span>( owner().allocate_additional_child_of(*my_root) ) Task(f) );
-<a name="l00108"></a>00108     }
-<a name="l00109"></a>00109 
-<a name="l00110"></a>00110 <span class="keyword">public</span>:
-<a name="l00111"></a>00111     task_group_base( uintptr_t traits = 0 )
-<a name="l00112"></a>00112         : my_context(task_group_context::bound, task_group_context::default_traits | traits)
-<a name="l00113"></a>00113     {
-<a name="l00114"></a>00114         my_root = <span class="keyword">new</span>( <a class="code" href="a00291.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(my_context) ) empty_task;
-<a name="l00115"></a>00115         my_root->set_ref_count(1);
-<a name="l00116"></a>00116     }
-<a name="l00117"></a>00117 
-<a name="l00118"></a>00118     ~task_group_base() {
-<a name="l00119"></a>00119         <span class="keywordflow">if</span>( my_root->ref_count() > 1 ) {
-<a name="l00120"></a>00120             <span class="keywordtype">bool</span> stack_unwinding_in_progress = std::uncaught_exception();
-<a name="l00121"></a>00121             <span class="comment">// Always attempt to do proper cleanup to avoid inevitable memory corruption </span>
-<a name="l00122"></a>00122             <span class="comment">// in case of missing wait (for the sake of better testability & debuggability)</span>
-<a name="l00123"></a>00123             <span class="keywordflow">if</span> ( !is_canceling() )
-<a name="l00124"></a>00124                 cancel();
-<a name="l00125"></a>00125             __TBB_TRY {
-<a name="l00126"></a>00126                 my_root->wait_for_all();
-<a name="l00127"></a>00127             } __TBB_CATCH (...) {
-<a name="l00128"></a>00128                 <a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
-<a name="l00129"></a>00129                 __TBB_RETHROW();
-<a name="l00130"></a>00130             }
-<a name="l00131"></a>00131             <a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
-<a name="l00132"></a>00132             <span class="keywordflow">if</span> ( !stack_unwinding_in_progress )
-<a name="l00133"></a>00133                 internal::throw_exception( internal::eid_missing_wait );
-<a name="l00134"></a>00134         }
-<a name="l00135"></a>00135         <span class="keywordflow">else</span> {
-<a name="l00136"></a>00136             <a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
-<a name="l00137"></a>00137         }
-<a name="l00138"></a>00138     }
-<a name="l00139"></a>00139 
-<a name="l00140"></a>00140     <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00141"></a>00141     <span class="keywordtype">void</span> run( task_handle<F>& h ) {
-<a name="l00142"></a>00142         internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
-<a name="l00143"></a>00143     }
-<a name="l00144"></a>00144 
-<a name="l00145"></a>00145     task_group_status wait() {
-<a name="l00146"></a>00146         __TBB_TRY {
-<a name="l00147"></a>00147             my_root->wait_for_all();
-<a name="l00148"></a>00148         } __TBB_CATCH( ... ) {
-<a name="l00149"></a>00149             my_context.reset();
-<a name="l00150"></a>00150             __TBB_RETHROW();
-<a name="l00151"></a>00151         }
-<a name="l00152"></a>00152         <span class="keywordflow">if</span> ( my_context.is_group_execution_cancelled() ) {
-<a name="l00153"></a>00153             my_context.reset();
-<a name="l00154"></a>00154             <span class="keywordflow">return</span> canceled;
-<a name="l00155"></a>00155         }
-<a name="l00156"></a>00156         <span class="keywordflow">return</span> complete;
-<a name="l00157"></a>00157     }
-<a name="l00158"></a>00158 
-<a name="l00159"></a>00159     <span class="keywordtype">bool</span> is_canceling() {
-<a name="l00160"></a>00160         <span class="keywordflow">return</span> my_context.is_group_execution_cancelled();
-<a name="l00161"></a>00161     }
-<a name="l00162"></a>00162 
-<a name="l00163"></a>00163     <span class="keywordtype">void</span> cancel() {
-<a name="l00164"></a>00164         my_context.cancel_group_execution();
-<a name="l00165"></a>00165     }
-<a name="l00166"></a>00166 }; <span class="comment">// class task_group_base</span>
-<a name="l00167"></a>00167 
-<a name="l00168"></a>00168 } <span class="comment">// namespace internal</span>
+<a name="l00094"></a>00094     task& owner () { <span class="keywordflow">return</span> *my_root; }
+<a name="l00095"></a>00095 
+<a name="l00096"></a>00096     <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00097"></a>00097     task_group_status internal_run_and_wait( F& f ) {
+<a name="l00098"></a>00098         __TBB_TRY {
+<a name="l00099"></a>00099             <span class="keywordflow">if</span> ( !my_context.is_group_execution_cancelled() )
+<a name="l00100"></a>00100                 f();
+<a name="l00101"></a>00101         } __TBB_CATCH( ... ) {
+<a name="l00102"></a>00102             my_context.register_pending_exception();
+<a name="l00103"></a>00103         }
+<a name="l00104"></a>00104         <span class="keywordflow">return</span> wait();
+<a name="l00105"></a>00105     }
+<a name="l00106"></a>00106 
+<a name="l00107"></a>00107     <span class="keyword">template</span><<span class="keyword">typename</span> F, <span class="keyword">typename</span> Task>
+<a name="l00108"></a>00108     <span class="keywordtype">void</span> internal_run( F& f ) {
+<a name="l00109"></a>00109         owner().spawn( *<span class="keyword">new</span>( owner().allocate_additional_child_of(*my_root) ) Task(f) );
+<a name="l00110"></a>00110     }
+<a name="l00111"></a>00111 
+<a name="l00112"></a>00112 <span class="keyword">public</span>:
+<a name="l00113"></a>00113     task_group_base( uintptr_t traits = 0 )
+<a name="l00114"></a>00114         : my_context(task_group_context::bound, task_group_context::default_traits | traits)
+<a name="l00115"></a>00115     {
+<a name="l00116"></a>00116         my_root = <span class="keyword">new</span>( <a class="code" href="a00311.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(my_context) ) empty_task;
+<a name="l00117"></a>00117         my_root->set_ref_count(1);
+<a name="l00118"></a>00118     }
+<a name="l00119"></a>00119 
+<a name="l00120"></a>00120     ~task_group_base() {
+<a name="l00121"></a>00121         <span class="keywordflow">if</span>( my_root->ref_count() > 1 ) {
+<a name="l00122"></a>00122             <span class="keywordtype">bool</span> stack_unwinding_in_progress = std::uncaught_exception();
+<a name="l00123"></a>00123             <span class="comment">// Always attempt to do proper cleanup to avoid inevitable memory corruption </span>
+<a name="l00124"></a>00124             <span class="comment">// in case of missing wait (for the sake of better testability & debuggability)</span>
+<a name="l00125"></a>00125             <span class="keywordflow">if</span> ( !is_canceling() )
+<a name="l00126"></a>00126                 cancel();
+<a name="l00127"></a>00127             __TBB_TRY {
+<a name="l00128"></a>00128                 my_root->wait_for_all();
+<a name="l00129"></a>00129             } __TBB_CATCH (...) {
+<a name="l00130"></a>00130                 <a class="code" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
+<a name="l00131"></a>00131                 __TBB_RETHROW();
+<a name="l00132"></a>00132             }
+<a name="l00133"></a>00133             <a class="code" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
+<a name="l00134"></a>00134             <span class="keywordflow">if</span> ( !stack_unwinding_in_progress )
+<a name="l00135"></a>00135                 internal::throw_exception( internal::eid_missing_wait );
+<a name="l00136"></a>00136         }
+<a name="l00137"></a>00137         <span class="keywordflow">else</span> {
+<a name="l00138"></a>00138             <a class="code" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
+<a name="l00139"></a>00139         }
+<a name="l00140"></a>00140     }
+<a name="l00141"></a>00141 
+<a name="l00142"></a>00142     <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00143"></a>00143     <span class="keywordtype">void</span> run( task_handle<F>& h ) {
+<a name="l00144"></a>00144         internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
+<a name="l00145"></a>00145     }
+<a name="l00146"></a>00146 
+<a name="l00147"></a>00147     task_group_status wait() {
+<a name="l00148"></a>00148         __TBB_TRY {
+<a name="l00149"></a>00149             my_root->wait_for_all();
+<a name="l00150"></a>00150         } __TBB_CATCH( ... ) {
+<a name="l00151"></a>00151             my_context.reset();
+<a name="l00152"></a>00152             __TBB_RETHROW();
+<a name="l00153"></a>00153         }
+<a name="l00154"></a>00154         <span class="keywordflow">if</span> ( my_context.is_group_execution_cancelled() ) {
+<a name="l00155"></a>00155             my_context.reset();
+<a name="l00156"></a>00156             <span class="keywordflow">return</span> canceled;
+<a name="l00157"></a>00157         }
+<a name="l00158"></a>00158         <span class="keywordflow">return</span> complete;
+<a name="l00159"></a>00159     }
+<a name="l00160"></a>00160 
+<a name="l00161"></a>00161     <span class="keywordtype">bool</span> is_canceling() {
+<a name="l00162"></a>00162         <span class="keywordflow">return</span> my_context.is_group_execution_cancelled();
+<a name="l00163"></a>00163     }
+<a name="l00164"></a>00164 
+<a name="l00165"></a>00165     <span class="keywordtype">void</span> cancel() {
+<a name="l00166"></a>00166         my_context.cancel_group_execution();
+<a name="l00167"></a>00167     }
+<a name="l00168"></a>00168 }; <span class="comment">// class task_group_base</span>
 <a name="l00169"></a>00169 
-<a name="l00170"></a>00170 <span class="keyword">class </span>task_group : <span class="keyword">public</span> internal::task_group_base {
-<a name="l00171"></a>00171 <span class="keyword">public</span>:
-<a name="l00172"></a>00172     task_group () : task_group_base( task_group_context::concurrent_wait ) {}
-<a name="l00173"></a>00173 
-<a name="l00174"></a>00174 <span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00175"></a>00175 <span class="preprocessor"></span>    ~task_group() __TBB_TRY {
-<a name="l00176"></a>00176         __TBB_ASSERT( my_root->ref_count() != 0, NULL );
-<a name="l00177"></a>00177         <span class="keywordflow">if</span>( my_root->ref_count() > 1 )
-<a name="l00178"></a>00178             my_root->wait_for_all();
-<a name="l00179"></a>00179     }
-<a name="l00180"></a>00180 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00181"></a>00181 <span class="preprocessor"></span>    <span class="keywordflow">catch</span> (...) {
-<a name="l00182"></a>00182         <span class="comment">// Have to destroy my_root here as the base class destructor won't be called</span>
-<a name="l00183"></a>00183         <a class="code" href="a00291.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
-<a name="l00184"></a>00184         <span class="keywordflow">throw</span>;
-<a name="l00185"></a>00185     }
-<a name="l00186"></a>00186 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_EXCEPTIONS */</span>
-<a name="l00187"></a>00187 <span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
-<a name="l00188"></a>00188 
-<a name="l00189"></a>00189 <span class="preprocessor">#if __SUNPRO_CC</span>
-<a name="l00190"></a>00190 <span class="preprocessor"></span>    <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00191"></a>00191     <span class="keywordtype">void</span> run( task_handle<F>& h ) {
-<a name="l00192"></a>00192         internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
-<a name="l00193"></a>00193     }
-<a name="l00194"></a>00194 <span class="preprocessor">#else</span>
-<a name="l00195"></a>00195 <span class="preprocessor"></span>    <span class="keyword">using</span> task_group_base::run;
-<a name="l00196"></a>00196 <span class="preprocessor">#endif</span>
-<a name="l00197"></a>00197 <span class="preprocessor"></span>
-<a name="l00198"></a>00198     <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00199"></a>00199     <span class="keywordtype">void</span> run( <span class="keyword">const</span> F& f ) {
-<a name="l00200"></a>00200         internal_run< const F, internal::function_task<F> >( f );
-<a name="l00201"></a>00201     }
-<a name="l00202"></a>00202 
-<a name="l00203"></a>00203     <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00204"></a>00204     task_group_status run_and_wait( <span class="keyword">const</span> F& f ) {
-<a name="l00205"></a>00205         <span class="keywordflow">return</span> internal_run_and_wait<const F>( f );
-<a name="l00206"></a>00206     }
-<a name="l00207"></a>00207 
-<a name="l00208"></a>00208     <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00209"></a>00209     task_group_status run_and_wait( task_handle<F>& h ) {
-<a name="l00210"></a>00210       <span class="keywordflow">return</span> internal_run_and_wait< task_handle<F> >( h );
-<a name="l00211"></a>00211     }
-<a name="l00212"></a>00212 }; <span class="comment">// class task_group</span>
-<a name="l00213"></a>00213 
-<a name="l00214"></a>00214 <span class="keyword">class </span>structured_task_group : <span class="keyword">public</span> internal::task_group_base {
-<a name="l00215"></a>00215 <span class="keyword">public</span>:
-<a name="l00216"></a>00216     <span class="keyword">template</span><<span class="keyword">typename</span> F>
-<a name="l00217"></a>00217     task_group_status run_and_wait ( task_handle<F>& h ) {
-<a name="l00218"></a>00218         <span class="keywordflow">return</span> internal_run_and_wait< task_handle<F> >( h );
-<a name="l00219"></a>00219     }
-<a name="l00220"></a>00220 
-<a name="l00221"></a>00221     task_group_status wait() {
-<a name="l00222"></a>00222         task_group_status res = task_group_base::wait();
-<a name="l00223"></a>00223         my_root->set_ref_count(1);
-<a name="l00224"></a>00224         <span class="keywordflow">return</span> res;
-<a name="l00225"></a>00225     }
-<a name="l00226"></a>00226 }; <span class="comment">// class structured_task_group</span>
-<a name="l00227"></a>00227 
-<a name="l00228"></a>00228 <span class="keyword">inline</span> 
-<a name="l00229"></a>00229 <span class="keywordtype">bool</span> is_current_task_group_canceling() {
-<a name="l00230"></a>00230     <span class="keywordflow">return</span> <a class="code" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().<a class="code" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>();
-<a name="l00231"></a>00231 }
-<a name="l00232"></a>00232 
-<a name="l00233"></a>00233 <span class="keyword">template</span><<span class="keyword">class</span> F>
-<a name="l00234"></a>00234 task_handle<F> make_task( <span class="keyword">const</span> F& f ) {
-<a name="l00235"></a>00235     <span class="keywordflow">return</span> task_handle<F>( f );
-<a name="l00236"></a>00236 }
-<a name="l00237"></a>00237 
-<a name="l00238"></a>00238 } <span class="comment">// namespace tbb</span>
+<a name="l00170"></a>00170 } <span class="comment">// namespace internal</span>
+<a name="l00171"></a>00171 
+<a name="l00172"></a>00172 <span class="keyword">class </span>task_group : <span class="keyword">public</span> internal::task_group_base {
+<a name="l00173"></a>00173 <span class="keyword">public</span>:
+<a name="l00174"></a>00174     task_group () : task_group_base( task_group_context::concurrent_wait ) {}
+<a name="l00175"></a>00175 
+<a name="l00176"></a>00176 <span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00177"></a>00177 <span class="preprocessor"></span>    ~task_group() __TBB_TRY {
+<a name="l00178"></a>00178         __TBB_ASSERT( my_root->ref_count() != 0, NULL );
+<a name="l00179"></a>00179         <span class="keywordflow">if</span>( my_root->ref_count() > 1 )
+<a name="l00180"></a>00180             my_root->wait_for_all();
+<a name="l00181"></a>00181     }
+<a name="l00182"></a>00182 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
+<a name="l00183"></a>00183 <span class="preprocessor"></span>    <span class="keywordflow">catch</span> (...) {
+<a name="l00184"></a>00184         <span class="comment">// Have to destroy my_root here as the base class destructor won't be called</span>
+<a name="l00185"></a>00185         <a class="code" href="a00311.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>(*my_root);
+<a name="l00186"></a>00186         <span class="keywordflow">throw</span>;
+<a name="l00187"></a>00187     }
+<a name="l00188"></a>00188 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_EXCEPTIONS */</span>
+<a name="l00189"></a>00189 <span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
+<a name="l00190"></a>00190 
+<a name="l00191"></a>00191 <span class="preprocessor">#if __SUNPRO_CC</span>
+<a name="l00192"></a>00192 <span class="preprocessor"></span>    <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00193"></a>00193     <span class="keywordtype">void</span> run( task_handle<F>& h ) {
+<a name="l00194"></a>00194         internal_run< task_handle<F>, internal::task_handle_task<F> >( h );
+<a name="l00195"></a>00195     }
+<a name="l00196"></a>00196 <span class="preprocessor">#else</span>
+<a name="l00197"></a>00197 <span class="preprocessor"></span>    <span class="keyword">using</span> task_group_base::run;
+<a name="l00198"></a>00198 <span class="preprocessor">#endif</span>
+<a name="l00199"></a>00199 <span class="preprocessor"></span>
+<a name="l00200"></a>00200     <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00201"></a>00201     <span class="keywordtype">void</span> run( <span class="keyword">const</span> F& f ) {
+<a name="l00202"></a>00202         internal_run< const F, internal::function_task<F> >( f );
+<a name="l00203"></a>00203     }
+<a name="l00204"></a>00204 
+<a name="l00205"></a>00205     <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00206"></a>00206     task_group_status run_and_wait( <span class="keyword">const</span> F& f ) {
+<a name="l00207"></a>00207         <span class="keywordflow">return</span> internal_run_and_wait<const F>( f );
+<a name="l00208"></a>00208     }
+<a name="l00209"></a>00209 
+<a name="l00210"></a>00210     <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00211"></a>00211     task_group_status run_and_wait( task_handle<F>& h ) {
+<a name="l00212"></a>00212       <span class="keywordflow">return</span> internal_run_and_wait< task_handle<F> >( h );
+<a name="l00213"></a>00213     }
+<a name="l00214"></a>00214 }; <span class="comment">// class task_group</span>
+<a name="l00215"></a>00215 
+<a name="l00216"></a>00216 <span class="keyword">class </span>structured_task_group : <span class="keyword">public</span> internal::task_group_base {
+<a name="l00217"></a>00217 <span class="keyword">public</span>:
+<a name="l00218"></a>00218     <span class="keyword">template</span><<span class="keyword">typename</span> F>
+<a name="l00219"></a>00219     task_group_status run_and_wait ( task_handle<F>& h ) {
+<a name="l00220"></a>00220         <span class="keywordflow">return</span> internal_run_and_wait< task_handle<F> >( h );
+<a name="l00221"></a>00221     }
+<a name="l00222"></a>00222 
+<a name="l00223"></a>00223     task_group_status wait() {
+<a name="l00224"></a>00224         task_group_status res = task_group_base::wait();
+<a name="l00225"></a>00225         my_root->set_ref_count(1);
+<a name="l00226"></a>00226         <span class="keywordflow">return</span> res;
+<a name="l00227"></a>00227     }
+<a name="l00228"></a>00228 }; <span class="comment">// class structured_task_group</span>
+<a name="l00229"></a>00229 
+<a name="l00230"></a>00230 <span class="keyword">inline</span> 
+<a name="l00231"></a>00231 <span class="keywordtype">bool</span> is_current_task_group_canceling() {
+<a name="l00232"></a>00232     <span class="keywordflow">return</span> <a class="code" href="a00311.html#bd43e8d6249738efafd12d6a4c72c5e3">task::self</a>().<a class="code" href="a00311.html#025f18118c057c4c8db87ff2ce8df975">is_cancelled</a>();
+<a name="l00233"></a>00233 }
+<a name="l00234"></a>00234 
+<a name="l00235"></a>00235 <span class="keyword">template</span><<span class="keyword">class</span> F>
+<a name="l00236"></a>00236 task_handle<F> make_task( <span class="keyword">const</span> F& f ) {
+<a name="l00237"></a>00237     <span class="keywordflow">return</span> task_handle<F>( f );
+<a name="l00238"></a>00238 }
 <a name="l00239"></a>00239 
-<a name="l00240"></a>00240 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_group_H */</span>
+<a name="l00240"></a>00240 } <span class="comment">// namespace tbb</span>
+<a name="l00241"></a>00241 
+<a name="l00242"></a>00242 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00243"></a>00243 
+<a name="l00244"></a>00244 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_group_H */</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00584.html b/doc/html/a00584.html
index 71e56af..b62f3ed 100644
--- a/doc/html/a00584.html
+++ b/doc/html/a00584.html
@@ -55,59 +55,57 @@
 <a name="l00036"></a>00036 } <span class="comment">// namespace internal</span>
 <a name="l00038"></a>00038 <span class="comment"></span>
 <a name="l00040"></a>00040 
-<a name="l00053"></a><a class="code" href="a00295.html">00053</a> <span class="keyword">class </span><a class="code" href="a00295.html">task_scheduler_init</a>: internal::no_copy {
-<a name="l00054"></a>00054 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span>    <span class="keyword">enum</span> ExceptionPropagationMode {
-<a name="l00056"></a>00056         propagation_mode_exact = 1u,
-<a name="l00057"></a>00057         propagation_mode_captured = 2u,
-<a name="l00058"></a>00058         propagation_mode_mask = propagation_mode_exact | propagation_mode_captured
-<a name="l00059"></a>00059     };
-<a name="l00060"></a>00060 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_EXCEPTIONS */</span>
-<a name="l00061"></a>00061 
-<a name="l00063"></a>00063     internal::scheduler* my_scheduler;
-<a name="l00064"></a>00064 <span class="keyword">public</span>:
-<a name="l00065"></a>00065 
-<a name="l00067"></a><a class="code" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">00067</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1;
-<a name="l00068"></a>00068 
-<a name="l00070"></a><a class="code" href="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">00070</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2;
+<a name="l00053"></a><a class="code" href="a00316.html">00053</a> <span class="keyword">class </span><a class="code" href="a00316.html">task_scheduler_init</a>: internal::no_copy {
+<a name="l00054"></a>00054     <span class="keyword">enum</span> ExceptionPropagationMode {
+<a name="l00055"></a>00055         propagation_mode_exact = 1u,
+<a name="l00056"></a>00056         propagation_mode_captured = 2u,
+<a name="l00057"></a>00057         propagation_mode_mask = propagation_mode_exact | propagation_mode_captured
+<a name="l00058"></a>00058     };
+<a name="l00059"></a>00059 
+<a name="l00061"></a>00061     internal::scheduler* my_scheduler;
+<a name="l00062"></a>00062 <span class="keyword">public</span>:
+<a name="l00063"></a>00063 
+<a name="l00065"></a><a class="code" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">00065</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> = -1;
+<a name="l00066"></a>00066 
+<a name="l00068"></a><a class="code" href="a00316.html#e6c860f1e559026ff3ef4599c0d6c514">00068</a>     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code" href="a00316.html#e6c860f1e559026ff3ef4599c0d6c514">deferred</a> = -2;
+<a name="l00069"></a>00069 
 <a name="l00071"></a>00071 
-<a name="l00073"></a>00073 
-<a name="l00084"></a>00084     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00295.html#d476053cc712e572554823492a5229ce">initialize</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> );
+<a name="l00082"></a>00082     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00316.html#d476053cc712e572554823492a5229ce">initialize</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a> );
+<a name="l00083"></a>00083 
 <a name="l00085"></a>00085 
+<a name="l00086"></a>00086     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00316.html#d476053cc712e572554823492a5229ce">initialize</a>( <span class="keywordtype">int</span> number_of_threads, stack_size_type thread_stack_size );
 <a name="l00087"></a>00087 
-<a name="l00088"></a>00088     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00295.html#d476053cc712e572554823492a5229ce">initialize</a>( <span class="keywordtype">int</span> number_of_threads, stack_size_type thread_stack_size );
-<a name="l00089"></a>00089 
-<a name="l00091"></a>00091     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00295.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
-<a name="l00092"></a>00092 
-<a name="l00094"></a><a class="code" href="a00295.html#421600bf9bf9338bcf937063f2ff0e90">00094</a>     <a class="code" href="a00295.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0 ) : my_scheduler(NULL)  {
-<a name="l00095"></a>00095 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span>        <span class="comment">// Take two lowest order bits of the stack size argument to communicate</span>
-<a name="l00097"></a>00097         <span class="comment">// default exception propagation mode of the client to be used when the</span>
-<a name="l00098"></a>00098         <span class="comment">// client manually creates tasks in the master thread and does not use</span>
-<a name="l00099"></a>00099         <span class="comment">// explicit task group context object. This is necessary because newer </span>
-<a name="l00100"></a>00100         <span class="comment">// TBB binaries with exact propagation enabled by default may be used </span>
-<a name="l00101"></a>00101         <span class="comment">// by older clients that expect tbb::captured_exception wrapper.</span>
-<a name="l00102"></a>00102         <span class="comment">// All zeros mean old client - no preference. </span>
-<a name="l00103"></a>00103         __TBB_ASSERT( !(thread_stack_size & propagation_mode_mask), <span class="stringliteral">"Requested stack size is not aligned"</span> );
-<a name="l00104"></a>00104         thread_stack_size |= TBB_USE_CAPTURED_EXCEPTION ? propagation_mode_captured : propagation_mode_exact;
-<a name="l00105"></a>00105 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_EXCEPTIONS */</span>
-<a name="l00106"></a>00106         <a class="code" href="a00295.html#d476053cc712e572554823492a5229ce">initialize</a>( number_of_threads, thread_stack_size );
-<a name="l00107"></a>00107     }
-<a name="l00108"></a>00108 
-<a name="l00110"></a><a class="code" href="a00295.html#4da6c86292d80c703a66c1f6f5299488">00110</a>     <a class="code" href="a00295.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a>() {
-<a name="l00111"></a>00111         <span class="keywordflow">if</span>( my_scheduler ) 
-<a name="l00112"></a>00112             <a class="code" href="a00295.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
-<a name="l00113"></a>00113         internal::poison_pointer( my_scheduler );
-<a name="l00114"></a>00114     }
-<a name="l00116"></a>00116 
-<a name="l00133"></a>00133     <span class="keyword">static</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00295.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a> ();
-<a name="l00134"></a>00134 
-<a name="l00136"></a><a class="code" href="a00295.html#12752282977029f23416642bc03e8b74">00136</a>     <span class="keywordtype">bool</span> <a class="code" href="a00295.html#12752282977029f23416642bc03e8b74">is_active</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_scheduler != NULL; }
-<a name="l00137"></a>00137 };
+<a name="l00089"></a>00089     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00316.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
+<a name="l00090"></a>00090 
+<a name="l00092"></a><a class="code" href="a00316.html#421600bf9bf9338bcf937063f2ff0e90">00092</a>     <a class="code" href="a00316.html#421600bf9bf9338bcf937063f2ff0e90">task_scheduler_init</a>( <span class="keywordtype">int</span> number_of_threads=<a class="code" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">automatic</a>, stack_size_type thread_stack_size=0 ) : my_scheduler(NULL)  {
+<a name="l00093"></a>00093         <span class="comment">// Two lowest order bits of the stack size argument may be taken to communicate</span>
+<a name="l00094"></a>00094         <span class="comment">// default exception propagation mode of the client to be used when the</span>
+<a name="l00095"></a>00095         <span class="comment">// client manually creates tasks in the master thread and does not use</span>
+<a name="l00096"></a>00096         <span class="comment">// explicit task group context object. This is necessary because newer </span>
+<a name="l00097"></a>00097         <span class="comment">// TBB binaries with exact propagation enabled by default may be used </span>
+<a name="l00098"></a>00098         <span class="comment">// by older clients that expect tbb::captured_exception wrapper.</span>
+<a name="l00099"></a>00099         <span class="comment">// All zeros mean old client - no preference. </span>
+<a name="l00100"></a>00100         __TBB_ASSERT( !(thread_stack_size & propagation_mode_mask), <span class="stringliteral">"Requested stack size is not aligned"</span> );
+<a name="l00101"></a>00101 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
+<a name="l00102"></a>00102 <span class="preprocessor"></span>        thread_stack_size |= TBB_USE_CAPTURED_EXCEPTION ? propagation_mode_captured : propagation_mode_exact;
+<a name="l00103"></a>00103 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_EXCEPTIONS */</span>
+<a name="l00104"></a>00104         <a class="code" href="a00316.html#d476053cc712e572554823492a5229ce">initialize</a>( number_of_threads, thread_stack_size );
+<a name="l00105"></a>00105     }
+<a name="l00106"></a>00106 
+<a name="l00108"></a><a class="code" href="a00316.html#4da6c86292d80c703a66c1f6f5299488">00108</a>     <a class="code" href="a00316.html#4da6c86292d80c703a66c1f6f5299488">~task_scheduler_init</a>() {
+<a name="l00109"></a>00109         <span class="keywordflow">if</span>( my_scheduler ) 
+<a name="l00110"></a>00110             <a class="code" href="a00316.html#f73257e04cb7fb9bd5be2b635d9016f1">terminate</a>();
+<a name="l00111"></a>00111         internal::poison_pointer( my_scheduler );
+<a name="l00112"></a>00112     }
+<a name="l00114"></a>00114 
+<a name="l00131"></a>00131     <span class="keyword">static</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00316.html#ba00714c33a41a3c2216f48613971cab">default_num_threads</a> ();
+<a name="l00132"></a>00132 
+<a name="l00134"></a><a class="code" href="a00316.html#12752282977029f23416642bc03e8b74">00134</a>     <span class="keywordtype">bool</span> <a class="code" href="a00316.html#12752282977029f23416642bc03e8b74">is_active</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> my_scheduler != NULL; }
+<a name="l00135"></a>00135 };
+<a name="l00136"></a>00136 
+<a name="l00137"></a>00137 } <span class="comment">// namespace tbb</span>
 <a name="l00138"></a>00138 
-<a name="l00139"></a>00139 } <span class="comment">// namespace tbb</span>
-<a name="l00140"></a>00140 
-<a name="l00141"></a>00141 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_scheduler_init_H */</span>
+<a name="l00139"></a>00139 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_task_scheduler_init_H */</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00588.html b/doc/html/a00588.html
index 305ea1b..ee303d1 100644
--- a/doc/html/a00588.html
+++ b/doc/html/a00588.html
@@ -78,7 +78,7 @@
 <a name="l00062"></a>00062 <span class="preprocessor"></span>
 <a name="l00064"></a>00064 
 <a name="l00069"></a>00069 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00070"></a><a class="code" href="a00296.html">00070</a> <span class="keyword">class </span><a class="code" href="a00296.html">tbb_allocator</a> {
+<a name="l00070"></a><a class="code" href="a00317.html">00070</a> <span class="keyword">class </span><a class="code" href="a00317.html">tbb_allocator</a> {
 <a name="l00071"></a>00071 <span class="keyword">public</span>:
 <a name="l00072"></a>00072     <span class="keyword">typedef</span> <span class="keyword">typename</span> internal::allocator_type<T>::value_type value_type;
 <a name="l00073"></a>00073     <span class="keyword">typedef</span> value_type* pointer;
@@ -88,39 +88,39 @@
 <a name="l00077"></a>00077     <span class="keyword">typedef</span> size_t size_type;
 <a name="l00078"></a>00078     <span class="keyword">typedef</span> ptrdiff_t difference_type;
 <a name="l00079"></a>00079     <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00080"></a>00080         <span class="keyword">typedef</span> <a class="code" href="a00296.html">tbb_allocator<U></a> other;
+<a name="l00080"></a>00080         <span class="keyword">typedef</span> <a class="code" href="a00317.html">tbb_allocator<U></a> other;
 <a name="l00081"></a>00081     };
 <a name="l00082"></a>00082 
-<a name="l00084"></a><a class="code" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">00084</a>     <span class="keyword">enum</span> <a class="code" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> {
+<a name="l00084"></a><a class="code" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">00084</a>     <span class="keyword">enum</span> <a class="code" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> {
 <a name="l00085"></a>00085         scalable, 
 <a name="l00086"></a>00086         standard
 <a name="l00087"></a>00087     };
 <a name="l00088"></a>00088 
-<a name="l00089"></a>00089     <a class="code" href="a00296.html">tbb_allocator</a>() throw() {}
+<a name="l00089"></a>00089     <a class="code" href="a00317.html">tbb_allocator</a>() throw() {}
 <a name="l00090"></a>00090     tbb_allocator( <span class="keyword">const</span> tbb_allocator& ) throw() {}
 <a name="l00091"></a>00091     <span class="keyword">template</span><<span class="keyword">typename</span> U> tbb_allocator(<span class="keyword">const</span> tbb_allocator<U>&) throw() {}
 <a name="l00092"></a>00092 
 <a name="l00093"></a>00093     pointer address(reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
 <a name="l00094"></a>00094     const_pointer address(const_reference x)<span class="keyword"> const </span>{<span class="keywordflow">return</span> &x;}
 <a name="l00095"></a>00095     
-<a name="l00097"></a><a class="code" href="a00296.html#f6cb487b1bdce0b581f265a77dca6d53">00097</a>     pointer <a class="code" href="a00296.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* <span class="comment">/*hint*/</span> = 0) {
+<a name="l00097"></a><a class="code" href="a00317.html#f6cb487b1bdce0b581f265a77dca6d53">00097</a>     pointer <a class="code" href="a00317.html#f6cb487b1bdce0b581f265a77dca6d53">allocate</a>( size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span>* <span class="comment">/*hint*/</span> = 0) {
 <a name="l00098"></a>00098         <span class="keywordflow">return</span> pointer(internal::allocate_via_handler_v3( n * <span class="keyword">sizeof</span>(value_type) ));
 <a name="l00099"></a>00099     }
 <a name="l00100"></a>00100 
-<a name="l00102"></a><a class="code" href="a00296.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">00102</a>     <span class="keywordtype">void</span> <a class="code" href="a00296.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>( pointer p, size_type ) {
+<a name="l00102"></a><a class="code" href="a00317.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">00102</a>     <span class="keywordtype">void</span> <a class="code" href="a00317.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">deallocate</a>( pointer p, size_type ) {
 <a name="l00103"></a>00103         internal::deallocate_via_handler_v3(p);        
 <a name="l00104"></a>00104     }
 <a name="l00105"></a>00105 
-<a name="l00107"></a><a class="code" href="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">00107</a>     size_type <a class="code" href="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const throw() {
+<a name="l00107"></a><a class="code" href="a00317.html#f059ca2c96243024f0d562ee3a87a3a5">00107</a>     size_type <a class="code" href="a00317.html#f059ca2c96243024f0d562ee3a87a3a5">max_size</a>() const throw() {
 <a name="l00108"></a>00108         size_type max = static_cast<size_type>(-1) / <span class="keyword">sizeof</span> (value_type);
 <a name="l00109"></a>00109         <span class="keywordflow">return</span> (max > 0 ? max : 1);
 <a name="l00110"></a>00110     }
 <a name="l00111"></a>00111     
-<a name="l00113"></a><a class="code" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">00113</a>     <span class="keywordtype">void</span> <a class="code" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
+<a name="l00113"></a><a class="code" href="a00317.html#ab228ab9e324ed041c2226e1d717df5f">00113</a>     <span class="keywordtype">void</span> <a class="code" href="a00317.html#ab228ab9e324ed041c2226e1d717df5f">construct</a>( pointer p, <span class="keyword">const</span> value_type& value ) {::new((<span class="keywordtype">void</span>*)(p)) value_type(value);}
 <a name="l00114"></a>00114 
-<a name="l00116"></a><a class="code" href="a00296.html#ef133522bf55f05a605bee0763208281">00116</a>     <span class="keywordtype">void</span> <a class="code" href="a00296.html#ef133522bf55f05a605bee0763208281">destroy</a>( pointer p ) {p->~value_type();}
+<a name="l00116"></a><a class="code" href="a00317.html#ef133522bf55f05a605bee0763208281">00116</a>     <span class="keywordtype">void</span> <a class="code" href="a00317.html#ef133522bf55f05a605bee0763208281">destroy</a>( pointer p ) {p->~value_type();}
 <a name="l00117"></a>00117 
-<a name="l00119"></a><a class="code" href="a00296.html#78701e7454ef8e1a25b5acd364367080">00119</a>     <span class="keyword">static</span> <a class="code" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> <a class="code" href="a00296.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>() {
+<a name="l00119"></a><a class="code" href="a00317.html#78701e7454ef8e1a25b5acd364367080">00119</a>     <span class="keyword">static</span> <a class="code" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">malloc_type</a> <a class="code" href="a00317.html#78701e7454ef8e1a25b5acd364367080">allocator_type</a>() {
 <a name="l00120"></a>00120         <span class="keywordflow">return</span> internal::is_malloc_used_v3() ? standard : scalable;
 <a name="l00121"></a>00121     }
 <a name="l00122"></a>00122 };
@@ -131,25 +131,25 @@
 <a name="l00127"></a>00127 <span class="preprocessor"></span>
 <a name="l00129"></a>00129 
 <a name="l00130"></a>00130 <span class="keyword">template</span><> 
-<a name="l00131"></a><a class="code" href="a00297.html">00131</a> <span class="keyword">class </span><a class="code" href="a00296.html">tbb_allocator</a><void> {
+<a name="l00131"></a><a class="code" href="a00318.html">00131</a> <span class="keyword">class </span><a class="code" href="a00317.html">tbb_allocator</a><void> {
 <a name="l00132"></a>00132 <span class="keyword">public</span>:
 <a name="l00133"></a>00133     <span class="keyword">typedef</span> <span class="keywordtype">void</span>* pointer;
 <a name="l00134"></a>00134     <span class="keyword">typedef</span> <span class="keyword">const</span> <span class="keywordtype">void</span>* const_pointer;
 <a name="l00135"></a>00135     <span class="keyword">typedef</span> <span class="keywordtype">void</span> value_type;
 <a name="l00136"></a>00136     <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00137"></a>00137         <span class="keyword">typedef</span> <a class="code" href="a00296.html">tbb_allocator<U></a> other;
+<a name="l00137"></a>00137         <span class="keyword">typedef</span> <a class="code" href="a00317.html">tbb_allocator<U></a> other;
 <a name="l00138"></a>00138     };
 <a name="l00139"></a>00139 };
 <a name="l00140"></a>00140 
 <a name="l00141"></a>00141 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00142"></a>00142 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00296.html">tbb_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00296.html">tbb_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
+<a name="l00142"></a>00142 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00317.html">tbb_allocator<T></a>&, <span class="keyword">const</span> <a class="code" href="a00317.html">tbb_allocator<U></a>& ) {<span class="keywordflow">return</span> <span class="keyword">true</span>;}
 <a name="l00143"></a>00143 
 <a name="l00144"></a>00144 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
 <a name="l00145"></a>00145 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=( <span class="keyword">const</span> tbb_allocator<T>&, <span class="keyword">const</span> tbb_allocator<U>& ) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
 <a name="l00146"></a>00146 
 <a name="l00148"></a>00148 
 <a name="l00153"></a>00153 <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">template</span><<span class="keyword">typename</span> X> <span class="keyword">class </span>Allocator = tbb_allocator>
-<a name="l00154"></a><a class="code" href="a00306.html">00154</a> <span class="keyword">class </span><a class="code" href="a00306.html">zero_allocator</a> : <span class="keyword">public</span> Allocator<T>
+<a name="l00154"></a><a class="code" href="a00326.html">00154</a> <span class="keyword">class </span><a class="code" href="a00326.html">zero_allocator</a> : <span class="keyword">public</span> Allocator<T>
 <a name="l00155"></a>00155 {
 <a name="l00156"></a>00156 <span class="keyword">public</span>:
 <a name="l00157"></a>00157     <span class="keyword">typedef</span> Allocator<T> base_allocator_type;
@@ -161,13 +161,13 @@
 <a name="l00163"></a>00163     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::size_type size_type;
 <a name="l00164"></a>00164     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::difference_type difference_type;
 <a name="l00165"></a>00165     <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00166"></a>00166         <span class="keyword">typedef</span> <a class="code" href="a00306.html">zero_allocator<U, Allocator></a> other;
+<a name="l00166"></a>00166         <span class="keyword">typedef</span> <a class="code" href="a00326.html">zero_allocator<U, Allocator></a> other;
 <a name="l00167"></a>00167     };
 <a name="l00168"></a>00168 
-<a name="l00169"></a>00169     <a class="code" href="a00306.html">zero_allocator</a>() <span class="keywordflow">throw</span>() { }
-<a name="l00170"></a>00170     <a class="code" href="a00306.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00306.html">zero_allocator</a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( a ) { }
+<a name="l00169"></a>00169     <a class="code" href="a00326.html">zero_allocator</a>() <span class="keywordflow">throw</span>() { }
+<a name="l00170"></a>00170     <a class="code" href="a00326.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00326.html">zero_allocator</a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( a ) { }
 <a name="l00171"></a>00171     <span class="keyword">template</span><<span class="keyword">typename</span> U>
-<a name="l00172"></a>00172     <a class="code" href="a00306.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00306.html">zero_allocator<U></a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( Allocator<U>( a ) ) { }
+<a name="l00172"></a>00172     <a class="code" href="a00326.html">zero_allocator</a>(<span class="keyword">const</span> <a class="code" href="a00326.html">zero_allocator<U></a> &a) <span class="keywordflow">throw</span>() : base_allocator_type( Allocator<U>( a ) ) { }
 <a name="l00173"></a>00173 
 <a name="l00174"></a>00174     pointer allocate(<span class="keyword">const</span> size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span> *hint = 0 ) {
 <a name="l00175"></a>00175         pointer ptr = base_allocator_type::allocate( n, hint );
@@ -178,19 +178,19 @@
 <a name="l00180"></a>00180 
 <a name="l00182"></a>00182 
 <a name="l00183"></a>00183 <span class="keyword">template</span><<span class="keyword">template</span><<span class="keyword">typename</span> T> <span class="keyword">class </span>Allocator> 
-<a name="l00184"></a><a class="code" href="a00307.html">00184</a> <span class="keyword">class </span><a class="code" href="a00306.html">zero_allocator</a><void, Allocator> : <span class="keyword">public</span> Allocator<void> {
+<a name="l00184"></a><a class="code" href="a00327.html">00184</a> <span class="keyword">class </span><a class="code" href="a00326.html">zero_allocator</a><void, Allocator> : <span class="keyword">public</span> Allocator<void> {
 <a name="l00185"></a>00185 <span class="keyword">public</span>:
 <a name="l00186"></a>00186     <span class="keyword">typedef</span> Allocator<void> base_allocator_type;
 <a name="l00187"></a>00187     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::value_type value_type;
 <a name="l00188"></a>00188     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::pointer pointer;
 <a name="l00189"></a>00189     <span class="keyword">typedef</span> <span class="keyword">typename</span> base_allocator_type::const_pointer const_pointer;
 <a name="l00190"></a>00190     <span class="keyword">template</span><<span class="keyword">typename</span> U> <span class="keyword">struct </span>rebind {
-<a name="l00191"></a>00191         <span class="keyword">typedef</span> <a class="code" href="a00306.html">zero_allocator<U, Allocator></a> other;
+<a name="l00191"></a>00191         <span class="keyword">typedef</span> <a class="code" href="a00326.html">zero_allocator<U, Allocator></a> other;
 <a name="l00192"></a>00192     };
 <a name="l00193"></a>00193 };
 <a name="l00194"></a>00194 
 <a name="l00195"></a>00195 <span class="keyword">template</span><<span class="keyword">typename</span> T1, <span class="keyword">template</span><<span class="keyword">typename</span> X1> <span class="keyword">class </span>B1, <span class="keyword">typename</span> T2, <span class="keyword">template</span><<span class="keyword">typename</span> X2> <span class="keyword">class </span>B2>
-<a name="l00196"></a>00196 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00306.html">zero_allocator<T1,B1></a> &a, <span class="keyword">const</span> <a class="code" href="a00306.html">zero_allocator<T2,B2></a> &b) {
+<a name="l00196"></a>00196 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==( <span class="keyword">const</span> <a class="code" href="a00326.html">zero_allocator<T1,B1></a> &a, <span class="keyword">const</span> <a class="code" href="a00326.html">zero_allocator<T2,B2></a> &b) {
 <a name="l00197"></a>00197     <span class="keywordflow">return</span> static_cast< B1<T1> >(a) == <span class="keyword">static_cast</span>< B2<T2> >(b);
 <a name="l00198"></a>00198 }
 <a name="l00199"></a>00199 <span class="keyword">template</span><<span class="keyword">typename</span> T1, <span class="keyword">template</span><<span class="keyword">typename</span> X1> <span class="keyword">class </span>B1, <span class="keyword">typename</span> T2, <span class="keyword">template</span><<span class="keyword">typename</span> X2> <span class="keyword">class </span>B2>
diff --git a/doc/html/a00592.html b/doc/html/a00592.html
index 5b4c18f..77b4a3d 100644
--- a/doc/html/a00592.html
+++ b/doc/html/a00592.html
@@ -42,190 +42,206 @@
 <a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_config_H</span>
 <a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_config_H</span>
 <a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00033"></a>00033 <span class="preprocessor">#ifndef TBB_USE_DEBUG</span>
-<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_ASSERT</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_DEBUG TBB_DO_ASSERT</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_DEBUG 0</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_ASSERT */</span>
-<a name="l00039"></a>00039 <span class="preprocessor">#else</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define TBB_DO_ASSERT TBB_USE_DEBUG</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_DEBUG */</span>
-<a name="l00042"></a>00042 
-<a name="l00043"></a>00043 <span class="preprocessor">#ifndef TBB_USE_ASSERT</span>
-<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_ASSERT</span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_ASSERT TBB_DO_ASSERT</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">#else </span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_ASSERT TBB_USE_DEBUG</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_ASSERT */</span>
-<a name="l00049"></a>00049 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00050"></a>00050 
-<a name="l00051"></a>00051 <span class="preprocessor">#ifndef TBB_USE_THREADING_TOOLS</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_THREADING_TOOLS</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_THREADING_TOOLS TBB_DO_THREADING_TOOLS</span>
-<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#else </span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_THREADING_TOOLS TBB_USE_DEBUG</span>
-<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_THREADING_TOOLS */</span>
-<a name="l00057"></a>00057 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
-<a name="l00058"></a>00058 
-<a name="l00059"></a>00059 <span class="preprocessor">#ifndef TBB_USE_PERFORMANCE_WARNINGS</span>
-<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_PERFORMANCE_WARNINGS</span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_PERFORMANCE_WARNINGS TBB_PERFORMANCE_WARNINGS</span>
-<a name="l00062"></a>00062 <span class="preprocessor"></span><span class="preprocessor">#else </span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_PERFORMANCE_WARNINGS TBB_USE_DEBUG</span>
-<a name="l00064"></a>00064 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_PEFORMANCE_WARNINGS */</span>
-<a name="l00065"></a>00065 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_PERFORMANCE_WARNINGS */</span>
-<a name="l00066"></a>00066 
-<a name="l00067"></a>00067 <span class="preprocessor">#if !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) && !defined(__SUNPRO_CC) || defined(_XBOX)</span>
-<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor">    #if TBB_USE_EXCEPTIONS</span>
-<a name="l00069"></a>00069 <span class="preprocessor"></span><span class="preprocessor">        #error Compilation settings do not support exception handling. Please do not set TBB_USE_EXCEPTIONS macro or set it to 0.</span>
-<a name="l00070"></a>00070 <span class="preprocessor"></span><span class="preprocessor">    #elif !defined(TBB_USE_EXCEPTIONS)</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor">        #define TBB_USE_EXCEPTIONS 0</span>
-<a name="l00072"></a>00072 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
-<a name="l00073"></a>00073 <span class="preprocessor"></span><span class="preprocessor">#elif !defined(TBB_USE_EXCEPTIONS)</span>
-<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor">    #define TBB_USE_EXCEPTIONS 1</span>
-<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00076"></a>00076 <span class="preprocessor"></span>
-<a name="l00077"></a>00077 <span class="preprocessor">#ifndef TBB_IMPLEMENT_CPP0X</span>
-<a name="l00078"></a>00078 <span class="preprocessor"></span>
-<a name="l00079"></a>00079 <span class="preprocessor">    #if __GNUC__==4 && __GNUC_MINOR__>=4 && __GXX_EXPERIMENTAL_CXX0X__</span>
-<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor">        #define TBB_IMPLEMENT_CPP0X 0</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor">    #else</span>
-<a name="l00082"></a>00082 <span class="preprocessor"></span><span class="preprocessor">        #define TBB_IMPLEMENT_CPP0X 1</span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
-<a name="l00084"></a>00084 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_IMPLEMENT_CPP0X */</span>
-<a name="l00085"></a>00085 
-<a name="l00086"></a>00086 <span class="preprocessor">#ifndef __TBB_DYNAMIC_LOAD_ENABLED</span>
-<a name="l00087"></a>00087 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_DYNAMIC_LOAD_ENABLED !__TBB_TASK_CPP_DIRECTLY_INCLUDED</span>
-<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#elif !__TBB_DYNAMIC_LOAD_ENABLED</span>
-<a name="l00089"></a>00089 <span class="preprocessor"></span><span class="preprocessor">    #if _WIN32||_WIN64</span>
-<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor">        #define __TBB_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00091"></a>00091 <span class="preprocessor"></span><span class="preprocessor">        #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="preprocessor">    #else</span>
-<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor">        #define __TBB_WEAK_SYMBOLS 1</span>
-<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
-<a name="l00095"></a>00095 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span>
-<a name="l00099"></a>00099 <span class="preprocessor">#ifndef __TBB_COUNT_TASK_NODES</span>
-<a name="l00100"></a>00100 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_COUNT_TASK_NODES TBB_USE_ASSERT</span>
-<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00102"></a>00102 <span class="preprocessor"></span>
-<a name="l00103"></a>00103 <span class="preprocessor">#ifndef __TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00104"></a>00104 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_TASK_GROUP_CONTEXT 1</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
-<a name="l00106"></a>00106 
-<a name="l00107"></a>00107 <span class="preprocessor">#ifndef __TBB_SCHEDULER_OBSERVER</span>
-<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_SCHEDULER_OBSERVER 1</span>
-<a name="l00109"></a>00109 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_SCHEDULER_OBSERVER */</span>
-<a name="l00110"></a>00110 
-<a name="l00111"></a>00111 <span class="preprocessor">#ifndef __TBB_TASK_PRIORITY</span>
-<a name="l00112"></a>00112 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_TASK_PRIORITY __TBB_CPF_BUILD</span>
-<a name="l00113"></a>00113 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
-<a name="l00114"></a>00114 
-<a name="l00115"></a>00115 <span class="preprocessor">#if __TBB_TASK_PRIORITY && !__TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00116"></a>00116 <span class="preprocessor"></span><span class="preprocessor">    #error __TBB_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00118"></a>00118 <span class="preprocessor"></span>
-<a name="l00119"></a>00119 <span class="preprocessor">#ifdef TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00120"></a>00120 <span class="preprocessor"></span><span class="preprocessor">    #if TBB_PREVIEW_TASK_PRIORITY</span>
-<a name="l00121"></a>00121 <span class="preprocessor"></span><span class="preprocessor">        #define __TBB_NO_IMPLICIT_LINKAGE 1</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span><span class="preprocessor">        #if __TBB_BUILD && !__TBB_TASK_PRIORITY</span>
-<a name="l00123"></a>00123 <span class="preprocessor"></span><span class="preprocessor">            #error TBB_PREVIEW_TASK_PRIORITY requires __TBB_TASK_PRIORITY to be enabled during TBB build</span>
-<a name="l00124"></a>00124 <span class="preprocessor"></span><span class="preprocessor">        #elif !__TBB_TASK_GROUP_CONTEXT</span>
-<a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor">            #error TBB_PREVIEW_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled</span>
-<a name="l00126"></a>00126 <span class="preprocessor"></span><span class="preprocessor">        #endif</span>
-<a name="l00127"></a>00127 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00129"></a>00129 <span class="preprocessor"></span><span class="preprocessor">    #if __TBB_BUILD</span>
-<a name="l00130"></a>00130 <span class="preprocessor"></span><span class="preprocessor">        #define TBB_PREVIEW_TASK_PRIORITY __TBB_TASK_PRIORITY</span>
-<a name="l00131"></a>00131 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
-<a name="l00132"></a>00132 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_PREVIEW_TASK_PRIORITY */</span>
-<a name="l00133"></a>00133 
-<a name="l00134"></a>00134 <span class="preprocessor">#if !defined(__TBB_SURVIVE_THREAD_SWITCH) && (_WIN32 || _WIN64 || __linux__)</span>
-<a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_SURVIVE_THREAD_SWITCH 1</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_SURVIVE_THREAD_SWITCH */</span>
-<a name="l00137"></a>00137 
-<a name="l00138"></a>00138 
-<a name="l00139"></a>00139 <span class="comment">/* TODO: The following condition should be extended as soon as new compilers/runtimes </span>
-<a name="l00140"></a>00140 <span class="comment">         with std::exception_ptr support appear. */</span>
-<a name="l00141"></a>00141 <span class="preprocessor">#define __TBB_EXCEPTION_PTR_PRESENT  (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && (__GNUC__==4 && __GNUC_MINOR__>=4))</span>
-<a name="l00142"></a>00142 <span class="preprocessor"></span>
-<a name="l00143"></a>00143 
-<a name="l00144"></a>00144 <span class="preprocessor">#ifndef TBB_USE_CAPTURED_EXCEPTION</span>
-<a name="l00145"></a>00145 <span class="preprocessor"></span><span class="preprocessor">    #if __TBB_EXCEPTION_PTR_PRESENT</span>
-<a name="l00146"></a>00146 <span class="preprocessor"></span><span class="preprocessor">        #define TBB_USE_CAPTURED_EXCEPTION 0</span>
-<a name="l00147"></a>00147 <span class="preprocessor"></span><span class="preprocessor">    #else</span>
-<a name="l00148"></a>00148 <span class="preprocessor"></span><span class="preprocessor">        #define TBB_USE_CAPTURED_EXCEPTION 1</span>
-<a name="l00149"></a>00149 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00151"></a>00151 <span class="preprocessor">    #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT</span>
-<a name="l00152"></a>00152 <span class="preprocessor"></span><span class="preprocessor">        #error Current runtime does not support std::exception_ptr. Set TBB_USE_CAPTURED_EXCEPTION and make sure that your code is ready to catch tbb::captured_exception.</span>
-<a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
-<a name="l00154"></a>00154 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
-<a name="l00155"></a>00155 
-<a name="l00156"></a>00156 
-<a name="l00157"></a>00157 <span class="preprocessor">#ifndef __TBB_DEFAULT_PARTITIONER</span>
-<a name="l00158"></a>00158 <span class="preprocessor"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
-<a name="l00159"></a>00159 <span class="preprocessor"></span>
-<a name="l00160"></a>00160 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::simple_partitioner</span>
-<a name="l00161"></a>00161 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00162"></a>00162 <span class="preprocessor"></span>
-<a name="l00163"></a>00163 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::auto_partitioner</span>
-<a name="l00164"></a>00164 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEFAULT_PARTITIONER */</span>
-<a name="l00165"></a>00165 <span class="preprocessor">#endif </span><span class="comment">/* !defined(__TBB_DEFAULT_PARTITIONER */</span>
-<a name="l00166"></a>00166 
-<a name="l00169"></a>00169 <span class="preprocessor">#if __GNUC__==4 && __GNUC_MINOR__>=4 && !defined(__INTEL_COMPILER)</span>
-<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_GCC_WARNING_SUPPRESSION_ENABLED 1</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00172"></a>00172 <span class="preprocessor"></span>
-<a name="l00179"></a>00179 <span class="preprocessor">#if _MSC_VER && __INTEL_COMPILER && (__INTEL_COMPILER<1110 || __INTEL_COMPILER==1110 && __INTEL_COMPILER_BUILD_DATE < 20091012)</span>
-<a name="l00180"></a>00180 <span class="preprocessor"></span>
-<a name="l00183"></a>00183 <span class="preprocessor">    #define __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN 1</span>
-<a name="l00184"></a>00184 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00185"></a>00185 <span class="preprocessor"></span>
-<a name="l00186"></a>00186 <span class="preprocessor">#if defined(_MSC_VER) && _MSC_VER < 1500 && !defined(__INTEL_COMPILER)</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span>
-<a name="l00189"></a>00189 <span class="preprocessor">    #define __TBB_TEMPLATE_FRIENDS_BROKEN 1</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#define __TBB_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)</span>
+<a name="l00033"></a>00033 <span class="preprocessor"></span>
+<a name="l00036"></a>00036 <span class="preprocessor">#if (__TBB_GCC_VERSION >= 40400) && !defined(__INTEL_COMPILER)</span>
+<a name="l00037"></a>00037 <span class="preprocessor"></span>
+<a name="l00038"></a>00038 <span class="preprocessor">    #define __TBB_GCC_WARNING_SUPPRESSION_PRESENT 1</span>
+<a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00040"></a>00040 <span class="preprocessor"></span>
+<a name="l00041"></a>00041 <span class="comment">/* TODO: The following condition should be extended when new compilers/runtimes </span>
+<a name="l00042"></a>00042 <span class="comment">         with std::exception_ptr support appear. */</span>
+<a name="l00043"></a>00043 <span class="preprocessor">#define __TBB_EXCEPTION_PTR_PRESENT  ((_MSC_VER >= 1600 || (__GXX_EXPERIMENTAL_CXX0X__ && __GNUC__==4 && __GNUC_MINOR__>=4)) && !__INTEL_COMPILER)</span>
+<a name="l00044"></a>00044 <span class="preprocessor"></span>
+<a name="l00045"></a>00045 <span class="preprocessor">#if __GNUC__ || __SUNPRO_CC || __IBMCPP__</span>
+<a name="l00046"></a>00046 <span class="preprocessor"></span>    <span class="comment">/* ICC defines __GNUC__ and so is covered */</span>
+<a name="l00047"></a>00047 <span class="preprocessor">    #define __TBB_ATTRIBUTE_ALIGNED_PRESENT 1</span>
+<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor">#elif _MSC_VER && (_MSC_VER >= 1300 || __INTEL_COMPILER)</span>
+<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_DECLSPEC_ALIGN_PRESENT 1</span>
+<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span>
+<a name="l00052"></a>00052 <span class="preprocessor">#if (__TBB_GCC_VERSION >= 40102) && !defined(__INTEL_COMPILER)</span>
+<a name="l00053"></a>00053 <span class="preprocessor"></span>
+<a name="l00054"></a>00054 <span class="preprocessor">    #define __TBB_GCC_BUILTIN_ATOMICS_PRESENT 1</span>
+<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00056"></a>00056 <span class="preprocessor"></span>
+<a name="l00059"></a>00059 <span class="preprocessor">#ifndef TBB_USE_DEBUG</span>
+<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_ASSERT</span>
+<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_DEBUG TBB_DO_ASSERT</span>
+<a name="l00062"></a>00062 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor">#ifdef _DEBUG</span>
+<a name="l00064"></a>00064 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_DEBUG _DEBUG</span>
+<a name="l00065"></a>00065 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00066"></a>00066 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_DEBUG 0</span>
+<a name="l00067"></a>00067 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_ASSERT */</span>
+<a name="l00069"></a>00069 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_DEBUG */</span>
+<a name="l00070"></a>00070 
+<a name="l00071"></a>00071 <span class="preprocessor">#ifndef TBB_USE_ASSERT</span>
+<a name="l00072"></a>00072 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_ASSERT</span>
+<a name="l00073"></a>00073 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_ASSERT TBB_DO_ASSERT</span>
+<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor">#else </span>
+<a name="l00075"></a>00075 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_ASSERT TBB_USE_DEBUG</span>
+<a name="l00076"></a>00076 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_ASSERT */</span>
+<a name="l00077"></a>00077 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00078"></a>00078 
+<a name="l00079"></a>00079 <span class="preprocessor">#ifndef TBB_USE_THREADING_TOOLS</span>
+<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_DO_THREADING_TOOLS</span>
+<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_THREADING_TOOLS TBB_DO_THREADING_TOOLS</span>
+<a name="l00082"></a>00082 <span class="preprocessor"></span><span class="preprocessor">#else </span>
+<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_THREADING_TOOLS TBB_USE_DEBUG</span>
+<a name="l00084"></a>00084 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DO_THREADING_TOOLS */</span>
+<a name="l00085"></a>00085 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_THREADING_TOOLS */</span>
+<a name="l00086"></a>00086 
+<a name="l00087"></a>00087 <span class="preprocessor">#ifndef TBB_USE_PERFORMANCE_WARNINGS</span>
+<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#ifdef TBB_PERFORMANCE_WARNINGS</span>
+<a name="l00089"></a>00089 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_PERFORMANCE_WARNINGS TBB_PERFORMANCE_WARNINGS</span>
+<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor">#else </span>
+<a name="l00091"></a>00091 <span class="preprocessor"></span><span class="preprocessor">#define TBB_USE_PERFORMANCE_WARNINGS TBB_USE_DEBUG</span>
+<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_PEFORMANCE_WARNINGS */</span>
+<a name="l00093"></a>00093 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_PERFORMANCE_WARNINGS */</span>
+<a name="l00094"></a>00094 
+<a name="l00095"></a>00095 <span class="preprocessor">#if !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) && !defined(__SUNPRO_CC) || defined(_XBOX)</span>
+<a name="l00096"></a>00096 <span class="preprocessor"></span><span class="preprocessor">    #if TBB_USE_EXCEPTIONS</span>
+<a name="l00097"></a>00097 <span class="preprocessor"></span><span class="preprocessor">        #error Compilation settings do not support exception handling. Please do not set TBB_USE_EXCEPTIONS macro or set it to 0.</span>
+<a name="l00098"></a>00098 <span class="preprocessor"></span><span class="preprocessor">    #elif !defined(TBB_USE_EXCEPTIONS)</span>
+<a name="l00099"></a>00099 <span class="preprocessor"></span><span class="preprocessor">        #define TBB_USE_EXCEPTIONS 0</span>
+<a name="l00100"></a>00100 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
+<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="preprocessor">#elif !defined(TBB_USE_EXCEPTIONS)</span>
+<a name="l00102"></a>00102 <span class="preprocessor"></span><span class="preprocessor">    #define TBB_USE_EXCEPTIONS 1</span>
+<a name="l00103"></a>00103 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00104"></a>00104 <span class="preprocessor"></span>
+<a name="l00105"></a>00105 <span class="preprocessor">#ifndef TBB_IMPLEMENT_CPP0X</span>
+<a name="l00106"></a>00106 <span class="preprocessor"></span>
+<a name="l00107"></a>00107 <span class="preprocessor">    #if __GNUC__==4 && __GNUC_MINOR__>=4 && __GXX_EXPERIMENTAL_CXX0X__</span>
+<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="preprocessor">        #define TBB_IMPLEMENT_CPP0X 0</span>
+<a name="l00109"></a>00109 <span class="preprocessor"></span><span class="preprocessor">    #else</span>
+<a name="l00110"></a>00110 <span class="preprocessor"></span><span class="preprocessor">        #define TBB_IMPLEMENT_CPP0X 1</span>
+<a name="l00111"></a>00111 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
+<a name="l00112"></a>00112 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_IMPLEMENT_CPP0X */</span>
+<a name="l00113"></a>00113 
+<a name="l00114"></a>00114 <span class="preprocessor">#ifndef TBB_USE_CAPTURED_EXCEPTION</span>
+<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor">    #if __TBB_EXCEPTION_PTR_PRESENT</span>
+<a name="l00116"></a>00116 <span class="preprocessor"></span><span class="preprocessor">        #define TBB_USE_CAPTURED_EXCEPTION 0</span>
+<a name="l00117"></a>00117 <span class="preprocessor"></span><span class="preprocessor">    #else</span>
+<a name="l00118"></a>00118 <span class="preprocessor"></span><span class="preprocessor">        #define TBB_USE_CAPTURED_EXCEPTION 1</span>
+<a name="l00119"></a>00119 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
+<a name="l00120"></a>00120 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00121"></a>00121 <span class="preprocessor">    #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT</span>
+<a name="l00122"></a>00122 <span class="preprocessor"></span><span class="preprocessor">        #error Current runtime does not support std::exception_ptr. Set TBB_USE_CAPTURED_EXCEPTION and make sure that your code is ready to catch tbb::captured_exception.</span>
+<a name="l00123"></a>00123 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
+<a name="l00124"></a>00124 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* defined TBB_USE_CAPTURED_EXCEPTION */</span>
+<a name="l00125"></a>00125 
+<a name="l00127"></a>00127 <span class="preprocessor">#if (TBB_USE_GCC_BUILTINS && !__TBB_GCC_BUILTIN_ATOMICS_PRESENT)</span>
+<a name="l00128"></a>00128 <span class="preprocessor"></span><span class="preprocessor">    #error "GCC atomic built-ins are not supported."</span>
+<a name="l00129"></a>00129 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00130"></a>00130 <span class="preprocessor"></span>
+<a name="l00133"></a>00133 <span class="preprocessor">#ifndef __TBB_DYNAMIC_LOAD_ENABLED</span>
+<a name="l00134"></a>00134 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_DYNAMIC_LOAD_ENABLED !__TBB_TASK_CPP_DIRECTLY_INCLUDED</span>
+<a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor">#elif !__TBB_DYNAMIC_LOAD_ENABLED</span>
+<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">    #if _WIN32||_WIN64</span>
+<a name="l00137"></a>00137 <span class="preprocessor"></span><span class="preprocessor">        #define __TBB_NO_IMPLICIT_LINKAGE 1</span>
+<a name="l00138"></a>00138 <span class="preprocessor"></span><span class="preprocessor">        #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1</span>
+<a name="l00139"></a>00139 <span class="preprocessor"></span><span class="preprocessor">    #else</span>
+<a name="l00140"></a>00140 <span class="preprocessor"></span><span class="preprocessor">        #define __TBB_WEAK_SYMBOLS 1</span>
+<a name="l00141"></a>00141 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
+<a name="l00142"></a>00142 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00143"></a>00143 <span class="preprocessor"></span>
+<a name="l00144"></a>00144 <span class="preprocessor">#ifndef __TBB_COUNT_TASK_NODES</span>
+<a name="l00145"></a>00145 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_COUNT_TASK_NODES TBB_USE_ASSERT</span>
+<a name="l00146"></a>00146 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00147"></a>00147 <span class="preprocessor"></span>
+<a name="l00148"></a>00148 <span class="preprocessor">#ifndef __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00149"></a>00149 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_TASK_GROUP_CONTEXT 1</span>
+<a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_GROUP_CONTEXT */</span>
+<a name="l00151"></a>00151 
+<a name="l00152"></a>00152 <span class="preprocessor">#if TBB_USE_EXCEPTIONS && !__TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor">    #error TBB_USE_EXCEPTIONS requires __TBB_TASK_GROUP_CONTEXT to be enabled</span>
+<a name="l00154"></a>00154 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00155"></a>00155 <span class="preprocessor"></span>
+<a name="l00156"></a>00156 <span class="preprocessor">#ifndef __TBB_SCHEDULER_OBSERVER</span>
+<a name="l00157"></a>00157 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_SCHEDULER_OBSERVER 1</span>
+<a name="l00158"></a>00158 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_SCHEDULER_OBSERVER */</span>
+<a name="l00159"></a>00159 
+<a name="l00160"></a>00160 <span class="preprocessor">#ifndef __TBB_TASK_PRIORITY</span>
+<a name="l00161"></a>00161 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_TASK_PRIORITY __TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00162"></a>00162 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_TASK_PRIORITY */</span>
+<a name="l00163"></a>00163 
+<a name="l00164"></a>00164 <span class="preprocessor">#if __TBB_TASK_PRIORITY && !__TBB_TASK_GROUP_CONTEXT</span>
+<a name="l00165"></a>00165 <span class="preprocessor"></span><span class="preprocessor">    #error __TBB_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled</span>
+<a name="l00166"></a>00166 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00167"></a>00167 <span class="preprocessor"></span>
+<a name="l00168"></a>00168 <span class="preprocessor">#if !defined(__TBB_SURVIVE_THREAD_SWITCH) && (_WIN32 || _WIN64 || __linux__)</span>
+<a name="l00169"></a>00169 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_SURVIVE_THREAD_SWITCH 1</span>
+<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_SURVIVE_THREAD_SWITCH */</span>
+<a name="l00171"></a>00171 
+<a name="l00172"></a>00172 <span class="preprocessor">#ifndef __TBB_DEFAULT_PARTITIONER</span>
+<a name="l00173"></a>00173 <span class="preprocessor"></span><span class="preprocessor">#if TBB_DEPRECATED</span>
+<a name="l00174"></a>00174 <span class="preprocessor"></span>
+<a name="l00175"></a>00175 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::simple_partitioner</span>
+<a name="l00176"></a>00176 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00177"></a>00177 <span class="preprocessor"></span>
+<a name="l00178"></a>00178 <span class="preprocessor">#define __TBB_DEFAULT_PARTITIONER tbb::auto_partitioner</span>
+<a name="l00179"></a>00179 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* TBB_DEPRECATED */</span>
+<a name="l00180"></a>00180 <span class="preprocessor">#endif </span><span class="comment">/* !defined(__TBB_DEFAULT_PARTITIONER */</span>
+<a name="l00181"></a>00181 
+<a name="l00188"></a>00188 <span class="preprocessor">#if __GNUC__ && __TBB_x86_64 && __INTEL_COMPILER == 1200</span>
+<a name="l00189"></a>00189 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_ICC_12_0_INL_ASM_FSTCW_BROKEN 1</span>
 <a name="l00190"></a>00190 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
 <a name="l00191"></a>00191 <span class="preprocessor"></span>
-<a name="l00192"></a>00192 <span class="preprocessor">#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__</span>
-<a name="l00194"></a>00194 <span class="preprocessor"></span>
-<a name="l00195"></a>00195 <span class="preprocessor">    #define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1</span>
-<a name="l00196"></a>00196 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00197"></a>00197 <span class="preprocessor"></span>
-<a name="l00198"></a>00198 <span class="preprocessor">#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110</span>
-<a name="l00199"></a>00199 <span class="preprocessor"></span>
-<a name="l00200"></a>00200 <span class="preprocessor">    #define __TBB_ICL_11_1_CODE_GEN_BROKEN 1</span>
-<a name="l00201"></a>00201 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00202"></a>00202 <span class="preprocessor"></span>
-<a name="l00203"></a>00203 <span class="preprocessor">#if __GNUC__==3 && __GNUC_MINOR__==3 && !defined(__INTEL_COMPILER)</span>
+<a name="l00192"></a>00192 <span class="preprocessor">#if _MSC_VER && __INTEL_COMPILER && (__INTEL_COMPILER<1110 || __INTEL_COMPILER==1110 && __INTEL_COMPILER_BUILD_DATE < 20091012)</span>
+<a name="l00193"></a>00193 <span class="preprocessor"></span>
+<a name="l00196"></a>00196 <span class="preprocessor">    #define __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN 1</span>
+<a name="l00197"></a>00197 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00198"></a>00198 <span class="preprocessor"></span>
+<a name="l00199"></a>00199 <span class="preprocessor">#if defined(_MSC_VER) && _MSC_VER < 1500 && !defined(__INTEL_COMPILER)</span>
+<a name="l00200"></a>00200 <span class="preprocessor"></span>
+<a name="l00202"></a>00202 <span class="preprocessor">    #define __TBB_TEMPLATE_FRIENDS_BROKEN 1</span>
+<a name="l00203"></a>00203 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
 <a name="l00204"></a>00204 <span class="preprocessor"></span>
-<a name="l00205"></a>00205 <span class="preprocessor">    #define __TBB_GCC_3_3_PROTECTED_BROKEN 1</span>
-<a name="l00206"></a>00206 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00205"></a>00205 <span class="preprocessor">#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__ || (__APPLE__ && __INTEL_COMPILER==1200 && !TBB_USE_DEBUG)</span>
 <a name="l00207"></a>00207 <span class="preprocessor"></span>
-<a name="l00208"></a>00208 <span class="preprocessor">#if __MINGW32__ && (__GNUC__<4 || __GNUC__==4 && __GNUC_MINOR__<2)</span>
-<a name="l00209"></a>00209 <span class="preprocessor"></span>
-<a name="l00211"></a>00211 <span class="preprocessor">    #define __TBB_SSE_STACK_ALIGNMENT_BROKEN 1</span>
-<a name="l00212"></a>00212 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00213"></a>00213 <span class="preprocessor"></span>
-<a name="l00214"></a>00214 <span class="preprocessor">#if __GNUC__==4 && __GNUC_MINOR__==3 && __GNUC_PATCHLEVEL__==0</span>
-<a name="l00215"></a>00215 <span class="preprocessor"></span>    <span class="comment">// GCC of this version may rashly ignore control dependencies</span>
-<a name="l00216"></a>00216 <span class="preprocessor">    #define __TBB_GCC_OPTIMIZER_ORDERING_BROKEN 1</span>
-<a name="l00217"></a>00217 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00218"></a>00218 <span class="preprocessor"></span>
-<a name="l00219"></a>00219 <span class="preprocessor">#if __FreeBSD__</span>
+<a name="l00208"></a>00208 <span class="preprocessor">    #define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1</span>
+<a name="l00209"></a>00209 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00210"></a>00210 <span class="preprocessor"></span>
+<a name="l00211"></a>00211 <span class="preprocessor">#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110</span>
+<a name="l00212"></a>00212 <span class="preprocessor"></span>
+<a name="l00213"></a>00213 <span class="preprocessor">    #define __TBB_ICL_11_1_CODE_GEN_BROKEN 1</span>
+<a name="l00214"></a>00214 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00215"></a>00215 <span class="preprocessor"></span>
+<a name="l00216"></a>00216 <span class="preprocessor">#if __GNUC__==3 && __GNUC_MINOR__==3 && !defined(__INTEL_COMPILER)</span>
+<a name="l00217"></a>00217 <span class="preprocessor"></span>
+<a name="l00218"></a>00218 <span class="preprocessor">    #define __TBB_GCC_3_3_PROTECTED_BROKEN 1</span>
+<a name="l00219"></a>00219 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
 <a name="l00220"></a>00220 <span class="preprocessor"></span>
-<a name="l00222"></a>00222 <span class="preprocessor">    #define __TBB_PRIO_INHERIT_BROKEN 1</span>
-<a name="l00223"></a>00223 <span class="preprocessor"></span>
-<a name="l00226"></a>00226 <span class="preprocessor">    #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1</span>
-<a name="l00227"></a>00227 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __FreeBSD__ */</span>
-<a name="l00228"></a>00228 
-<a name="l00229"></a>00229 <span class="preprocessor">#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER)</span>
-<a name="l00230"></a>00230 <span class="preprocessor"></span>
-<a name="l00232"></a>00232 <span class="preprocessor">    #define __TBB_ICC_ASM_VOLATILE_BROKEN 1</span>
-<a name="l00233"></a>00233 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00234"></a>00234 <span class="preprocessor"></span>
-<a name="l00235"></a>00235 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_H */</span>
+<a name="l00221"></a>00221 <span class="preprocessor">#if __MINGW32__ && (__GNUC__<4 || __GNUC__==4 && __GNUC_MINOR__<2)</span>
+<a name="l00222"></a>00222 <span class="preprocessor"></span>
+<a name="l00224"></a>00224 <span class="preprocessor">    #define __TBB_SSE_STACK_ALIGNMENT_BROKEN 1</span>
+<a name="l00225"></a>00225 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00226"></a>00226 <span class="preprocessor"></span>
+<a name="l00227"></a>00227 <span class="preprocessor">#if __GNUC__==4 && __GNUC_MINOR__==3 && __GNUC_PATCHLEVEL__==0</span>
+<a name="l00228"></a>00228 <span class="preprocessor"></span>    <span class="comment">// GCC of this version may rashly ignore control dependencies</span>
+<a name="l00229"></a>00229 <span class="preprocessor">    #define __TBB_GCC_OPTIMIZER_ORDERING_BROKEN 1</span>
+<a name="l00230"></a>00230 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00231"></a>00231 <span class="preprocessor"></span>
+<a name="l00232"></a>00232 <span class="preprocessor">#if __FreeBSD__</span>
+<a name="l00233"></a>00233 <span class="preprocessor"></span>
+<a name="l00235"></a>00235 <span class="preprocessor">    #define __TBB_PRIO_INHERIT_BROKEN 1</span>
+<a name="l00236"></a>00236 <span class="preprocessor"></span>
+<a name="l00239"></a>00239 <span class="preprocessor">    #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1</span>
+<a name="l00240"></a>00240 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __FreeBSD__ */</span>
+<a name="l00241"></a>00241 
+<a name="l00242"></a>00242 <span class="preprocessor">#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER)</span>
+<a name="l00243"></a>00243 <span class="preprocessor"></span>
+<a name="l00245"></a>00245 <span class="preprocessor">    #define __TBB_ICC_ASM_VOLATILE_BROKEN 1</span>
+<a name="l00246"></a>00246 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00247"></a>00247 <span class="preprocessor"></span>
+<a name="l00248"></a>00248 <span class="preprocessor">#if !__INTEL_COMPILER && (_MSC_VER || __GNUC__==3 && __GNUC_MINOR__<=2)</span>
+<a name="l00249"></a>00249 <span class="preprocessor"></span>
+<a name="l00251"></a>00251 <span class="preprocessor">    #define __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN 1</span>
+<a name="l00252"></a>00252 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00253"></a>00253 <span class="preprocessor"></span>
+<a name="l00254"></a>00254 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_config_H */</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00593.html b/doc/html/a00593.html
index c03be4c..a928935 100644
--- a/doc/html/a00593.html
+++ b/doc/html/a00593.html
@@ -59,25 +59,25 @@
 <a name="l00038"></a>00038 <span class="preprocessor"></span>
 <a name="l00039"></a>00039 <span class="keyword">namespace </span>tbb {
 <a name="l00040"></a>00040 
-<a name="l00042"></a><a class="code" href="a00220.html">00042</a> <span class="keyword">class </span><a class="code" href="a00220.html">bad_last_alloc</a> : <span class="keyword">public</span> std::bad_alloc {
+<a name="l00042"></a><a class="code" href="a00232.html">00042</a> <span class="keyword">class </span><a class="code" href="a00232.html">bad_last_alloc</a> : <span class="keyword">public</span> std::bad_alloc {
 <a name="l00043"></a>00043 <span class="keyword">public</span>:
 <a name="l00044"></a>00044     <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
 <a name="l00045"></a>00045 <span class="preprocessor">#if __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span>    <span class="comment">/*override*/</span> ~<a class="code" href="a00220.html">bad_last_alloc</a>() <span class="keywordflow">throw</span>() {}
+<a name="l00046"></a>00046 <span class="preprocessor"></span>    <span class="comment">/*override*/</span> ~<a class="code" href="a00232.html">bad_last_alloc</a>() <span class="keywordflow">throw</span>() {}
 <a name="l00047"></a>00047 <span class="preprocessor">#endif</span>
 <a name="l00048"></a>00048 <span class="preprocessor"></span>};
 <a name="l00049"></a>00049 
-<a name="l00051"></a><a class="code" href="a00252.html">00051</a> <span class="keyword">class </span><a class="code" href="a00252.html">improper_lock</a> : <span class="keyword">public</span> std::exception {
+<a name="l00051"></a><a class="code" href="a00264.html">00051</a> <span class="keyword">class </span><a class="code" href="a00264.html">improper_lock</a> : <span class="keyword">public</span> std::exception {
 <a name="l00052"></a>00052 <span class="keyword">public</span>:
 <a name="l00053"></a>00053     <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
 <a name="l00054"></a>00054 };
 <a name="l00055"></a>00055 
-<a name="l00057"></a><a class="code" href="a00256.html">00057</a> <span class="keyword">class </span><a class="code" href="a00256.html">missing_wait</a> : <span class="keyword">public</span> std::exception {
+<a name="l00057"></a><a class="code" href="a00272.html">00057</a> <span class="keyword">class </span><a class="code" href="a00272.html">missing_wait</a> : <span class="keyword">public</span> std::exception {
 <a name="l00058"></a>00058 <span class="keyword">public</span>:
 <a name="l00059"></a>00059     <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
 <a name="l00060"></a>00060 };
 <a name="l00061"></a>00061 
-<a name="l00063"></a><a class="code" href="a00253.html">00063</a> <span class="keyword">class </span><a class="code" href="a00253.html">invalid_multiple_scheduling</a> : <span class="keyword">public</span> std::exception {
+<a name="l00063"></a><a class="code" href="a00265.html">00063</a> <span class="keyword">class </span><a class="code" href="a00265.html">invalid_multiple_scheduling</a> : <span class="keyword">public</span> std::exception {
 <a name="l00064"></a>00064 <span class="keyword">public</span>:
 <a name="l00065"></a>00065     <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* what() <span class="keyword">const</span> <span class="keywordflow">throw</span>();
 <a name="l00066"></a>00066 };
@@ -124,77 +124,77 @@
 <a name="l00113"></a>00113 <span class="keyword">namespace </span>tbb {
 <a name="l00114"></a>00114 
 <a name="l00116"></a>00116 
-<a name="l00136"></a><a class="code" href="a00298.html">00136</a> <span class="keyword">class </span><a class="code" href="a00298.html">tbb_exception</a> : <span class="keyword">public</span> std::exception
+<a name="l00136"></a><a class="code" href="a00319.html">00136</a> <span class="keyword">class </span><a class="code" href="a00319.html">tbb_exception</a> : <span class="keyword">public</span> std::exception
 <a name="l00137"></a>00137 {
 <a name="l00141"></a>00141     <span class="keywordtype">void</span>* operator new ( size_t );
 <a name="l00142"></a>00142 
 <a name="l00143"></a>00143 <span class="keyword">public</span>:
 <a name="l00145"></a>00145 
-<a name="l00146"></a>00146     <span class="keyword">virtual</span> <a class="code" href="a00298.html">tbb_exception</a>* <a class="code" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> () <span class="keywordflow">throw</span>() = 0;
+<a name="l00146"></a>00146     <span class="keyword">virtual</span> <a class="code" href="a00319.html">tbb_exception</a>* <a class="code" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">move</a> () <span class="keywordflow">throw</span>() = 0;
 <a name="l00147"></a>00147 
 <a name="l00149"></a>00149 
-<a name="l00151"></a>00151     <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00298.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> () <span class="keywordflow">throw</span>() = 0;
+<a name="l00151"></a>00151     <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00319.html#66c94938eca8bf88b76f3eccaaf215d8">destroy</a> () <span class="keywordflow">throw</span>() = 0;
 <a name="l00152"></a>00152 
 <a name="l00154"></a>00154 
-<a name="l00158"></a>00158     <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00298.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> () = 0;
+<a name="l00158"></a>00158     <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="a00319.html#8588e07fa49692f4d734e4f2e4f048f4">throw_self</a> () = 0;
 <a name="l00159"></a>00159 
-<a name="l00161"></a>00161     <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00298.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
+<a name="l00161"></a>00161     <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00319.html#d00f6497e552fee978a02bfcbebf46e2">name</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
 <a name="l00162"></a>00162 
-<a name="l00164"></a>00164     <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
+<a name="l00164"></a>00164     <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00319.html#e8157689ecb66bc6c72d3618bf3cc371">what</a>() <span class="keyword">const</span> <span class="keywordflow">throw</span>() = 0;
 <a name="l00165"></a>00165 
-<a name="l00172"></a><a class="code" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">00172</a>     <span class="keywordtype">void</span> <a class="code" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete </a>( <span class="keywordtype">void</span>* p ) {
+<a name="l00172"></a><a class="code" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">00172</a>     <span class="keywordtype">void</span> <a class="code" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">operator delete </a>( <span class="keywordtype">void</span>* p ) {
 <a name="l00173"></a>00173         internal::deallocate_via_handler_v3(p);
 <a name="l00174"></a>00174     }
 <a name="l00175"></a>00175 };
 <a name="l00176"></a>00176 
 <a name="l00178"></a>00178 
-<a name="l00182"></a><a class="code" href="a00228.html">00182</a> <span class="keyword">class </span><a class="code" href="a00228.html">captured_exception</a> : <span class="keyword">public</span> <a class="code" href="a00298.html">tbb_exception</a>
+<a name="l00182"></a><a class="code" href="a00240.html">00182</a> <span class="keyword">class </span><a class="code" href="a00240.html">captured_exception</a> : <span class="keyword">public</span> <a class="code" href="a00319.html">tbb_exception</a>
 <a name="l00183"></a>00183 {
 <a name="l00184"></a>00184 <span class="keyword">public</span>:
-<a name="l00185"></a>00185     <a class="code" href="a00228.html">captured_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00228.html">captured_exception</a>& src )
-<a name="l00186"></a>00186         : <a class="code" href="a00298.html">tbb_exception</a>(src), my_dynamic(<span class="keyword">false</span>)
+<a name="l00185"></a>00185     <a class="code" href="a00240.html">captured_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00240.html">captured_exception</a>& src )
+<a name="l00186"></a>00186         : <a class="code" href="a00319.html">tbb_exception</a>(src), my_dynamic(<span class="keyword">false</span>)
 <a name="l00187"></a>00187     {
-<a name="l00188"></a>00188         set(src.<a class="code" href="a00228.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00228.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
+<a name="l00188"></a>00188         set(src.<a class="code" href="a00240.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00240.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
 <a name="l00189"></a>00189     }
 <a name="l00190"></a>00190 
-<a name="l00191"></a>00191     <a class="code" href="a00228.html">captured_exception</a> ( <span class="keyword">const</span> <span class="keywordtype">char</span>* name_, <span class="keyword">const</span> <span class="keywordtype">char</span>* info )
+<a name="l00191"></a>00191     <a class="code" href="a00240.html">captured_exception</a> ( <span class="keyword">const</span> <span class="keywordtype">char</span>* name_, <span class="keyword">const</span> <span class="keywordtype">char</span>* info )
 <a name="l00192"></a>00192         : my_dynamic(<span class="keyword">false</span>)
 <a name="l00193"></a>00193     {
 <a name="l00194"></a>00194         set(name_, info);
 <a name="l00195"></a>00195     }
 <a name="l00196"></a>00196 
-<a name="l00197"></a>00197     __TBB_EXPORTED_METHOD ~<a class="code" href="a00228.html">captured_exception</a> () <span class="keywordflow">throw</span>();
+<a name="l00197"></a>00197     __TBB_EXPORTED_METHOD ~<a class="code" href="a00240.html">captured_exception</a> () <span class="keywordflow">throw</span>();
 <a name="l00198"></a>00198 
-<a name="l00199"></a>00199     <a class="code" href="a00228.html">captured_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00228.html">captured_exception</a>& src ) {
+<a name="l00199"></a>00199     <a class="code" href="a00240.html">captured_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00240.html">captured_exception</a>& src ) {
 <a name="l00200"></a>00200         <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
 <a name="l00201"></a>00201             clear();
-<a name="l00202"></a>00202             set(src.<a class="code" href="a00228.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00228.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
+<a name="l00202"></a>00202             set(src.<a class="code" href="a00240.html#6a57f9aa0bce72392492d109b9e1d941">my_exception_name</a>, src.<a class="code" href="a00240.html#788adf4e55cdad7abc178a48a1d47e69">my_exception_info</a>);
 <a name="l00203"></a>00203         }
 <a name="l00204"></a>00204         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
 <a name="l00205"></a>00205     }
 <a name="l00206"></a>00206 
 <a name="l00207"></a>00207     <span class="comment">/*override*/</span>
-<a name="l00208"></a>00208     <a class="code" href="a00228.html">captured_exception</a>* __TBB_EXPORTED_METHOD <a class="code" href="a00228.html#837a50b8f6a800bda225c39d1699643f">move</a> () <span class="keywordflow">throw</span>();
+<a name="l00208"></a>00208     <a class="code" href="a00240.html">captured_exception</a>* __TBB_EXPORTED_METHOD <a class="code" href="a00240.html#837a50b8f6a800bda225c39d1699643f">move</a> () <span class="keywordflow">throw</span>();
 <a name="l00209"></a>00209 
 <a name="l00210"></a>00210     <span class="comment">/*override*/</span>
-<a name="l00211"></a>00211     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00228.html#93d875d3555502ff6f18513525de204c">destroy</a> () <span class="keywordflow">throw</span>();
+<a name="l00211"></a>00211     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD <a class="code" href="a00240.html#93d875d3555502ff6f18513525de204c">destroy</a> () <span class="keywordflow">throw</span>();
 <a name="l00212"></a>00212 
 <a name="l00213"></a>00213     <span class="comment">/*override*/</span>
-<a name="l00214"></a><a class="code" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">00214</a>     <span class="keywordtype">void</span> <a class="code" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> () { __TBB_THROW(*<span class="keyword">this</span>); }
+<a name="l00214"></a><a class="code" href="a00240.html#2dd1be66ab32fa27e0ddef5707fa67ef">00214</a>     <span class="keywordtype">void</span> <a class="code" href="a00240.html#2dd1be66ab32fa27e0ddef5707fa67ef">throw_self</a> () { __TBB_THROW(*<span class="keyword">this</span>); }
 <a name="l00215"></a>00215 
 <a name="l00216"></a>00216     <span class="comment">/*override*/</span>
-<a name="l00217"></a>00217     <span class="keyword">const</span> <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00228.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const throw();
+<a name="l00217"></a>00217     <span class="keyword">const</span> <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00240.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>() const throw();
 <a name="l00218"></a>00218 
 <a name="l00219"></a>00219     <span class="comment">/*override*/</span>
-<a name="l00220"></a>00220     const <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00228.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const throw();
+<a name="l00220"></a>00220     const <span class="keywordtype">char</span>* __TBB_EXPORTED_METHOD <a class="code" href="a00240.html#6b5988ef74a1fe2a58998d110b3633e0">what</a>() const throw();
 <a name="l00221"></a>00221 
-<a name="l00222"></a>00222     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD set ( const <span class="keywordtype">char</span>* <a class="code" href="a00228.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, const <span class="keywordtype">char</span>* info ) throw();
+<a name="l00222"></a>00222     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD set ( const <span class="keywordtype">char</span>* <a class="code" href="a00240.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, const <span class="keywordtype">char</span>* info ) throw();
 <a name="l00223"></a>00223     <span class="keywordtype">void</span> __TBB_EXPORTED_METHOD clear () throw();
 <a name="l00224"></a>00224 
 <a name="l00225"></a>00225 private:
-<a name="l00227"></a>00227     <a class="code" href="a00228.html">captured_exception</a>() {}
+<a name="l00227"></a>00227     <a class="code" href="a00240.html">captured_exception</a>() {}
 <a name="l00228"></a>00228 
-<a name="l00230"></a>00230     <span class="keyword">static</span> captured_exception* allocate ( <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00228.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, <span class="keyword">const</span> <span class="keywordtype">char</span>* info );
+<a name="l00230"></a>00230     <span class="keyword">static</span> captured_exception* allocate ( <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00240.html#5af82fd677449c5ca727fa1d7e16f9f5">name</a>, <span class="keyword">const</span> <span class="keywordtype">char</span>* info );
 <a name="l00231"></a>00231 
 <a name="l00232"></a>00232     <span class="keywordtype">bool</span> my_dynamic;
 <a name="l00233"></a>00233     <span class="keyword">const</span> <span class="keywordtype">char</span>* my_exception_name;
@@ -203,51 +203,51 @@
 <a name="l00236"></a>00236 
 <a name="l00238"></a>00238 
 <a name="l00242"></a>00242 <span class="keyword">template</span><<span class="keyword">typename</span> ExceptionData>
-<a name="l00243"></a><a class="code" href="a00257.html">00243</a> <span class="keyword">class </span><a class="code" href="a00257.html">movable_exception</a> : <span class="keyword">public</span> <a class="code" href="a00298.html">tbb_exception</a>
+<a name="l00243"></a><a class="code" href="a00273.html">00243</a> <span class="keyword">class </span><a class="code" href="a00273.html">movable_exception</a> : <span class="keyword">public</span> <a class="code" href="a00319.html">tbb_exception</a>
 <a name="l00244"></a>00244 {
-<a name="l00245"></a>00245     <span class="keyword">typedef</span> <a class="code" href="a00257.html">movable_exception<ExceptionData></a> <a class="code" href="a00257.html">self_type</a>;
+<a name="l00245"></a>00245     <span class="keyword">typedef</span> <a class="code" href="a00273.html">movable_exception<ExceptionData></a> <a class="code" href="a00273.html">self_type</a>;
 <a name="l00246"></a>00246 
 <a name="l00247"></a>00247 <span class="keyword">public</span>:
-<a name="l00248"></a>00248     <a class="code" href="a00257.html">movable_exception</a> ( <span class="keyword">const</span> ExceptionData& data_ )
-<a name="l00249"></a>00249         : <a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(data_)
+<a name="l00248"></a>00248     <a class="code" href="a00273.html">movable_exception</a> ( <span class="keyword">const</span> ExceptionData& data_ )
+<a name="l00249"></a>00249         : <a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(data_)
 <a name="l00250"></a>00250         , my_dynamic(<span class="keyword">false</span>)
 <a name="l00251"></a>00251         , my_exception_name(
 <a name="l00252"></a>00252 #<span class="keywordflow">if</span> TBB_USE_EXCEPTIONS
-<a name="l00253"></a>00253         <span class="keyword">typeid</span>(<a class="code" href="a00257.html">self_type</a>).<a class="code" href="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>()
+<a name="l00253"></a>00253         <span class="keyword">typeid</span>(<a class="code" href="a00273.html">self_type</a>).<a class="code" href="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a>()
 <a name="l00254"></a>00254 #<span class="keywordflow">else</span> <span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
 <a name="l00255"></a>00255         <span class="stringliteral">"movable_exception"</span>
 <a name="l00256"></a>00256 #endif <span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
 <a name="l00257"></a>00257         )
 <a name="l00258"></a>00258     {}
 <a name="l00259"></a>00259 
-<a name="l00260"></a>00260     <a class="code" href="a00257.html">movable_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00257.html">movable_exception</a>& src ) <span class="keywordflow">throw</span> ()
-<a name="l00261"></a>00261         : <a class="code" href="a00298.html">tbb_exception</a>(src)
-<a name="l00262"></a>00262         , <a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(src.<a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>)
+<a name="l00260"></a>00260     <a class="code" href="a00273.html">movable_exception</a> ( <span class="keyword">const</span> <a class="code" href="a00273.html">movable_exception</a>& src ) <span class="keywordflow">throw</span> ()
+<a name="l00261"></a>00261         : <a class="code" href="a00319.html">tbb_exception</a>(src)
+<a name="l00262"></a>00262         , <a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>(src.<a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>)
 <a name="l00263"></a>00263         , my_dynamic(<span class="keyword">false</span>)
-<a name="l00264"></a>00264         , my_exception_name(src.<a class="code" href="a00257.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>)
+<a name="l00264"></a>00264         , my_exception_name(src.<a class="code" href="a00273.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>)
 <a name="l00265"></a>00265     {}
 <a name="l00266"></a>00266 
-<a name="l00267"></a>00267     ~<a class="code" href="a00257.html">movable_exception</a> () <span class="keywordflow">throw</span>() {}
+<a name="l00267"></a>00267     ~<a class="code" href="a00273.html">movable_exception</a> () <span class="keywordflow">throw</span>() {}
 <a name="l00268"></a>00268 
-<a name="l00269"></a>00269     <span class="keyword">const</span> <a class="code" href="a00257.html">movable_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00257.html">movable_exception</a>& src ) {
+<a name="l00269"></a>00269     <span class="keyword">const</span> <a class="code" href="a00273.html">movable_exception</a>& operator= ( <span class="keyword">const</span> <a class="code" href="a00273.html">movable_exception</a>& src ) {
 <a name="l00270"></a>00270         <span class="keywordflow">if</span> ( <span class="keyword">this</span> != &src ) {
-<a name="l00271"></a>00271             <a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a> = src.<a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
-<a name="l00272"></a>00272             my_exception_name = src.<a class="code" href="a00257.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>;
+<a name="l00271"></a>00271             <a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a> = src.<a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
+<a name="l00272"></a>00272             my_exception_name = src.<a class="code" href="a00273.html#5f5843b501829ff824c9c8d28c8283eb">my_exception_name</a>;
 <a name="l00273"></a>00273         }
 <a name="l00274"></a>00274         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
 <a name="l00275"></a>00275     }
 <a name="l00276"></a>00276 
-<a name="l00277"></a>00277     ExceptionData& data () <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
+<a name="l00277"></a>00277     ExceptionData& data () <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
 <a name="l00278"></a>00278 
-<a name="l00279"></a>00279     <span class="keyword">const</span> ExceptionData& data () <span class="keyword">const</span> <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
+<a name="l00279"></a>00279     <span class="keyword">const</span> ExceptionData& data () <span class="keyword">const</span> <span class="keywordflow">throw</span>() { <span class="keywordflow">return</span> <a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>; }
 <a name="l00280"></a>00280 
-<a name="l00281"></a><a class="code" href="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">00281</a>     <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw() { <span class="keywordflow">return</span> my_exception_name; }
+<a name="l00281"></a><a class="code" href="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">00281</a>     <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">name</a> () const throw() { <span class="keywordflow">return</span> my_exception_name; }
 <a name="l00282"></a>00282 
-<a name="l00283"></a><a class="code" href="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">00283</a>     <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw() { <span class="keywordflow">return</span> <span class="stringliteral">"tbb::movable_exception"</span>; }
+<a name="l00283"></a><a class="code" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">00283</a>     <span class="comment">/*override*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">what</a> () const throw() { <span class="keywordflow">return</span> <span class="stringliteral">"tbb::movable_exception"</span>; }
 <a name="l00284"></a>00284 
 <a name="l00285"></a>00285     <span class="comment">/*override*/</span>
-<a name="l00286"></a><a class="code" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">00286</a>     <a class="code" href="a00257.html">movable_exception</a>* <a class="code" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw() {
-<a name="l00287"></a>00287         <span class="keywordtype">void</span>* e = internal::allocate_via_handler_v3(<span class="keyword">sizeof</span>(<a class="code" href="a00257.html">movable_exception</a>));
+<a name="l00286"></a><a class="code" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">00286</a>     <a class="code" href="a00273.html">movable_exception</a>* <a class="code" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">move</a> () throw() {
+<a name="l00287"></a>00287         <span class="keywordtype">void</span>* e = internal::allocate_via_handler_v3(<span class="keyword">sizeof</span>(<a class="code" href="a00273.html">movable_exception</a>));
 <a name="l00288"></a>00288         <span class="keywordflow">if</span> ( e ) {
 <a name="l00289"></a>00289             ::new (e) movable_exception(*<span class="keyword">this</span>);
 <a name="l00290"></a>00290             ((movable_exception*)e)->my_dynamic = <span class="keyword">true</span>;
@@ -255,18 +255,18 @@
 <a name="l00292"></a>00292         <span class="keywordflow">return</span> (movable_exception*)e;
 <a name="l00293"></a>00293     }
 <a name="l00294"></a>00294     <span class="comment">/*override*/</span>
-<a name="l00295"></a><a class="code" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">00295</a>     <span class="keywordtype">void</span> <a class="code" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw() {
+<a name="l00295"></a><a class="code" href="a00273.html#7a46873119d9f85a7b0009c13e41a258">00295</a>     <span class="keywordtype">void</span> <a class="code" href="a00273.html#7a46873119d9f85a7b0009c13e41a258">destroy</a> () throw() {
 <a name="l00296"></a>00296         __TBB_ASSERT ( my_dynamic, <span class="stringliteral">"Method destroy can be called only on dynamically allocated movable_exceptions"</span> );
 <a name="l00297"></a>00297         <span class="keywordflow">if</span> ( my_dynamic ) {
-<a name="l00298"></a>00298             this->~<a class="code" href="a00257.html">movable_exception</a>();
+<a name="l00298"></a>00298             this->~<a class="code" href="a00273.html">movable_exception</a>();
 <a name="l00299"></a>00299             internal::deallocate_via_handler_v3(<span class="keyword">this</span>);
 <a name="l00300"></a>00300         }
 <a name="l00301"></a>00301     }
 <a name="l00302"></a>00302     <span class="comment">/*override*/</span>
-<a name="l00303"></a><a class="code" href="a00257.html#17cffba35811c92b7e65d63506b69602">00303</a>     <span class="keywordtype">void</span> <a class="code" href="a00257.html#17cffba35811c92b7e65d63506b69602">throw_self</a> () { __TBB_THROW( *<span class="keyword">this</span> ); }
+<a name="l00303"></a><a class="code" href="a00273.html#17cffba35811c92b7e65d63506b69602">00303</a>     <span class="keywordtype">void</span> <a class="code" href="a00273.html#17cffba35811c92b7e65d63506b69602">throw_self</a> () { __TBB_THROW( *<span class="keyword">this</span> ); }
 <a name="l00304"></a>00304 
 <a name="l00305"></a>00305 <span class="keyword">protected</span>:
-<a name="l00307"></a><a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">00307</a>     ExceptionData  <a class="code" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
+<a name="l00307"></a><a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">00307</a>     ExceptionData  <a class="code" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">my_exception_data</a>;
 <a name="l00308"></a>00308 
 <a name="l00309"></a>00309 <span class="keyword">private</span>:
 <a name="l00311"></a>00311     <span class="keywordtype">bool</span> my_dynamic;
@@ -279,22 +279,22 @@
 <a name="l00319"></a>00319 <span class="preprocessor"></span><span class="keyword">namespace </span>internal {
 <a name="l00320"></a>00320 
 <a name="l00322"></a>00322 
-<a name="l00324"></a><a class="code" href="a00299.html">00324</a> <span class="keyword">class </span><a class="code" href="a00299.html">tbb_exception_ptr</a> {
+<a name="l00324"></a><a class="code" href="a00320.html">00324</a> <span class="keyword">class </span><a class="code" href="a00320.html">tbb_exception_ptr</a> {
 <a name="l00325"></a>00325     std::exception_ptr  my_ptr;
 <a name="l00326"></a>00326 
 <a name="l00327"></a>00327 <span class="keyword">public</span>:
-<a name="l00328"></a>00328     <span class="keyword">static</span> <a class="code" href="a00299.html">tbb_exception_ptr</a>* allocate ();
-<a name="l00329"></a>00329     <span class="keyword">static</span> <a class="code" href="a00299.html">tbb_exception_ptr</a>* allocate ( <span class="keyword">const</span> <a class="code" href="a00298.html">tbb_exception</a>& tag );
-<a name="l00331"></a>00331     <span class="keyword">static</span> <a class="code" href="a00299.html">tbb_exception_ptr</a>* allocate ( <a class="code" href="a00228.html">captured_exception</a>& src );
+<a name="l00328"></a>00328     <span class="keyword">static</span> <a class="code" href="a00320.html">tbb_exception_ptr</a>* allocate ();
+<a name="l00329"></a>00329     <span class="keyword">static</span> <a class="code" href="a00320.html">tbb_exception_ptr</a>* allocate ( <span class="keyword">const</span> <a class="code" href="a00319.html">tbb_exception</a>& tag );
+<a name="l00331"></a>00331     <span class="keyword">static</span> <a class="code" href="a00320.html">tbb_exception_ptr</a>* allocate ( <a class="code" href="a00240.html">captured_exception</a>& src );
 <a name="l00332"></a>00332 
 <a name="l00334"></a>00334 
-<a name="l00335"></a>00335     <span class="keywordtype">void</span> <a class="code" href="a00299.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> () <span class="keywordflow">throw</span>();
+<a name="l00335"></a>00335     <span class="keywordtype">void</span> <a class="code" href="a00320.html#921875bbacd2c8a5f324c7da7a415262">destroy</a> () <span class="keywordflow">throw</span>();
 <a name="l00336"></a>00336 
-<a name="l00338"></a><a class="code" href="a00299.html#292832fd5c523e3d8081a22247840a1d">00338</a>     <span class="keywordtype">void</span> <a class="code" href="a00299.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> () { std::rethrow_exception(my_ptr); }
+<a name="l00338"></a><a class="code" href="a00320.html#292832fd5c523e3d8081a22247840a1d">00338</a>     <span class="keywordtype">void</span> <a class="code" href="a00320.html#292832fd5c523e3d8081a22247840a1d">throw_self</a> () { std::rethrow_exception(my_ptr); }
 <a name="l00339"></a>00339 
 <a name="l00340"></a>00340 <span class="keyword">private</span>:
-<a name="l00341"></a>00341     <a class="code" href="a00299.html">tbb_exception_ptr</a> ( <span class="keyword">const</span> std::exception_ptr& src ) : my_ptr(src) {}
-<a name="l00342"></a>00342     tbb_exception_ptr ( <span class="keyword">const</span> <a class="code" href="a00228.html">captured_exception</a>& src ) : my_ptr(std::copy_exception(src)) {}
+<a name="l00341"></a>00341     <a class="code" href="a00320.html">tbb_exception_ptr</a> ( <span class="keyword">const</span> std::exception_ptr& src ) : my_ptr(src) {}
+<a name="l00342"></a>00342     tbb_exception_ptr ( <span class="keyword">const</span> <a class="code" href="a00240.html">captured_exception</a>& src ) : my_ptr(std::copy_exception(src)) {}
 <a name="l00343"></a>00343 }; <span class="comment">// class tbb::internal::tbb_exception_ptr</span>
 <a name="l00344"></a>00344 
 <a name="l00345"></a>00345 } <span class="comment">// namespace internal</span>
diff --git a/doc/html/a00594.html b/doc/html/a00594.html
index 2905182..84e2f7c 100644
--- a/doc/html/a00594.html
+++ b/doc/html/a00594.html
@@ -42,662 +42,701 @@
 <a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_machine_H</span>
 <a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_H</span>
 <a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 
-<a name="l00026"></a>00026 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>
-<a name="l00028"></a>00028 <span class="preprocessor">#ifdef _MANAGED</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#pragma managed(push, off)</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#if __MINGW64__</span>
-<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
-<a name="l00034"></a>00034 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> __declspec(dllimport) int __stdcall SwitchToThread( <span class="keywordtype">void</span> );
-<a name="l00035"></a>00035 <span class="preprocessor">#define __TBB_Yield()  SwitchToThread()</span>
-<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#elif __MINGW32__</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
-<a name="l00038"></a>00038 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> __declspec(dllimport) int __stdcall SwitchToThread( <span class="keywordtype">void</span> );
-<a name="l00039"></a>00039 <span class="preprocessor">#define __TBB_Yield()  SwitchToThread()</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#elif defined(_M_IX86)</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_ia32.h"</span>
-<a name="l00042"></a>00042 <span class="preprocessor">#elif defined(_M_AMD64) </span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_intel64.h"</span>
-<a name="l00044"></a>00044 <span class="preprocessor">#elif _XBOX </span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#include "machine/xbox360_ppc.h"</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#endif</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span>
-<a name="l00048"></a>00048 <span class="preprocessor">#ifdef _MANAGED</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span><span class="preprocessor">#pragma managed(pop)</span>
-<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span>
-<a name="l00052"></a>00052 <span class="preprocessor">#elif __linux__ || __FreeBSD__ || __NetBSD__</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span>
-<a name="l00054"></a>00054 <span class="preprocessor">#if __i386__</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
-<a name="l00056"></a>00056 <span class="preprocessor">#elif __x86_64__</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
-<a name="l00058"></a>00058 <span class="preprocessor">#elif __ia64__</span>
-<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia64.h"</span>
-<a name="l00060"></a>00060 <span class="preprocessor">#elif __powerpc__</span>
-<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#include "machine/mac_ppc.h"</span>
-<a name="l00062"></a>00062 <span class="preprocessor">#endif</span>
-<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_common.h"</span>
-<a name="l00064"></a>00064 
-<a name="l00065"></a>00065 <span class="preprocessor">#elif __APPLE__</span>
-<a name="l00066"></a>00066 <span class="preprocessor"></span>
-<a name="l00067"></a>00067 <span class="preprocessor">#if __i386__</span>
-<a name="l00068"></a>00068 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
-<a name="l00069"></a>00069 <span class="preprocessor">#elif __x86_64__</span>
-<a name="l00070"></a>00070 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
-<a name="l00071"></a>00071 <span class="preprocessor">#elif __POWERPC__</span>
-<a name="l00072"></a>00072 <span class="preprocessor"></span><span class="preprocessor">#include "machine/mac_ppc.h"</span>
-<a name="l00073"></a>00073 <span class="preprocessor">#endif</span>
-<a name="l00074"></a>00074 <span class="preprocessor"></span><span class="preprocessor">#include "machine/macos_common.h"</span>
-<a name="l00075"></a>00075 
-<a name="l00076"></a>00076 <span class="preprocessor">#elif _AIX</span>
-<a name="l00077"></a>00077 <span class="preprocessor"></span>
-<a name="l00078"></a>00078 <span class="preprocessor">#include "machine/ibm_aix51.h"</span>
-<a name="l00079"></a>00079 
-<a name="l00080"></a>00080 <span class="preprocessor">#elif __sun || __SUNPRO_CC</span>
-<a name="l00081"></a>00081 <span class="preprocessor"></span>
-<a name="l00082"></a>00082 <span class="preprocessor">#define __asm__ asm </span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor">#define __volatile__ volatile</span>
-<a name="l00084"></a>00084 <span class="preprocessor"></span>
-<a name="l00085"></a>00085 <span class="preprocessor">#if __i386  || __i386__</span>
-<a name="l00086"></a>00086 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_ia32.h"</span>
-<a name="l00087"></a>00087 <span class="preprocessor">#elif __x86_64__</span>
-<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#include "machine/linux_intel64.h"</span>
-<a name="l00089"></a>00089 <span class="preprocessor">#elif __sparc</span>
-<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor">#include "machine/sunos_sparc.h"</span>
-<a name="l00091"></a>00091 <span class="preprocessor">#endif</span>
-<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="preprocessor">#include <sched.h></span>
-<a name="l00093"></a>00093 
-<a name="l00094"></a>00094 <span class="preprocessor">#define __TBB_Yield() sched_yield()</span>
-<a name="l00095"></a>00095 <span class="preprocessor"></span>
-<a name="l00096"></a>00096 <span class="preprocessor">#endif </span><span class="comment">/* Sun */</span>
-<a name="l00097"></a>00097 
-<a name="l00098"></a>00098 <span class="preprocessor">#ifndef __TBB_64BIT_ATOMICS</span>
-<a name="l00099"></a>00099 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_64BIT_ATOMICS 1</span>
-<a name="l00100"></a>00100 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00101"></a>00101 <span class="preprocessor"></span>
+<a name="l00099"></a>00099 <span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00100"></a>00100 
+<a name="l00101"></a>00101 <span class="keyword">namespace </span>tbb {
+<a name="l00102"></a>00102 <span class="keyword">namespace </span>internal {
 <a name="l00103"></a>00103 
-<a name="l00115"></a>00115 <span class="preprocessor">#if    !defined(__TBB_CompareAndSwap4) \</span>
-<a name="l00116"></a>00116 <span class="preprocessor">    || !defined(__TBB_CompareAndSwap8) && __TBB_64BIT_ATOMICS \</span>
-<a name="l00117"></a>00117 <span class="preprocessor">    || !defined(__TBB_Yield)           \</span>
-<a name="l00118"></a>00118 <span class="preprocessor">    || !defined(__TBB_full_memory_fence)    \</span>
-<a name="l00119"></a>00119 <span class="preprocessor">    || !defined(__TBB_release_consistency_helper)</span>
-<a name="l00120"></a>00120 <span class="preprocessor"></span><span class="preprocessor">#error Minimal requirements for tbb_machine.h not satisfied; platform is not supported.</span>
-<a name="l00121"></a>00121 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span>
-<a name="l00123"></a>00123 <span class="preprocessor">#ifndef __TBB_Pause</span>
-<a name="l00124"></a>00124 <span class="preprocessor"></span>    <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_Pause(int32_t) {
-<a name="l00125"></a>00125         __TBB_Yield();
-<a name="l00126"></a>00126     }
-<a name="l00127"></a>00127 <span class="preprocessor">#endif</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span>
-<a name="l00129"></a>00129 <span class="keyword">namespace </span>tbb {
-<a name="l00130"></a>00130 
-<a name="l00132"></a><a class="code" href="a00362.html#250275615f10d5b5de6ad466ae2f54de">00132</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00362.html#250275615f10d5b5de6ad466ae2f54de">atomic_fence</a> () { __TBB_full_memory_fence(); }
+<a name="l00105"></a>00105 <span class="comment">// Overridable helpers declarations</span>
+<a name="l00106"></a>00106 <span class="comment">//</span>
+<a name="l00107"></a>00107 <span class="comment">// A machine/*.h file may choose to define these templates, otherwise it must</span>
+<a name="l00108"></a>00108 <span class="comment">// request default implementation by setting appropriate __TBB_USE_GENERIC_XXX macro(s).</span>
+<a name="l00109"></a>00109 <span class="comment">//</span>
+<a name="l00110"></a>00110 <span class="keyword">template</span> <<span class="keyword">typename</span> T, std::size_t S>
+<a name="l00111"></a>00111 <span class="keyword">struct </span>machine_load_store;
+<a name="l00112"></a>00112 
+<a name="l00113"></a>00113 <span class="keyword">template</span> <<span class="keyword">typename</span> T, std::size_t S>
+<a name="l00114"></a>00114 <span class="keyword">struct </span>machine_load_store_relaxed;
+<a name="l00115"></a>00115 
+<a name="l00116"></a>00116 <span class="keyword">template</span> <<span class="keyword">typename</span> T, std::size_t S>
+<a name="l00117"></a>00117 <span class="keyword">struct </span>machine_load_store_seq_cst;
+<a name="l00118"></a>00118 <span class="comment">//</span>
+<a name="l00119"></a>00119 <span class="comment">// End of overridable helpers declarations</span>
+<a name="l00121"></a>00121 <span class="comment"></span>
+<a name="l00122"></a>00122 <span class="keyword">template</span><size_t S> <span class="keyword">struct </span>atomic_selector;
+<a name="l00123"></a>00123 
+<a name="l00124"></a>00124 <span class="keyword">template</span><> <span class="keyword">struct </span>atomic_selector<1> {
+<a name="l00125"></a>00125     <span class="keyword">typedef</span> int8_t word;
+<a name="l00126"></a>00126     <span class="keyword">inline</span> <span class="keyword">static</span> word fetch_store ( <span class="keyword">volatile</span> <span class="keywordtype">void</span>* location, word value );
+<a name="l00127"></a>00127 };
+<a name="l00128"></a>00128 
+<a name="l00129"></a>00129 <span class="keyword">template</span><> <span class="keyword">struct </span>atomic_selector<2> {
+<a name="l00130"></a>00130     <span class="keyword">typedef</span> int16_t word;
+<a name="l00131"></a>00131     <span class="keyword">inline</span> <span class="keyword">static</span> word fetch_store ( <span class="keyword">volatile</span> <span class="keywordtype">void</span>* location, word value );
+<a name="l00132"></a>00132 };
 <a name="l00133"></a>00133 
-<a name="l00134"></a>00134 <span class="keyword">namespace </span>internal {
-<a name="l00135"></a>00135 
-<a name="l00137"></a>00137 
-<a name="l00138"></a><a class="code" href="a00218.html">00138</a> <span class="keyword">class </span><a class="code" href="a00218.html">atomic_backoff</a> : no_copy {
-<a name="l00140"></a>00140 
-<a name="l00142"></a>00142     <span class="keyword">static</span> <span class="keyword">const</span> int32_t LOOPS_BEFORE_YIELD = 16;
-<a name="l00143"></a>00143     int32_t count;
-<a name="l00144"></a>00144 <span class="keyword">public</span>:
-<a name="l00145"></a>00145     <a class="code" href="a00218.html">atomic_backoff</a>() : count(1) {}
-<a name="l00146"></a>00146 
-<a name="l00148"></a><a class="code" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">00148</a>     <span class="keywordtype">void</span> <a class="code" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>() {
-<a name="l00149"></a>00149         <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
-<a name="l00150"></a>00150             __TBB_Pause(count);
-<a name="l00151"></a>00151             <span class="comment">// Pause twice as long the next time.</span>
-<a name="l00152"></a>00152             count*=2;
-<a name="l00153"></a>00153         } <span class="keywordflow">else</span> {
-<a name="l00154"></a>00154             <span class="comment">// Pause is so long that we might as well yield CPU to scheduler.</span>
-<a name="l00155"></a>00155             __TBB_Yield();
-<a name="l00156"></a>00156         }
-<a name="l00157"></a>00157     }
-<a name="l00158"></a>00158 
-<a name="l00159"></a>00159     <span class="comment">// pause for a few times and then return false immediately.</span>
-<a name="l00160"></a>00160     <span class="keywordtype">bool</span> bounded_pause() {
-<a name="l00161"></a>00161         <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
-<a name="l00162"></a>00162             __TBB_Pause(count);
-<a name="l00163"></a>00163             <span class="comment">// Pause twice as long the next time.</span>
-<a name="l00164"></a>00164             count*=2;
-<a name="l00165"></a>00165             <span class="keywordflow">return</span> <span class="keyword">true</span>;
-<a name="l00166"></a>00166         } <span class="keywordflow">else</span> {
-<a name="l00167"></a>00167             <span class="keywordflow">return</span> <span class="keyword">false</span>;
-<a name="l00168"></a>00168         }
-<a name="l00169"></a>00169     }
-<a name="l00170"></a>00170 
-<a name="l00171"></a>00171     <span class="keywordtype">void</span> reset() {
-<a name="l00172"></a>00172         count = 1;
-<a name="l00173"></a>00173     }
-<a name="l00174"></a>00174 };
-<a name="l00175"></a>00175 
-<a name="l00177"></a>00177 
-<a name="l00178"></a>00178 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00179"></a>00179 <span class="keywordtype">void</span> spin_wait_while_eq( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location, U value ) {
-<a name="l00180"></a>00180     atomic_backoff backoff;
-<a name="l00181"></a>00181     <span class="keywordflow">while</span>( location==value ) backoff.pause();
-<a name="l00182"></a>00182 }
-<a name="l00183"></a>00183 
-<a name="l00185"></a>00185 
-<a name="l00186"></a>00186 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00187"></a>00187 <span class="keywordtype">void</span> spin_wait_until_eq( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location, <span class="keyword">const</span> U value ) {
-<a name="l00188"></a>00188     atomic_backoff backoff;
-<a name="l00189"></a>00189     <span class="keywordflow">while</span>( location!=value ) backoff.pause();
-<a name="l00190"></a>00190 }
-<a name="l00191"></a>00191 
-<a name="l00192"></a>00192 <span class="comment">// T should be unsigned, otherwise sign propagation will break correctness of bit manipulations.</span>
-<a name="l00193"></a>00193 <span class="comment">// S should be either 1 or 2, for the mask calculation to work correctly.</span>
-<a name="l00194"></a>00194 <span class="comment">// Together, these rules limit applicability of Masked CAS to unsigned char and unsigned short.</span>
-<a name="l00195"></a>00195 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00196"></a>00196 <span class="keyword">inline</span> T __TBB_MaskedCompareAndSwap (<span class="keyword">volatile</span> T *ptr, T value, T comparand ) {
-<a name="l00197"></a>00197     <span class="keyword">volatile</span> uint32_t * base = (uint32_t*)( (uintptr_t)ptr & ~(uintptr_t)0x3 );
-<a name="l00198"></a>00198 <span class="preprocessor">#if __TBB_BIG_ENDIAN</span>
-<a name="l00199"></a>00199 <span class="preprocessor"></span>    <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*( 4-S - (uintptr_t(ptr) & 0x3) ) );
-<a name="l00200"></a>00200 <span class="preprocessor">#else</span>
-<a name="l00201"></a>00201 <span class="preprocessor"></span>    <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*((uintptr_t)ptr & 0x3) );
-<a name="l00202"></a>00202 <span class="preprocessor">#endif</span>
-<a name="l00203"></a>00203 <span class="preprocessor"></span>    <span class="keyword">const</span> uint32_t mask = ( (1<<(S*8)) - 1 )<<bitoffset;
-<a name="l00204"></a>00204     atomic_backoff b;
-<a name="l00205"></a>00205     uint32_t result;
-<a name="l00206"></a>00206     <span class="keywordflow">for</span>(;;) {
-<a name="l00207"></a>00207         result = *base; <span class="comment">// reload the base value which might change during the pause</span>
-<a name="l00208"></a>00208         uint32_t old_value = ( result & ~mask ) | ( comparand << bitoffset );
-<a name="l00209"></a>00209         uint32_t new_value = ( result & ~mask ) | ( value << bitoffset );
-<a name="l00210"></a>00210         <span class="comment">// __TBB_CompareAndSwap4 presumed to have full fence. </span>
-<a name="l00211"></a>00211         result = __TBB_CompareAndSwap4( base, new_value, old_value );
-<a name="l00212"></a>00212         <span class="keywordflow">if</span>(  result==old_value               <span class="comment">// CAS succeeded</span>
-<a name="l00213"></a>00213           || ((result^old_value)&mask)!=0 )  <span class="comment">// CAS failed and the bits of interest have changed</span>
-<a name="l00214"></a>00214             <span class="keywordflow">break</span>;
-<a name="l00215"></a>00215         <span class="keywordflow">else</span>                                 <span class="comment">// CAS failed but the bits of interest left unchanged</span>
-<a name="l00216"></a>00216             b.pause();
-<a name="l00217"></a>00217     }
-<a name="l00218"></a>00218     <span class="keywordflow">return</span> T((result & mask) >> bitoffset);
-<a name="l00219"></a>00219 }
-<a name="l00220"></a>00220 
-<a name="l00221"></a>00221 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00222"></a>00222 <span class="keyword">inline</span> T __TBB_CompareAndSwapGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value, T comparand ) { 
-<a name="l00223"></a>00223     <span class="keywordflow">return</span> __TBB_CompareAndSwapW((T *)ptr,value,comparand);
-<a name="l00224"></a>00224 }
-<a name="l00225"></a>00225 
-<a name="l00226"></a>00226 <span class="keyword">template</span><>
-<a name="l00227"></a>00227 <span class="keyword">inline</span> uint8_t __TBB_CompareAndSwapGeneric <1,uint8_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint8_t value, uint8_t comparand ) {
-<a name="l00228"></a>00228 #ifdef __TBB_CompareAndSwap1
-<a name="l00229"></a>00229     <span class="keywordflow">return</span> __TBB_CompareAndSwap1(ptr,value,comparand);
-<a name="l00230"></a>00230 <span class="preprocessor">#else</span>
-<a name="l00231"></a>00231 <span class="preprocessor"></span>    <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<1,uint8_t>((<span class="keyword">volatile</span> uint8_t *)ptr,value,comparand);
-<a name="l00232"></a>00232 <span class="preprocessor">#endif</span>
-<a name="l00233"></a>00233 <span class="preprocessor"></span>}
-<a name="l00234"></a>00234 
-<a name="l00235"></a>00235 <span class="keyword">template</span><>
-<a name="l00236"></a>00236 <span class="keyword">inline</span> uint16_t __TBB_CompareAndSwapGeneric <2,uint16_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint16_t value, uint16_t comparand ) {
-<a name="l00237"></a>00237 #ifdef __TBB_CompareAndSwap2
-<a name="l00238"></a>00238     <span class="keywordflow">return</span> __TBB_CompareAndSwap2(ptr,value,comparand);
-<a name="l00239"></a>00239 <span class="preprocessor">#else</span>
-<a name="l00240"></a>00240 <span class="preprocessor"></span>    <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<2,uint16_t>((<span class="keyword">volatile</span> uint16_t *)ptr,value,comparand);
-<a name="l00241"></a>00241 <span class="preprocessor">#endif</span>
-<a name="l00242"></a>00242 <span class="preprocessor"></span>}
-<a name="l00243"></a>00243 
-<a name="l00244"></a>00244 <span class="keyword">template</span><>
-<a name="l00245"></a>00245 <span class="keyword">inline</span> uint32_t __TBB_CompareAndSwapGeneric <4,uint32_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint32_t value, uint32_t comparand ) { 
-<a name="l00246"></a>00246     <span class="keywordflow">return</span> __TBB_CompareAndSwap4(ptr,value,comparand);
-<a name="l00247"></a>00247 }
-<a name="l00248"></a>00248 
-<a name="l00249"></a>00249 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
-<a name="l00250"></a>00250 <span class="preprocessor"></span><span class="keyword">template</span><>
-<a name="l00251"></a>00251 <span class="keyword">inline</span> uint64_t __TBB_CompareAndSwapGeneric <8,uint64_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint64_t value, uint64_t comparand ) { 
-<a name="l00252"></a>00252     <span class="keywordflow">return</span> __TBB_CompareAndSwap8(ptr,value,comparand);
-<a name="l00253"></a>00253 }
-<a name="l00254"></a>00254 <span class="preprocessor">#endif</span>
-<a name="l00255"></a>00255 <span class="preprocessor"></span>
-<a name="l00256"></a>00256 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00257"></a>00257 <span class="keyword">inline</span> T __TBB_FetchAndAddGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T addend) {
-<a name="l00258"></a>00258     atomic_backoff b;
-<a name="l00259"></a>00259     T result;
-<a name="l00260"></a>00260     <span class="keywordflow">for</span>(;;) {
-<a name="l00261"></a>00261         result = *reinterpret_cast<volatile T *>(ptr);
-<a name="l00262"></a>00262         <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence. </span>
-<a name="l00263"></a>00263         <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result ) 
-<a name="l00264"></a>00264             <span class="keywordflow">break</span>;
-<a name="l00265"></a>00265         b.pause();
-<a name="l00266"></a>00266     }
-<a name="l00267"></a>00267     <span class="keywordflow">return</span> result;
-<a name="l00268"></a>00268 }
-<a name="l00269"></a>00269 
-<a name="l00270"></a>00270 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
-<a name="l00271"></a>00271 <span class="keyword">inline</span> T __TBB_FetchAndStoreGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value) {
-<a name="l00272"></a>00272     atomic_backoff b;
-<a name="l00273"></a>00273     T result;
-<a name="l00274"></a>00274     <span class="keywordflow">for</span>(;;) {
-<a name="l00275"></a>00275         result = *reinterpret_cast<volatile T *>(ptr);
-<a name="l00276"></a>00276         <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence.</span>
-<a name="l00277"></a>00277         <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result ) 
-<a name="l00278"></a>00278             <span class="keywordflow">break</span>;
-<a name="l00279"></a>00279         b.pause();
-<a name="l00280"></a>00280     }
-<a name="l00281"></a>00281     <span class="keywordflow">return</span> result;
-<a name="l00282"></a>00282 }
+<a name="l00134"></a>00134 <span class="keyword">template</span><> <span class="keyword">struct </span>atomic_selector<4> {
+<a name="l00135"></a>00135 <span class="preprocessor">#if _MSC_VER && !_WIN64</span>
+<a name="l00136"></a>00136 <span class="preprocessor"></span>    <span class="comment">// Work-around that avoids spurious /Wp64 warnings</span>
+<a name="l00137"></a>00137     <span class="keyword">typedef</span> intptr_t word;
+<a name="l00138"></a>00138 <span class="preprocessor">#else</span>
+<a name="l00139"></a>00139 <span class="preprocessor"></span>    <span class="keyword">typedef</span> int32_t word;
+<a name="l00140"></a>00140 <span class="preprocessor">#endif</span>
+<a name="l00141"></a>00141 <span class="preprocessor"></span>    <span class="keyword">inline</span> <span class="keyword">static</span> word fetch_store ( <span class="keyword">volatile</span> <span class="keywordtype">void</span>* location, word value );
+<a name="l00142"></a>00142 };
+<a name="l00143"></a>00143 
+<a name="l00144"></a>00144 <span class="keyword">template</span><> <span class="keyword">struct </span>atomic_selector<8> {
+<a name="l00145"></a>00145     <span class="keyword">typedef</span> int64_t word;
+<a name="l00146"></a>00146     <span class="keyword">inline</span> <span class="keyword">static</span> word fetch_store ( <span class="keyword">volatile</span> <span class="keywordtype">void</span>* location, word value );
+<a name="l00147"></a>00147 };
+<a name="l00148"></a>00148 
+<a name="l00149"></a>00149 }} <span class="comment">// namespaces internal, tbb</span>
+<a name="l00150"></a>00150 
+<a name="l00151"></a>00151 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00152"></a>00152 <span class="preprocessor"></span>
+<a name="l00153"></a>00153 <span class="preprocessor">#ifdef _MANAGED</span>
+<a name="l00154"></a>00154 <span class="preprocessor"></span><span class="preprocessor">#pragma managed(push, off)</span>
+<a name="l00155"></a>00155 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00156"></a>00156 <span class="preprocessor"></span>
+<a name="l00157"></a>00157 <span class="preprocessor">    #if __MINGW64__ || __MINGW32__</span>
+<a name="l00158"></a>00158 <span class="preprocessor"></span>        <span class="keyword">extern</span> <span class="stringliteral">"C"</span> __declspec(dllimport) int __stdcall SwitchToThread( <span class="keywordtype">void</span> );
+<a name="l00159"></a>00159         <span class="preprocessor">#define __TBB_Yield()  SwitchToThread()</span>
+<a name="l00160"></a>00160 <span class="preprocessor"></span><span class="preprocessor">        #if (TBB_USE_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT)</span>
+<a name="l00161"></a>00161 <span class="preprocessor"></span><span class="preprocessor">            #include "machine/gcc_generic.h"</span>
+<a name="l00162"></a>00162 <span class="preprocessor">        #elif __MINGW64__</span>
+<a name="l00163"></a>00163 <span class="preprocessor"></span><span class="preprocessor">            #include "machine/linux_intel64.h"</span>
+<a name="l00164"></a>00164 <span class="preprocessor">        #elif __MINGW32__</span>
+<a name="l00165"></a>00165 <span class="preprocessor"></span><span class="preprocessor">            #include "machine/linux_ia32.h"</span>
+<a name="l00166"></a>00166 <span class="preprocessor">        #endif</span>
+<a name="l00167"></a>00167 <span class="preprocessor"></span><span class="preprocessor">    #elif defined(_M_IX86)</span>
+<a name="l00168"></a>00168 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/windows_ia32.h"</span>
+<a name="l00169"></a>00169 <span class="preprocessor">    #elif defined(_M_X64) </span>
+<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/windows_intel64.h"</span>
+<a name="l00171"></a>00171 <span class="preprocessor">    #elif _XBOX</span>
+<a name="l00172"></a>00172 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/xbox360_ppc.h"</span>
+<a name="l00173"></a>00173 <span class="preprocessor">    #endif</span>
+<a name="l00174"></a>00174 <span class="preprocessor"></span>
+<a name="l00175"></a>00175 <span class="preprocessor">#ifdef _MANAGED</span>
+<a name="l00176"></a>00176 <span class="preprocessor"></span><span class="preprocessor">#pragma managed(pop)</span>
+<a name="l00177"></a>00177 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00178"></a>00178 <span class="preprocessor"></span>
+<a name="l00179"></a>00179 <span class="preprocessor">#elif __linux__ || __FreeBSD__ || __NetBSD__</span>
+<a name="l00180"></a>00180 <span class="preprocessor"></span>
+<a name="l00181"></a>00181 <span class="preprocessor">    #if (TBB_USE_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT)</span>
+<a name="l00182"></a>00182 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/gcc_generic.h"</span>
+<a name="l00183"></a>00183 <span class="preprocessor">    #elif __i386__</span>
+<a name="l00184"></a>00184 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/linux_ia32.h"</span>
+<a name="l00185"></a>00185 <span class="preprocessor">    #elif __x86_64__</span>
+<a name="l00186"></a>00186 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/linux_intel64.h"</span>
+<a name="l00187"></a>00187 <span class="preprocessor">    #elif __ia64__</span>
+<a name="l00188"></a>00188 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/linux_ia64.h"</span>
+<a name="l00189"></a>00189 <span class="preprocessor">    #elif __powerpc__</span>
+<a name="l00190"></a>00190 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/mac_ppc.h"</span>
+<a name="l00191"></a>00191 <span class="preprocessor">    #elif __TBB_GCC_BUILTIN_ATOMICS_PRESENT</span>
+<a name="l00192"></a>00192 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/gcc_generic.h"</span>
+<a name="l00193"></a>00193 <span class="preprocessor">    #endif</span>
+<a name="l00194"></a>00194 <span class="preprocessor"></span><span class="preprocessor">    #include "machine/linux_common.h"</span>
+<a name="l00195"></a>00195 
+<a name="l00196"></a>00196 <span class="preprocessor">#elif __APPLE__</span>
+<a name="l00197"></a>00197 <span class="preprocessor"></span>
+<a name="l00198"></a>00198 <span class="preprocessor">    #if __i386__</span>
+<a name="l00199"></a>00199 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/linux_ia32.h"</span>
+<a name="l00200"></a>00200 <span class="preprocessor">    #elif __x86_64__</span>
+<a name="l00201"></a>00201 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/linux_intel64.h"</span>
+<a name="l00202"></a>00202 <span class="preprocessor">    #elif __POWERPC__</span>
+<a name="l00203"></a>00203 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/mac_ppc.h"</span>
+<a name="l00204"></a>00204 <span class="preprocessor">    #endif</span>
+<a name="l00205"></a>00205 <span class="preprocessor"></span><span class="preprocessor">    #include "machine/macos_common.h"</span>
+<a name="l00206"></a>00206 
+<a name="l00207"></a>00207 <span class="preprocessor">#elif _AIX</span>
+<a name="l00208"></a>00208 <span class="preprocessor"></span>
+<a name="l00209"></a>00209 <span class="preprocessor">    #include "machine/ibm_aix51.h"</span>
+<a name="l00210"></a>00210 
+<a name="l00211"></a>00211 <span class="preprocessor">#elif __sun || __SUNPRO_CC</span>
+<a name="l00212"></a>00212 <span class="preprocessor"></span>
+<a name="l00213"></a>00213 <span class="preprocessor">    #define __asm__ asm</span>
+<a name="l00214"></a>00214 <span class="preprocessor"></span><span class="preprocessor">    #define __volatile__ volatile</span>
+<a name="l00215"></a>00215 <span class="preprocessor"></span>
+<a name="l00216"></a>00216 <span class="preprocessor">    #if __i386  || __i386__</span>
+<a name="l00217"></a>00217 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/linux_ia32.h"</span>
+<a name="l00218"></a>00218 <span class="preprocessor">    #elif __x86_64__</span>
+<a name="l00219"></a>00219 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/linux_intel64.h"</span>
+<a name="l00220"></a>00220 <span class="preprocessor">    #elif __sparc</span>
+<a name="l00221"></a>00221 <span class="preprocessor"></span><span class="preprocessor">        #include "machine/sunos_sparc.h"</span>
+<a name="l00222"></a>00222 <span class="preprocessor">    #endif</span>
+<a name="l00223"></a>00223 <span class="preprocessor"></span><span class="preprocessor">    #include <sched.h></span>
+<a name="l00224"></a>00224 
+<a name="l00225"></a>00225 <span class="preprocessor">    #define __TBB_Yield() sched_yield()</span>
+<a name="l00226"></a>00226 <span class="preprocessor"></span>
+<a name="l00227"></a>00227 <span class="preprocessor">#endif </span><span class="comment">/* OS selection */</span>
+<a name="l00228"></a>00228 
+<a name="l00229"></a>00229 <span class="preprocessor">#ifndef __TBB_64BIT_ATOMICS</span>
+<a name="l00230"></a>00230 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_64BIT_ATOMICS 1</span>
+<a name="l00231"></a>00231 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00232"></a>00232 <span class="preprocessor"></span>
+<a name="l00233"></a>00233 <span class="comment">// Special atomic functions</span>
+<a name="l00234"></a>00234 <span class="preprocessor">#if __TBB_USE_FENCED_ATOMICS</span>
+<a name="l00235"></a>00235 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_machine_cmpswp1   __TBB_machine_cmpswp1full_fence</span>
+<a name="l00236"></a>00236 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_machine_cmpswp2   __TBB_machine_cmpswp2full_fence</span>
+<a name="l00237"></a>00237 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_machine_cmpswp4   __TBB_machine_cmpswp4full_fence</span>
+<a name="l00238"></a>00238 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_machine_cmpswp8   __TBB_machine_cmpswp8full_fence</span>
+<a name="l00239"></a>00239 <span class="preprocessor"></span>
+<a name="l00240"></a>00240 <span class="preprocessor">    #if __TBB_WORDSIZE==8</span>
+<a name="l00241"></a>00241 <span class="preprocessor"></span><span class="preprocessor">        #define __TBB_machine_fetchadd8             __TBB_machine_fetchadd8full_fence</span>
+<a name="l00242"></a>00242 <span class="preprocessor"></span><span class="preprocessor">        #define __TBB_machine_fetchstore8           __TBB_machine_fetchstore8full_fence</span>
+<a name="l00243"></a>00243 <span class="preprocessor"></span><span class="preprocessor">        #define __TBB_FetchAndAddWrelease(P,V)      __TBB_machine_fetchadd8release(P,V)</span>
+<a name="l00244"></a>00244 <span class="preprocessor"></span><span class="preprocessor">        #define __TBB_FetchAndIncrementWacquire(P)  __TBB_machine_fetchadd8acquire(P,1)</span>
+<a name="l00245"></a>00245 <span class="preprocessor"></span><span class="preprocessor">        #define __TBB_FetchAndDecrementWrelease(P)  __TBB_machine_fetchadd8release(P,(-1))</span>
+<a name="l00246"></a>00246 <span class="preprocessor"></span><span class="preprocessor">    #else</span>
+<a name="l00247"></a>00247 <span class="preprocessor"></span><span class="preprocessor">        #error Define macros for 4-byte word, similarly to the above __TBB_WORDSIZE==8 branch.</span>
+<a name="l00248"></a>00248 <span class="preprocessor"></span><span class="preprocessor">    #endif </span><span class="comment">/* __TBB_WORDSIZE==4 */</span>
+<a name="l00249"></a>00249 <span class="preprocessor">#else </span><span class="comment">/* !__TBB_USE_FENCED_ATOMICS */</span>
+<a name="l00250"></a>00250 <span class="preprocessor">    #define __TBB_FetchAndAddWrelease(P,V)      __TBB_FetchAndAddW(P,V)</span>
+<a name="l00251"></a>00251 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_FetchAndIncrementWacquire(P)  __TBB_FetchAndAddW(P,1)</span>
+<a name="l00252"></a>00252 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_FetchAndDecrementWrelease(P)  __TBB_FetchAndAddW(P,(-1))</span>
+<a name="l00253"></a>00253 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !__TBB_USE_FENCED_ATOMICS */</span>
+<a name="l00254"></a>00254 
+<a name="l00255"></a>00255 <span class="preprocessor">#if __TBB_WORDSIZE==4</span>
+<a name="l00256"></a>00256 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_CompareAndSwapW(P,V,C)    __TBB_machine_cmpswp4(P,V,C)</span>
+<a name="l00257"></a>00257 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_FetchAndAddW(P,V)         __TBB_machine_fetchadd4(P,V)</span>
+<a name="l00258"></a>00258 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_FetchAndStoreW(P,V)       __TBB_machine_fetchstore4(P,V)</span>
+<a name="l00259"></a>00259 <span class="preprocessor"></span><span class="preprocessor">#elif  __TBB_WORDSIZE==8</span>
+<a name="l00260"></a>00260 <span class="preprocessor"></span><span class="preprocessor">    #if __TBB_USE_GENERIC_DWORD_LOAD_STORE || __TBB_USE_GENERIC_DWORD_FETCH_ADD || __TBB_USE_GENERIC_DWORD_FETCH_STORE</span>
+<a name="l00261"></a>00261 <span class="preprocessor"></span><span class="preprocessor">        #error These macros should only be used on 32-bit platforms.</span>
+<a name="l00262"></a>00262 <span class="preprocessor"></span><span class="preprocessor">    #endif</span>
+<a name="l00263"></a>00263 <span class="preprocessor"></span>
+<a name="l00264"></a>00264 <span class="preprocessor">    #define __TBB_CompareAndSwapW(P,V,C)    __TBB_machine_cmpswp8(P,V,C)</span>
+<a name="l00265"></a>00265 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_FetchAndAddW(P,V)         __TBB_machine_fetchadd8(P,V)</span>
+<a name="l00266"></a>00266 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_FetchAndStoreW(P,V)       __TBB_machine_fetchstore8(P,V)</span>
+<a name="l00267"></a>00267 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* __TBB_WORDSIZE != 8 */</span>
+<a name="l00268"></a>00268 <span class="preprocessor">    #error Unsupported machine word size.</span>
+<a name="l00269"></a>00269 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE */</span>
+<a name="l00270"></a>00270 
+<a name="l00271"></a>00271 <span class="preprocessor">#ifndef __TBB_Pause</span>
+<a name="l00272"></a>00272 <span class="preprocessor"></span>    <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_Pause(int32_t) {
+<a name="l00273"></a>00273         __TBB_Yield();
+<a name="l00274"></a>00274     }
+<a name="l00275"></a>00275 <span class="preprocessor">#endif</span>
+<a name="l00276"></a>00276 <span class="preprocessor"></span>
+<a name="l00277"></a>00277 <span class="keyword">namespace </span>tbb {
+<a name="l00278"></a>00278 
+<a name="l00280"></a><a class="code" href="a00383.html#250275615f10d5b5de6ad466ae2f54de">00280</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="a00383.html#250275615f10d5b5de6ad466ae2f54de">atomic_fence</a> () { __TBB_full_memory_fence(); }
+<a name="l00281"></a>00281 
+<a name="l00282"></a>00282 <span class="keyword">namespace </span>internal {
 <a name="l00283"></a>00283 
-<a name="l00284"></a>00284 <span class="comment">// Macro __TBB_TypeWithAlignmentAtLeastAsStrict(T) should be a type with alignment at least as </span>
-<a name="l00285"></a>00285 <span class="comment">// strict as type T.  Type type should have a trivial default constructor and destructor, so that</span>
-<a name="l00286"></a>00286 <span class="comment">// arrays of that type can be declared without initializers.  </span>
-<a name="l00287"></a>00287 <span class="comment">// It is correct (but perhaps a waste of space) if __TBB_TypeWithAlignmentAtLeastAsStrict(T) expands</span>
-<a name="l00288"></a>00288 <span class="comment">// to a type bigger than T.</span>
-<a name="l00289"></a>00289 <span class="comment">// The default definition here works on machines where integers are naturally aligned and the</span>
-<a name="l00290"></a>00290 <span class="comment">// strictest alignment is 16.</span>
-<a name="l00291"></a>00291 <span class="preprocessor">#ifndef __TBB_TypeWithAlignmentAtLeastAsStrict</span>
-<a name="l00292"></a>00292 <span class="preprocessor"></span>
-<a name="l00293"></a>00293 <span class="preprocessor">#if __GNUC__ || __SUNPRO_CC || __IBMCPP__</span>
-<a name="l00294"></a>00294 <span class="preprocessor"></span><span class="keyword">struct </span>__TBB_machine_type_with_strictest_alignment {
-<a name="l00295"></a>00295     <span class="keywordtype">int</span> member[4];
-<a name="l00296"></a>00296 } __attribute__((aligned(16)));
-<a name="l00297"></a>00297 <span class="preprocessor">#elif _MSC_VER</span>
-<a name="l00298"></a>00298 <span class="preprocessor"></span>__declspec(align(16)) struct __TBB_machine_type_with_strictest_alignment {
-<a name="l00299"></a>00299     <span class="keywordtype">int</span> member[4];
-<a name="l00300"></a>00300 };
-<a name="l00301"></a>00301 <span class="preprocessor">#else</span>
-<a name="l00302"></a>00302 <span class="preprocessor"></span><span class="preprocessor">#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T) or __TBB_machine_type_with_strictest_alignment</span>
-<a name="l00303"></a>00303 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00304"></a>00304 <span class="preprocessor"></span>
-<a name="l00305"></a>00305 <span class="keyword">template</span><size_t N> <span class="keyword">struct </span>type_with_alignment {__TBB_machine_type_with_strictest_alignment member;};
-<a name="l00306"></a>00306 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<1> { <span class="keywordtype">char</span> member; };
-<a name="l00307"></a>00307 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<2> { uint16_t member; };
-<a name="l00308"></a>00308 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<4> { uint32_t member; };
-<a name="l00309"></a>00309 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<8> { uint64_t member; };
-<a name="l00310"></a>00310 
-<a name="l00311"></a>00311 <span class="preprocessor">#if _MSC_VER||defined(__GNUC__)&&__GNUC__==3 && __GNUC_MINOR__<=2  </span>
-<a name="l00313"></a>00313 <span class="preprocessor"></span>
-<a name="l00315"></a>00315 <span class="preprocessor">template<size_t Size, typename T> </span>
-<a name="l00316"></a><a class="code" href="a00305.html">00316</a> <span class="preprocessor"></span><span class="keyword">struct </span><a class="code" href="a00305.html">work_around_alignment_bug</a> {
-<a name="l00317"></a>00317 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00318"></a>00318 <span class="preprocessor"></span>    <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __alignof(T);
-<a name="l00319"></a>00319 <span class="preprocessor">#else</span>
-<a name="l00320"></a>00320 <span class="preprocessor"></span>    <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __alignof__(T);
-<a name="l00321"></a>00321 <span class="preprocessor">#endif</span>
-<a name="l00322"></a>00322 <span class="preprocessor"></span>};
-<a name="l00323"></a>00323 <span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<tbb::internal::work_around_alignment_bug<sizeof(T),T>::alignment></span>
-<a name="l00324"></a>00324 <span class="preprocessor"></span><span class="preprocessor">#elif __GNUC__ || __SUNPRO_CC || __IBMCPP__</span>
-<a name="l00325"></a>00325 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__alignof__(T)></span>
-<a name="l00326"></a>00326 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00327"></a>00327 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) __TBB_machine_type_with_strictest_alignment</span>
-<a name="l00328"></a>00328 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00329"></a>00329 <span class="preprocessor"></span><span class="preprocessor">#endif  </span><span class="comment">/* ____TBB_TypeWithAlignmentAtLeastAsStrict */</span>
-<a name="l00330"></a>00330 
-<a name="l00331"></a>00331 <span class="comment">// Template class here is to avoid instantiation of the static data for modules that don't use it</span>
-<a name="l00332"></a>00332 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00333"></a>00333 <span class="keyword">struct </span>reverse {
-<a name="l00334"></a>00334     <span class="keyword">static</span> <span class="keyword">const</span> T byte_table[256];
-<a name="l00335"></a>00335 };
-<a name="l00336"></a>00336 <span class="comment">// An efficient implementation of the reverse function utilizes a 2^8 lookup table holding the bit-reversed</span>
-<a name="l00337"></a>00337 <span class="comment">// values of [0..2^8 - 1]. Those values can also be computed on the fly at a slightly higher cost.</span>
-<a name="l00338"></a>00338 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00339"></a>00339 <span class="keyword">const</span> T reverse<T>::byte_table[256] = {
-<a name="l00340"></a>00340     0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
-<a name="l00341"></a>00341     0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
-<a name="l00342"></a>00342     0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
-<a name="l00343"></a>00343     0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
-<a name="l00344"></a>00344     0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
-<a name="l00345"></a>00345     0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
-<a name="l00346"></a>00346     0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
-<a name="l00347"></a>00347     0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
-<a name="l00348"></a>00348     0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
-<a name="l00349"></a>00349     0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
-<a name="l00350"></a>00350     0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
-<a name="l00351"></a>00351     0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
-<a name="l00352"></a>00352     0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
-<a name="l00353"></a>00353     0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
-<a name="l00354"></a>00354     0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
-<a name="l00355"></a>00355     0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
-<a name="l00356"></a>00356 };
-<a name="l00357"></a>00357 
-<a name="l00358"></a>00358 } <span class="comment">// namespace internal</span>
-<a name="l00359"></a>00359 } <span class="comment">// namespace tbb</span>
-<a name="l00360"></a>00360 
-<a name="l00361"></a>00361 <span class="preprocessor">#ifndef __TBB_CompareAndSwap1</span>
-<a name="l00362"></a>00362 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t></span>
-<a name="l00363"></a>00363 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00364"></a>00364 <span class="preprocessor"></span>
-<a name="l00365"></a>00365 <span class="preprocessor">#ifndef __TBB_CompareAndSwap2 </span>
-<a name="l00366"></a>00366 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t></span>
-<a name="l00367"></a>00367 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00368"></a>00368 <span class="preprocessor"></span>
-<a name="l00369"></a>00369 <span class="preprocessor">#ifndef __TBB_CompareAndSwapW</span>
-<a name="l00370"></a>00370 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwapW tbb::internal::__TBB_CompareAndSwapGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
-<a name="l00371"></a>00371 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00372"></a>00372 <span class="preprocessor"></span>
-<a name="l00373"></a>00373 <span class="preprocessor">#ifndef __TBB_FetchAndAdd1</span>
-<a name="l00374"></a>00374 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t></span>
-<a name="l00375"></a>00375 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00376"></a>00376 <span class="preprocessor"></span>
-<a name="l00377"></a>00377 <span class="preprocessor">#ifndef __TBB_FetchAndAdd2</span>
-<a name="l00378"></a>00378 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t></span>
-<a name="l00379"></a>00379 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00380"></a>00380 <span class="preprocessor"></span>
-<a name="l00381"></a>00381 <span class="preprocessor">#ifndef __TBB_FetchAndAdd4</span>
-<a name="l00382"></a>00382 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t></span>
-<a name="l00383"></a>00383 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00384"></a>00384 <span class="preprocessor"></span>
-<a name="l00385"></a>00385 <span class="preprocessor">#ifndef __TBB_FetchAndAdd8</span>
-<a name="l00386"></a>00386 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t></span>
-<a name="l00387"></a>00387 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00388"></a>00388 <span class="preprocessor"></span>
-<a name="l00389"></a>00389 <span class="preprocessor">#ifndef __TBB_FetchAndAddW</span>
-<a name="l00390"></a>00390 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAddW tbb::internal::__TBB_FetchAndAddGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
-<a name="l00391"></a>00391 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00392"></a>00392 <span class="preprocessor"></span>
-<a name="l00393"></a>00393 <span class="preprocessor">#ifndef __TBB_FetchAndStore1</span>
-<a name="l00394"></a>00394 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t></span>
-<a name="l00395"></a>00395 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00396"></a>00396 <span class="preprocessor"></span>
-<a name="l00397"></a>00397 <span class="preprocessor">#ifndef __TBB_FetchAndStore2</span>
-<a name="l00398"></a>00398 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t></span>
-<a name="l00399"></a>00399 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00400"></a>00400 <span class="preprocessor"></span>
-<a name="l00401"></a>00401 <span class="preprocessor">#ifndef __TBB_FetchAndStore4</span>
-<a name="l00402"></a>00402 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t></span>
-<a name="l00403"></a>00403 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00404"></a>00404 <span class="preprocessor"></span>
-<a name="l00405"></a>00405 <span class="preprocessor">#ifndef __TBB_FetchAndStore8</span>
-<a name="l00406"></a>00406 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_t></span>
-<a name="l00407"></a>00407 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00408"></a>00408 <span class="preprocessor"></span>
-<a name="l00409"></a>00409 <span class="preprocessor">#ifndef __TBB_FetchAndStoreW</span>
-<a name="l00410"></a>00410 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStoreW tbb::internal::__TBB_FetchAndStoreGeneric<sizeof(ptrdiff_t),ptrdiff_t></span>
-<a name="l00411"></a>00411 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00412"></a>00412 <span class="preprocessor"></span>
-<a name="l00413"></a>00413 <span class="preprocessor">#if __TBB_DECL_FENCED_ATOMICS</span>
-<a name="l00414"></a>00414 <span class="preprocessor"></span>
-<a name="l00415"></a>00415 <span class="preprocessor">#ifndef __TBB_CompareAndSwap1__TBB_full_fence</span>
-<a name="l00416"></a>00416 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1__TBB_full_fence __TBB_CompareAndSwap1</span>
-<a name="l00417"></a>00417 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00418"></a>00418 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap1acquire</span>
-<a name="l00419"></a>00419 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1acquire __TBB_CompareAndSwap1__TBB_full_fence</span>
-<a name="l00420"></a>00420 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00421"></a>00421 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap1release</span>
-<a name="l00422"></a>00422 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap1release __TBB_CompareAndSwap1__TBB_full_fence</span>
-<a name="l00423"></a>00423 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00424"></a>00424 <span class="preprocessor"></span>
-<a name="l00425"></a>00425 <span class="preprocessor">#ifndef __TBB_CompareAndSwap2__TBB_full_fence</span>
-<a name="l00426"></a>00426 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2__TBB_full_fence __TBB_CompareAndSwap2</span>
-<a name="l00427"></a>00427 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00428"></a>00428 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap2acquire</span>
-<a name="l00429"></a>00429 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2acquire __TBB_CompareAndSwap2__TBB_full_fence</span>
-<a name="l00430"></a>00430 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00431"></a>00431 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap2release</span>
-<a name="l00432"></a>00432 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap2release __TBB_CompareAndSwap2__TBB_full_fence</span>
-<a name="l00433"></a>00433 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00434"></a>00434 <span class="preprocessor"></span>
-<a name="l00435"></a>00435 <span class="preprocessor">#ifndef __TBB_CompareAndSwap4__TBB_full_fence</span>
-<a name="l00436"></a>00436 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4__TBB_full_fence __TBB_CompareAndSwap4</span>
-<a name="l00437"></a>00437 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00438"></a>00438 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap4acquire</span>
-<a name="l00439"></a>00439 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4acquire __TBB_CompareAndSwap4__TBB_full_fence</span>
-<a name="l00440"></a>00440 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00441"></a>00441 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap4release</span>
-<a name="l00442"></a>00442 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap4release __TBB_CompareAndSwap4__TBB_full_fence</span>
-<a name="l00443"></a>00443 <span class="preprocessor"></span><span class="preprocessor">#endif </span>
-<a name="l00444"></a>00444 <span class="preprocessor"></span>
-<a name="l00445"></a>00445 <span class="preprocessor">#ifndef __TBB_CompareAndSwap8__TBB_full_fence</span>
-<a name="l00446"></a>00446 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8__TBB_full_fence __TBB_CompareAndSwap8</span>
-<a name="l00447"></a>00447 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00448"></a>00448 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap8acquire</span>
-<a name="l00449"></a>00449 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8acquire __TBB_CompareAndSwap8__TBB_full_fence</span>
-<a name="l00450"></a>00450 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00451"></a>00451 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_CompareAndSwap8release</span>
-<a name="l00452"></a>00452 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_CompareAndSwap8release __TBB_CompareAndSwap8__TBB_full_fence</span>
+<a name="l00285"></a>00285 
+<a name="l00286"></a><a class="code" href="a00230.html">00286</a> <span class="keyword">class </span><a class="code" href="a00230.html">atomic_backoff</a> : no_copy {
+<a name="l00288"></a>00288 
+<a name="l00290"></a>00290     <span class="keyword">static</span> <span class="keyword">const</span> int32_t LOOPS_BEFORE_YIELD = 16;
+<a name="l00291"></a>00291     int32_t count;
+<a name="l00292"></a>00292 <span class="keyword">public</span>:
+<a name="l00293"></a>00293     <a class="code" href="a00230.html">atomic_backoff</a>() : count(1) {}
+<a name="l00294"></a>00294 
+<a name="l00296"></a><a class="code" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">00296</a>     <span class="keywordtype">void</span> <a class="code" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>() {
+<a name="l00297"></a>00297         <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
+<a name="l00298"></a>00298             __TBB_Pause(count);
+<a name="l00299"></a>00299             <span class="comment">// Pause twice as long the next time.</span>
+<a name="l00300"></a>00300             count*=2;
+<a name="l00301"></a>00301         } <span class="keywordflow">else</span> {
+<a name="l00302"></a>00302             <span class="comment">// Pause is so long that we might as well yield CPU to scheduler.</span>
+<a name="l00303"></a>00303             __TBB_Yield();
+<a name="l00304"></a>00304         }
+<a name="l00305"></a>00305     }
+<a name="l00306"></a>00306 
+<a name="l00307"></a>00307     <span class="comment">// pause for a few times and then return false immediately.</span>
+<a name="l00308"></a>00308     <span class="keywordtype">bool</span> bounded_pause() {
+<a name="l00309"></a>00309         <span class="keywordflow">if</span>( count<=LOOPS_BEFORE_YIELD ) {
+<a name="l00310"></a>00310             __TBB_Pause(count);
+<a name="l00311"></a>00311             <span class="comment">// Pause twice as long the next time.</span>
+<a name="l00312"></a>00312             count*=2;
+<a name="l00313"></a>00313             <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00314"></a>00314         } <span class="keywordflow">else</span> {
+<a name="l00315"></a>00315             <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00316"></a>00316         }
+<a name="l00317"></a>00317     }
+<a name="l00318"></a>00318 
+<a name="l00319"></a>00319     <span class="keywordtype">void</span> reset() {
+<a name="l00320"></a>00320         count = 1;
+<a name="l00321"></a>00321     }
+<a name="l00322"></a>00322 };
+<a name="l00323"></a>00323 
+<a name="l00325"></a>00325 
+<a name="l00326"></a>00326 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00327"></a>00327 <span class="keywordtype">void</span> spin_wait_while_eq( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location, U value ) {
+<a name="l00328"></a>00328     atomic_backoff backoff;
+<a name="l00329"></a>00329     <span class="keywordflow">while</span>( location==value ) backoff.pause();
+<a name="l00330"></a>00330 }
+<a name="l00331"></a>00331 
+<a name="l00333"></a>00333 
+<a name="l00334"></a>00334 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00335"></a>00335 <span class="keywordtype">void</span> spin_wait_until_eq( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location, <span class="keyword">const</span> U value ) {
+<a name="l00336"></a>00336     atomic_backoff backoff;
+<a name="l00337"></a>00337     <span class="keywordflow">while</span>( location!=value ) backoff.pause();
+<a name="l00338"></a>00338 }
+<a name="l00339"></a>00339 
+<a name="l00340"></a>00340 <span class="comment">// T should be unsigned, otherwise sign propagation will break correctness of bit manipulations.</span>
+<a name="l00341"></a>00341 <span class="comment">// S should be either 1 or 2, for the mask calculation to work correctly.</span>
+<a name="l00342"></a>00342 <span class="comment">// Together, these rules limit applicability of Masked CAS to unsigned char and unsigned short.</span>
+<a name="l00343"></a>00343 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00344"></a>00344 <span class="keyword">inline</span> T __TBB_MaskedCompareAndSwap (<span class="keyword">volatile</span> T *ptr, T value, T comparand ) {
+<a name="l00345"></a>00345     <span class="keyword">volatile</span> uint32_t * base = (uint32_t*)( (uintptr_t)ptr & ~(uintptr_t)0x3 );
+<a name="l00346"></a>00346 <span class="preprocessor">#if __TBB_BIG_ENDIAN</span>
+<a name="l00347"></a>00347 <span class="preprocessor"></span>    <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*( 4-S - (uintptr_t(ptr) & 0x3) ) );
+<a name="l00348"></a>00348 <span class="preprocessor">#else</span>
+<a name="l00349"></a>00349 <span class="preprocessor"></span>    <span class="keyword">const</span> uint8_t bitoffset = uint8_t( 8*((uintptr_t)ptr & 0x3) );
+<a name="l00350"></a>00350 <span class="preprocessor">#endif</span>
+<a name="l00351"></a>00351 <span class="preprocessor"></span>    <span class="keyword">const</span> uint32_t mask = ( (1<<(S*8)) - 1 )<<bitoffset;
+<a name="l00352"></a>00352     atomic_backoff b;
+<a name="l00353"></a>00353     uint32_t result;
+<a name="l00354"></a>00354     <span class="keywordflow">for</span>(;;) {
+<a name="l00355"></a>00355         result = *base; <span class="comment">// reload the base value which might change during the pause</span>
+<a name="l00356"></a>00356         uint32_t old_value = ( result & ~mask ) | ( comparand << bitoffset );
+<a name="l00357"></a>00357         uint32_t new_value = ( result & ~mask ) | ( value << bitoffset );
+<a name="l00358"></a>00358         <span class="comment">// __TBB_CompareAndSwap4 presumed to have full fence.</span>
+<a name="l00359"></a>00359         <span class="comment">// Cast shuts up /Wp64 warning</span>
+<a name="l00360"></a>00360         result = (uint32_t)__TBB_machine_cmpswp4( base, new_value, old_value );
+<a name="l00361"></a>00361         <span class="keywordflow">if</span>(  result==old_value               <span class="comment">// CAS succeeded</span>
+<a name="l00362"></a>00362           || ((result^old_value)&mask)!=0 )  <span class="comment">// CAS failed and the bits of interest have changed</span>
+<a name="l00363"></a>00363             <span class="keywordflow">break</span>;
+<a name="l00364"></a>00364         <span class="keywordflow">else</span>                                 <span class="comment">// CAS failed but the bits of interest left unchanged</span>
+<a name="l00365"></a>00365             b.pause();
+<a name="l00366"></a>00366     }
+<a name="l00367"></a>00367     <span class="keywordflow">return</span> T((result & mask) >> bitoffset);
+<a name="l00368"></a>00368 }
+<a name="l00369"></a>00369 
+<a name="l00370"></a>00370 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00371"></a>00371 <span class="keyword">inline</span> T __TBB_CompareAndSwapGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value, T comparand );
+<a name="l00372"></a>00372 
+<a name="l00373"></a>00373 <span class="keyword">template</span><>
+<a name="l00374"></a>00374 <span class="keyword">inline</span> uint8_t __TBB_CompareAndSwapGeneric <1,uint8_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint8_t value, uint8_t comparand ) {
+<a name="l00375"></a>00375 #<span class="keywordflow">if</span> __TBB_USE_GENERIC_PART_WORD_CAS
+<a name="l00376"></a>00376     <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<1,uint8_t>((<span class="keyword">volatile</span> uint8_t *)ptr,value,comparand);
+<a name="l00377"></a>00377 <span class="preprocessor">#else</span>
+<a name="l00378"></a>00378 <span class="preprocessor"></span>    <span class="keywordflow">return</span> __TBB_machine_cmpswp1(ptr,value,comparand);
+<a name="l00379"></a>00379 <span class="preprocessor">#endif</span>
+<a name="l00380"></a>00380 <span class="preprocessor"></span>}
+<a name="l00381"></a>00381 
+<a name="l00382"></a>00382 <span class="keyword">template</span><>
+<a name="l00383"></a>00383 <span class="keyword">inline</span> uint16_t __TBB_CompareAndSwapGeneric <2,uint16_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint16_t value, uint16_t comparand ) {
+<a name="l00384"></a>00384 #<span class="keywordflow">if</span> __TBB_USE_GENERIC_PART_WORD_CAS
+<a name="l00385"></a>00385     <span class="keywordflow">return</span> __TBB_MaskedCompareAndSwap<2,uint16_t>((<span class="keyword">volatile</span> uint16_t *)ptr,value,comparand);
+<a name="l00386"></a>00386 <span class="preprocessor">#else</span>
+<a name="l00387"></a>00387 <span class="preprocessor"></span>    <span class="keywordflow">return</span> __TBB_machine_cmpswp2(ptr,value,comparand);
+<a name="l00388"></a>00388 <span class="preprocessor">#endif</span>
+<a name="l00389"></a>00389 <span class="preprocessor"></span>}
+<a name="l00390"></a>00390 
+<a name="l00391"></a>00391 <span class="keyword">template</span><>
+<a name="l00392"></a>00392 <span class="keyword">inline</span> uint32_t __TBB_CompareAndSwapGeneric <4,uint32_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint32_t value, uint32_t comparand ) {
+<a name="l00393"></a>00393     <span class="comment">// Cast shuts up /Wp64 warning</span>
+<a name="l00394"></a>00394     <span class="keywordflow">return</span> (uint32_t)__TBB_machine_cmpswp4(ptr,value,comparand);
+<a name="l00395"></a>00395 }
+<a name="l00396"></a>00396 
+<a name="l00397"></a>00397 <span class="preprocessor">#if __TBB_64BIT_ATOMICS</span>
+<a name="l00398"></a>00398 <span class="preprocessor"></span><span class="keyword">template</span><>
+<a name="l00399"></a>00399 <span class="keyword">inline</span> uint64_t __TBB_CompareAndSwapGeneric <8,uint64_t> (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, uint64_t value, uint64_t comparand ) {
+<a name="l00400"></a>00400     <span class="keywordflow">return</span> __TBB_machine_cmpswp8(ptr,value,comparand);
+<a name="l00401"></a>00401 }
+<a name="l00402"></a>00402 <span class="preprocessor">#endif</span>
+<a name="l00403"></a>00403 <span class="preprocessor"></span>
+<a name="l00404"></a>00404 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00405"></a>00405 <span class="keyword">inline</span> T __TBB_FetchAndAddGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T addend) {
+<a name="l00406"></a>00406     atomic_backoff b;
+<a name="l00407"></a>00407     T result;
+<a name="l00408"></a>00408     <span class="keywordflow">for</span>(;;) {
+<a name="l00409"></a>00409         result = *reinterpret_cast<volatile T *>(ptr);
+<a name="l00410"></a>00410         <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence.</span>
+<a name="l00411"></a>00411         <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result )
+<a name="l00412"></a>00412             <span class="keywordflow">break</span>;
+<a name="l00413"></a>00413         b.pause();
+<a name="l00414"></a>00414     }
+<a name="l00415"></a>00415     <span class="keywordflow">return</span> result;
+<a name="l00416"></a>00416 }
+<a name="l00417"></a>00417 
+<a name="l00418"></a>00418 <span class="keyword">template</span><size_t S, <span class="keyword">typename</span> T>
+<a name="l00419"></a>00419 <span class="keyword">inline</span> T __TBB_FetchAndStoreGeneric (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, T value) {
+<a name="l00420"></a>00420     atomic_backoff b;
+<a name="l00421"></a>00421     T result;
+<a name="l00422"></a>00422     <span class="keywordflow">for</span>(;;) {
+<a name="l00423"></a>00423         result = *reinterpret_cast<volatile T *>(ptr);
+<a name="l00424"></a>00424         <span class="comment">// __TBB_CompareAndSwapGeneric presumed to have full fence.</span>
+<a name="l00425"></a>00425         <span class="keywordflow">if</span>( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result )
+<a name="l00426"></a>00426             <span class="keywordflow">break</span>;
+<a name="l00427"></a>00427         b.pause();
+<a name="l00428"></a>00428     }
+<a name="l00429"></a>00429     <span class="keywordflow">return</span> result;
+<a name="l00430"></a>00430 }
+<a name="l00431"></a>00431 
+<a name="l00432"></a>00432 <span class="preprocessor">#if __TBB_USE_GENERIC_PART_WORD_CAS</span>
+<a name="l00433"></a>00433 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_cmpswp1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t></span>
+<a name="l00434"></a>00434 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_cmpswp2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t></span>
+<a name="l00435"></a>00435 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00436"></a>00436 <span class="preprocessor"></span>
+<a name="l00437"></a>00437 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_ADD || __TBB_USE_GENERIC_PART_WORD_FETCH_ADD</span>
+<a name="l00438"></a>00438 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchadd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t></span>
+<a name="l00439"></a>00439 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchadd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t></span>
+<a name="l00440"></a>00440 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00441"></a>00441 <span class="preprocessor"></span>
+<a name="l00442"></a>00442 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_ADD </span>
+<a name="l00443"></a>00443 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchadd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t></span>
+<a name="l00444"></a>00444 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00445"></a>00445 <span class="preprocessor"></span>
+<a name="l00446"></a>00446 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_ADD || __TBB_USE_GENERIC_DWORD_FETCH_ADD</span>
+<a name="l00447"></a>00447 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchadd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t></span>
+<a name="l00448"></a>00448 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00449"></a>00449 <span class="preprocessor"></span>
+<a name="l00450"></a>00450 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_STORE || __TBB_USE_GENERIC_PART_WORD_FETCH_STORE</span>
+<a name="l00451"></a>00451 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchstore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t></span>
+<a name="l00452"></a>00452 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchstore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t></span>
 <a name="l00453"></a>00453 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
 <a name="l00454"></a>00454 <span class="preprocessor"></span>
-<a name="l00455"></a>00455 <span class="preprocessor">#ifndef __TBB_FetchAndAdd1__TBB_full_fence</span>
-<a name="l00456"></a>00456 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1__TBB_full_fence __TBB_FetchAndAdd1</span>
+<a name="l00455"></a>00455 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_STORE </span>
+<a name="l00456"></a>00456 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchstore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t></span>
 <a name="l00457"></a>00457 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00458"></a>00458 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd1acquire</span>
-<a name="l00459"></a>00459 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1acquire __TBB_FetchAndAdd1__TBB_full_fence</span>
-<a name="l00460"></a>00460 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00461"></a>00461 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd1release</span>
-<a name="l00462"></a>00462 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd1release __TBB_FetchAndAdd1__TBB_full_fence</span>
-<a name="l00463"></a>00463 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00464"></a>00464 <span class="preprocessor"></span>
-<a name="l00465"></a>00465 <span class="preprocessor">#ifndef __TBB_FetchAndAdd2__TBB_full_fence</span>
-<a name="l00466"></a>00466 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2__TBB_full_fence __TBB_FetchAndAdd2</span>
-<a name="l00467"></a>00467 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00468"></a>00468 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd2acquire</span>
-<a name="l00469"></a>00469 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2acquire __TBB_FetchAndAdd2__TBB_full_fence</span>
-<a name="l00470"></a>00470 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00471"></a>00471 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd2release</span>
-<a name="l00472"></a>00472 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd2release __TBB_FetchAndAdd2__TBB_full_fence</span>
-<a name="l00473"></a>00473 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00474"></a>00474 <span class="preprocessor"></span>
-<a name="l00475"></a>00475 <span class="preprocessor">#ifndef __TBB_FetchAndAdd4__TBB_full_fence</span>
-<a name="l00476"></a>00476 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4__TBB_full_fence __TBB_FetchAndAdd4</span>
-<a name="l00477"></a>00477 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00478"></a>00478 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd4acquire</span>
-<a name="l00479"></a>00479 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4acquire __TBB_FetchAndAdd4__TBB_full_fence</span>
-<a name="l00480"></a>00480 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00481"></a>00481 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd4release</span>
-<a name="l00482"></a>00482 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd4release __TBB_FetchAndAdd4__TBB_full_fence</span>
-<a name="l00483"></a>00483 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00484"></a>00484 <span class="preprocessor"></span>
-<a name="l00485"></a>00485 <span class="preprocessor">#ifndef __TBB_FetchAndAdd8__TBB_full_fence</span>
-<a name="l00486"></a>00486 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8__TBB_full_fence __TBB_FetchAndAdd8</span>
-<a name="l00487"></a>00487 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00488"></a>00488 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd8acquire</span>
-<a name="l00489"></a>00489 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8acquire __TBB_FetchAndAdd8__TBB_full_fence</span>
-<a name="l00490"></a>00490 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00491"></a>00491 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndAdd8release</span>
-<a name="l00492"></a>00492 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAdd8release __TBB_FetchAndAdd8__TBB_full_fence</span>
-<a name="l00493"></a>00493 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00458"></a>00458 <span class="preprocessor"></span>
+<a name="l00459"></a>00459 <span class="preprocessor">#if __TBB_USE_GENERIC_FETCH_STORE || __TBB_USE_GENERIC_DWORD_FETCH_STORE</span>
+<a name="l00460"></a>00460 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_machine_fetchstore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_t></span>
+<a name="l00461"></a>00461 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00462"></a>00462 <span class="preprocessor"></span>
+<a name="l00463"></a>00463 <span class="preprocessor">#if __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE</span>
+<a name="l00464"></a>00464 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(S)                                             \</span>
+<a name="l00465"></a>00465 <span class="preprocessor">    atomic_selector<S>::word atomic_selector<S>::fetch_store ( volatile void* location, word value ) {  \</span>
+<a name="l00466"></a>00466 <span class="preprocessor">        return __TBB_machine_fetchstore##S( location, value );                                          \</span>
+<a name="l00467"></a>00467 <span class="preprocessor">    }</span>
+<a name="l00468"></a>00468 <span class="preprocessor"></span>
+<a name="l00469"></a>00469 __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(1)
+<a name="l00470"></a>00470 __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(2)
+<a name="l00471"></a>00471 __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(4)
+<a name="l00472"></a>00472 __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(8)
+<a name="l00473"></a>00473 
+<a name="l00474"></a>00474 <span class="preprocessor">#undef __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE</span>
+<a name="l00475"></a>00475 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */</span>
+<a name="l00476"></a>00476 
+<a name="l00477"></a>00477 <span class="preprocessor">#if __TBB_USE_GENERIC_DWORD_LOAD_STORE</span>
+<a name="l00478"></a>00478 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_machine_store8 (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, int64_t value) {
+<a name="l00479"></a>00479     <span class="keywordflow">for</span>(;;) {
+<a name="l00480"></a>00480         int64_t result = *(int64_t *)ptr;
+<a name="l00481"></a>00481         <span class="keywordflow">if</span>( __TBB_machine_cmpswp8(ptr,value,result)==result ) <span class="keywordflow">break</span>;
+<a name="l00482"></a>00482     }
+<a name="l00483"></a>00483 }
+<a name="l00484"></a>00484 
+<a name="l00485"></a>00485 <span class="keyword">inline</span> int64_t __TBB_machine_load8 (<span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr) {
+<a name="l00486"></a>00486     <span class="comment">// Comparand and new value may be anything, they only must be equal, and</span>
+<a name="l00487"></a>00487     <span class="comment">// the value should have a low probability to be actually found in 'location'.</span>
+<a name="l00488"></a>00488     <span class="keyword">const</span> int64_t anyvalue = 2305843009213693951;
+<a name="l00489"></a>00489     <span class="keywordflow">return</span> __TBB_machine_cmpswp8(const_cast<volatile void *>(ptr),anyvalue,anyvalue);
+<a name="l00490"></a>00490 }
+<a name="l00491"></a>00491 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_USE_GENERIC_DWORD_LOAD_STORE */</span>
+<a name="l00492"></a>00492 
+<a name="l00493"></a>00493 <span class="preprocessor">#if __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE</span>
 <a name="l00494"></a>00494 <span class="preprocessor"></span>
-<a name="l00495"></a>00495 <span class="preprocessor">#ifndef __TBB_FetchAndStore1__TBB_full_fence</span>
-<a name="l00496"></a>00496 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1__TBB_full_fence __TBB_FetchAndStore1</span>
-<a name="l00497"></a>00497 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00498"></a>00498 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore1acquire</span>
-<a name="l00499"></a>00499 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1acquire __TBB_FetchAndStore1__TBB_full_fence</span>
-<a name="l00500"></a>00500 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00501"></a>00501 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore1release</span>
-<a name="l00502"></a>00502 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore1release __TBB_FetchAndStore1__TBB_full_fence</span>
-<a name="l00503"></a>00503 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00504"></a>00504 <span class="preprocessor"></span>
-<a name="l00505"></a>00505 <span class="preprocessor">#ifndef __TBB_FetchAndStore2__TBB_full_fence</span>
-<a name="l00506"></a>00506 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2__TBB_full_fence __TBB_FetchAndStore2</span>
-<a name="l00507"></a>00507 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00508"></a>00508 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore2acquire</span>
-<a name="l00509"></a>00509 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2acquire __TBB_FetchAndStore2__TBB_full_fence</span>
-<a name="l00510"></a>00510 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00511"></a>00511 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore2release</span>
-<a name="l00512"></a>00512 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore2release __TBB_FetchAndStore2__TBB_full_fence</span>
-<a name="l00513"></a>00513 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00514"></a>00514 <span class="preprocessor"></span>
-<a name="l00515"></a>00515 <span class="preprocessor">#ifndef __TBB_FetchAndStore4__TBB_full_fence</span>
-<a name="l00516"></a>00516 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4__TBB_full_fence __TBB_FetchAndStore4</span>
-<a name="l00517"></a>00517 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00518"></a>00518 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore4acquire</span>
-<a name="l00519"></a>00519 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4acquire __TBB_FetchAndStore4__TBB_full_fence</span>
-<a name="l00520"></a>00520 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00521"></a>00521 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore4release</span>
-<a name="l00522"></a>00522 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore4release __TBB_FetchAndStore4__TBB_full_fence</span>
-<a name="l00523"></a>00523 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00524"></a>00524 <span class="preprocessor"></span>
-<a name="l00525"></a>00525 <span class="preprocessor">#ifndef __TBB_FetchAndStore8__TBB_full_fence</span>
-<a name="l00526"></a>00526 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8__TBB_full_fence __TBB_FetchAndStore8</span>
-<a name="l00527"></a>00527 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00528"></a>00528 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore8acquire</span>
-<a name="l00529"></a>00529 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8acquire __TBB_FetchAndStore8__TBB_full_fence</span>
-<a name="l00530"></a>00530 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00531"></a>00531 <span class="preprocessor"></span><span class="preprocessor">#ifndef __TBB_FetchAndStore8release</span>
-<a name="l00532"></a>00532 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndStore8release __TBB_FetchAndStore8__TBB_full_fence</span>
-<a name="l00533"></a>00533 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00534"></a>00534 <span class="preprocessor"></span>
-<a name="l00535"></a>00535 <span class="preprocessor">#endif // __TBB_DECL_FENCED_ATOMICS</span>
-<a name="l00536"></a>00536 <span class="preprocessor"></span>
-<a name="l00537"></a>00537 <span class="comment">// Special atomic functions</span>
-<a name="l00538"></a>00538 <span class="preprocessor">#ifndef __TBB_FetchAndAddWrelease</span>
-<a name="l00539"></a>00539 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndAddWrelease __TBB_FetchAndAddW</span>
-<a name="l00540"></a>00540 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00541"></a>00541 <span class="preprocessor"></span>
-<a name="l00542"></a>00542 <span class="preprocessor">#ifndef __TBB_FetchAndIncrementWacquire</span>
-<a name="l00543"></a>00543 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)</span>
-<a name="l00544"></a>00544 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00500"></a>00500 <span class="keyword">template</span> <<span class="keyword">typename</span> T, size_t S>
+<a name="l00501"></a>00501 <span class="keyword">struct </span>machine_load_store {
+<a name="l00502"></a>00502     <span class="keyword">static</span> T load_with_acquire ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
+<a name="l00503"></a>00503         T to_return = location;
+<a name="l00504"></a>00504         __TBB_acquire_consistency_helper();
+<a name="l00505"></a>00505         <span class="keywordflow">return</span> to_return;
+<a name="l00506"></a>00506     }
+<a name="l00507"></a>00507     <span class="keyword">static</span> <span class="keywordtype">void</span> store_with_release ( <span class="keyword">volatile</span> T &location, T value ) {
+<a name="l00508"></a>00508         __TBB_release_consistency_helper();
+<a name="l00509"></a>00509         location = value;
+<a name="l00510"></a>00510     }
+<a name="l00511"></a>00511 };
+<a name="l00512"></a>00512 
+<a name="l00513"></a>00513 <span class="preprocessor">#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS</span>
+<a name="l00514"></a>00514 <span class="preprocessor"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00515"></a>00515 <span class="keyword">struct </span>machine_load_store<T,8> {
+<a name="l00516"></a>00516     <span class="keyword">static</span> T load_with_acquire ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
+<a name="l00517"></a>00517         <span class="keywordflow">return</span> (T)__TBB_machine_load8( (<span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location );
+<a name="l00518"></a>00518     }
+<a name="l00519"></a>00519     <span class="keyword">static</span> <span class="keywordtype">void</span> store_with_release ( <span class="keyword">volatile</span> T& location, T value ) {
+<a name="l00520"></a>00520         __TBB_machine_store8( (<span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location, (int64_t)value );
+<a name="l00521"></a>00521     }
+<a name="l00522"></a>00522 };
+<a name="l00523"></a>00523 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */</span>
+<a name="l00524"></a>00524 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE */</span>
+<a name="l00525"></a>00525 
+<a name="l00526"></a>00526 <span class="keyword">template</span> <<span class="keyword">typename</span> T, size_t S>
+<a name="l00527"></a>00527 <span class="keyword">struct </span>machine_load_store_seq_cst {
+<a name="l00528"></a>00528     <span class="keyword">static</span> T load ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
+<a name="l00529"></a>00529         __TBB_full_memory_fence();
+<a name="l00530"></a>00530         <span class="keywordflow">return</span> machine_load_store<T,S>::load_with_acquire( location );
+<a name="l00531"></a>00531     }
+<a name="l00532"></a>00532 <span class="preprocessor">#if __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE</span>
+<a name="l00533"></a>00533 <span class="preprocessor"></span>    <span class="keyword">static</span> <span class="keywordtype">void</span> store ( <span class="keyword">volatile</span> T &location, T value ) {
+<a name="l00534"></a>00534         atomic_selector<S>::fetch_store( (<span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location, (<span class="keyword">typename</span> atomic_selector<S>::word)value );
+<a name="l00535"></a>00535     }
+<a name="l00536"></a>00536 <span class="preprocessor">#else </span><span class="comment">/* !__TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */</span>
+<a name="l00537"></a>00537     <span class="keyword">static</span> <span class="keywordtype">void</span> store ( <span class="keyword">volatile</span> T &location, T value ) {
+<a name="l00538"></a>00538         machine_load_store<T,S>::store_with_release( location, value );
+<a name="l00539"></a>00539         __TBB_full_memory_fence();
+<a name="l00540"></a>00540     }
+<a name="l00541"></a>00541 <span class="preprocessor">#endif </span><span class="comment">/* !__TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */</span>
+<a name="l00542"></a>00542 };
+<a name="l00543"></a>00543 
+<a name="l00544"></a>00544 <span class="preprocessor">#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS</span>
 <a name="l00545"></a>00545 <span class="preprocessor"></span>
-<a name="l00546"></a>00546 <span class="preprocessor">#ifndef __TBB_FetchAndDecrementWrelease</span>
-<a name="l00547"></a>00547 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,(-1))</span>
-<a name="l00548"></a>00548 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00549"></a>00549 <span class="preprocessor"></span>
-<a name="l00550"></a>00550 <span class="keyword">template</span> <<span class="keyword">typename</span> T, size_t S>
-<a name="l00551"></a>00551 <span class="keyword">struct </span>__TBB_machine_load_store {
-<a name="l00552"></a>00552     <span class="keyword">static</span> <span class="keyword">inline</span> T load_with_acquire(<span class="keyword">const</span> <span class="keyword">volatile</span> T& location) {
-<a name="l00553"></a>00553         T to_return = location;
-<a name="l00554"></a>00554         __TBB_release_consistency_helper();
-<a name="l00555"></a>00555         <span class="keywordflow">return</span> to_return;
-<a name="l00556"></a>00556     }
-<a name="l00557"></a>00557 
-<a name="l00558"></a>00558     <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> store_with_release(<span class="keyword">volatile</span> T &location, T value) {
-<a name="l00559"></a>00559         __TBB_release_consistency_helper();
-<a name="l00560"></a>00560         location = value;
-<a name="l00561"></a>00561     }
-<a name="l00562"></a>00562 };
-<a name="l00563"></a>00563 
-<a name="l00564"></a>00564 <span class="preprocessor">#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS</span>
-<a name="l00565"></a>00565 <span class="preprocessor"></span><span class="preprocessor">#if _MSC_VER</span>
-<a name="l00566"></a>00566 <span class="preprocessor"></span><span class="keyword">using</span> tbb::internal::int64_t;
-<a name="l00567"></a>00567 <span class="preprocessor">#endif</span>
-<a name="l00568"></a>00568 <span class="preprocessor"></span><span class="comment">// On 32-bit platforms, there should be definition of __TBB_Store8 and __TBB_Load8</span>
-<a name="l00569"></a>00569 <span class="preprocessor">#ifndef __TBB_Store8</span>
-<a name="l00570"></a>00570 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_Store8 (<span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr, int64_t value) {
-<a name="l00571"></a>00571     <span class="keywordflow">for</span>(;;) {
-<a name="l00572"></a>00572         int64_t result = *(int64_t *)ptr;
-<a name="l00573"></a>00573         <span class="keywordflow">if</span>( __TBB_CompareAndSwap8(ptr,value,result)==result ) <span class="keywordflow">break</span>;
-<a name="l00574"></a>00574     }
-<a name="l00575"></a>00575 }
-<a name="l00576"></a>00576 <span class="preprocessor">#endif</span>
-<a name="l00577"></a>00577 <span class="preprocessor"></span>
-<a name="l00578"></a>00578 <span class="preprocessor">#ifndef __TBB_Load8</span>
-<a name="l00579"></a>00579 <span class="preprocessor"></span><span class="keyword">inline</span> int64_t __TBB_Load8 (<span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span> *ptr) {
-<a name="l00580"></a>00580     <span class="keyword">const</span> int64_t anyvalue = 3264; <span class="comment">// Could be anything, just the same for comparand and new value</span>
-<a name="l00581"></a>00581     <span class="keywordflow">return</span> __TBB_CompareAndSwap8(const_cast<volatile void *>(ptr),anyvalue,anyvalue);
-<a name="l00582"></a>00582 }
-<a name="l00583"></a>00583 <span class="preprocessor">#endif</span>
-<a name="l00584"></a>00584 <span class="preprocessor"></span>
-<a name="l00585"></a>00585 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00586"></a>00586 <span class="keyword">struct </span>__TBB_machine_load_store<T,8> {
-<a name="l00587"></a>00587     <span class="keyword">static</span> <span class="keyword">inline</span> T load_with_acquire(<span class="keyword">const</span> <span class="keyword">volatile</span> T& location) {
-<a name="l00588"></a>00588         T to_return = (T)__TBB_Load8((<span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location);
-<a name="l00589"></a>00589         __TBB_release_consistency_helper();
-<a name="l00590"></a>00590         <span class="keywordflow">return</span> to_return;
-<a name="l00591"></a>00591     }
-<a name="l00592"></a>00592 
-<a name="l00593"></a>00593     <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> store_with_release(<span class="keyword">volatile</span> T& location, T value) {
-<a name="l00594"></a>00594         __TBB_release_consistency_helper();
-<a name="l00595"></a>00595         __TBB_Store8((<span class="keyword">volatile</span> <span class="keywordtype">void</span> *)&location,(int64_t)value);
-<a name="l00596"></a>00596     }
-<a name="l00597"></a>00597 };
-<a name="l00598"></a>00598 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 */</span>
-<a name="l00599"></a>00599 
-<a name="l00600"></a>00600 <span class="preprocessor">#ifndef __TBB_load_with_acquire</span>
-<a name="l00601"></a>00601 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00602"></a>00602 <span class="keyword">inline</span> T __TBB_load_with_acquire(<span class="keyword">const</span> <span class="keyword">volatile</span> T &location) {
-<a name="l00603"></a>00603     <span class="keywordflow">return</span> __TBB_machine_load_store<T,sizeof(T)>::load_with_acquire(location);
-<a name="l00604"></a>00604 }
-<a name="l00605"></a>00605 <span class="preprocessor">#endif</span>
-<a name="l00606"></a>00606 <span class="preprocessor"></span>
-<a name="l00607"></a>00607 <span class="preprocessor">#ifndef __TBB_store_with_release</span>
-<a name="l00608"></a>00608 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V>
-<a name="l00609"></a>00609 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_with_release(<span class="keyword">volatile</span> T& location, V value) {
-<a name="l00610"></a>00610     __TBB_machine_load_store<T,sizeof(T)>::store_with_release(location,T(value));
+<a name="l00547"></a>00547 <span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00548"></a><a class="code" href="a00268.html">00548</a> <span class="keyword">struct </span>machine_load_store_seq_cst<T,8> {
+<a name="l00549"></a>00549     <span class="keyword">static</span> T load ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
+<a name="l00550"></a>00550         <span class="comment">// Comparand and new value may be anything, they only must be equal, and</span>
+<a name="l00551"></a>00551         <span class="comment">// the value should have a low probability to be actually found in 'location'.</span>
+<a name="l00552"></a>00552         <span class="keyword">const</span> int64_t anyvalue = 2305843009213693951ll;
+<a name="l00553"></a>00553         <span class="keywordflow">return</span> __TBB_machine_cmpswp8( (<span class="keyword">volatile</span> <span class="keywordtype">void</span>*)const_cast<volatile T*>(&location), anyvalue, anyvalue );
+<a name="l00554"></a>00554     }
+<a name="l00555"></a>00555     <span class="keyword">static</span> <span class="keywordtype">void</span> store ( <span class="keyword">volatile</span> T &location, T value ) {
+<a name="l00556"></a>00556         int64_t result = (<span class="keyword">volatile</span> int64_t&)location;
+<a name="l00557"></a>00557         <span class="keywordflow">while</span> ( __TBB_machine_cmpswp8((<span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location, (int64_t)value, result) != result )
+<a name="l00558"></a>00558             result = (<span class="keyword">volatile</span> int64_t&)location;
+<a name="l00559"></a>00559     }
+<a name="l00560"></a>00560 };
+<a name="l00561"></a>00561 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */</span>
+<a name="l00562"></a>00562 
+<a name="l00563"></a>00563 <span class="preprocessor">#if __TBB_USE_GENERIC_RELAXED_LOAD_STORE</span>
+<a name="l00564"></a>00564 <span class="preprocessor"></span><span class="comment">// Relaxed operations add volatile qualifier to prevent compiler from optimizing them out.</span>
+<a name="l00568"></a>00568 <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T, size_t S>
+<a name="l00569"></a><a class="code" href="a00267.html">00569</a> <span class="keyword">struct </span><a class="code" href="a00267.html">machine_load_store_relaxed</a> {
+<a name="l00570"></a>00570     <span class="keyword">static</span> <span class="keyword">inline</span> T load ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
+<a name="l00571"></a>00571         <span class="keywordflow">return</span> location;
+<a name="l00572"></a>00572     }
+<a name="l00573"></a>00573     <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> store ( <span class="keyword">volatile</span> T& location, T value ) {
+<a name="l00574"></a>00574         location = value;
+<a name="l00575"></a>00575     }
+<a name="l00576"></a>00576 };
+<a name="l00577"></a>00577 
+<a name="l00578"></a>00578 <span class="preprocessor">#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS</span>
+<a name="l00579"></a>00579 <span class="preprocessor"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00580"></a>00580 <span class="keyword">struct </span><a class="code" href="a00267.html">machine_load_store_relaxed</a><T,8> {
+<a name="l00581"></a>00581     <span class="keyword">static</span> <span class="keyword">inline</span> T load ( <span class="keyword">const</span> <span class="keyword">volatile</span> T& location ) {
+<a name="l00582"></a>00582         <span class="keywordflow">return</span> (T)__TBB_machine_load8( (<span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location );
+<a name="l00583"></a>00583     }
+<a name="l00584"></a>00584     <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> store ( <span class="keyword">volatile</span> T& location, T value ) {
+<a name="l00585"></a>00585         __TBB_machine_store8( (<span class="keyword">volatile</span> <span class="keywordtype">void</span>*)&location, (int64_t)value );
+<a name="l00586"></a>00586     }
+<a name="l00587"></a>00587 };
+<a name="l00588"></a>00588 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */</span>
+<a name="l00589"></a>00589 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_USE_GENERIC_RELAXED_LOAD_STORE */</span>
+<a name="l00590"></a>00590 
+<a name="l00591"></a>00591 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00592"></a>00592 <span class="keyword">inline</span> T __TBB_load_with_acquire(<span class="keyword">const</span> <span class="keyword">volatile</span> T &location) {
+<a name="l00593"></a>00593     <span class="keywordflow">return</span> machine_load_store<T,sizeof(T)>::load_with_acquire( location );
+<a name="l00594"></a>00594 }
+<a name="l00595"></a>00595 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V>
+<a name="l00596"></a>00596 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_with_release(<span class="keyword">volatile</span> T& location, V value) {
+<a name="l00597"></a>00597     machine_load_store<T,sizeof(T)>::store_with_release( location, T(value) );
+<a name="l00598"></a>00598 }
+<a name="l00600"></a>00600 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_with_release(<span class="keyword">volatile</span> size_t& location, size_t value) {
+<a name="l00601"></a>00601     machine_load_store<size_t,sizeof(size_t)>::store_with_release( location, value );
+<a name="l00602"></a>00602 }
+<a name="l00603"></a>00603 
+<a name="l00604"></a>00604 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00605"></a>00605 <span class="keyword">inline</span> T __TBB_load_full_fence(<span class="keyword">const</span> <span class="keyword">volatile</span> T &location) {
+<a name="l00606"></a>00606     <span class="keywordflow">return</span> machine_load_store_seq_cst<T,sizeof(T)>::load( location );
+<a name="l00607"></a>00607 }
+<a name="l00608"></a>00608 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V>
+<a name="l00609"></a>00609 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_full_fence(<span class="keyword">volatile</span> T& location, V value) {
+<a name="l00610"></a>00610     machine_load_store_seq_cst<T,sizeof(T)>::store( location, T(value) );
 <a name="l00611"></a>00611 }
-<a name="l00613"></a>00613 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_with_release(<span class="keyword">volatile</span> size_t& location, size_t value) {
-<a name="l00614"></a>00614     __TBB_machine_load_store<size_t,sizeof(size_t)>::store_with_release(location,value);
+<a name="l00613"></a>00613 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_full_fence(<span class="keyword">volatile</span> size_t& location, size_t value) {
+<a name="l00614"></a>00614     machine_load_store_seq_cst<size_t,sizeof(size_t)>::store( location, value );
 <a name="l00615"></a>00615 }
-<a name="l00616"></a>00616 <span class="preprocessor">#endif</span>
-<a name="l00617"></a>00617 <span class="preprocessor"></span>
-<a name="l00618"></a>00618 <span class="preprocessor">#ifndef __TBB_Log2</span>
-<a name="l00619"></a>00619 <span class="preprocessor"></span><span class="keyword">inline</span> intptr_t __TBB_Log2( uintptr_t x ) {
-<a name="l00620"></a>00620     <span class="keywordflow">if</span>( x==0 ) <span class="keywordflow">return</span> -1;
-<a name="l00621"></a>00621     intptr_t result = 0;
-<a name="l00622"></a>00622     uintptr_t tmp;
-<a name="l00623"></a>00623 <span class="preprocessor">#if __TBB_WORDSIZE>=8</span>
-<a name="l00624"></a>00624 <span class="preprocessor"></span>    <span class="keywordflow">if</span>( (tmp = x>>32) ) { x=tmp; result += 32; }
-<a name="l00625"></a>00625 <span class="preprocessor">#endif</span>
-<a name="l00626"></a>00626 <span class="preprocessor"></span>    <span class="keywordflow">if</span>( (tmp = x>>16) ) { x=tmp; result += 16; }
-<a name="l00627"></a>00627     <span class="keywordflow">if</span>( (tmp = x>>8) )  { x=tmp; result += 8; }
-<a name="l00628"></a>00628     <span class="keywordflow">if</span>( (tmp = x>>4) )  { x=tmp; result += 4; }
-<a name="l00629"></a>00629     <span class="keywordflow">if</span>( (tmp = x>>2) )  { x=tmp; result += 2; }
-<a name="l00630"></a>00630     <span class="keywordflow">return</span> (x&2)? result+1: result;
-<a name="l00631"></a>00631 }
-<a name="l00632"></a>00632 <span class="preprocessor">#endif</span>
-<a name="l00633"></a>00633 <span class="preprocessor"></span>
-<a name="l00634"></a>00634 <span class="preprocessor">#ifndef __TBB_AtomicOR</span>
-<a name="l00635"></a>00635 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_AtomicOR( <span class="keyword">volatile</span> <span class="keywordtype">void</span> *operand, uintptr_t addend ) {
-<a name="l00636"></a>00636     <a class="code" href="a00218.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00637"></a>00637     <span class="keywordflow">for</span>(;;) {
-<a name="l00638"></a>00638         uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
-<a name="l00639"></a>00639         uintptr_t result = __TBB_CompareAndSwapW(operand, tmp|addend, tmp);
-<a name="l00640"></a>00640         <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
-<a name="l00641"></a>00641         b.<a class="code" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00642"></a>00642     }
-<a name="l00643"></a>00643 }
-<a name="l00644"></a>00644 <span class="preprocessor">#endif</span>
-<a name="l00645"></a>00645 <span class="preprocessor"></span>
-<a name="l00646"></a>00646 <span class="preprocessor">#ifndef __TBB_AtomicAND</span>
-<a name="l00647"></a>00647 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_AtomicAND( <span class="keyword">volatile</span> <span class="keywordtype">void</span> *operand, uintptr_t addend ) {
-<a name="l00648"></a>00648     <a class="code" href="a00218.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00649"></a>00649     <span class="keywordflow">for</span>(;;) {
-<a name="l00650"></a>00650         uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
-<a name="l00651"></a>00651         uintptr_t result = __TBB_CompareAndSwapW(operand, tmp&addend, tmp);
-<a name="l00652"></a>00652         <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
-<a name="l00653"></a>00653         b.<a class="code" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00654"></a>00654     }
-<a name="l00655"></a>00655 }
-<a name="l00656"></a>00656 <span class="preprocessor">#endif</span>
-<a name="l00657"></a>00657 <span class="preprocessor"></span>
-<a name="l00658"></a>00658 <span class="preprocessor">#ifndef __TBB_Byte</span>
-<a name="l00659"></a>00659 <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __TBB_Byte;
-<a name="l00660"></a>00660 <span class="preprocessor">#endif</span>
-<a name="l00661"></a>00661 <span class="preprocessor"></span>
-<a name="l00662"></a>00662 <span class="preprocessor">#ifndef __TBB_TryLockByte</span>
-<a name="l00663"></a>00663 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_TryLockByte( __TBB_Byte &flag ) {
-<a name="l00664"></a>00664     <span class="keywordflow">return</span> __TBB_CompareAndSwap1(&flag,1,0)==0;
-<a name="l00665"></a>00665 }
-<a name="l00666"></a>00666 <span class="preprocessor">#endif</span>
-<a name="l00667"></a>00667 <span class="preprocessor"></span>
-<a name="l00668"></a>00668 <span class="preprocessor">#ifndef __TBB_LockByte</span>
-<a name="l00669"></a>00669 <span class="preprocessor"></span><span class="keyword">inline</span> uintptr_t __TBB_LockByte( __TBB_Byte& flag ) {
-<a name="l00670"></a>00670     <span class="keywordflow">if</span> ( !__TBB_TryLockByte(flag) ) {
-<a name="l00671"></a>00671         <a class="code" href="a00218.html">tbb::internal::atomic_backoff</a> b;
-<a name="l00672"></a>00672         <span class="keywordflow">do</span> {
-<a name="l00673"></a>00673             b.<a class="code" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
-<a name="l00674"></a>00674         } <span class="keywordflow">while</span> ( !__TBB_TryLockByte(flag) );
-<a name="l00675"></a>00675     }
-<a name="l00676"></a>00676     <span class="keywordflow">return</span> 0;
-<a name="l00677"></a>00677 }
-<a name="l00678"></a>00678 <span class="preprocessor">#endif</span>
-<a name="l00679"></a>00679 <span class="preprocessor"></span>
-<a name="l00680"></a>00680 <span class="preprocessor">#define __TBB_UnlockByte __TBB_store_with_release</span>
-<a name="l00681"></a>00681 <span class="preprocessor"></span>
-<a name="l00682"></a>00682 <span class="preprocessor">#ifndef __TBB_ReverseByte</span>
-<a name="l00683"></a>00683 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __TBB_ReverseByte(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> src) {
-<a name="l00684"></a>00684     <span class="keywordflow">return</span> tbb::internal::reverse<unsigned char>::byte_table[src];
-<a name="l00685"></a>00685 }
-<a name="l00686"></a>00686 <span class="preprocessor">#endif</span>
-<a name="l00687"></a>00687 <span class="preprocessor"></span>
-<a name="l00688"></a>00688 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00689"></a>00689 T __TBB_ReverseBits(T src)
-<a name="l00690"></a>00690 {
-<a name="l00691"></a>00691     T dst;
-<a name="l00692"></a>00692     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *original = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &src;
-<a name="l00693"></a>00693     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *reversed = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &dst;
+<a name="l00616"></a>00616 
+<a name="l00617"></a>00617 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00618"></a>00618 <span class="keyword">inline</span> T __TBB_load_relaxed (<span class="keyword">const</span> <span class="keyword">volatile</span> T& location) {
+<a name="l00619"></a>00619     <span class="keywordflow">return</span> machine_load_store_relaxed<T,sizeof(T)>::load( const_cast<T&>(location) );
+<a name="l00620"></a>00620 }
+<a name="l00621"></a>00621 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> V>
+<a name="l00622"></a>00622 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_relaxed ( <span class="keyword">volatile</span> T& location, V value ) {
+<a name="l00623"></a>00623     machine_load_store_relaxed<T,sizeof(T)>::store( const_cast<T&>(location), T(value) );
+<a name="l00624"></a>00624 }
+<a name="l00626"></a>00626 <span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_store_relaxed ( <span class="keyword">volatile</span> size_t& location, size_t value ) {
+<a name="l00627"></a>00627     machine_load_store_relaxed<size_t,sizeof(size_t)>::store( const_cast<size_t&>(location), value );
+<a name="l00628"></a>00628 }
+<a name="l00629"></a>00629 
+<a name="l00630"></a>00630 <span class="comment">// Macro __TBB_TypeWithAlignmentAtLeastAsStrict(T) should be a type with alignment at least as </span>
+<a name="l00631"></a>00631 <span class="comment">// strict as type T.  The type should have a trivial default constructor and destructor, so that</span>
+<a name="l00632"></a>00632 <span class="comment">// arrays of that type can be declared without initializers.</span>
+<a name="l00633"></a>00633 <span class="comment">// It is correct (but perhaps a waste of space) if __TBB_TypeWithAlignmentAtLeastAsStrict(T) expands</span>
+<a name="l00634"></a>00634 <span class="comment">// to a type bigger than T.</span>
+<a name="l00635"></a>00635 <span class="comment">// The default definition here works on machines where integers are naturally aligned and the</span>
+<a name="l00636"></a>00636 <span class="comment">// strictest alignment is 64.</span>
+<a name="l00637"></a>00637 <span class="preprocessor">#ifndef __TBB_TypeWithAlignmentAtLeastAsStrict</span>
+<a name="l00638"></a>00638 <span class="preprocessor"></span>
+<a name="l00639"></a>00639 <span class="preprocessor">#if __TBB_ATTRIBUTE_ALIGNED_PRESENT</span>
+<a name="l00640"></a>00640 <span class="preprocessor"></span>
+<a name="l00641"></a>00641 <span class="preprocessor">#define __TBB_DefineTypeWithAlignment(PowerOf2)       \</span>
+<a name="l00642"></a>00642 <span class="preprocessor">struct __TBB_machine_type_with_alignment_##PowerOf2 { \</span>
+<a name="l00643"></a>00643 <span class="preprocessor">    uint32_t member[PowerOf2/sizeof(uint32_t)];       \</span>
+<a name="l00644"></a>00644 <span class="preprocessor">} __attribute__((aligned(PowerOf2)));</span>
+<a name="l00645"></a>00645 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_alignof(T) __alignof__(T)</span>
+<a name="l00646"></a>00646 <span class="preprocessor"></span>
+<a name="l00647"></a>00647 <span class="preprocessor">#elif __TBB_DECLSPEC_ALIGN_PRESENT</span>
+<a name="l00648"></a>00648 <span class="preprocessor"></span>
+<a name="l00649"></a>00649 <span class="preprocessor">#define __TBB_DefineTypeWithAlignment(PowerOf2)       \</span>
+<a name="l00650"></a>00650 <span class="preprocessor">__declspec(align(PowerOf2))                           \</span>
+<a name="l00651"></a>00651 <span class="preprocessor">struct __TBB_machine_type_with_alignment_##PowerOf2 { \</span>
+<a name="l00652"></a>00652 <span class="preprocessor">    uint32_t member[PowerOf2/sizeof(uint32_t)];       \</span>
+<a name="l00653"></a>00653 <span class="preprocessor">};</span>
+<a name="l00654"></a>00654 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_alignof(T) __alignof(T)</span>
+<a name="l00655"></a>00655 <span class="preprocessor"></span>
+<a name="l00656"></a>00656 <span class="preprocessor">#else </span><span class="comment">/* A compiler with unknown syntax for data alignment */</span>
+<a name="l00657"></a>00657 <span class="preprocessor">#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T)</span>
+<a name="l00658"></a>00658 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00659"></a>00659 <span class="preprocessor"></span>
+<a name="l00660"></a>00660 <span class="comment">/* Now declare types aligned to useful powers of two */</span>
+<a name="l00661"></a>00661 <span class="comment">// TODO: Is __TBB_DefineTypeWithAlignment(8) needed on 32 bit platforms?</span>
+<a name="l00662"></a>00662 __TBB_DefineTypeWithAlignment(16)
+<a name="l00663"></a>00663 __TBB_DefineTypeWithAlignment(32)
+<a name="l00664"></a>00664 __TBB_DefineTypeWithAlignment(64)
+<a name="l00665"></a>00665 
+<a name="l00666"></a>00666 typedef __TBB_machine_type_with_alignment_64 __TBB_machine_type_with_strictest_alignment;
+<a name="l00667"></a>00667 
+<a name="l00668"></a>00668 <span class="comment">// Primary template is a declaration of incomplete type so that it fails with unknown alignments</span>
+<a name="l00669"></a>00669 template<size_t N> struct type_with_alignment;
+<a name="l00670"></a>00670 
+<a name="l00671"></a>00671 <span class="comment">// Specializations for allowed alignments</span>
+<a name="l00672"></a>00672 template<> struct type_with_alignment<1> { <span class="keywordtype">char</span> member; };
+<a name="l00673"></a>00673 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<2> { uint16_t member; };
+<a name="l00674"></a>00674 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<4> { uint32_t member; };
+<a name="l00675"></a>00675 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<8> { uint64_t member; };
+<a name="l00676"></a>00676 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<16> {__TBB_machine_type_with_alignment_16 member; };
+<a name="l00677"></a>00677 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<32> {__TBB_machine_type_with_alignment_32 member; };
+<a name="l00678"></a>00678 <span class="keyword">template</span><> <span class="keyword">struct </span>type_with_alignment<64> {__TBB_machine_type_with_alignment_64 member; };
+<a name="l00679"></a>00679 
+<a name="l00680"></a>00680 <span class="preprocessor">#if __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN  </span>
+<a name="l00682"></a>00682 <span class="preprocessor"></span>
+<a name="l00684"></a>00684 <span class="preprocessor">template<size_t Size, typename T></span>
+<a name="l00685"></a><a class="code" href="a00325.html">00685</a> <span class="preprocessor"></span><span class="keyword">struct </span><a class="code" href="a00325.html">work_around_alignment_bug</a> {
+<a name="l00686"></a>00686     <span class="keyword">static</span> <span class="keyword">const</span> size_t alignment = __TBB_alignof(T);
+<a name="l00687"></a>00687 };
+<a name="l00688"></a>00688 <span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<tbb::internal::work_around_alignment_bug<sizeof(T),T>::alignment></span>
+<a name="l00689"></a>00689 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00690"></a>00690 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__TBB_alignof(T)></span>
+<a name="l00691"></a>00691 <span class="preprocessor"></span><span class="preprocessor">#endif  </span><span class="comment">/* __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN */</span>
+<a name="l00692"></a>00692 
+<a name="l00693"></a>00693 <span class="preprocessor">#endif  </span><span class="comment">/* __TBB_TypeWithAlignmentAtLeastAsStrict */</span>
 <a name="l00694"></a>00694 
-<a name="l00695"></a>00695     <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = <span class="keyword">sizeof</span>(T)-1; i >= 0; i-- )
-<a name="l00696"></a>00696         reversed[i] = __TBB_ReverseByte( original[<span class="keyword">sizeof</span>(T)-i-1] );
-<a name="l00697"></a>00697 
-<a name="l00698"></a>00698     <span class="keywordflow">return</span> dst;
-<a name="l00699"></a>00699 }
-<a name="l00700"></a>00700 
-<a name="l00701"></a>00701 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_machine_H */</span>
+<a name="l00695"></a>00695 <span class="comment">// Template class here is to avoid instantiation of the static data for modules that don't use it</span>
+<a name="l00696"></a>00696 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00697"></a>00697 <span class="keyword">struct </span>reverse {
+<a name="l00698"></a>00698     <span class="keyword">static</span> <span class="keyword">const</span> T byte_table[256];
+<a name="l00699"></a>00699 };
+<a name="l00700"></a>00700 <span class="comment">// An efficient implementation of the reverse function utilizes a 2^8 lookup table holding the bit-reversed</span>
+<a name="l00701"></a>00701 <span class="comment">// values of [0..2^8 - 1]. Those values can also be computed on the fly at a slightly higher cost.</span>
+<a name="l00702"></a>00702 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00703"></a>00703 <span class="keyword">const</span> T reverse<T>::byte_table[256] = {
+<a name="l00704"></a>00704     0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
+<a name="l00705"></a>00705     0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
+<a name="l00706"></a>00706     0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
+<a name="l00707"></a>00707     0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
+<a name="l00708"></a>00708     0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
+<a name="l00709"></a>00709     0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
+<a name="l00710"></a>00710     0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
+<a name="l00711"></a>00711     0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
+<a name="l00712"></a>00712     0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
+<a name="l00713"></a>00713     0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
+<a name="l00714"></a>00714     0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
+<a name="l00715"></a>00715     0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
+<a name="l00716"></a>00716     0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
+<a name="l00717"></a>00717     0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
+<a name="l00718"></a>00718     0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
+<a name="l00719"></a>00719     0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
+<a name="l00720"></a>00720 };
+<a name="l00721"></a>00721 
+<a name="l00722"></a>00722 } <span class="comment">// namespace internal</span>
+<a name="l00723"></a>00723 } <span class="comment">// namespace tbb</span>
+<a name="l00724"></a>00724 
+<a name="l00725"></a>00725 <span class="comment">// Preserving access to legacy APIs</span>
+<a name="l00726"></a>00726 <span class="keyword">using</span> tbb::internal::__TBB_load_with_acquire;
+<a name="l00727"></a>00727 <span class="keyword">using</span> tbb::internal::__TBB_store_with_release;
+<a name="l00728"></a>00728 
+<a name="l00729"></a>00729 <span class="comment">// Mapping historically used names to the ones expected by atomic_load_store_traits</span>
+<a name="l00730"></a>00730 <span class="preprocessor">#define __TBB_load_acquire  __TBB_load_with_acquire</span>
+<a name="l00731"></a>00731 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_store_release __TBB_store_with_release</span>
+<a name="l00732"></a>00732 <span class="preprocessor"></span>
+<a name="l00733"></a>00733 <span class="preprocessor">#ifndef __TBB_Log2</span>
+<a name="l00734"></a>00734 <span class="preprocessor"></span><span class="keyword">inline</span> intptr_t __TBB_Log2( uintptr_t x ) {
+<a name="l00735"></a>00735     <span class="keywordflow">if</span>( x==0 ) <span class="keywordflow">return</span> -1;
+<a name="l00736"></a>00736     intptr_t result = 0;
+<a name="l00737"></a>00737     uintptr_t tmp;
+<a name="l00738"></a>00738 <span class="preprocessor">#if __TBB_WORDSIZE>=8</span>
+<a name="l00739"></a>00739 <span class="preprocessor"></span>    <span class="keywordflow">if</span>( (tmp = x>>32) ) { x=tmp; result += 32; }
+<a name="l00740"></a>00740 <span class="preprocessor">#endif</span>
+<a name="l00741"></a>00741 <span class="preprocessor"></span>    <span class="keywordflow">if</span>( (tmp = x>>16) ) { x=tmp; result += 16; }
+<a name="l00742"></a>00742     <span class="keywordflow">if</span>( (tmp = x>>8) )  { x=tmp; result += 8; }
+<a name="l00743"></a>00743     <span class="keywordflow">if</span>( (tmp = x>>4) )  { x=tmp; result += 4; }
+<a name="l00744"></a>00744     <span class="keywordflow">if</span>( (tmp = x>>2) )  { x=tmp; result += 2; }
+<a name="l00745"></a>00745     <span class="keywordflow">return</span> (x&2)? result+1: result;
+<a name="l00746"></a>00746 }
+<a name="l00747"></a>00747 <span class="preprocessor">#endif</span>
+<a name="l00748"></a>00748 <span class="preprocessor"></span>
+<a name="l00749"></a>00749 <span class="preprocessor">#ifndef __TBB_AtomicOR</span>
+<a name="l00750"></a>00750 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_AtomicOR( <span class="keyword">volatile</span> <span class="keywordtype">void</span> *operand, uintptr_t addend ) {
+<a name="l00751"></a>00751     <a class="code" href="a00230.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00752"></a>00752     <span class="keywordflow">for</span>(;;) {
+<a name="l00753"></a>00753         uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
+<a name="l00754"></a>00754         uintptr_t result = __TBB_CompareAndSwapW(operand, tmp|addend, tmp);
+<a name="l00755"></a>00755         <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
+<a name="l00756"></a>00756         b.<a class="code" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
+<a name="l00757"></a>00757     }
+<a name="l00758"></a>00758 }
+<a name="l00759"></a>00759 <span class="preprocessor">#endif</span>
+<a name="l00760"></a>00760 <span class="preprocessor"></span>
+<a name="l00761"></a>00761 <span class="preprocessor">#ifndef __TBB_AtomicAND</span>
+<a name="l00762"></a>00762 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> __TBB_AtomicAND( <span class="keyword">volatile</span> <span class="keywordtype">void</span> *operand, uintptr_t addend ) {
+<a name="l00763"></a>00763     <a class="code" href="a00230.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00764"></a>00764     <span class="keywordflow">for</span>(;;) {
+<a name="l00765"></a>00765         uintptr_t tmp = *(<span class="keyword">volatile</span> uintptr_t *)operand;
+<a name="l00766"></a>00766         uintptr_t result = __TBB_CompareAndSwapW(operand, tmp&addend, tmp);
+<a name="l00767"></a>00767         <span class="keywordflow">if</span>( result==tmp ) <span class="keywordflow">break</span>;
+<a name="l00768"></a>00768         b.<a class="code" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
+<a name="l00769"></a>00769     }
+<a name="l00770"></a>00770 }
+<a name="l00771"></a>00771 <span class="preprocessor">#endif</span>
+<a name="l00772"></a>00772 <span class="preprocessor"></span>
+<a name="l00773"></a>00773 <span class="preprocessor">#ifndef __TBB_Flag</span>
+<a name="l00774"></a>00774 <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __TBB_Flag;
+<a name="l00775"></a>00775 <span class="preprocessor">#endif</span>
+<a name="l00776"></a>00776 <span class="preprocessor"></span><span class="keyword">typedef</span> __TBB_atomic __TBB_Flag __TBB_atomic_flag;
+<a name="l00777"></a>00777 
+<a name="l00778"></a>00778 <span class="preprocessor">#ifndef __TBB_TryLockByte</span>
+<a name="l00779"></a>00779 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_TryLockByte( __TBB_atomic_flag &flag ) {
+<a name="l00780"></a>00780     <span class="keywordflow">return</span> __TBB_machine_cmpswp1(&flag,1,0)==0;
+<a name="l00781"></a>00781 }
+<a name="l00782"></a>00782 <span class="preprocessor">#endif</span>
+<a name="l00783"></a>00783 <span class="preprocessor"></span>
+<a name="l00784"></a>00784 <span class="preprocessor">#ifndef __TBB_LockByte</span>
+<a name="l00785"></a>00785 <span class="preprocessor"></span><span class="keyword">inline</span> __TBB_Flag __TBB_LockByte( __TBB_atomic_flag& flag ) {
+<a name="l00786"></a>00786     <span class="keywordflow">if</span> ( !__TBB_TryLockByte(flag) ) {
+<a name="l00787"></a>00787         <a class="code" href="a00230.html">tbb::internal::atomic_backoff</a> b;
+<a name="l00788"></a>00788         <span class="keywordflow">do</span> {
+<a name="l00789"></a>00789             b.<a class="code" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">pause</a>();
+<a name="l00790"></a>00790         } <span class="keywordflow">while</span> ( !__TBB_TryLockByte(flag) );
+<a name="l00791"></a>00791     }
+<a name="l00792"></a>00792     <span class="keywordflow">return</span> 0;
+<a name="l00793"></a>00793 }
+<a name="l00794"></a>00794 <span class="preprocessor">#endif</span>
+<a name="l00795"></a>00795 <span class="preprocessor"></span>
+<a name="l00796"></a>00796 <span class="preprocessor">#define __TBB_UnlockByte __TBB_store_with_release</span>
+<a name="l00797"></a>00797 <span class="preprocessor"></span>
+<a name="l00798"></a>00798 <span class="preprocessor">#ifndef __TBB_ReverseByte</span>
+<a name="l00799"></a>00799 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> __TBB_ReverseByte(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> src) {
+<a name="l00800"></a>00800     <span class="keywordflow">return</span> tbb::internal::reverse<unsigned char>::byte_table[src];
+<a name="l00801"></a>00801 }
+<a name="l00802"></a>00802 <span class="preprocessor">#endif</span>
+<a name="l00803"></a>00803 <span class="preprocessor"></span>
+<a name="l00804"></a>00804 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00805"></a>00805 T __TBB_ReverseBits(T src) {
+<a name="l00806"></a>00806     T dst;
+<a name="l00807"></a>00807     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *original = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &src;
+<a name="l00808"></a>00808     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *reversed = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) &dst;
+<a name="l00809"></a>00809 
+<a name="l00810"></a>00810     <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = <span class="keyword">sizeof</span>(T)-1; i >= 0; i-- )
+<a name="l00811"></a>00811         reversed[i] = __TBB_ReverseByte( original[<span class="keyword">sizeof</span>(T)-i-1] );
+<a name="l00812"></a>00812 
+<a name="l00813"></a>00813     <span class="keywordflow">return</span> dst;
+<a name="l00814"></a>00814 }
+<a name="l00815"></a>00815 
+<a name="l00816"></a>00816 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_machine_H */</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00599.html b/doc/html/a00599.html
deleted file mode 100644
index 486b1b7..0000000
--- a/doc/html/a00599.html
+++ /dev/null
@@ -1,225 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_profiling.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>tbb_profiling.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_profiling_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_profiling_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="comment">// Check if the tools support is enabled</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#if (_WIN32||_WIN64||__linux__) && !__MINGW32__ && TBB_USE_THREADING_TOOLS</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span>
-<a name="l00027"></a>00027 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#include <stdlib.h></span>  <span class="comment">/* mbstowcs_s */</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#endif</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00031"></a>00031 
-<a name="l00032"></a>00032 <span class="keyword">namespace </span>tbb {
-<a name="l00033"></a>00033     <span class="keyword">namespace </span>internal {
-<a name="l00034"></a>00034 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span>        <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC itt_set_sync_name_v3( <span class="keywordtype">void</span> *obj, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* name ); 
-<a name="l00036"></a>00036         <span class="keyword">inline</span> size_t multibyte_to_widechar( <span class="keywordtype">wchar_t</span>* wcs, <span class="keyword">const</span> <span class="keywordtype">char</span>* mbs, size_t bufsize) {
-<a name="l00037"></a>00037 <span class="preprocessor">#if _MSC_VER>=1400</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span>            size_t len;
-<a name="l00039"></a>00039             mbstowcs_s( &len, wcs, bufsize, mbs, _TRUNCATE );
-<a name="l00040"></a>00040             <span class="keywordflow">return</span> len;   <span class="comment">// mbstowcs_s counts null terminator</span>
-<a name="l00041"></a>00041 <span class="preprocessor">#else</span>
-<a name="l00042"></a>00042 <span class="preprocessor"></span>            size_t len = mbstowcs( wcs, mbs, bufsize );
-<a name="l00043"></a>00043             <span class="keywordflow">if</span>(wcs && len!=size_t(-1) )
-<a name="l00044"></a>00044                 wcs[len<bufsize-1? len: bufsize-1] = wchar_t(<span class="charliteral">'\0'</span>);
-<a name="l00045"></a>00045             <span class="keywordflow">return</span> len+1; <span class="comment">// mbstowcs does not count null terminator</span>
-<a name="l00046"></a>00046 <span class="preprocessor">#endif</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span>        }
-<a name="l00048"></a>00048 <span class="preprocessor">#else</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span>        <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC itt_set_sync_name_v3( <span class="keywordtype">void</span> *obj, <span class="keyword">const</span> <span class="keywordtype">char</span>* name ); 
-<a name="l00050"></a>00050 <span class="preprocessor">#endif</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span>    } <span class="comment">// namespace internal</span>
-<a name="l00052"></a>00052 } <span class="comment">// namespace tbb</span>
-<a name="l00053"></a>00053 
-<a name="l00055"></a>00055 
-<a name="l00057"></a>00057 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)    \</span>
-<a name="l00059"></a>00059 <span class="preprocessor">        namespace profiling {                                                       \</span>
-<a name="l00060"></a>00060 <span class="preprocessor">            inline void set_name( sync_object_type& obj, const wchar_t* name ) {    \</span>
-<a name="l00061"></a>00061 <span class="preprocessor">                tbb::internal::itt_set_sync_name_v3( &obj, name );                  \</span>
-<a name="l00062"></a>00062 <span class="preprocessor">            }                                                                       \</span>
-<a name="l00063"></a>00063 <span class="preprocessor">            inline void set_name( sync_object_type& obj, const char* name ) {       \</span>
-<a name="l00064"></a>00064 <span class="preprocessor">                size_t len = tbb::internal::multibyte_to_widechar(NULL, name, 0);   \</span>
-<a name="l00065"></a>00065 <span class="preprocessor">                wchar_t *wname = new wchar_t[len];                                  \</span>
-<a name="l00066"></a>00066 <span class="preprocessor">                tbb::internal::multibyte_to_widechar(wname, name, len);             \</span>
-<a name="l00067"></a>00067 <span class="preprocessor">                set_name( obj, wname );                                             \</span>
-<a name="l00068"></a>00068 <span class="preprocessor">                delete[] wname;                                                     \</span>
-<a name="l00069"></a>00069 <span class="preprocessor">            }                                                                       \</span>
-<a name="l00070"></a>00070 <span class="preprocessor">        }</span>
-<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !WIN */</span>
-<a name="l00072"></a>00072 <span class="preprocessor">    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)    \</span>
-<a name="l00073"></a>00073 <span class="preprocessor">        namespace profiling {                                                       \</span>
-<a name="l00074"></a>00074 <span class="preprocessor">            inline void set_name( sync_object_type& obj, const char* name ) {       \</span>
-<a name="l00075"></a>00075 <span class="preprocessor">                tbb::internal::itt_set_sync_name_v3( &obj, name );                  \</span>
-<a name="l00076"></a>00076 <span class="preprocessor">            }                                                                       \</span>
-<a name="l00077"></a>00077 <span class="preprocessor">        }</span>
-<a name="l00078"></a>00078 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !WIN */</span>
-<a name="l00079"></a>00079 
-<a name="l00080"></a>00080 <span class="preprocessor">#else </span><span class="comment">/* no tools support */</span>
-<a name="l00081"></a>00081 
-<a name="l00082"></a>00082 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)    \</span>
-<a name="l00084"></a>00084 <span class="preprocessor">        namespace profiling {                                               \</span>
-<a name="l00085"></a>00085 <span class="preprocessor">            inline void set_name( sync_object_type&, const wchar_t* ) {}    \</span>
-<a name="l00086"></a>00086 <span class="preprocessor">            inline void set_name( sync_object_type&, const char* ) {}       \</span>
-<a name="l00087"></a>00087 <span class="preprocessor">        }</span>
-<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !WIN */</span>
-<a name="l00089"></a>00089 <span class="preprocessor">    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)    \</span>
-<a name="l00090"></a>00090 <span class="preprocessor">        namespace profiling {                                               \</span>
-<a name="l00091"></a>00091 <span class="preprocessor">            inline void set_name( sync_object_type&, const char* ) {}       \</span>
-<a name="l00092"></a>00092 <span class="preprocessor">        }</span>
-<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !WIN */</span>
-<a name="l00094"></a>00094 
-<a name="l00095"></a>00095 <span class="preprocessor">#endif </span><span class="comment">/* no tools support */</span>
-<a name="l00096"></a>00096 
-<a name="l00097"></a>00097 <span class="preprocessor">#include "atomic.h"</span>
-<a name="l00098"></a>00098 <span class="comment">// Need these to work regardless of tools support</span>
-<a name="l00099"></a>00099 <span class="keyword">namespace </span>tbb {
-<a name="l00100"></a>00100     <span class="keyword">namespace </span>internal {
-<a name="l00101"></a>00101 
-<a name="l00102"></a>00102         <span class="keyword">enum</span> notify_type {prepare=0, cancel, acquired, releasing};
-<a name="l00103"></a>00103         <span class="keyword">const</span> uintptr_t NUM_NOTIFY_TYPES = 4; <span class="comment">// set to # elements in enum above</span>
-<a name="l00104"></a>00104         
-<a name="l00105"></a>00105         <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC call_itt_notify_v5(<span class="keywordtype">int</span> t, <span class="keywordtype">void</span> *ptr);
-<a name="l00106"></a>00106         <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC itt_store_pointer_with_release_v3(<span class="keywordtype">void</span> *dst, <span class="keywordtype">void</span> *src);
-<a name="l00107"></a>00107         <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC itt_load_pointer_with_acquire_v3(<span class="keyword">const</span> <span class="keywordtype">void</span> *src);
-<a name="l00108"></a>00108         <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC itt_load_pointer_v3( <span class="keyword">const</span> <span class="keywordtype">void</span>* src );
-<a name="l00109"></a>00109 
-<a name="l00110"></a>00110         <span class="comment">// two template arguments are to workaround /Wp64 warning with tbb::atomic specialized for unsigned type</span>
-<a name="l00111"></a>00111         <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
-<a name="l00112"></a>00112         <span class="keyword">inline</span> <span class="keywordtype">void</span> itt_store_word_with_release(<a class="code" href="a00216.html">tbb::atomic<T></a>& dst, U src) {
-<a name="l00113"></a>00113 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00114"></a>00114 <span class="preprocessor"></span>            <span class="comment">// This assertion should be replaced with static_assert</span>
-<a name="l00115"></a>00115             __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized."</span>);
-<a name="l00116"></a>00116             itt_store_pointer_with_release_v3(&dst, (<span class="keywordtype">void</span> *)uintptr_t(src));
-<a name="l00117"></a>00117 <span class="preprocessor">#else</span>
-<a name="l00118"></a>00118 <span class="preprocessor"></span>            dst = src;
-<a name="l00119"></a>00119 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
-<a name="l00120"></a>00120 <span class="preprocessor"></span>        }
-<a name="l00121"></a>00121 
-<a name="l00122"></a>00122         <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00123"></a>00123         <span class="keyword">inline</span> T itt_load_word_with_acquire(<span class="keyword">const</span> <a class="code" href="a00216.html">tbb::atomic<T></a>& src) {
-<a name="l00124"></a>00124 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00125"></a>00125 <span class="preprocessor"></span>            <span class="comment">// This assertion should be replaced with static_assert</span>
-<a name="l00126"></a>00126             __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized."</span>);
-<a name="l00127"></a>00127 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00128"></a>00128 <span class="preprocessor"></span>            <span class="comment">// Workaround for overzealous compiler warnings </span>
-<a name="l00129"></a>00129 <span class="preprocessor">            #pragma warning (push)</span>
-<a name="l00130"></a>00130 <span class="preprocessor"></span><span class="preprocessor">            #pragma warning (disable: 4311)</span>
-<a name="l00131"></a>00131 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00132"></a>00132 <span class="preprocessor"></span>            T result = (T)itt_load_pointer_with_acquire_v3(&src);
-<a name="l00133"></a>00133 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
-<a name="l00134"></a>00134 <span class="preprocessor"></span><span class="preprocessor">            #pragma warning (pop)</span>
-<a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span>            <span class="keywordflow">return</span> result;
-<a name="l00137"></a>00137 <span class="preprocessor">#else</span>
-<a name="l00138"></a>00138 <span class="preprocessor"></span>            <span class="keywordflow">return</span> src;
-<a name="l00139"></a>00139 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span>        }
-<a name="l00141"></a>00141 
-<a name="l00142"></a>00142         <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00143"></a>00143         <span class="keyword">inline</span> <span class="keywordtype">void</span> itt_store_word_with_release(T& dst, T src) {
-<a name="l00144"></a>00144 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00145"></a>00145 <span class="preprocessor"></span>            <span class="comment">// This assertion should be replaced with static_assert</span>
-<a name="l00146"></a>00146             __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized."</span>);
-<a name="l00147"></a>00147             itt_store_pointer_with_release_v3(&dst, (<span class="keywordtype">void</span> *)src);
-<a name="l00148"></a>00148 <span class="preprocessor">#else</span>
-<a name="l00149"></a>00149 <span class="preprocessor"></span>            __TBB_store_with_release(dst, src); 
-<a name="l00150"></a>00150 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
-<a name="l00151"></a>00151 <span class="preprocessor"></span>        }
-<a name="l00152"></a>00152 
-<a name="l00153"></a>00153         <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00154"></a>00154         <span class="keyword">inline</span> T itt_load_word_with_acquire(<span class="keyword">const</span> T& src) {
-<a name="l00155"></a>00155 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00156"></a>00156 <span class="preprocessor"></span>            <span class="comment">// This assertion should be replaced with static_assert</span>
-<a name="l00157"></a>00157             __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized"</span>);
-<a name="l00158"></a>00158             <span class="keywordflow">return</span> (T)itt_load_pointer_with_acquire_v3(&src);
-<a name="l00159"></a>00159 <span class="preprocessor">#else</span>
-<a name="l00160"></a>00160 <span class="preprocessor"></span>            <span class="keywordflow">return</span> __TBB_load_with_acquire(src);
-<a name="l00161"></a>00161 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
-<a name="l00162"></a>00162 <span class="preprocessor"></span>        }
-<a name="l00163"></a>00163         
-<a name="l00164"></a>00164         <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00165"></a>00165         <span class="keyword">inline</span> <span class="keywordtype">void</span> itt_hide_store_word(T& dst, T src) {
-<a name="l00166"></a>00166 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00167"></a>00167 <span class="preprocessor"></span>            <span class="comment">// This assertion should be replaced with static_assert</span>
-<a name="l00168"></a>00168             __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized"</span>);
-<a name="l00169"></a>00169             itt_store_pointer_with_release_v3(&dst, (<span class="keywordtype">void</span> *)src);
-<a name="l00170"></a>00170 <span class="preprocessor">#else</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span>            dst = src;
-<a name="l00172"></a>00172 <span class="preprocessor">#endif</span>
-<a name="l00173"></a>00173 <span class="preprocessor"></span>        }
-<a name="l00174"></a>00174 
-<a name="l00175"></a>00175         <span class="keyword">template</span> <<span class="keyword">typename</span> T>
-<a name="l00176"></a>00176         <span class="keyword">inline</span> T itt_hide_load_word(<span class="keyword">const</span> T& src) {
-<a name="l00177"></a>00177 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00178"></a>00178 <span class="preprocessor"></span>            <span class="comment">// This assertion should be replaced with static_assert</span>
-<a name="l00179"></a>00179             __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized."</span>);
-<a name="l00180"></a>00180             <span class="keywordflow">return</span> (T)itt_load_pointer_v3(&src);
-<a name="l00181"></a>00181 <span class="preprocessor">#else</span>
-<a name="l00182"></a>00182 <span class="preprocessor"></span>            <span class="keywordflow">return</span> src;
-<a name="l00183"></a>00183 <span class="preprocessor">#endif</span>
-<a name="l00184"></a>00184 <span class="preprocessor"></span>        }
-<a name="l00185"></a>00185 
-<a name="l00186"></a>00186 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span>        <span class="keyword">inline</span> <span class="keywordtype">void</span> call_itt_notify(notify_type t, <span class="keywordtype">void</span> *ptr) {
-<a name="l00188"></a>00188             call_itt_notify_v5((<span class="keywordtype">int</span>)t, ptr);
-<a name="l00189"></a>00189         }
-<a name="l00190"></a>00190 <span class="preprocessor">#else</span>
-<a name="l00191"></a>00191 <span class="preprocessor"></span>        <span class="keyword">inline</span> <span class="keywordtype">void</span> call_itt_notify(notify_type <span class="comment">/*t*/</span>, <span class="keywordtype">void</span> * <span class="comment">/*ptr*/</span>) {}
-<a name="l00192"></a>00192 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
-<a name="l00193"></a>00193 <span class="preprocessor"></span>
-<a name="l00194"></a>00194     } <span class="comment">// namespace internal</span>
-<a name="l00195"></a>00195 } <span class="comment">// namespace tbb</span>
-<a name="l00196"></a>00196 
-<a name="l00197"></a>00197 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_profiling_H */</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00600.html b/doc/html/a00600.html
index dea6fc7..e75183f 100644
--- a/doc/html/a00600.html
+++ b/doc/html/a00600.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbb_stddef.h Source File</title>
+<title>tbb_profiling.h Source File</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -19,7 +19,7 @@
     <li><a href="files.html"><span>File List</span></a></li>
     <li><a href="globals.html"><span>File Members</span></a></li>
   </ul></div>
-<h1>tbb_stddef.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>tbb_profiling.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
 <a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
 <a name="l00003"></a>00003 <span class="comment"></span>
 <a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
@@ -39,217 +39,181 @@
 <a name="l00018"></a>00018 <span class="comment">    writing.</span>
 <a name="l00019"></a>00019 <span class="comment">*/</span>
 <a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tbb_stddef_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_stddef_H</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_profiling_H</span>
+<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_profiling_H</span>
 <a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="comment">// Marketing-driven product version</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#define TBB_VERSION_MAJOR 3</span>
-<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define TBB_VERSION_MINOR 0</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span>
-<a name="l00028"></a>00028 <span class="comment">// Engineering-focused interface version</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#define TBB_INTERFACE_VERSION 5006</span>
-<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000</span>
-<a name="l00031"></a>00031 <span class="preprocessor"></span>
-<a name="l00032"></a>00032 <span class="comment">// The oldest major interface version still supported</span>
-<a name="l00033"></a>00033 <span class="comment">// To be used in SONAME, manifests, etc.</span>
-<a name="l00034"></a>00034 <span class="preprocessor">#define TBB_COMPATIBLE_INTERFACE_VERSION 2</span>
-<a name="l00035"></a>00035 <span class="preprocessor"></span>
-<a name="l00036"></a>00036 <span class="preprocessor">#define __TBB_STRING_AUX(x) #x</span>
-<a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_STRING(x) __TBB_STRING_AUX(x)</span>
-<a name="l00038"></a>00038 <span class="preprocessor"></span>
-<a name="l00039"></a>00039 <span class="comment">// We do not need defines below for resource processing on windows</span>
-<a name="l00040"></a>00040 <span class="preprocessor">#if !defined RC_INVOKED</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span>
-<a name="l00042"></a>00042 <span class="comment">// Define groups for Doxygen documentation</span>
-<a name="l00052"></a>00052 <span class="comment"></span><span class="comment">// Simple text that is displayed on the main page of Doxygen documentation.</span>
-<a name="l00094"></a>00094 <span class="comment"></span><span class="comment">// Define preprocessor symbols used to determine architecture</span>
-<a name="l00095"></a>00095 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span><span class="preprocessor">#   if defined(_M_X64)||defined(__x86_64__)  // the latter for MinGW support</span>
-<a name="l00097"></a>00097 <span class="preprocessor"></span><span class="preprocessor">#       define __TBB_x86_64 1</span>
-<a name="l00098"></a>00098 <span class="preprocessor"></span><span class="preprocessor">#   elif defined(_M_IA64)</span>
-<a name="l00099"></a>00099 <span class="preprocessor"></span><span class="preprocessor">#       define __TBB_ipf 1</span>
-<a name="l00100"></a>00100 <span class="preprocessor"></span><span class="preprocessor">#   elif defined(_M_IX86)||defined(__i386__) // the latter for MinGW support</span>
-<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="preprocessor">#       define __TBB_x86_32 1</span>
-<a name="l00102"></a>00102 <span class="preprocessor"></span><span class="preprocessor">#   endif</span>
-<a name="l00103"></a>00103 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* Assume generic Unix */</span>
-<a name="l00104"></a>00104 <span class="preprocessor">#   if !__linux__ && !__APPLE__</span>
-<a name="l00105"></a>00105 <span class="preprocessor"></span><span class="preprocessor">#       define __TBB_generic_os 1</span>
-<a name="l00106"></a>00106 <span class="preprocessor"></span><span class="preprocessor">#   endif</span>
-<a name="l00107"></a>00107 <span class="preprocessor"></span><span class="preprocessor">#   if __x86_64__</span>
-<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="preprocessor">#       define __TBB_x86_64 1</span>
-<a name="l00109"></a>00109 <span class="preprocessor"></span><span class="preprocessor">#   elif __ia64__</span>
-<a name="l00110"></a>00110 <span class="preprocessor"></span><span class="preprocessor">#       define __TBB_ipf 1</span>
-<a name="l00111"></a>00111 <span class="preprocessor"></span><span class="preprocessor">#   elif __i386__||__i386  // __i386 is for Sun OS</span>
-<a name="l00112"></a>00112 <span class="preprocessor"></span><span class="preprocessor">#       define __TBB_x86_32 1</span>
-<a name="l00113"></a>00113 <span class="preprocessor"></span><span class="preprocessor">#   else</span>
-<a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor">#       define __TBB_generic_arch 1</span>
-<a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor">#   endif</span>
-<a name="l00116"></a>00116 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00117"></a>00117 <span class="preprocessor"></span>
-<a name="l00118"></a>00118 <span class="comment">// tbb_config.h should be included the first since it contains macro definitions used in other headers</span>
-<a name="l00119"></a>00119 <span class="preprocessor">#include "tbb_config.h"</span>
-<a name="l00120"></a>00120 
-<a name="l00121"></a>00121 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span><span class="comment">// define the parts of stdint.h that are needed, but put them inside tbb::internal</span>
-<a name="l00123"></a>00123 <span class="keyword">namespace </span>tbb {
-<a name="l00124"></a>00124 <span class="keyword">namespace </span>internal {
-<a name="l00125"></a>00125     <span class="keyword">typedef</span> __int8 int8_t;
-<a name="l00126"></a>00126     <span class="keyword">typedef</span> __int16 int16_t;
-<a name="l00127"></a>00127     <span class="keyword">typedef</span> __int32 int32_t;
-<a name="l00128"></a>00128     <span class="keyword">typedef</span> __int64 int64_t;
-<a name="l00129"></a>00129     <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int8 uint8_t;
-<a name="l00130"></a>00130     <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int16 uint16_t;
-<a name="l00131"></a>00131     <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int32 uint32_t;
-<a name="l00132"></a>00132     <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int64 uint64_t;
-<a name="l00133"></a>00133 } <span class="comment">// namespace internal</span>
-<a name="l00134"></a>00134 } <span class="comment">// namespace tbb</span>
-<a name="l00135"></a>00135 <span class="preprocessor">#else</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">#include <stdint.h></span>
-<a name="l00137"></a>00137 <span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER */</span>
-<a name="l00138"></a>00138 
-<a name="l00139"></a>00139 <span class="preprocessor">#if _MSC_VER >=1400</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC   __cdecl</span>
-<a name="l00141"></a>00141 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_METHOD __thiscall</span>
-<a name="l00142"></a>00142 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00143"></a>00143 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC</span>
-<a name="l00144"></a>00144 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_METHOD</span>
-<a name="l00145"></a>00145 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00146"></a>00146 <span class="preprocessor"></span>
-<a name="l00147"></a>00147 <span class="preprocessor">#include <cstddef></span>      <span class="comment">/* Need size_t and ptrdiff_t */</span>
-<a name="l00148"></a>00148 
-<a name="l00149"></a>00149 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_windef_H</span>
-<a name="l00151"></a>00151 <span class="preprocessor"></span><span class="preprocessor">#include "_tbb_windef.h"</span>
-<a name="l00152"></a>00152 <span class="preprocessor">#undef __TBB_tbb_windef_H</span>
-<a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00154"></a>00154 <span class="preprocessor"></span>
-<a name="l00156"></a>00156 <span class="keyword">namespace </span>tbb {
-<a name="l00157"></a>00157 
-<a name="l00158"></a>00158 <span class="keyword">using</span> std::size_t; <span class="keyword">using</span> std::ptrdiff_t;
-<a name="l00159"></a>00159 
-<a name="l00161"></a><a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">00161</a>     <span class="keyword">typedef</span> void(*<a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a>)( <span class="keyword">const</span> <span class="keywordtype">char</span>* filename, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* expression, <span class="keyword">const</span> < [...]
-<a name="l00162"></a>00162 
-<a name="l00163"></a>00163 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00164"></a>00164 <span class="preprocessor"></span>
-<a name="l00166"></a>00166 
-<a name="l00169"></a>00169 <span class="preprocessor">#define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))</span>
-<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_ASSERT_EX __TBB_ASSERT</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span>
-<a name="l00173"></a>00173     <a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC <a class="code" href="a00362.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a>( <a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler );
+<a name="l00024"></a>00024 <span class="comment">// Check if the tools support is enabled</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#if (_WIN32||_WIN64||__linux__) && !__MINGW32__ && TBB_USE_THREADING_TOOLS</span>
+<a name="l00026"></a>00026 <span class="preprocessor"></span>
+<a name="l00027"></a>00027 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00028"></a>00028 <span class="preprocessor"></span><span class="preprocessor">#include <stdlib.h></span>  <span class="comment">/* mbstowcs_s */</span>
+<a name="l00029"></a>00029 <span class="preprocessor">#endif</span>
+<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#include "tbb_stddef.h"</span>
+<a name="l00031"></a>00031 
+<a name="l00032"></a>00032 <span class="keyword">namespace </span>tbb {
+<a name="l00033"></a>00033     <span class="keyword">namespace </span>internal {
+<a name="l00034"></a>00034 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00035"></a>00035 <span class="preprocessor"></span>        <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC itt_set_sync_name_v3( <span class="keywordtype">void</span> *obj, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* name ); 
+<a name="l00036"></a>00036         <span class="keyword">inline</span> size_t multibyte_to_widechar( <span class="keywordtype">wchar_t</span>* wcs, <span class="keyword">const</span> <span class="keywordtype">char</span>* mbs, size_t bufsize) {
+<a name="l00037"></a>00037 <span class="preprocessor">#if _MSC_VER>=1400</span>
+<a name="l00038"></a>00038 <span class="preprocessor"></span>            size_t len;
+<a name="l00039"></a>00039             mbstowcs_s( &len, wcs, bufsize, mbs, _TRUNCATE );
+<a name="l00040"></a>00040             <span class="keywordflow">return</span> len;   <span class="comment">// mbstowcs_s counts null terminator</span>
+<a name="l00041"></a>00041 <span class="preprocessor">#else</span>
+<a name="l00042"></a>00042 <span class="preprocessor"></span>            size_t len = mbstowcs( wcs, mbs, bufsize );
+<a name="l00043"></a>00043             <span class="keywordflow">if</span>(wcs && len!=size_t(-1) )
+<a name="l00044"></a>00044                 wcs[len<bufsize-1? len: bufsize-1] = wchar_t(<span class="charliteral">'\0'</span>);
+<a name="l00045"></a>00045             <span class="keywordflow">return</span> len+1; <span class="comment">// mbstowcs does not count null terminator</span>
+<a name="l00046"></a>00046 <span class="preprocessor">#endif</span>
+<a name="l00047"></a>00047 <span class="preprocessor"></span>        }
+<a name="l00048"></a>00048 <span class="preprocessor">#else</span>
+<a name="l00049"></a>00049 <span class="preprocessor"></span>        <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC itt_set_sync_name_v3( <span class="keywordtype">void</span> *obj, <span class="keyword">const</span> <span class="keywordtype">char</span>* name ); 
+<a name="l00050"></a>00050 <span class="preprocessor">#endif</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span>    } <span class="comment">// namespace internal</span>
+<a name="l00052"></a>00052 } <span class="comment">// namespace tbb</span>
+<a name="l00053"></a>00053 
+<a name="l00055"></a>00055 
+<a name="l00057"></a>00057 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00058"></a>00058 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)    \</span>
+<a name="l00059"></a>00059 <span class="preprocessor">        namespace profiling {                                                       \</span>
+<a name="l00060"></a>00060 <span class="preprocessor">            inline void set_name( sync_object_type& obj, const wchar_t* name ) {    \</span>
+<a name="l00061"></a>00061 <span class="preprocessor">                tbb::internal::itt_set_sync_name_v3( &obj, name );                  \</span>
+<a name="l00062"></a>00062 <span class="preprocessor">            }                                                                       \</span>
+<a name="l00063"></a>00063 <span class="preprocessor">            inline void set_name( sync_object_type& obj, const char* name ) {       \</span>
+<a name="l00064"></a>00064 <span class="preprocessor">                size_t len = tbb::internal::multibyte_to_widechar(NULL, name, 0);   \</span>
+<a name="l00065"></a>00065 <span class="preprocessor">                wchar_t *wname = new wchar_t[len];                                  \</span>
+<a name="l00066"></a>00066 <span class="preprocessor">                tbb::internal::multibyte_to_widechar(wname, name, len);             \</span>
+<a name="l00067"></a>00067 <span class="preprocessor">                set_name( obj, wname );                                             \</span>
+<a name="l00068"></a>00068 <span class="preprocessor">                delete[] wname;                                                     \</span>
+<a name="l00069"></a>00069 <span class="preprocessor">            }                                                                       \</span>
+<a name="l00070"></a>00070 <span class="preprocessor">        }</span>
+<a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !WIN */</span>
+<a name="l00072"></a>00072 <span class="preprocessor">    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)    \</span>
+<a name="l00073"></a>00073 <span class="preprocessor">        namespace profiling {                                                       \</span>
+<a name="l00074"></a>00074 <span class="preprocessor">            inline void set_name( sync_object_type& obj, const char* name ) {       \</span>
+<a name="l00075"></a>00075 <span class="preprocessor">                tbb::internal::itt_set_sync_name_v3( &obj, name );                  \</span>
+<a name="l00076"></a>00076 <span class="preprocessor">            }                                                                       \</span>
+<a name="l00077"></a>00077 <span class="preprocessor">        }</span>
+<a name="l00078"></a>00078 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !WIN */</span>
+<a name="l00079"></a>00079 
+<a name="l00080"></a>00080 <span class="preprocessor">#else </span><span class="comment">/* no tools support */</span>
+<a name="l00081"></a>00081 
+<a name="l00082"></a>00082 <span class="preprocessor">#if _WIN32||_WIN64</span>
+<a name="l00083"></a>00083 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)    \</span>
+<a name="l00084"></a>00084 <span class="preprocessor">        namespace profiling {                                               \</span>
+<a name="l00085"></a>00085 <span class="preprocessor">            inline void set_name( sync_object_type&, const wchar_t* ) {}    \</span>
+<a name="l00086"></a>00086 <span class="preprocessor">            inline void set_name( sync_object_type&, const char* ) {}       \</span>
+<a name="l00087"></a>00087 <span class="preprocessor">        }</span>
+<a name="l00088"></a>00088 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !WIN */</span>
+<a name="l00089"></a>00089 <span class="preprocessor">    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)    \</span>
+<a name="l00090"></a>00090 <span class="preprocessor">        namespace profiling {                                               \</span>
+<a name="l00091"></a>00091 <span class="preprocessor">            inline void set_name( sync_object_type&, const char* ) {}       \</span>
+<a name="l00092"></a>00092 <span class="preprocessor">        }</span>
+<a name="l00093"></a>00093 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !WIN */</span>
+<a name="l00094"></a>00094 
+<a name="l00095"></a>00095 <span class="preprocessor">#endif </span><span class="comment">/* no tools support */</span>
+<a name="l00096"></a>00096 
+<a name="l00097"></a>00097 <span class="preprocessor">#include "atomic.h"</span>
+<a name="l00098"></a>00098 <span class="comment">// Need these to work regardless of tools support</span>
+<a name="l00099"></a>00099 <span class="keyword">namespace </span>tbb {
+<a name="l00100"></a>00100     <span class="keyword">namespace </span>internal {
+<a name="l00101"></a>00101 
+<a name="l00102"></a>00102         <span class="keyword">enum</span> notify_type {prepare=0, cancel, acquired, releasing};
+<a name="l00103"></a>00103         <span class="keyword">const</span> uintptr_t NUM_NOTIFY_TYPES = 4; <span class="comment">// set to # elements in enum above</span>
+<a name="l00104"></a>00104         
+<a name="l00105"></a>00105         <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC call_itt_notify_v5(<span class="keywordtype">int</span> t, <span class="keywordtype">void</span> *ptr);
+<a name="l00106"></a>00106         <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC itt_store_pointer_with_release_v3(<span class="keywordtype">void</span> *dst, <span class="keywordtype">void</span> *src);
+<a name="l00107"></a>00107         <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC itt_load_pointer_with_acquire_v3(<span class="keyword">const</span> <span class="keywordtype">void</span> *src);
+<a name="l00108"></a>00108         <span class="keywordtype">void</span>* __TBB_EXPORTED_FUNC itt_load_pointer_v3( <span class="keyword">const</span> <span class="keywordtype">void</span>* src );
+<a name="l00109"></a>00109 
+<a name="l00110"></a>00110         <span class="comment">// two template arguments are to workaround /Wp64 warning with tbb::atomic specialized for unsigned type</span>
+<a name="l00111"></a>00111         <span class="keyword">template</span> <<span class="keyword">typename</span> T, <span class="keyword">typename</span> U>
+<a name="l00112"></a>00112         <span class="keyword">inline</span> <span class="keywordtype">void</span> itt_store_word_with_release(<a class="code" href="a00228.html">tbb::atomic<T></a>& dst, U src) {
+<a name="l00113"></a>00113 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00114"></a>00114 <span class="preprocessor"></span>            <span class="comment">// This assertion should be replaced with static_assert</span>
+<a name="l00115"></a>00115             __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized."</span>);
+<a name="l00116"></a>00116             itt_store_pointer_with_release_v3(&dst, (<span class="keywordtype">void</span> *)uintptr_t(src));
+<a name="l00117"></a>00117 <span class="preprocessor">#else</span>
+<a name="l00118"></a>00118 <span class="preprocessor"></span>            dst = src;
+<a name="l00119"></a>00119 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
+<a name="l00120"></a>00120 <span class="preprocessor"></span>        }
+<a name="l00121"></a>00121 
+<a name="l00122"></a>00122         <span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00123"></a>00123         <span class="keyword">inline</span> T itt_load_word_with_acquire(<span class="keyword">const</span> <a class="code" href="a00228.html">tbb::atomic<T></a>& src) {
+<a name="l00124"></a>00124 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00125"></a>00125 <span class="preprocessor"></span>            <span class="comment">// This assertion should be replaced with static_assert</span>
+<a name="l00126"></a>00126             __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized."</span>);
+<a name="l00127"></a>00127 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
+<a name="l00128"></a>00128 <span class="preprocessor"></span>            <span class="comment">// Workaround for overzealous compiler warnings </span>
+<a name="l00129"></a>00129 <span class="preprocessor">            #pragma warning (push)</span>
+<a name="l00130"></a>00130 <span class="preprocessor"></span><span class="preprocessor">            #pragma warning (disable: 4311)</span>
+<a name="l00131"></a>00131 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00132"></a>00132 <span class="preprocessor"></span>            T result = (T)itt_load_pointer_with_acquire_v3(&src);
+<a name="l00133"></a>00133 <span class="preprocessor">#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)</span>
+<a name="l00134"></a>00134 <span class="preprocessor"></span><span class="preprocessor">            #pragma warning (pop)</span>
+<a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00136"></a>00136 <span class="preprocessor"></span>            <span class="keywordflow">return</span> result;
+<a name="l00137"></a>00137 <span class="preprocessor">#else</span>
+<a name="l00138"></a>00138 <span class="preprocessor"></span>            <span class="keywordflow">return</span> src;
+<a name="l00139"></a>00139 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
+<a name="l00140"></a>00140 <span class="preprocessor"></span>        }
+<a name="l00141"></a>00141 
+<a name="l00142"></a>00142         <span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00143"></a>00143         <span class="keyword">inline</span> <span class="keywordtype">void</span> itt_store_word_with_release(T& dst, T src) {
+<a name="l00144"></a>00144 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00145"></a>00145 <span class="preprocessor"></span>            <span class="comment">// This assertion should be replaced with static_assert</span>
+<a name="l00146"></a>00146             __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized."</span>);
+<a name="l00147"></a>00147             itt_store_pointer_with_release_v3(&dst, (<span class="keywordtype">void</span> *)src);
+<a name="l00148"></a>00148 <span class="preprocessor">#else</span>
+<a name="l00149"></a>00149 <span class="preprocessor"></span>            __TBB_store_with_release(dst, src); 
+<a name="l00150"></a>00150 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
+<a name="l00151"></a>00151 <span class="preprocessor"></span>        }
+<a name="l00152"></a>00152 
+<a name="l00153"></a>00153         <span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00154"></a>00154         <span class="keyword">inline</span> T itt_load_word_with_acquire(<span class="keyword">const</span> T& src) {
+<a name="l00155"></a>00155 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00156"></a>00156 <span class="preprocessor"></span>            <span class="comment">// This assertion should be replaced with static_assert</span>
+<a name="l00157"></a>00157             __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized"</span>);
+<a name="l00158"></a>00158             <span class="keywordflow">return</span> (T)itt_load_pointer_with_acquire_v3(&src);
+<a name="l00159"></a>00159 <span class="preprocessor">#else</span>
+<a name="l00160"></a>00160 <span class="preprocessor"></span>            <span class="keywordflow">return</span> __TBB_load_with_acquire(src);
+<a name="l00161"></a>00161 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
+<a name="l00162"></a>00162 <span class="preprocessor"></span>        }
+<a name="l00163"></a>00163         
+<a name="l00164"></a>00164         <span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00165"></a>00165         <span class="keyword">inline</span> <span class="keywordtype">void</span> itt_hide_store_word(T& dst, T src) {
+<a name="l00166"></a>00166 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00167"></a>00167 <span class="preprocessor"></span>            <span class="comment">// This assertion should be replaced with static_assert</span>
+<a name="l00168"></a>00168             __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized"</span>);
+<a name="l00169"></a>00169             itt_store_pointer_with_release_v3(&dst, (<span class="keywordtype">void</span> *)src);
+<a name="l00170"></a>00170 <span class="preprocessor">#else</span>
+<a name="l00171"></a>00171 <span class="preprocessor"></span>            dst = src;
+<a name="l00172"></a>00172 <span class="preprocessor">#endif</span>
+<a name="l00173"></a>00173 <span class="preprocessor"></span>        }
 <a name="l00174"></a>00174 
-<a name="l00176"></a>00176 
-<a name="l00179"></a>00179     <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00362.html#3d1252787be39b4aef311f1cadaff9e8">assertion_failure</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* filename, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* expression, <span class="keyword">const</span> <span class="keywordtype">char</span>* comment );
-<a name="l00180"></a>00180 
+<a name="l00175"></a>00175         <span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00176"></a>00176         <span class="keyword">inline</span> T itt_hide_load_word(<span class="keyword">const</span> T& src) {
+<a name="l00177"></a>00177 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00178"></a>00178 <span class="preprocessor"></span>            <span class="comment">// This assertion should be replaced with static_assert</span>
+<a name="l00179"></a>00179             __TBB_ASSERT(<span class="keyword">sizeof</span>(T) == <span class="keyword">sizeof</span>(<span class="keywordtype">void</span> *), <span class="stringliteral">"Type must be word-sized."</span>);
+<a name="l00180"></a>00180             <span class="keywordflow">return</span> (T)itt_load_pointer_v3(&src);
 <a name="l00181"></a>00181 <span class="preprocessor">#else</span>
-<a name="l00182"></a>00182 <span class="preprocessor"></span>
-<a name="l00184"></a>00184 <span class="preprocessor">#define __TBB_ASSERT(predicate,comment) ((void)0)</span>
-<a name="l00186"></a>00186 <span class="preprocessor">#define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span>
-<a name="l00188"></a>00188 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00189"></a>00189 
-<a name="l00191"></a>00191 
-<a name="l00195"></a>00195 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00362.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a>();
+<a name="l00182"></a>00182 <span class="preprocessor"></span>            <span class="keywordflow">return</span> src;
+<a name="l00183"></a>00183 <span class="preprocessor">#endif</span>
+<a name="l00184"></a>00184 <span class="preprocessor"></span>        }
+<a name="l00185"></a>00185 
+<a name="l00186"></a>00186 <span class="preprocessor">#if TBB_USE_THREADING_TOOLS</span>
+<a name="l00187"></a>00187 <span class="preprocessor"></span>        <span class="keyword">inline</span> <span class="keywordtype">void</span> call_itt_notify(notify_type t, <span class="keywordtype">void</span> *ptr) {
+<a name="l00188"></a>00188             call_itt_notify_v5((<span class="keywordtype">int</span>)t, ptr);
+<a name="l00189"></a>00189         }
+<a name="l00190"></a>00190 <span class="preprocessor">#else</span>
+<a name="l00191"></a>00191 <span class="preprocessor"></span>        <span class="keyword">inline</span> <span class="keywordtype">void</span> call_itt_notify(notify_type <span class="comment">/*t*/</span>, <span class="keywordtype">void</span> * <span class="comment">/*ptr*/</span>) {}
+<a name="l00192"></a>00192 <span class="preprocessor">#endif // TBB_USE_THREADING_TOOLS</span>
+<a name="l00193"></a>00193 <span class="preprocessor"></span>
+<a name="l00194"></a>00194     } <span class="comment">// namespace internal</span>
+<a name="l00195"></a>00195 } <span class="comment">// namespace tbb</span>
 <a name="l00196"></a>00196 
-<a name="l00198"></a>00198 
-<a name="l00202"></a><a class="code" href="a00290.html">00202</a> <span class="keyword">class </span><a class="code" href="a00290.html">split</a> {
-<a name="l00203"></a>00203 };
-<a name="l00204"></a>00204 
-<a name="l00209"></a>00209 <span class="keyword">namespace </span>internal {
-<a name="l00210"></a>00210 
-<a name="l00212"></a>00212 
-<a name="l00215"></a>00215 <span class="keyword">const</span> size_t NFS_MaxLineSize = 128;
-<a name="l00216"></a>00216 
-<a name="l00217"></a>00217 <span class="keyword">template</span><<span class="keyword">class</span> T, <span class="keywordtype">int</span> S>
-<a name="l00218"></a>00218 <span class="keyword">struct </span>padded_base : T {
-<a name="l00219"></a>00219     <span class="keywordtype">char</span> pad[NFS_MaxLineSize - <span class="keyword">sizeof</span>(T) % NFS_MaxLineSize];
-<a name="l00220"></a>00220 };
-<a name="l00221"></a>00221 <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">struct </span>padded_base<T, 0> : T {};
-<a name="l00222"></a>00222 
-<a name="l00224"></a>00224 <span class="keyword">template</span><<span class="keyword">class</span> T>
-<a name="l00225"></a>00225 <span class="keyword">struct </span>padded : padded_base<T, sizeof(T)> {};
-<a name="l00226"></a>00226 
-<a name="l00228"></a>00228 
-<a name="l00230"></a>00230 <span class="preprocessor">#define __TBB_offsetof(class_name, member_name) \</span>
-<a name="l00231"></a>00231 <span class="preprocessor">    ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)</span>
-<a name="l00232"></a>00232 <span class="preprocessor"></span>
-<a name="l00234"></a>00234 <span class="preprocessor">#define __TBB_get_object_ref(class_name, member_name, member_addr) \</span>
-<a name="l00235"></a>00235 <span class="preprocessor">    (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name)))</span>
-<a name="l00236"></a>00236 <span class="preprocessor"></span>
-<a name="l00238"></a>00238 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC handle_perror( <span class="keywordtype">int</span> error_code, <span class="keyword">const</span> <span class="keywordtype">char</span>* aux_info );
-<a name="l00239"></a>00239 
-<a name="l00240"></a>00240 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00241"></a>00241 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_TRY try</span>
-<a name="l00242"></a>00242 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_CATCH(e) catch(e)</span>
-<a name="l00243"></a>00243 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_THROW(e) throw e</span>
-<a name="l00244"></a>00244 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_RETHROW() throw</span>
-<a name="l00245"></a>00245 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00246"></a>00246     <span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_false() { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00247"></a>00247 <span class="preprocessor">    #define __TBB_TRY</span>
-<a name="l00248"></a>00248 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() )</span>
-<a name="l00249"></a>00249 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_THROW(e) ((void)0)</span>
-<a name="l00250"></a>00250 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_RETHROW() ((void)0)</span>
-<a name="l00251"></a>00251 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00252"></a>00252 
-<a name="l00254"></a>00254 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC runtime_warning( <span class="keyword">const</span> <span class="keywordtype">char</span>* format, ... );
-<a name="l00255"></a>00255 
-<a name="l00256"></a>00256 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00257"></a>00257 <span class="preprocessor"></span><span class="keyword">static</span> <span class="keywordtype">void</span>* <span class="keyword">const</span> poisoned_ptr = reinterpret_cast<void*>(-1);
-<a name="l00258"></a>00258 
-<a name="l00260"></a>00260 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00261"></a>00261 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T*& p ) { p = reinterpret_cast<T*>(poisoned_ptr); }
-<a name="l00262"></a>00262 
-<a name="l00264"></a>00264 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00265"></a>00265 <span class="keyword">inline</span> <span class="keywordtype">bool</span> is_poisoned( T* p ) { <span class="keywordflow">return</span> p == reinterpret_cast<T*>(poisoned_ptr); }
-<a name="l00266"></a>00266 <span class="preprocessor">#else</span>
-<a name="l00267"></a>00267 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00268"></a>00268 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* ) {<span class="comment">/*do nothing*/</span>}
-<a name="l00269"></a>00269 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_ASSERT */</span>
-<a name="l00270"></a>00270 
-<a name="l00272"></a>00272 
-<a name="l00274"></a>00274 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U> 
-<a name="l00275"></a>00275 <span class="keyword">inline</span> T punned_cast( U* ptr ) {
-<a name="l00276"></a>00276     uintptr_t x = reinterpret_cast<uintptr_t>(ptr);
-<a name="l00277"></a>00277     <span class="keywordflow">return</span> reinterpret_cast<T>(x);
-<a name="l00278"></a>00278 }
-<a name="l00279"></a>00279 
-<a name="l00281"></a>00281 <span class="keyword">class </span>no_assign {
-<a name="l00282"></a>00282     <span class="comment">// Deny assignment</span>
-<a name="l00283"></a>00283     <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> no_assign& );
-<a name="l00284"></a>00284 <span class="keyword">public</span>:
-<a name="l00285"></a>00285 <span class="preprocessor">#if __GNUC__</span>
-<a name="l00287"></a>00287 <span class="preprocessor">    no_assign() {}</span>
-<a name="l00288"></a>00288 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
-<a name="l00289"></a>00289 };
-<a name="l00290"></a>00290 
-<a name="l00292"></a>00292 <span class="keyword">class </span>no_copy: no_assign {
-<a name="l00294"></a>00294     no_copy( <span class="keyword">const</span> no_copy& );
-<a name="l00295"></a>00295 <span class="keyword">public</span>:
-<a name="l00297"></a>00297     no_copy() {}
-<a name="l00298"></a>00298 };
-<a name="l00299"></a>00299 
-<a name="l00301"></a>00301 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00302"></a>00302 <span class="keyword">struct </span>allocator_type {
-<a name="l00303"></a>00303     <span class="keyword">typedef</span> T value_type;
-<a name="l00304"></a>00304 };
-<a name="l00305"></a>00305 
-<a name="l00306"></a>00306 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00308"></a>00308 <span class="preprocessor">template<typename T></span>
-<a name="l00309"></a>00309 <span class="preprocessor"></span><span class="keyword">struct </span>allocator_type<const T> {
-<a name="l00310"></a>00310     <span class="keyword">typedef</span> T value_type;
-<a name="l00311"></a>00311 };
-<a name="l00312"></a>00312 <span class="preprocessor">#endif</span>
-<a name="l00313"></a>00313 <span class="preprocessor"></span>
-<a name="l00314"></a>00314 <span class="comment">// Struct to be used as a version tag for inline functions.</span>
-<a name="l00317"></a>00317 <span class="comment"></span><span class="keyword">struct </span>version_tag_v3 {};
-<a name="l00318"></a>00318 
-<a name="l00319"></a>00319 <span class="keyword">typedef</span> version_tag_v3 version_tag;
-<a name="l00320"></a>00320 
-<a name="l00321"></a>00321 } <span class="comment">// internal</span>
-<a name="l00323"></a>00323 <span class="comment"></span>
-<a name="l00324"></a>00324 } <span class="comment">// tbb</span>
-<a name="l00325"></a>00325 
-<a name="l00326"></a>00326 <span class="preprocessor">#endif </span><span class="comment">/* RC_INVOKED */</span>
-<a name="l00327"></a>00327 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_stddef_H */</span>
+<a name="l00197"></a>00197 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_profiling_H */</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00600.html b/doc/html/a00601.html
similarity index 55%
copy from doc/html/a00600.html
copy to doc/html/a00601.html
index dea6fc7..70ad527 100644
--- a/doc/html/a00600.html
+++ b/doc/html/a00601.html
@@ -43,11 +43,11 @@
 <a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_stddef_H</span>
 <a name="l00023"></a>00023 <span class="preprocessor"></span>
 <a name="l00024"></a>00024 <span class="comment">// Marketing-driven product version</span>
-<a name="l00025"></a>00025 <span class="preprocessor">#define TBB_VERSION_MAJOR 3</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#define TBB_VERSION_MAJOR 4</span>
 <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define TBB_VERSION_MINOR 0</span>
 <a name="l00027"></a>00027 <span class="preprocessor"></span>
 <a name="l00028"></a>00028 <span class="comment">// Engineering-focused interface version</span>
-<a name="l00029"></a>00029 <span class="preprocessor">#define TBB_INTERFACE_VERSION 5006</span>
+<a name="l00029"></a>00029 <span class="preprocessor">#define TBB_INTERFACE_VERSION 6000</span>
 <a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#define TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000</span>
 <a name="l00031"></a>00031 <span class="preprocessor"></span>
 <a name="l00032"></a>00032 <span class="comment">// The oldest major interface version still supported</span>
@@ -89,167 +89,178 @@
 <a name="l00118"></a>00118 <span class="comment">// tbb_config.h should be included the first since it contains macro definitions used in other headers</span>
 <a name="l00119"></a>00119 <span class="preprocessor">#include "tbb_config.h"</span>
 <a name="l00120"></a>00120 
-<a name="l00121"></a>00121 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span><span class="comment">// define the parts of stdint.h that are needed, but put them inside tbb::internal</span>
-<a name="l00123"></a>00123 <span class="keyword">namespace </span>tbb {
-<a name="l00124"></a>00124 <span class="keyword">namespace </span>internal {
-<a name="l00125"></a>00125     <span class="keyword">typedef</span> __int8 int8_t;
-<a name="l00126"></a>00126     <span class="keyword">typedef</span> __int16 int16_t;
-<a name="l00127"></a>00127     <span class="keyword">typedef</span> __int32 int32_t;
-<a name="l00128"></a>00128     <span class="keyword">typedef</span> __int64 int64_t;
-<a name="l00129"></a>00129     <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int8 uint8_t;
-<a name="l00130"></a>00130     <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int16 uint16_t;
-<a name="l00131"></a>00131     <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int32 uint32_t;
-<a name="l00132"></a>00132     <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int64 uint64_t;
-<a name="l00133"></a>00133 } <span class="comment">// namespace internal</span>
-<a name="l00134"></a>00134 } <span class="comment">// namespace tbb</span>
-<a name="l00135"></a>00135 <span class="preprocessor">#else</span>
-<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">#include <stdint.h></span>
-<a name="l00137"></a>00137 <span class="preprocessor">#endif </span><span class="comment">/* _MSC_VER */</span>
-<a name="l00138"></a>00138 
-<a name="l00139"></a>00139 <span class="preprocessor">#if _MSC_VER >=1400</span>
-<a name="l00140"></a>00140 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC   __cdecl</span>
-<a name="l00141"></a>00141 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_METHOD __thiscall</span>
-<a name="l00142"></a>00142 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00143"></a>00143 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_FUNC</span>
-<a name="l00144"></a>00144 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_EXPORTED_METHOD</span>
-<a name="l00145"></a>00145 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00146"></a>00146 <span class="preprocessor"></span>
-<a name="l00147"></a>00147 <span class="preprocessor">#include <cstddef></span>      <span class="comment">/* Need size_t and ptrdiff_t */</span>
-<a name="l00148"></a>00148 
-<a name="l00149"></a>00149 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbb_windef_H</span>
-<a name="l00151"></a>00151 <span class="preprocessor"></span><span class="preprocessor">#include "_tbb_windef.h"</span>
-<a name="l00152"></a>00152 <span class="preprocessor">#undef __TBB_tbb_windef_H</span>
-<a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00154"></a>00154 <span class="preprocessor"></span>
-<a name="l00156"></a>00156 <span class="keyword">namespace </span>tbb {
-<a name="l00157"></a>00157 
-<a name="l00158"></a>00158 <span class="keyword">using</span> std::size_t; <span class="keyword">using</span> std::ptrdiff_t;
-<a name="l00159"></a>00159 
-<a name="l00161"></a><a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">00161</a>     <span class="keyword">typedef</span> void(*<a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a>)( <span class="keyword">const</span> <span class="keywordtype">char</span>* filename, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* expression, <span class="keyword">const</span> < [...]
-<a name="l00162"></a>00162 
-<a name="l00163"></a>00163 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00164"></a>00164 <span class="preprocessor"></span>
-<a name="l00166"></a>00166 
-<a name="l00169"></a>00169 <span class="preprocessor">#define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))</span>
-<a name="l00170"></a>00170 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_ASSERT_EX __TBB_ASSERT</span>
-<a name="l00171"></a>00171 <span class="preprocessor"></span>
-<a name="l00173"></a>00173     <a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC <a class="code" href="a00362.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a>( <a class="code" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler );
-<a name="l00174"></a>00174 
-<a name="l00176"></a>00176 
-<a name="l00179"></a>00179     <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00362.html#3d1252787be39b4aef311f1cadaff9e8">assertion_failure</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* filename, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* expression, <span class="keyword">const</span> <span class="keywordtype">char</span>* comment );
-<a name="l00180"></a>00180 
-<a name="l00181"></a>00181 <span class="preprocessor">#else</span>
-<a name="l00182"></a>00182 <span class="preprocessor"></span>
-<a name="l00184"></a>00184 <span class="preprocessor">#define __TBB_ASSERT(predicate,comment) ((void)0)</span>
-<a name="l00186"></a>00186 <span class="preprocessor">#define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))</span>
-<a name="l00187"></a>00187 <span class="preprocessor"></span>
-<a name="l00188"></a>00188 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
+<a name="l00121"></a>00121 <span class="preprocessor">#if _MSC_VER >=1400</span>
+<a name="l00122"></a>00122 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_EXPORTED_FUNC   __cdecl</span>
+<a name="l00123"></a>00123 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_EXPORTED_METHOD __thiscall</span>
+<a name="l00124"></a>00124 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_EXPORTED_FUNC</span>
+<a name="l00126"></a>00126 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_EXPORTED_METHOD</span>
+<a name="l00127"></a>00127 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00128"></a>00128 <span class="preprocessor"></span>
+<a name="l00129"></a>00129 <span class="preprocessor">#include <cstddef></span>      <span class="comment">/* Need size_t and ptrdiff_t */</span>
+<a name="l00130"></a>00130 
+<a name="l00131"></a>00131 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00132"></a>00132 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_tbb_windef_H</span>
+<a name="l00133"></a>00133 <span class="preprocessor"></span><span class="preprocessor">    #include "internal/_tbb_windef.h"</span>
+<a name="l00134"></a>00134 <span class="preprocessor">    #undef __TBB_tbb_windef_H</span>
+<a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">    #include <stdint.h></span>
+<a name="l00137"></a>00137 <span class="preprocessor">#endif</span>
+<a name="l00138"></a>00138 <span class="preprocessor"></span>
+<a name="l00140"></a>00140 <span class="keyword">namespace </span>tbb {
+<a name="l00141"></a>00141 
+<a name="l00142"></a>00142 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00143"></a>00143 <span class="preprocessor"></span>    <span class="keyword">namespace </span>internal {
+<a name="l00144"></a>00144         <span class="keyword">typedef</span> __int8 int8_t;
+<a name="l00145"></a>00145         <span class="keyword">typedef</span> __int16 int16_t;
+<a name="l00146"></a>00146         <span class="keyword">typedef</span> __int32 int32_t;
+<a name="l00147"></a>00147         <span class="keyword">typedef</span> __int64 int64_t;
+<a name="l00148"></a>00148         <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int8 uint8_t;
+<a name="l00149"></a>00149         <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int16 uint16_t;
+<a name="l00150"></a>00150         <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int32 uint32_t;
+<a name="l00151"></a>00151         <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> __int64 uint64_t;
+<a name="l00152"></a>00152     } <span class="comment">// namespace internal</span>
+<a name="l00153"></a>00153 <span class="preprocessor">#else </span><span class="comment">/* Posix */</span>
+<a name="l00154"></a>00154     <span class="keyword">namespace </span>internal {
+<a name="l00155"></a>00155         using ::int8_t;
+<a name="l00156"></a>00156         using ::int16_t;
+<a name="l00157"></a>00157         using ::int32_t;
+<a name="l00158"></a>00158         using ::int64_t;
+<a name="l00159"></a>00159         using ::uint8_t;
+<a name="l00160"></a>00160         using ::uint16_t;
+<a name="l00161"></a>00161         using ::uint32_t;
+<a name="l00162"></a>00162         using ::uint64_t;
+<a name="l00163"></a>00163     } <span class="comment">// namespace internal</span>
+<a name="l00164"></a>00164 <span class="preprocessor">#endif </span><span class="comment">/* Posix */</span>
+<a name="l00165"></a>00165 
+<a name="l00166"></a>00166     <span class="keyword">using</span> std::size_t;
+<a name="l00167"></a>00167     <span class="keyword">using</span> std::ptrdiff_t;
+<a name="l00168"></a>00168 
+<a name="l00170"></a><a class="code" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">00170</a>     <span class="keyword">typedef</span> void(*<a class="code" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a>)( <span class="keyword">const</span> <span class="keywordtype">char</span>* filename, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* expression, <span class="keyword">const</span> < [...]
+<a name="l00171"></a>00171 
+<a name="l00172"></a>00172 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00173"></a>00173 <span class="preprocessor"></span>
+<a name="l00175"></a>00175 
+<a name="l00178"></a>00178 <span class="preprocessor">    #define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))</span>
+<a name="l00179"></a>00179 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_ASSERT_EX __TBB_ASSERT</span>
+<a name="l00180"></a>00180 <span class="preprocessor"></span>
+<a name="l00182"></a>00182     <a class="code" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> __TBB_EXPORTED_FUNC <a class="code" href="a00383.html#823fa1c15dd829d1d9167157450ddcd9">set_assertion_handler</a>( <a class="code" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">assertion_handler_type</a> new_handler );
+<a name="l00183"></a>00183 
+<a name="l00185"></a>00185 
+<a name="l00188"></a>00188     <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC <a class="code" href="a00383.html#3d1252787be39b4aef311f1cadaff9e8">assertion_failure</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* filename, <span class="keywordtype">int</span> line, <span class="keyword">const</span> <span class="keywordtype">char</span>* expression, <span class="keyword">const</span> <span class="keywordtype">char</span>* comment );
 <a name="l00189"></a>00189 
+<a name="l00190"></a>00190 <span class="preprocessor">#else </span><span class="comment">/* !TBB_USE_ASSERT */</span>
 <a name="l00191"></a>00191 
-<a name="l00195"></a>00195 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00362.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a>();
-<a name="l00196"></a>00196 
+<a name="l00193"></a>00193 <span class="preprocessor">    #define __TBB_ASSERT(predicate,comment) ((void)0)</span>
+<a name="l00195"></a>00195 <span class="preprocessor">    #define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))</span>
+<a name="l00196"></a>00196 <span class="preprocessor"></span>
+<a name="l00197"></a>00197 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_ASSERT */</span>
 <a name="l00198"></a>00198 
-<a name="l00202"></a><a class="code" href="a00290.html">00202</a> <span class="keyword">class </span><a class="code" href="a00290.html">split</a> {
-<a name="l00203"></a>00203 };
-<a name="l00204"></a>00204 
-<a name="l00209"></a>00209 <span class="keyword">namespace </span>internal {
-<a name="l00210"></a>00210 
-<a name="l00212"></a>00212 
-<a name="l00215"></a>00215 <span class="keyword">const</span> size_t NFS_MaxLineSize = 128;
-<a name="l00216"></a>00216 
-<a name="l00217"></a>00217 <span class="keyword">template</span><<span class="keyword">class</span> T, <span class="keywordtype">int</span> S>
-<a name="l00218"></a>00218 <span class="keyword">struct </span>padded_base : T {
-<a name="l00219"></a>00219     <span class="keywordtype">char</span> pad[NFS_MaxLineSize - <span class="keyword">sizeof</span>(T) % NFS_MaxLineSize];
-<a name="l00220"></a>00220 };
-<a name="l00221"></a>00221 <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">struct </span>padded_base<T, 0> : T {};
-<a name="l00222"></a>00222 
-<a name="l00224"></a>00224 <span class="keyword">template</span><<span class="keyword">class</span> T>
-<a name="l00225"></a>00225 <span class="keyword">struct </span>padded : padded_base<T, sizeof(T)> {};
-<a name="l00226"></a>00226 
-<a name="l00228"></a>00228 
-<a name="l00230"></a>00230 <span class="preprocessor">#define __TBB_offsetof(class_name, member_name) \</span>
-<a name="l00231"></a>00231 <span class="preprocessor">    ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)</span>
-<a name="l00232"></a>00232 <span class="preprocessor"></span>
-<a name="l00234"></a>00234 <span class="preprocessor">#define __TBB_get_object_ref(class_name, member_name, member_addr) \</span>
-<a name="l00235"></a>00235 <span class="preprocessor">    (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name)))</span>
-<a name="l00236"></a>00236 <span class="preprocessor"></span>
-<a name="l00238"></a>00238 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC handle_perror( <span class="keywordtype">int</span> error_code, <span class="keyword">const</span> <span class="keywordtype">char</span>* aux_info );
-<a name="l00239"></a>00239 
-<a name="l00240"></a>00240 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
-<a name="l00241"></a>00241 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_TRY try</span>
-<a name="l00242"></a>00242 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_CATCH(e) catch(e)</span>
-<a name="l00243"></a>00243 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_THROW(e) throw e</span>
-<a name="l00244"></a>00244 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_RETHROW() throw</span>
-<a name="l00245"></a>00245 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
-<a name="l00246"></a>00246     <span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_false() { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
-<a name="l00247"></a>00247 <span class="preprocessor">    #define __TBB_TRY</span>
-<a name="l00248"></a>00248 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() )</span>
-<a name="l00249"></a>00249 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_THROW(e) ((void)0)</span>
-<a name="l00250"></a>00250 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_RETHROW() ((void)0)</span>
-<a name="l00251"></a>00251 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
+<a name="l00200"></a>00200 
+<a name="l00204"></a>00204 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">int</span> __TBB_EXPORTED_FUNC <a class="code" href="a00383.html#a6858b22e90041c9c4669674ff39b056">TBB_runtime_interface_version</a>();
+<a name="l00205"></a>00205 
+<a name="l00207"></a>00207 
+<a name="l00211"></a><a class="code" href="a00309.html">00211</a> <span class="keyword">class </span><a class="code" href="a00309.html">split</a> {
+<a name="l00212"></a>00212 };
+<a name="l00213"></a>00213 
+<a name="l00218"></a>00218 <span class="keyword">namespace </span>internal {
+<a name="l00219"></a>00219 
+<a name="l00221"></a>00221 
+<a name="l00224"></a>00224 <span class="keyword">const</span> size_t NFS_MaxLineSize = 128;
+<a name="l00225"></a>00225 
+<a name="l00245"></a>00245 <span class="preprocessor">#define __TBB_atomic // intentionally empty, see above</span>
+<a name="l00246"></a>00246 <span class="preprocessor"></span>
+<a name="l00247"></a>00247 <span class="keyword">template</span><<span class="keyword">class</span> T, <span class="keywordtype">int</span> S>
+<a name="l00248"></a>00248 <span class="keyword">struct </span>padded_base : T {
+<a name="l00249"></a>00249     <span class="keywordtype">char</span> pad[NFS_MaxLineSize - <span class="keyword">sizeof</span>(T) % NFS_MaxLineSize];
+<a name="l00250"></a>00250 };
+<a name="l00251"></a>00251 <span class="keyword">template</span><<span class="keyword">class</span> T> <span class="keyword">struct </span>padded_base<T, 0> : T {};
 <a name="l00252"></a>00252 
-<a name="l00254"></a>00254 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC runtime_warning( <span class="keyword">const</span> <span class="keywordtype">char</span>* format, ... );
-<a name="l00255"></a>00255 
-<a name="l00256"></a>00256 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00257"></a>00257 <span class="preprocessor"></span><span class="keyword">static</span> <span class="keywordtype">void</span>* <span class="keyword">const</span> poisoned_ptr = reinterpret_cast<void*>(-1);
+<a name="l00254"></a>00254 <span class="keyword">template</span><<span class="keyword">class</span> T>
+<a name="l00255"></a>00255 <span class="keyword">struct </span>padded : padded_base<T, sizeof(T)> {};
+<a name="l00256"></a>00256 
 <a name="l00258"></a>00258 
-<a name="l00260"></a>00260 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00261"></a>00261 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T*& p ) { p = reinterpret_cast<T*>(poisoned_ptr); }
-<a name="l00262"></a>00262 
-<a name="l00264"></a>00264 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00265"></a>00265 <span class="keyword">inline</span> <span class="keywordtype">bool</span> is_poisoned( T* p ) { <span class="keywordflow">return</span> p == reinterpret_cast<T*>(poisoned_ptr); }
-<a name="l00266"></a>00266 <span class="preprocessor">#else</span>
-<a name="l00267"></a>00267 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00268"></a>00268 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* ) {<span class="comment">/*do nothing*/</span>}
-<a name="l00269"></a>00269 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_ASSERT */</span>
-<a name="l00270"></a>00270 
-<a name="l00272"></a>00272 
-<a name="l00274"></a>00274 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U> 
-<a name="l00275"></a>00275 <span class="keyword">inline</span> T punned_cast( U* ptr ) {
-<a name="l00276"></a>00276     uintptr_t x = reinterpret_cast<uintptr_t>(ptr);
-<a name="l00277"></a>00277     <span class="keywordflow">return</span> reinterpret_cast<T>(x);
-<a name="l00278"></a>00278 }
-<a name="l00279"></a>00279 
-<a name="l00281"></a>00281 <span class="keyword">class </span>no_assign {
-<a name="l00282"></a>00282     <span class="comment">// Deny assignment</span>
-<a name="l00283"></a>00283     <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> no_assign& );
-<a name="l00284"></a>00284 <span class="keyword">public</span>:
-<a name="l00285"></a>00285 <span class="preprocessor">#if __GNUC__</span>
-<a name="l00287"></a>00287 <span class="preprocessor">    no_assign() {}</span>
-<a name="l00288"></a>00288 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
-<a name="l00289"></a>00289 };
-<a name="l00290"></a>00290 
-<a name="l00292"></a>00292 <span class="keyword">class </span>no_copy: no_assign {
-<a name="l00294"></a>00294     no_copy( <span class="keyword">const</span> no_copy& );
-<a name="l00295"></a>00295 <span class="keyword">public</span>:
-<a name="l00297"></a>00297     no_copy() {}
-<a name="l00298"></a>00298 };
-<a name="l00299"></a>00299 
-<a name="l00301"></a>00301 <span class="keyword">template</span><<span class="keyword">typename</span> T>
-<a name="l00302"></a>00302 <span class="keyword">struct </span>allocator_type {
-<a name="l00303"></a>00303     <span class="keyword">typedef</span> T value_type;
-<a name="l00304"></a>00304 };
-<a name="l00305"></a>00305 
-<a name="l00306"></a>00306 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00308"></a>00308 <span class="preprocessor">template<typename T></span>
-<a name="l00309"></a>00309 <span class="preprocessor"></span><span class="keyword">struct </span>allocator_type<const T> {
-<a name="l00310"></a>00310     <span class="keyword">typedef</span> T value_type;
-<a name="l00311"></a>00311 };
-<a name="l00312"></a>00312 <span class="preprocessor">#endif</span>
-<a name="l00313"></a>00313 <span class="preprocessor"></span>
-<a name="l00314"></a>00314 <span class="comment">// Struct to be used as a version tag for inline functions.</span>
-<a name="l00317"></a>00317 <span class="comment"></span><span class="keyword">struct </span>version_tag_v3 {};
-<a name="l00318"></a>00318 
-<a name="l00319"></a>00319 <span class="keyword">typedef</span> version_tag_v3 version_tag;
+<a name="l00260"></a>00260 <span class="preprocessor">#define __TBB_offsetof(class_name, member_name) \</span>
+<a name="l00261"></a>00261 <span class="preprocessor">    ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)</span>
+<a name="l00262"></a>00262 <span class="preprocessor"></span>
+<a name="l00264"></a>00264 <span class="preprocessor">#define __TBB_get_object_ref(class_name, member_name, member_addr) \</span>
+<a name="l00265"></a>00265 <span class="preprocessor">    (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name)))</span>
+<a name="l00266"></a>00266 <span class="preprocessor"></span>
+<a name="l00268"></a>00268 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC handle_perror( <span class="keywordtype">int</span> error_code, <span class="keyword">const</span> <span class="keywordtype">char</span>* aux_info );
+<a name="l00269"></a>00269 
+<a name="l00270"></a>00270 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
+<a name="l00271"></a>00271 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_TRY try</span>
+<a name="l00272"></a>00272 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_CATCH(e) catch(e)</span>
+<a name="l00273"></a>00273 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_THROW(e) throw e</span>
+<a name="l00274"></a>00274 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_RETHROW() throw</span>
+<a name="l00275"></a>00275 <span class="preprocessor"></span><span class="preprocessor">#else </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
+<a name="l00276"></a>00276     <span class="keyword">inline</span> <span class="keywordtype">bool</span> __TBB_false() { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
+<a name="l00277"></a>00277 <span class="preprocessor">    #define __TBB_TRY</span>
+<a name="l00278"></a>00278 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() )</span>
+<a name="l00279"></a>00279 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_THROW(e) ((void)0)</span>
+<a name="l00280"></a>00280 <span class="preprocessor"></span><span class="preprocessor">    #define __TBB_RETHROW() ((void)0)</span>
+<a name="l00281"></a>00281 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_EXCEPTIONS */</span>
+<a name="l00282"></a>00282 
+<a name="l00284"></a>00284 <span class="keywordtype">void</span> __TBB_EXPORTED_FUNC runtime_warning( <span class="keyword">const</span> <span class="keywordtype">char</span>* format, ... );
+<a name="l00285"></a>00285 
+<a name="l00286"></a>00286 <span class="preprocessor">#if TBB_USE_ASSERT</span>
+<a name="l00287"></a>00287 <span class="preprocessor"></span><span class="keyword">static</span> <span class="keywordtype">void</span>* <span class="keyword">const</span> poisoned_ptr = reinterpret_cast<void*>(-1);
+<a name="l00288"></a>00288 
+<a name="l00290"></a>00290 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00291"></a>00291 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T*& p ) { p = reinterpret_cast<T*>(poisoned_ptr); }
+<a name="l00292"></a>00292 
+<a name="l00294"></a>00294 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00295"></a>00295 <span class="keyword">inline</span> <span class="keywordtype">bool</span> is_poisoned( T* p ) { <span class="keywordflow">return</span> p == reinterpret_cast<T*>(poisoned_ptr); }
+<a name="l00296"></a>00296 <span class="preprocessor">#else</span>
+<a name="l00297"></a>00297 <span class="preprocessor"></span><span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00298"></a>00298 <span class="keyword">inline</span> <span class="keywordtype">void</span> poison_pointer( T* ) {<span class="comment">/*do nothing*/</span>}
+<a name="l00299"></a>00299 <span class="preprocessor">#endif </span><span class="comment">/* !TBB_USE_ASSERT */</span>
+<a name="l00300"></a>00300 
+<a name="l00302"></a>00302 
+<a name="l00304"></a>00304 <span class="keyword">template</span><<span class="keyword">typename</span> T, <span class="keyword">typename</span> U> 
+<a name="l00305"></a>00305 <span class="keyword">inline</span> T punned_cast( U* ptr ) {
+<a name="l00306"></a>00306     uintptr_t x = reinterpret_cast<uintptr_t>(ptr);
+<a name="l00307"></a>00307     <span class="keywordflow">return</span> reinterpret_cast<T>(x);
+<a name="l00308"></a>00308 }
+<a name="l00309"></a>00309 
+<a name="l00311"></a>00311 <span class="keyword">class </span>no_assign {
+<a name="l00312"></a>00312     <span class="comment">// Deny assignment</span>
+<a name="l00313"></a>00313     <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> no_assign& );
+<a name="l00314"></a>00314 <span class="keyword">public</span>:
+<a name="l00315"></a>00315 <span class="preprocessor">#if __GNUC__</span>
+<a name="l00317"></a>00317 <span class="preprocessor">    no_assign() {}</span>
+<a name="l00318"></a>00318 <span class="preprocessor"></span><span class="preprocessor">#endif </span><span class="comment">/* __GNUC__ */</span>
+<a name="l00319"></a>00319 };
 <a name="l00320"></a>00320 
-<a name="l00321"></a>00321 } <span class="comment">// internal</span>
-<a name="l00323"></a>00323 <span class="comment"></span>
-<a name="l00324"></a>00324 } <span class="comment">// tbb</span>
-<a name="l00325"></a>00325 
-<a name="l00326"></a>00326 <span class="preprocessor">#endif </span><span class="comment">/* RC_INVOKED */</span>
-<a name="l00327"></a>00327 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_stddef_H */</span>
+<a name="l00322"></a>00322 <span class="keyword">class </span>no_copy: no_assign {
+<a name="l00324"></a>00324     no_copy( <span class="keyword">const</span> no_copy& );
+<a name="l00325"></a>00325 <span class="keyword">public</span>:
+<a name="l00327"></a>00327     no_copy() {}
+<a name="l00328"></a>00328 };
+<a name="l00329"></a>00329 
+<a name="l00331"></a>00331 <span class="keyword">template</span><<span class="keyword">typename</span> T>
+<a name="l00332"></a>00332 <span class="keyword">struct </span>allocator_type {
+<a name="l00333"></a>00333     <span class="keyword">typedef</span> T value_type;
+<a name="l00334"></a>00334 };
+<a name="l00335"></a>00335 
+<a name="l00336"></a>00336 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00338"></a>00338 <span class="preprocessor">template<typename T></span>
+<a name="l00339"></a>00339 <span class="preprocessor"></span><span class="keyword">struct </span>allocator_type<const T> {
+<a name="l00340"></a>00340     <span class="keyword">typedef</span> T value_type;
+<a name="l00341"></a>00341 };
+<a name="l00342"></a>00342 <span class="preprocessor">#endif</span>
+<a name="l00343"></a>00343 <span class="preprocessor"></span>
+<a name="l00344"></a>00344 <span class="comment">// Struct to be used as a version tag for inline functions.</span>
+<a name="l00347"></a>00347 <span class="comment"></span><span class="keyword">struct </span>version_tag_v3 {};
+<a name="l00348"></a>00348 
+<a name="l00349"></a>00349 <span class="keyword">typedef</span> version_tag_v3 version_tag;
+<a name="l00350"></a>00350 
+<a name="l00351"></a>00351 } <span class="comment">// internal</span>
+<a name="l00353"></a>00353 <span class="comment"></span>
+<a name="l00354"></a>00354 } <span class="comment">// tbb</span>
+<a name="l00355"></a>00355 
+<a name="l00356"></a>00356 <span class="preprocessor">#endif </span><span class="comment">/* RC_INVOKED */</span>
+<a name="l00357"></a>00357 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tbb_stddef_H */</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00606.html b/doc/html/a00608.html
similarity index 99%
rename from doc/html/a00606.html
rename to doc/html/a00608.html
index 88571ef..48bded1 100644
--- a/doc/html/a00606.html
+++ b/doc/html/a00608.html
@@ -75,7 +75,7 @@
 <a name="l00055"></a>00055 
 <a name="l00056"></a>00056 } <span class="comment">// namespace internal</span>
 <a name="l00057"></a>00057 
-<a name="l00058"></a>00058 <span class="keywordtype">void</span> swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 ); 
+<a name="l00058"></a>00058 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 ); 
 <a name="l00059"></a>00059 
 <a name="l00060"></a>00060 <span class="keyword">namespace </span>internal {
 <a name="l00061"></a>00061 
diff --git a/doc/html/a00614.html b/doc/html/a00614.html
deleted file mode 100644
index c83d1a6..0000000
--- a/doc/html/a00614.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tbbmalloc_proxy.h Source File</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-<link href="tabs.css" rel="stylesheet" type="text/css">
-</head><body>
-<!-- Generated by Doxygen 1.4.7 -->
-<div class="tabs">
-  <ul>
-    <li><a href="index.html"><span>Main Page</span></a></li>
-    <li><a href="modules.html"><span>Modules</span></a></li>
-    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
-    <li><a href="annotated.html"><span>Classes</span></a></li>
-    <li id="current"><a href="files.html"><span>Files</span></a></li>
-    <li><a href="pages.html"><span>Related Pages</span></a></li>
-  </ul></div>
-<div class="tabs">
-  <ul>
-    <li><a href="files.html"><span>File List</span></a></li>
-    <li><a href="globals.html"><span>File Members</span></a></li>
-  </ul></div>
-<h1>tbbmalloc_proxy.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
-<a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
-<a name="l00003"></a>00003 <span class="comment"></span>
-<a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
-<a name="l00005"></a>00005 <span class="comment">    to the source code ("Material") are owned by Intel Corporation or its</span>
-<a name="l00006"></a>00006 <span class="comment">    suppliers or licensors.  Title to the Material remains with Intel</span>
-<a name="l00007"></a>00007 <span class="comment">    Corporation or its suppliers and licensors.  The Material is protected</span>
-<a name="l00008"></a>00008 <span class="comment">    by worldwide copyright laws and treaty provisions.  No part of the</span>
-<a name="l00009"></a>00009 <span class="comment">    Material may be used, copied, reproduced, modified, published, uploaded,</span>
-<a name="l00010"></a>00010 <span class="comment">    posted, transmitted, distributed, or disclosed in any way without</span>
-<a name="l00011"></a>00011 <span class="comment">    Intel's prior express written permission.</span>
-<a name="l00012"></a>00012 <span class="comment"></span>
-<a name="l00013"></a>00013 <span class="comment">    No license under any patent, copyright, trade secret or other</span>
-<a name="l00014"></a>00014 <span class="comment">    intellectual property right is granted to or conferred upon you by</span>
-<a name="l00015"></a>00015 <span class="comment">    disclosure or delivery of the Materials, either expressly, by</span>
-<a name="l00016"></a>00016 <span class="comment">    implication, inducement, estoppel or otherwise.  Any license under such</span>
-<a name="l00017"></a>00017 <span class="comment">    intellectual property rights must be express and approved by Intel in</span>
-<a name="l00018"></a>00018 <span class="comment">    writing.</span>
-<a name="l00019"></a>00019 <span class="comment">*/</span>
-<a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="comment">/*</span>
-<a name="l00022"></a>00022 <span class="comment">Replacing the standard memory allocation routines in Microsoft* C/C++ RTL </span>
-<a name="l00023"></a>00023 <span class="comment">(malloc/free, global new/delete, etc.) with the TBB memory allocator. </span>
-<a name="l00024"></a>00024 <span class="comment"></span>
-<a name="l00025"></a>00025 <span class="comment">Include the following header to a source of any binary which is loaded during </span>
-<a name="l00026"></a>00026 <span class="comment">application startup</span>
-<a name="l00027"></a>00027 <span class="comment"></span>
-<a name="l00028"></a>00028 <span class="comment">#include "tbb/tbbmalloc_proxy.h"</span>
-<a name="l00029"></a>00029 <span class="comment"></span>
-<a name="l00030"></a>00030 <span class="comment">or add following parameters to the linker options for the binary which is </span>
-<a name="l00031"></a>00031 <span class="comment">loaded during application startup. It can be either exe-file or dll.</span>
-<a name="l00032"></a>00032 <span class="comment"></span>
-<a name="l00033"></a>00033 <span class="comment">For win32</span>
-<a name="l00034"></a>00034 <span class="comment">tbbmalloc_proxy.lib /INCLUDE:"___TBB_malloc_proxy"</span>
-<a name="l00035"></a>00035 <span class="comment">win64</span>
-<a name="l00036"></a>00036 <span class="comment">tbbmalloc_proxy.lib /INCLUDE:"__TBB_malloc_proxy"</span>
-<a name="l00037"></a>00037 <span class="comment">*/</span>
-<a name="l00038"></a>00038 
-<a name="l00039"></a>00039 <span class="preprocessor">#ifndef __TBB_tbbmalloc_proxy_H</span>
-<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbbmalloc_proxy_H</span>
-<a name="l00041"></a>00041 <span class="preprocessor"></span>
-<a name="l00042"></a>00042 <span class="preprocessor">#if _MSC_VER</span>
-<a name="l00043"></a>00043 <span class="preprocessor"></span>
-<a name="l00044"></a>00044 <span class="preprocessor">#ifdef _DEBUG</span>
-<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">    #pragma comment(lib, "tbbmalloc_proxy_debug.lib")</span>
-<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor">    #pragma comment(lib, "tbbmalloc_proxy.lib")</span>
-<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00049"></a>00049 <span class="preprocessor"></span>
-<a name="l00050"></a>00050 <span class="preprocessor">#if defined(_WIN64)</span>
-<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">    #pragma comment(linker, "/include:__TBB_malloc_proxy")</span>
-<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#else</span>
-<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">    #pragma comment(linker, "/include:___TBB_malloc_proxy")</span>
-<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
-<a name="l00055"></a>00055 <span class="preprocessor"></span>
-<a name="l00056"></a>00056 <span class="preprocessor">#else</span>
-<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="comment">/* Primarily to support MinGW */</span>
-<a name="l00058"></a>00058 
-<a name="l00059"></a>00059 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">void</span> __TBB_malloc_proxy();
-<a name="l00060"></a>00060 <span class="keyword">struct </span>__TBB_malloc_proxy_caller {
-<a name="l00061"></a>00061     __TBB_malloc_proxy_caller() { __TBB_malloc_proxy(); }
-<a name="l00062"></a>00062 } <span class="keyword">volatile</span> __TBB_malloc_proxy_helper_object;
-<a name="l00063"></a>00063 
-<a name="l00064"></a>00064 <span class="preprocessor">#endif // _MSC_VER</span>
-<a name="l00065"></a>00065 <span class="preprocessor"></span>
-<a name="l00066"></a>00066 <span class="preprocessor">#endif //__TBB_tbbmalloc_proxy_H</span>
-</pre></div><hr>
-<p></p>
-Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
-<p></p>
-* Other names and brands may be claimed as the property of others.
diff --git a/doc/html/a00616.html b/doc/html/a00616.html
index e01fd80..c83d1a6 100644
--- a/doc/html/a00616.html
+++ b/doc/html/a00616.html
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
-<title>tick_count.h Source File</title>
+<title>tbbmalloc_proxy.h Source File</title>
 <link href="doxygen.css" rel="stylesheet" type="text/css">
 <link href="tabs.css" rel="stylesheet" type="text/css">
 </head><body>
@@ -19,7 +19,7 @@
     <li><a href="files.html"><span>File List</span></a></li>
     <li><a href="globals.html"><span>File Members</span></a></li>
   </ul></div>
-<h1>tick_count.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
+<h1>tbbmalloc_proxy.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
 <a name="l00002"></a>00002 <span class="comment">    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.</span>
 <a name="l00003"></a>00003 <span class="comment"></span>
 <a name="l00004"></a>00004 <span class="comment">    The source code contained or described herein and all documents related</span>
@@ -39,120 +39,52 @@
 <a name="l00018"></a>00018 <span class="comment">    writing.</span>
 <a name="l00019"></a>00019 <span class="comment">*/</span>
 <a name="l00020"></a>00020 
-<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_tick_count_H</span>
-<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tick_count_H</span>
-<a name="l00023"></a>00023 <span class="preprocessor"></span>
-<a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
-<a name="l00025"></a>00025 
-<a name="l00026"></a>00026 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00027"></a>00027 <span class="preprocessor"></span><span class="preprocessor">#include "machine/windows_api.h"</span>
-<a name="l00028"></a>00028 <span class="preprocessor">#elif __linux__</span>
-<a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#include <ctime></span>
-<a name="l00030"></a>00030 <span class="preprocessor">#else </span><span class="comment">/* generic Unix */</span>
-<a name="l00031"></a>00031 <span class="preprocessor">#include <sys/time.h></span>
-<a name="l00032"></a>00032 <span class="preprocessor">#endif </span><span class="comment">/* (choice of OS) */</span>
-<a name="l00033"></a>00033 
-<a name="l00034"></a>00034 <span class="keyword">namespace </span>tbb {
-<a name="l00035"></a>00035 
-<a name="l00037"></a>00037 
-<a name="l00038"></a><a class="code" href="a00302.html">00038</a> <span class="keyword">class </span><a class="code" href="a00302.html">tick_count</a> {
-<a name="l00039"></a>00039 <span class="keyword">public</span>:
-<a name="l00041"></a><a class="code" href="a00303.html">00041</a>     <span class="keyword">class </span><a class="code" href="a00303.html">interval_t</a> {
-<a name="l00042"></a>00042         <span class="keywordtype">long</span> <span class="keywordtype">long</span> value;
-<a name="l00043"></a>00043         <span class="keyword">explicit</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>( <span class="keywordtype">long</span> <span class="keywordtype">long</span> value_ ) : value(value_) {}
-<a name="l00044"></a>00044     <span class="keyword">public</span>:
-<a name="l00046"></a><a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">00046</a>         <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>() : value(0) {};
-<a name="l00047"></a>00047 
-<a name="l00049"></a>00049         <span class="keyword">explicit</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>( <span class="keywordtype">double</span> sec );
-<a name="l00050"></a>00050 
-<a name="l00052"></a>00052         <span class="keywordtype">double</span> <a class="code" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() <span class="keyword">const</span>;
-<a name="l00053"></a>00053 
-<a name="l00054"></a>00054         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00302.html">tbb::tick_count</a>;
-<a name="l00055"></a>00055 
-<a name="l00057"></a>00057         <span class="keyword">friend</span> <a class="code" href="a00303.html">interval_t</a> <a class="code" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t0 );
+<a name="l00021"></a>00021 <span class="comment">/*</span>
+<a name="l00022"></a>00022 <span class="comment">Replacing the standard memory allocation routines in Microsoft* C/C++ RTL </span>
+<a name="l00023"></a>00023 <span class="comment">(malloc/free, global new/delete, etc.) with the TBB memory allocator. </span>
+<a name="l00024"></a>00024 <span class="comment"></span>
+<a name="l00025"></a>00025 <span class="comment">Include the following header to a source of any binary which is loaded during </span>
+<a name="l00026"></a>00026 <span class="comment">application startup</span>
+<a name="l00027"></a>00027 <span class="comment"></span>
+<a name="l00028"></a>00028 <span class="comment">#include "tbb/tbbmalloc_proxy.h"</span>
+<a name="l00029"></a>00029 <span class="comment"></span>
+<a name="l00030"></a>00030 <span class="comment">or add following parameters to the linker options for the binary which is </span>
+<a name="l00031"></a>00031 <span class="comment">loaded during application startup. It can be either exe-file or dll.</span>
+<a name="l00032"></a>00032 <span class="comment"></span>
+<a name="l00033"></a>00033 <span class="comment">For win32</span>
+<a name="l00034"></a>00034 <span class="comment">tbbmalloc_proxy.lib /INCLUDE:"___TBB_malloc_proxy"</span>
+<a name="l00035"></a>00035 <span class="comment">win64</span>
+<a name="l00036"></a>00036 <span class="comment">tbbmalloc_proxy.lib /INCLUDE:"__TBB_malloc_proxy"</span>
+<a name="l00037"></a>00037 <span class="comment">*/</span>
+<a name="l00038"></a>00038 
+<a name="l00039"></a>00039 <span class="preprocessor">#ifndef __TBB_tbbmalloc_proxy_H</span>
+<a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_tbbmalloc_proxy_H</span>
+<a name="l00041"></a>00041 <span class="preprocessor"></span>
+<a name="l00042"></a>00042 <span class="preprocessor">#if _MSC_VER</span>
+<a name="l00043"></a>00043 <span class="preprocessor"></span>
+<a name="l00044"></a>00044 <span class="preprocessor">#ifdef _DEBUG</span>
+<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">    #pragma comment(lib, "tbbmalloc_proxy_debug.lib")</span>
+<a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00047"></a>00047 <span class="preprocessor"></span><span class="preprocessor">    #pragma comment(lib, "tbbmalloc_proxy.lib")</span>
+<a name="l00048"></a>00048 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00049"></a>00049 <span class="preprocessor"></span>
+<a name="l00050"></a>00050 <span class="preprocessor">#if defined(_WIN64)</span>
+<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">    #pragma comment(linker, "/include:__TBB_malloc_proxy")</span>
+<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">    #pragma comment(linker, "/include:___TBB_malloc_proxy")</span>
+<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+<a name="l00055"></a>00055 <span class="preprocessor"></span>
+<a name="l00056"></a>00056 <span class="preprocessor">#else</span>
+<a name="l00057"></a>00057 <span class="preprocessor"></span><span class="comment">/* Primarily to support MinGW */</span>
 <a name="l00058"></a>00058 
-<a name="l00060"></a><a class="code" href="a00303.html#5871ead1ca230efbe52a5008470e6428">00060</a>         <span class="keyword">friend</span> <a class="code" href="a00303.html">interval_t</a> <a class="code" href="a00303.html#5871ead1ca230efbe52a5008470e6428">operator+</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& j ) {
-<a name="l00061"></a>00061             <span class="keywordflow">return</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>+j.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
-<a name="l00062"></a>00062         }
+<a name="l00059"></a>00059 <span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">void</span> __TBB_malloc_proxy();
+<a name="l00060"></a>00060 <span class="keyword">struct </span>__TBB_malloc_proxy_caller {
+<a name="l00061"></a>00061     __TBB_malloc_proxy_caller() { __TBB_malloc_proxy(); }
+<a name="l00062"></a>00062 } <span class="keyword">volatile</span> __TBB_malloc_proxy_helper_object;
 <a name="l00063"></a>00063 
-<a name="l00065"></a><a class="code" href="a00303.html#fa509691e1d689830931e36edd274f76">00065</a>         <span class="keyword">friend</span> <a class="code" href="a00303.html">interval_t</a> <a class="code" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& j ) {
-<a name="l00066"></a>00066             <span class="keywordflow">return</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>-j.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
-<a name="l00067"></a>00067         }
-<a name="l00068"></a>00068 
-<a name="l00070"></a><a class="code" href="a00303.html#cd9814947902e26463a69a111530f81b">00070</a>         <a class="code" href="a00303.html">interval_t</a>& <a class="code" href="a00303.html#cd9814947902e26463a69a111530f81b">operator+=</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i ) {value += i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>; <span class="keywordflow">return</span> *<span class="keyword [...]
-<a name="l00071"></a>00071 
-<a name="l00073"></a><a class="code" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">00073</a>         <a class="code" href="a00303.html">interval_t</a>& <a class="code" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i ) {value -= i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>; <span class="keywordflow">return</span> *<span class="keyword [...]
-<a name="l00074"></a>00074     };
-<a name="l00075"></a>00075     
-<a name="l00077"></a><a class="code" href="a00302.html#34593326ae4191e02a13c7cbdab9de4c">00077</a>     <a class="code" href="a00302.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>() : my_count(0) {};
-<a name="l00078"></a>00078 
-<a name="l00080"></a>00080     <span class="keyword">static</span> <a class="code" href="a00302.html">tick_count</a> <a class="code" href="a00302.html#fb7f78ca61cf28398645ace66e284473">now</a>();
-<a name="l00081"></a>00081     
-<a name="l00083"></a>00083     <span class="keyword">friend</span> interval_t <a class="code" href="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t0 );
-<a name="l00084"></a>00084 
-<a name="l00085"></a>00085 <span class="keyword">private</span>:
-<a name="l00086"></a>00086     <span class="keywordtype">long</span> <span class="keywordtype">long</span> my_count;
-<a name="l00087"></a>00087 };
-<a name="l00088"></a>00088 
-<a name="l00089"></a><a class="code" href="a00302.html#fb7f78ca61cf28398645ace66e284473">00089</a> <span class="keyword">inline</span> <a class="code" href="a00302.html">tick_count</a> <a class="code" href="a00302.html#fb7f78ca61cf28398645ace66e284473">tick_count::now</a>() {
-<a name="l00090"></a>00090     <a class="code" href="a00302.html">tick_count</a> result;
-<a name="l00091"></a>00091 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00092"></a>00092 <span class="preprocessor"></span>    LARGE_INTEGER qpcnt;
-<a name="l00093"></a>00093     QueryPerformanceCounter(&qpcnt);
-<a name="l00094"></a>00094     result.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = qpcnt.QuadPart;
-<a name="l00095"></a>00095 <span class="preprocessor">#elif __linux__</span>
-<a name="l00096"></a>00096 <span class="preprocessor"></span>    <span class="keyword">struct </span>timespec ts;
-<a name="l00097"></a>00097 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00098"></a>00098 <span class="preprocessor"></span>    <span class="keywordtype">int</span> status = 
-<a name="l00099"></a>00099 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00100"></a>00100         clock_gettime( CLOCK_REALTIME, &ts );
-<a name="l00101"></a>00101     __TBB_ASSERT( status==0, <span class="stringliteral">"CLOCK_REALTIME not supported"</span> );
-<a name="l00102"></a>00102     result.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = static_cast<long long>(1000000000UL)*static_cast<long long>(ts.tv_sec) + static_cast<long long>(ts.tv_nsec);
-<a name="l00103"></a>00103 <span class="preprocessor">#else </span><span class="comment">/* generic Unix */</span>
-<a name="l00104"></a>00104     <span class="keyword">struct </span>timeval tv;
-<a name="l00105"></a>00105 <span class="preprocessor">#if TBB_USE_ASSERT</span>
-<a name="l00106"></a>00106 <span class="preprocessor"></span>    <span class="keywordtype">int</span> status = 
-<a name="l00107"></a>00107 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
-<a name="l00108"></a>00108         gettimeofday(&tv, NULL);
-<a name="l00109"></a>00109     __TBB_ASSERT( status==0, <span class="stringliteral">"gettimeofday failed"</span> );
-<a name="l00110"></a>00110     result.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = static_cast<long long>(1000000)*static_cast<long long>(tv.tv_sec) + static_cast<long long>(tv.tv_usec);
-<a name="l00111"></a>00111 <span class="preprocessor">#endif </span><span class="comment">/*(choice of OS) */</span>
-<a name="l00112"></a>00112     <span class="keywordflow">return</span> result;
-<a name="l00113"></a>00113 }
-<a name="l00114"></a>00114 
-<a name="l00115"></a><a class="code" href="a00303.html#1a21a428e00cced2e6a49e0f5f2258bf">00115</a> <span class="keyword">inline</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">tick_count::interval_t::interval_t</a>( <span class="keywordtype">double</span> sec )
-<a name="l00116"></a>00116 {
-<a name="l00117"></a>00117 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00118"></a>00118 <span class="preprocessor"></span>    LARGE_INTEGER qpfreq;
-<a name="l00119"></a>00119     QueryPerformanceFrequency(&qpfreq);
-<a name="l00120"></a>00120     value = static_cast<long long>(sec*qpfreq.QuadPart);
-<a name="l00121"></a>00121 <span class="preprocessor">#elif __linux__</span>
-<a name="l00122"></a>00122 <span class="preprocessor"></span>    value = static_cast<long long>(sec*1E9);
-<a name="l00123"></a>00123 <span class="preprocessor">#else </span><span class="comment">/* generic Unix */</span>
-<a name="l00124"></a>00124     value = static_cast<long long>(sec*1E6);
-<a name="l00125"></a>00125 <span class="preprocessor">#endif </span><span class="comment">/* (choice of OS) */</span>
-<a name="l00126"></a>00126 }
-<a name="l00127"></a>00127 
-<a name="l00128"></a><a class="code" href="a00302.html#09dde78a4100800c11bb883d6204b586">00128</a> <span class="keyword">inline</span> <a class="code" href="a00303.html">tick_count::interval_t</a> <a class="code" href="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t0 ) {
-<a name="l00129"></a>00129     <span class="keywordflow">return</span> <a class="code" href="a00303.html">tick_count::interval_t</a>( t1.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a>-t0.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> );
-<a name="l00130"></a>00130 }
-<a name="l00131"></a>00131 
-<a name="l00132"></a><a class="code" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">00132</a> <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">tick_count::interval_t::seconds</a>()<span class="keyword"> const </span>{
-<a name="l00133"></a>00133 <span class="preprocessor">#if _WIN32||_WIN64</span>
-<a name="l00134"></a>00134 <span class="preprocessor"></span>    LARGE_INTEGER qpfreq;
-<a name="l00135"></a>00135     QueryPerformanceFrequency(&qpfreq);
-<a name="l00136"></a>00136     <span class="keywordflow">return</span> value/(double)qpfreq.QuadPart;
-<a name="l00137"></a>00137 #elif __linux__
-<a name="l00138"></a>00138     <span class="keywordflow">return</span> value*1E-9;
-<a name="l00139"></a>00139 #<span class="keywordflow">else</span> <span class="comment">/* generic Unix */</span>
-<a name="l00140"></a>00140     <span class="keywordflow">return</span> value*1E-6;
-<a name="l00141"></a>00141 #endif <span class="comment">/* (choice of OS) */</span>
-<a name="l00142"></a>00142 }
-<a name="l00143"></a>00143 
-<a name="l00144"></a>00144 } <span class="comment">// namespace tbb</span>
-<a name="l00145"></a>00145 
-<a name="l00146"></a>00146 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_tick_count_H */</span>
-<a name="l00147"></a>00147 
+<a name="l00064"></a>00064 <span class="preprocessor">#endif // _MSC_VER</span>
+<a name="l00065"></a>00065 <span class="preprocessor"></span>
+<a name="l00066"></a>00066 <span class="preprocessor">#endif //__TBB_tbbmalloc_proxy_H</span>
 </pre></div><hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/a00616.html b/doc/html/a00618.html
similarity index 76%
copy from doc/html/a00616.html
copy to doc/html/a00618.html
index e01fd80..6dbf540 100644
--- a/doc/html/a00616.html
+++ b/doc/html/a00618.html
@@ -55,51 +55,51 @@
 <a name="l00034"></a>00034 <span class="keyword">namespace </span>tbb {
 <a name="l00035"></a>00035 
 <a name="l00037"></a>00037 
-<a name="l00038"></a><a class="code" href="a00302.html">00038</a> <span class="keyword">class </span><a class="code" href="a00302.html">tick_count</a> {
+<a name="l00038"></a><a class="code" href="a00323.html">00038</a> <span class="keyword">class </span><a class="code" href="a00323.html">tick_count</a> {
 <a name="l00039"></a>00039 <span class="keyword">public</span>:
-<a name="l00041"></a><a class="code" href="a00303.html">00041</a>     <span class="keyword">class </span><a class="code" href="a00303.html">interval_t</a> {
+<a name="l00041"></a><a class="code" href="a00324.html">00041</a>     <span class="keyword">class </span><a class="code" href="a00324.html">interval_t</a> {
 <a name="l00042"></a>00042         <span class="keywordtype">long</span> <span class="keywordtype">long</span> value;
-<a name="l00043"></a>00043         <span class="keyword">explicit</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>( <span class="keywordtype">long</span> <span class="keywordtype">long</span> value_ ) : value(value_) {}
+<a name="l00043"></a>00043         <span class="keyword">explicit</span> <a class="code" href="a00324.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>( <span class="keywordtype">long</span> <span class="keywordtype">long</span> value_ ) : value(value_) {}
 <a name="l00044"></a>00044     <span class="keyword">public</span>:
-<a name="l00046"></a><a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">00046</a>         <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>() : value(0) {};
+<a name="l00046"></a><a class="code" href="a00324.html#75a9a0949f8a8a84d6758835f1b48dad">00046</a>         <a class="code" href="a00324.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>() : value(0) {};
 <a name="l00047"></a>00047 
-<a name="l00049"></a>00049         <span class="keyword">explicit</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>( <span class="keywordtype">double</span> sec );
+<a name="l00049"></a>00049         <span class="keyword">explicit</span> <a class="code" href="a00324.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>( <span class="keywordtype">double</span> sec );
 <a name="l00050"></a>00050 
-<a name="l00052"></a>00052         <span class="keywordtype">double</span> <a class="code" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() <span class="keyword">const</span>;
+<a name="l00052"></a>00052         <span class="keywordtype">double</span> <a class="code" href="a00324.html#d5d8429c0bc59cf6131b2abc7929fa59">seconds</a>() <span class="keyword">const</span>;
 <a name="l00053"></a>00053 
-<a name="l00054"></a>00054         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00302.html">tbb::tick_count</a>;
+<a name="l00054"></a>00054         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00323.html">tbb::tick_count</a>;
 <a name="l00055"></a>00055 
-<a name="l00057"></a>00057         <span class="keyword">friend</span> <a class="code" href="a00303.html">interval_t</a> <a class="code" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t0 );
+<a name="l00057"></a>00057         <span class="keyword">friend</span> <a class="code" href="a00324.html">interval_t</a> <a class="code" href="a00324.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00323.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00323.html">tick_count</a>& t0 );
 <a name="l00058"></a>00058 
-<a name="l00060"></a><a class="code" href="a00303.html#5871ead1ca230efbe52a5008470e6428">00060</a>         <span class="keyword">friend</span> <a class="code" href="a00303.html">interval_t</a> <a class="code" href="a00303.html#5871ead1ca230efbe52a5008470e6428">operator+</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& j ) {
-<a name="l00061"></a>00061             <span class="keywordflow">return</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>+j.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
+<a name="l00060"></a><a class="code" href="a00324.html#5871ead1ca230efbe52a5008470e6428">00060</a>         <span class="keyword">friend</span> <a class="code" href="a00324.html">interval_t</a> <a class="code" href="a00324.html#5871ead1ca230efbe52a5008470e6428">operator+</a>( <span class="keyword">const</span> <a class="code" href="a00324.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00324.html">interval_t</a>& j ) {
+<a name="l00061"></a>00061             <span class="keywordflow">return</span> <a class="code" href="a00324.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00324.html#beea71acda120af3e3e29f10e8cb5c10">value</a>+j.<a class="code" href="a00324.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
 <a name="l00062"></a>00062         }
 <a name="l00063"></a>00063 
-<a name="l00065"></a><a class="code" href="a00303.html#fa509691e1d689830931e36edd274f76">00065</a>         <span class="keyword">friend</span> <a class="code" href="a00303.html">interval_t</a> <a class="code" href="a00303.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& j ) {
-<a name="l00066"></a>00066             <span class="keywordflow">return</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>-j.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
+<a name="l00065"></a><a class="code" href="a00324.html#fa509691e1d689830931e36edd274f76">00065</a>         <span class="keyword">friend</span> <a class="code" href="a00324.html">interval_t</a> <a class="code" href="a00324.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00324.html">interval_t</a>& i, <span class="keyword">const</span> <a class="code" href="a00324.html">interval_t</a>& j ) {
+<a name="l00066"></a>00066             <span class="keywordflow">return</span> <a class="code" href="a00324.html#75a9a0949f8a8a84d6758835f1b48dad">interval_t</a>(i.<a class="code" href="a00324.html#beea71acda120af3e3e29f10e8cb5c10">value</a>-j.<a class="code" href="a00324.html#beea71acda120af3e3e29f10e8cb5c10">value</a>);
 <a name="l00067"></a>00067         }
 <a name="l00068"></a>00068 
-<a name="l00070"></a><a class="code" href="a00303.html#cd9814947902e26463a69a111530f81b">00070</a>         <a class="code" href="a00303.html">interval_t</a>& <a class="code" href="a00303.html#cd9814947902e26463a69a111530f81b">operator+=</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i ) {value += i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>; <span class="keywordflow">return</span> *<span class="keyword [...]
+<a name="l00070"></a><a class="code" href="a00324.html#cd9814947902e26463a69a111530f81b">00070</a>         <a class="code" href="a00324.html">interval_t</a>& <a class="code" href="a00324.html#cd9814947902e26463a69a111530f81b">operator+=</a>( <span class="keyword">const</span> <a class="code" href="a00324.html">interval_t</a>& i ) {value += i.<a class="code" href="a00324.html#beea71acda120af3e3e29f10e8cb5c10">value</a>; <span class="keywordflow">return</span> *<span class="keyword [...]
 <a name="l00071"></a>00071 
-<a name="l00073"></a><a class="code" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">00073</a>         <a class="code" href="a00303.html">interval_t</a>& <a class="code" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>( <span class="keyword">const</span> <a class="code" href="a00303.html">interval_t</a>& i ) {value -= i.<a class="code" href="a00303.html#beea71acda120af3e3e29f10e8cb5c10">value</a>; <span class="keywordflow">return</span> *<span class="keyword [...]
+<a name="l00073"></a><a class="code" href="a00324.html#35ff7eaf7c2031b4a991402ac9ecb940">00073</a>         <a class="code" href="a00324.html">interval_t</a>& <a class="code" href="a00324.html#35ff7eaf7c2031b4a991402ac9ecb940">operator-=</a>( <span class="keyword">const</span> <a class="code" href="a00324.html">interval_t</a>& i ) {value -= i.<a class="code" href="a00324.html#beea71acda120af3e3e29f10e8cb5c10">value</a>; <span class="keywordflow">return</span> *<span class="keyword [...]
 <a name="l00074"></a>00074     };
 <a name="l00075"></a>00075     
-<a name="l00077"></a><a class="code" href="a00302.html#34593326ae4191e02a13c7cbdab9de4c">00077</a>     <a class="code" href="a00302.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>() : my_count(0) {};
+<a name="l00077"></a><a class="code" href="a00323.html#34593326ae4191e02a13c7cbdab9de4c">00077</a>     <a class="code" href="a00323.html#34593326ae4191e02a13c7cbdab9de4c">tick_count</a>() : my_count(0) {};
 <a name="l00078"></a>00078 
-<a name="l00080"></a>00080     <span class="keyword">static</span> <a class="code" href="a00302.html">tick_count</a> <a class="code" href="a00302.html#fb7f78ca61cf28398645ace66e284473">now</a>();
+<a name="l00080"></a>00080     <span class="keyword">static</span> <a class="code" href="a00323.html">tick_count</a> <a class="code" href="a00323.html#fb7f78ca61cf28398645ace66e284473">now</a>();
 <a name="l00081"></a>00081     
-<a name="l00083"></a>00083     <span class="keyword">friend</span> interval_t <a class="code" href="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t0 );
+<a name="l00083"></a>00083     <span class="keyword">friend</span> interval_t <a class="code" href="a00323.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00323.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00323.html">tick_count</a>& t0 );
 <a name="l00084"></a>00084 
 <a name="l00085"></a>00085 <span class="keyword">private</span>:
 <a name="l00086"></a>00086     <span class="keywordtype">long</span> <span class="keywordtype">long</span> my_count;
 <a name="l00087"></a>00087 };
 <a name="l00088"></a>00088 
-<a name="l00089"></a><a class="code" href="a00302.html#fb7f78ca61cf28398645ace66e284473">00089</a> <span class="keyword">inline</span> <a class="code" href="a00302.html">tick_count</a> <a class="code" href="a00302.html#fb7f78ca61cf28398645ace66e284473">tick_count::now</a>() {
-<a name="l00090"></a>00090     <a class="code" href="a00302.html">tick_count</a> result;
+<a name="l00089"></a><a class="code" href="a00323.html#fb7f78ca61cf28398645ace66e284473">00089</a> <span class="keyword">inline</span> <a class="code" href="a00323.html">tick_count</a> <a class="code" href="a00323.html#fb7f78ca61cf28398645ace66e284473">tick_count::now</a>() {
+<a name="l00090"></a>00090     <a class="code" href="a00323.html">tick_count</a> result;
 <a name="l00091"></a>00091 <span class="preprocessor">#if _WIN32||_WIN64</span>
 <a name="l00092"></a>00092 <span class="preprocessor"></span>    LARGE_INTEGER qpcnt;
 <a name="l00093"></a>00093     QueryPerformanceCounter(&qpcnt);
-<a name="l00094"></a>00094     result.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = qpcnt.QuadPart;
+<a name="l00094"></a>00094     result.<a class="code" href="a00323.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = qpcnt.QuadPart;
 <a name="l00095"></a>00095 <span class="preprocessor">#elif __linux__</span>
 <a name="l00096"></a>00096 <span class="preprocessor"></span>    <span class="keyword">struct </span>timespec ts;
 <a name="l00097"></a>00097 <span class="preprocessor">#if TBB_USE_ASSERT</span>
@@ -107,7 +107,7 @@
 <a name="l00099"></a>00099 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
 <a name="l00100"></a>00100         clock_gettime( CLOCK_REALTIME, &ts );
 <a name="l00101"></a>00101     __TBB_ASSERT( status==0, <span class="stringliteral">"CLOCK_REALTIME not supported"</span> );
-<a name="l00102"></a>00102     result.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = static_cast<long long>(1000000000UL)*static_cast<long long>(ts.tv_sec) + static_cast<long long>(ts.tv_nsec);
+<a name="l00102"></a>00102     result.<a class="code" href="a00323.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = static_cast<long long>(1000000000UL)*static_cast<long long>(ts.tv_sec) + static_cast<long long>(ts.tv_nsec);
 <a name="l00103"></a>00103 <span class="preprocessor">#else </span><span class="comment">/* generic Unix */</span>
 <a name="l00104"></a>00104     <span class="keyword">struct </span>timeval tv;
 <a name="l00105"></a>00105 <span class="preprocessor">#if TBB_USE_ASSERT</span>
@@ -115,12 +115,12 @@
 <a name="l00107"></a>00107 <span class="preprocessor">#endif </span><span class="comment">/* TBB_USE_ASSERT */</span>
 <a name="l00108"></a>00108         gettimeofday(&tv, NULL);
 <a name="l00109"></a>00109     __TBB_ASSERT( status==0, <span class="stringliteral">"gettimeofday failed"</span> );
-<a name="l00110"></a>00110     result.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = static_cast<long long>(1000000)*static_cast<long long>(tv.tv_sec) + static_cast<long long>(tv.tv_usec);
+<a name="l00110"></a>00110     result.<a class="code" href="a00323.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> = static_cast<long long>(1000000)*static_cast<long long>(tv.tv_sec) + static_cast<long long>(tv.tv_usec);
 <a name="l00111"></a>00111 <span class="preprocessor">#endif </span><span class="comment">/*(choice of OS) */</span>
 <a name="l00112"></a>00112     <span class="keywordflow">return</span> result;
 <a name="l00113"></a>00113 }
 <a name="l00114"></a>00114 
-<a name="l00115"></a><a class="code" href="a00303.html#1a21a428e00cced2e6a49e0f5f2258bf">00115</a> <span class="keyword">inline</span> <a class="code" href="a00303.html#75a9a0949f8a8a84d6758835f1b48dad">tick_count::interval_t::interval_t</a>( <span class="keywordtype">double</span> sec )
+<a name="l00115"></a><a class="code" href="a00324.html#1a21a428e00cced2e6a49e0f5f2258bf">00115</a> <span class="keyword">inline</span> <a class="code" href="a00324.html#75a9a0949f8a8a84d6758835f1b48dad">tick_count::interval_t::interval_t</a>( <span class="keywordtype">double</span> sec )
 <a name="l00116"></a>00116 {
 <a name="l00117"></a>00117 <span class="preprocessor">#if _WIN32||_WIN64</span>
 <a name="l00118"></a>00118 <span class="preprocessor"></span>    LARGE_INTEGER qpfreq;
@@ -133,11 +133,11 @@
 <a name="l00125"></a>00125 <span class="preprocessor">#endif </span><span class="comment">/* (choice of OS) */</span>
 <a name="l00126"></a>00126 }
 <a name="l00127"></a>00127 
-<a name="l00128"></a><a class="code" href="a00302.html#09dde78a4100800c11bb883d6204b586">00128</a> <span class="keyword">inline</span> <a class="code" href="a00303.html">tick_count::interval_t</a> <a class="code" href="a00302.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00302.html">tick_count</a>& t0 ) {
-<a name="l00129"></a>00129     <span class="keywordflow">return</span> <a class="code" href="a00303.html">tick_count::interval_t</a>( t1.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a>-t0.<a class="code" href="a00302.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> );
+<a name="l00128"></a><a class="code" href="a00323.html#09dde78a4100800c11bb883d6204b586">00128</a> <span class="keyword">inline</span> <a class="code" href="a00324.html">tick_count::interval_t</a> <a class="code" href="a00323.html#09dde78a4100800c11bb883d6204b586">operator-</a>( <span class="keyword">const</span> <a class="code" href="a00323.html">tick_count</a>& t1, <span class="keyword">const</span> <a class="code" href="a00323.html">tick_count</a>& t0 ) {
+<a name="l00129"></a>00129     <span class="keywordflow">return</span> <a class="code" href="a00324.html">tick_count::interval_t</a>( t1.<a class="code" href="a00323.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a>-t0.<a class="code" href="a00323.html#1ba05ad46dc08bc1bf34bd6cc94e36ec">my_count</a> );
 <a name="l00130"></a>00130 }
 <a name="l00131"></a>00131 
-<a name="l00132"></a><a class="code" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">00132</a> <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">tick_count::interval_t::seconds</a>()<span class="keyword"> const </span>{
+<a name="l00132"></a><a class="code" href="a00324.html#d5d8429c0bc59cf6131b2abc7929fa59">00132</a> <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="a00324.html#d5d8429c0bc59cf6131b2abc7929fa59">tick_count::interval_t::seconds</a>()<span class="keyword"> const </span>{
 <a name="l00133"></a>00133 <span class="preprocessor">#if _WIN32||_WIN64</span>
 <a name="l00134"></a>00134 <span class="preprocessor"></span>    LARGE_INTEGER qpfreq;
 <a name="l00135"></a>00135     QueryPerformanceFrequency(&qpfreq);
diff --git a/doc/html/annotated.html b/doc/html/annotated.html
index 8c497a2..0af9bd7 100644
--- a/doc/html/annotated.html
+++ b/doc/html/annotated.html
@@ -21,102 +21,109 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <h1>Class List</h1>Here are the classes, structs, unions and interfaces with brief descriptions:<table>
-  <tr><td class="indexkey"><a class="el" href="a00212.html">tbb::affinity_partitioner</a></td><td class="indexvalue">An affinity partitioner </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a></td><td class="indexvalue">Aggregated_operation base class </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a></td><td class="indexvalue">Aggregator base class </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00215.html">tbb::aligned_space< T, N ></a></td><td class="indexvalue">Block of space aligned sufficiently to construct an array T with N elements </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00216.html">tbb::atomic< T ></a></td><td class="indexvalue">Primary template for atomic </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00217.html">tbb::atomic< void * ></a></td><td class="indexvalue">Specialization for <a class="el" href="a00217.html">atomic<void*></a>, for sake of not allowing arithmetic or operator-> </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00218.html">tbb::internal::atomic_backoff</a></td><td class="indexvalue">Class that implements exponential backoff </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00219.html">tbb::auto_partitioner</a></td><td class="indexvalue">An auto partitioner </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00220.html">tbb::bad_last_alloc</a></td><td class="indexvalue">Exception for concurrent containers </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00221.html">tbb::blocked_range< Value ></a></td><td class="indexvalue">A range over which to iterate </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td class="indexvalue">A 2-dimensional range that models the Range concept </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td class="indexvalue">A 3-dimensional range that models the Range concept </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00224.html">tbb::broadcast_node< T ></a></td><td class="indexvalue">Forwards messages of type T to all successors </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00225.html">tbb::buffer_node< T ></a></td><td class="indexvalue">Forwards messages in arbitrary order </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00227.html">tbb::cache_aligned_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00228.html">tbb::captured_exception</a></td><td class="indexvalue">This class is used by TBB to propagate information about unhandled exceptions into the root thread </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00229.html">tbb::combinable< T ></a></td><td class="indexvalue">Thread-local storage with optional reduction </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe blocking concurrent bounded queue </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td class="indexvalue">Unordered map from Key to T </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00232.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td class="indexvalue">Allows write access to elements and combines data access, locking, and garbage collection </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00233.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td class="indexvalue">Bucket accessor is to find, rehash, acquire a lock, and access a bucket </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td class="indexvalue">Combines data access, locking, and garbage collection </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td class="indexvalue">Concurrent priority queue </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe non-blocking concurrent queue </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe blocking concurrent bounded queue </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a></td><td class="indexvalue">Concurrent vector container </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00239.html">tbb::continue_msg</a></td><td class="indexvalue">An empty class used for messages that mean "I'm done" </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00240.html">tbb::continue_node</a></td><td class="indexvalue">Broadcasts completion message when it receives completion messages from all predecessors. Then resets </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00241.html">tbb::continue_receiver</a></td><td class="indexvalue">Base class for receivers of completion messages </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00242.html">tbb::empty_task</a></td><td class="indexvalue">Task that does nothing. Useful for synchronization </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td class="indexvalue">The <a class="el" href="a00243.html">enumerable_thread_specific</a> container </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00244.html">tbb::executable_node< Output ></a></td><td class="indexvalue">Implements an executable node that supports <a class="el" href="a00239.html">continue_msg</a> -> Output </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00245.html">tbb::filter</a></td><td class="indexvalue">A stage in a pipeline </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a></td><td class="indexvalue">Class representing a chain of type-safe pipeline filters </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00247.html">tbb::final_scan_tag</a></td><td class="indexvalue">Used to indicate that the final scan is being performed </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00248.html">tbb::interface6::flow_control</a></td><td class="indexvalue">Input_filter control to signal end-of-input for parallel_pipeline </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a></td><td class="indexvalue">Implements a function node that supports Input -> Output </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00250.html">tbb::graph</a></td><td class="indexvalue">The graph class </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00251.html">tbb::graph_node</a></td><td class="indexvalue">The base of all graph nodes. Allows them to be stored in a collection for deletion </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00252.html">tbb::improper_lock</a></td><td class="indexvalue">Exception for PPL locks </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00253.html">tbb::invalid_multiple_scheduling</a></td><td class="indexvalue">Exception for repeated scheduling of the same task_handle </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a></td><td class="indexvalue">Join_node_base </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00255.html">tbb::limiter_node< T ></a></td><td class="indexvalue">Forwards messages only if the threshold has not been reached </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00256.html">tbb::missing_wait</a></td><td class="indexvalue">Exception for missing wait on structured_task_group </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a></td><td class="indexvalue">Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00258.html">tbb::mutex</a></td><td class="indexvalue">Wrapper around the platform's native reader-writer lock </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00260.html">tbb::null_mutex</a></td><td class="indexvalue">A mutex which does nothing </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a></td><td class="indexvalue">Represents acquisition of a mutex </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00262.html">tbb::null_rw_mutex</a></td><td class="indexvalue">A rw mutex which does nothing </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a></td><td class="indexvalue">Represents acquisition of a mutex </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00264.html">tbb::parallel_do_feeder< Item ></a></td><td class="indexvalue">Class the user supplied algorithm body uses to add new tasks </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00265.html">tbb::parallel_while< Body ></a></td><td class="indexvalue">Parallel iteration over a stream, with optional addition of more work </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00266.html">tbb::pipeline</a></td><td class="indexvalue">A processing pipeline that applies filters to items </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00267.html">tbb::pre_scan_tag</a></td><td class="indexvalue">Used to indicate that the initial scan is being performed </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a></td><td class="indexvalue">Forwards messages in priority order </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00269.html">tbb::queue_node< T ></a></td><td class="indexvalue">Forwards messages in FIFO order </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00270.html">tbb::queuing_mutex</a></td><td class="indexvalue">Queuing lock with local-only spinning </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a></td><td class="indexvalue">Reader-writer lock with local-only spinning </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a></td><td class="indexvalue">Writer-preference reader-writer lock with local-only spinning on readers </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td class="indexvalue">The scoped lock pattern for write locks </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td class="indexvalue">The scoped lock pattern for read locks </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00277.html">tbb::receiver< T ></a></td><td class="indexvalue">Pure virtual template class that defines a receiver of messages of type T </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00278.html">tbb::recursive_mutex</a></td><td class="indexvalue">Mutex that allows recursive mutex acquisition </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00281.html">tbb::scalable_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00282.html">tbb::sender< T ></a></td><td class="indexvalue">Pure virtual template class that defines a sender of messages of type T </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00283.html">tbb::sequencer_node< T ></a></td><td class="indexvalue">Forwards messages in sequence order </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00284.html">tbb::simple_partitioner</a></td><td class="indexvalue">A simple partitioner </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00285.html">tbb::source_node< Output ></a></td><td class="indexvalue">An executable node that acts as a source, i.e. it has no predecessors </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00286.html">tbb::spin_mutex</a></td><td class="indexvalue">A lock that occupies a single byte </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a></td><td class="indexvalue">Represents acquisition of a mutex </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a></td><td class="indexvalue">Fast, unfair, spinning reader-writer lock with backoff and writer-preference </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00290.html">tbb::split</a></td><td class="indexvalue">Dummy type that distinguishes splitting constructor from copy constructor </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00291.html">tbb::task</a></td><td class="indexvalue">Base class for user-defined tasks </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00292.html">tbb::interface5::internal::task_base</a></td><td class="indexvalue">Base class for methods that became static in TBB 3.0 </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00293.html">tbb::task_group_context</a></td><td class="indexvalue">Used to form groups of tasks </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00294.html">tbb::task_list</a></td><td class="indexvalue">A list of children </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00295.html">tbb::task_scheduler_init</a></td><td class="indexvalue">Class delimiting the scope of task scheduler activity </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00297.html">tbb::tbb_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00298.html">tbb::tbb_exception</a></td><td class="indexvalue">Interface to be implemented by all exceptions TBB recognizes and propagates across the threads </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a></td><td class="indexvalue">Exception container that preserves the exact copy of the original exception </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a></td><td class="indexvalue">Hash_compare that is default argument for concurrent_hash_map </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00301.html">tbb::thread_bound_filter</a></td><td class="indexvalue">A stage in a pipeline served by a user thread </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00302.html">tbb::tick_count</a></td><td class="indexvalue">Absolute timestamp </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00303.html">tbb::tick_count::interval_t</a></td><td class="indexvalue">Relative time interval </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a></td><td class="indexvalue">The two-phase join port </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00305.html">tbb::internal::work_around_alignment_bug< Size, T ></a></td><td class="indexvalue">Work around for bug in GNU 3.2 and MSVC compilers </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00225.html">tbb::affinity_partitioner</a></td><td class="indexvalue">An affinity partitioner </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a></td><td class="indexvalue">Defines entry point for affinity partitioner into tbb run-time library </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00227.html">tbb::aligned_space< T, N ></a></td><td class="indexvalue">Block of space aligned sufficiently to construct an array T with N elements </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00228.html">tbb::atomic< T ></a></td><td class="indexvalue">Primary template for atomic </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00229.html">tbb::atomic< void * ></a></td><td class="indexvalue">Specialization for <a class="el" href="a00229.html">atomic<void*></a>, for sake of not allowing arithmetic or operator-> </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00230.html">tbb::internal::atomic_backoff</a></td><td class="indexvalue">Class that implements exponential backoff </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00231.html">tbb::auto_partitioner</a></td><td class="indexvalue">An auto partitioner </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00232.html">tbb::bad_last_alloc</a></td><td class="indexvalue">Exception for concurrent containers </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00233.html">tbb::blocked_range< Value ></a></td><td class="indexvalue">A range over which to iterate </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a></td><td class="indexvalue">A 2-dimensional range that models the Range concept </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a></td><td class="indexvalue">A 3-dimensional range that models the Range concept </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a></td><td class="indexvalue">Forwards messages of type T to all successors </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a></td><td class="indexvalue">Forwards messages in arbitrary order </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00239.html">tbb::cache_aligned_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00240.html">tbb::captured_exception</a></td><td class="indexvalue">This class is used by TBB to propagate information about unhandled exceptions into the root thread </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00241.html">tbb::combinable< T ></a></td><td class="indexvalue">Thread-local storage with optional reduction </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe blocking concurrent bounded queue </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></td><td class="indexvalue">Unordered map from Key to T </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00244.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a></td><td class="indexvalue">Allows write access to elements and combines data access, locking, and garbage collection </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00245.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a></td><td class="indexvalue">Bucket accessor is to find, rehash, acquire a lock, and access a bucket </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a></td><td class="indexvalue">Combines data access, locking, and garbage collection </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a></td><td class="indexvalue">Concurrent priority queue </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe non-blocking concurrent queue </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a></td><td class="indexvalue">A high-performance thread-safe blocking concurrent bounded queue </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a></td><td class="indexvalue">Concurrent vector container </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00251.html">tbb::flow::interface6::continue_msg</a></td><td class="indexvalue">An empty class used for messages that mean "I'm done" </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a></td><td class="indexvalue">Implements an executable node that supports <a class="el" href="a00251.html">continue_msg</a> -> Output </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a></td><td class="indexvalue">Base class for receivers of completion messages </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00254.html">tbb::empty_task</a></td><td class="indexvalue">Task that does nothing. Useful for synchronization </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a></td><td class="indexvalue">The <a class="el" href="a00255.html">enumerable_thread_specific</a> container </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00256.html">tbb::filter</a></td><td class="indexvalue">A stage in a pipeline </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a></td><td class="indexvalue">Class representing a chain of type-safe pipeline filters </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00258.html">tbb::final_scan_tag</a></td><td class="indexvalue">Used to indicate that the final scan is being performed </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00259.html">tbb::interface6::flow_control</a></td><td class="indexvalue">Input_filter control to signal end-of-input for parallel_pipeline </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></td><td class="indexvalue">Implements a function node that supports Input -> Output </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a></td><td class="indexvalue">Implements a function node that supports Input -> Output </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00262.html">tbb::flow::interface6::graph</a></td><td class="indexvalue">The graph class </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a></td><td class="indexvalue">The base of all graph nodes. Allows them to be stored in a collection for deletion </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00264.html">tbb::improper_lock</a></td><td class="indexvalue">Exception for PPL locks </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00265.html">tbb::invalid_multiple_scheduling</a></td><td class="indexvalue">Exception for repeated scheduling of the same task_handle </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a></td><td class="indexvalue">Forwards messages only if the threshold has not been reached </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00267.html">tbb::internal::machine_load_store_relaxed< T, S ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00268.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00269.html">tbb::interface6::memory_pool< Alloc ></a></td><td class="indexvalue">Thread-safe growable pool allocator for variable-size requests </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00272.html">tbb::missing_wait</a></td><td class="indexvalue">Exception for missing wait on structured_task_group </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a></td><td class="indexvalue">Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a></td><td class="indexvalue">Implements a function node that supports Input -> (set of outputs) </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00275.html">tbb::mutex</a></td><td class="indexvalue">Wrapper around the platform's native reader-writer lock </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00277.html">tbb::null_mutex</a></td><td class="indexvalue">A mutex which does nothing </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a></td><td class="indexvalue">Represents acquisition of a mutex </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00279.html">tbb::null_rw_mutex</a></td><td class="indexvalue">A rw mutex which does nothing </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a></td><td class="indexvalue">Represents acquisition of a mutex </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00281.html">tbb::parallel_do_feeder< Item ></a></td><td class="indexvalue">Class the user supplied algorithm body uses to add new tasks </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00282.html">tbb::parallel_while< Body ></a></td><td class="indexvalue">Parallel iteration over a stream, with optional addition of more work </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00283.html">tbb::internal::partition_type_base</a></td><td class="indexvalue">Provides backward-compatible methods for partition objects without affinity </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00284.html">tbb::pipeline</a></td><td class="indexvalue">A processing pipeline that applies filters to items </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00285.html">tbb::pre_scan_tag</a></td><td class="indexvalue">Used to indicate that the initial scan is being performed </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a></td><td class="indexvalue">Forwards messages in priority order </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a></td><td class="indexvalue">Forwards messages in FIFO order </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00288.html">tbb::queuing_mutex</a></td><td class="indexvalue">Queuing lock with local-only spinning </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a></td><td class="indexvalue">Reader-writer lock with local-only spinning </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a></td><td class="indexvalue">Writer-preference reader-writer lock with local-only spinning on readers </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a></td><td class="indexvalue">The scoped lock pattern for write locks </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a></td><td class="indexvalue">The scoped lock pattern for read locks </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a></td><td class="indexvalue">Pure virtual template class that defines a receiver of messages of type T </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00296.html">tbb::recursive_mutex</a></td><td class="indexvalue">Mutex that allows recursive mutex acquisition </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a></td><td class="indexvalue">Load TBB at runtime </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00300.html">tbb::scalable_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a></td><td class="indexvalue">Pure virtual template class that defines a sender of messages of type T </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a></td><td class="indexvalue">Forwards messages in sequence order </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00303.html">tbb::simple_partitioner</a></td><td class="indexvalue">A simple partitioner </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a></td><td class="indexvalue">An executable node that acts as a source, i.e. it has no predecessors </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00305.html">tbb::spin_mutex</a></td><td class="indexvalue">A lock that occupies a single byte </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a></td><td class="indexvalue">Represents acquisition of a mutex </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a></td><td class="indexvalue">Fast, unfair, spinning reader-writer lock with backoff and writer-preference </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a></td><td class="indexvalue">The scoped locking pattern </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00309.html">tbb::split</a></td><td class="indexvalue">Dummy type that distinguishes splitting constructor from copy constructor </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a></td><td class="indexvalue">Split_node: accepts a tuple as input, forwards each element of the tuple to its </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00311.html">tbb::task</a></td><td class="indexvalue">Base class for user-defined tasks </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00312.html">tbb::interface5::internal::task_base</a></td><td class="indexvalue">Base class for methods that became static in TBB 3.0 </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00313.html">tbb::task_group_context</a></td><td class="indexvalue">Used to form groups of tasks </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00314.html">tbb::task_group_context</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00315.html">tbb::task_list</a></td><td class="indexvalue">A list of children </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00316.html">tbb::task_scheduler_init</a></td><td class="indexvalue">Class delimiting the scope of task scheduler activity </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00318.html">tbb::tbb_allocator< void ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00319.html">tbb::tbb_exception</a></td><td class="indexvalue">Interface to be implemented by all exceptions TBB recognizes and propagates across the threads </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a></td><td class="indexvalue">Exception container that preserves the exact copy of the original exception </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00321.html">tbb::tbb_hash_compare< Key ></a></td><td class="indexvalue">Hash_compare that is default argument for concurrent_hash_map </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00322.html">tbb::thread_bound_filter</a></td><td class="indexvalue">A stage in a pipeline served by a user thread </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00323.html">tbb::tick_count</a></td><td class="indexvalue">Absolute timestamp </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00324.html">tbb::tick_count::interval_t</a></td><td class="indexvalue">Relative time interval </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00325.html">tbb::internal::work_around_alignment_bug< Size, T ></a></td><td class="indexvalue">Work around for bug in GNU 3.2 and MSVC compilers </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a></td><td class="indexvalue">Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5 </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a></td><td class="indexvalue">Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1 </td></tr>
 </table>
 <hr>
 <p></p>
diff --git a/doc/html/deprecated.html b/doc/html/deprecated.html
index 90d05f7..bd1303f 100644
--- a/doc/html/deprecated.html
+++ b/doc/html/deprecated.html
@@ -15,7 +15,7 @@
     <li><a href="pages.html"><span>Related Pages</span></a></li>
   </ul></div>
 <h1><a class="anchor" name="deprecated">Deprecated List</a></h1><a class="anchor" name="_deprecated000001"></a> <dl>
-<dt>Member <a class="el" href="a00237.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue::pop_if_present</a> (T &destination) </dt>
+<dt>Member <a class="el" href="a00249.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue::pop_if_present</a> (T &destination) </dt>
 <dd>Use try_pop() </dd>
 </dl>
 <hr>
diff --git a/doc/html/files.html b/doc/html/files.html
index 5e565d1..9f603c7 100644
--- a/doc/html/files.html
+++ b/doc/html/files.html
@@ -20,43 +20,42 @@
     <li><a href="globals.html"><span>File Members</span></a></li>
   </ul></div>
 <h1>File List</h1>Here is a list of all documented files with brief descriptions:<table>
-  <tr><td class="indexkey"><b>_aggregator_internal.h</b> <a href="a00377.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>_concurrent_queue_internal.h</b> <a href="a00381.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>_concurrent_unordered_internal.h</b> <a href="a00397.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>_tbb_windef.h</b> <a href="a00407.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>aligned_space.h</b> <a href="a00409.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>atomic.h</b> <a href="a00410.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>blocked_range.h</b> <a href="a00418.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>blocked_range2d.h</b> <a href="a00419.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>blocked_range3d.h</b> <a href="a00420.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>cache_aligned_allocator.h</b> <a href="a00421.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>combinable.h</b> <a href="a00423.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>concurrent_hash_map.h</b> <a href="a00424.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>concurrent_priority_queue.h</b> <a href="a00433.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>concurrent_queue.h</b> <a href="a00436.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>concurrent_unordered_map.h</b> <a href="a00437.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>concurrent_vector.h</b> <a href="a00442.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>critical_section.h</b> <a href="a00451.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>enumerable_thread_specific.h</b> <a href="a00454.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00326.html">graph.h</a> <a href="a00466.html">[code]</a></td><td class="indexvalue">The graph related classes and functions </td></tr>
-  <tr><td class="indexkey"><b>mutex.h</b> <a href="a00499.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>null_mutex.h</b> <a href="a00501.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>null_rw_mutex.h</b> <a href="a00502.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>parallel_do.h</b> <a href="a00503.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>parallel_for.h</b> <a href="a00512.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>parallel_for_each.h</b> <a href="a00516.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>parallel_invoke.h</b> <a href="a00518.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>parallel_reduce.h</b> <a href="a00524.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>parallel_scan.h</b> <a href="a00528.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>parallel_sort.h</b> <a href="a00533.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>parallel_while.h</b> <a href="a00537.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>partitioner.h</b> <a href="a00541.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>pipeline.h</b> <a href="a00546.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>queuing_mutex.h</b> <a href="a00560.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>queuing_rw_mutex.h</b> <a href="a00561.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>reader_writer_lock.h</b> <a href="a00562.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>recursive_mutex.h</b> <a href="a00563.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00344.html">scalable_allocator.h</a> <a href="a00564.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>aligned_space.h</b> <a href="a00401.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>atomic.h</b> <a href="a00403.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>blocked_range.h</b> <a href="a00412.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>blocked_range2d.h</b> <a href="a00413.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>blocked_range3d.h</b> <a href="a00414.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>cache_aligned_allocator.h</b> <a href="a00415.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>combinable.h</b> <a href="a00417.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>concurrent_hash_map.h</b> <a href="a00418.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>concurrent_priority_queue.h</b> <a href="a00429.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>concurrent_queue.h</b> <a href="a00432.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>concurrent_unordered_map.h</b> <a href="a00436.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>concurrent_unordered_set.h</b> <a href="a00440.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>concurrent_vector.h</b> <a href="a00443.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>critical_section.h</b> <a href="a00452.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>enumerable_thread_specific.h</b> <a href="a00455.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00343.html">flow_graph.h</a> <a href="a00468.html">[code]</a></td><td class="indexvalue">The graph related classes and functions </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00344.html">memory_pool.h</a> <a href="a00480.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>mutex.h</b> <a href="a00487.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>null_mutex.h</b> <a href="a00489.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>null_rw_mutex.h</b> <a href="a00490.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>parallel_do.h</b> <a href="a00491.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>parallel_for.h</b> <a href="a00500.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>parallel_for_each.h</b> <a href="a00504.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>parallel_invoke.h</b> <a href="a00506.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>parallel_reduce.h</b> <a href="a00512.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>parallel_scan.h</b> <a href="a00518.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>parallel_sort.h</b> <a href="a00523.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>parallel_while.h</b> <a href="a00527.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>partitioner.h</b> <a href="a00531.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>pipeline.h</b> <a href="a00543.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>queuing_mutex.h</b> <a href="a00557.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>queuing_rw_mutex.h</b> <a href="a00558.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>reader_writer_lock.h</b> <a href="a00559.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>recursive_mutex.h</b> <a href="a00560.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>runtime_loader.h</b> <a href="a00561.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00363.html">scalable_allocator.h</a> <a href="a00562.html">[code]</a></td><td class="indexvalue"></td></tr>
   <tr><td class="indexkey"><b>spin_mutex.h</b> <a href="a00565.html">[code]</a></td><td class="indexvalue"></td></tr>
   <tr><td class="indexkey"><b>spin_rw_mutex.h</b> <a href="a00566.html">[code]</a></td><td class="indexvalue"></td></tr>
   <tr><td class="indexkey"><b>task.h</b> <a href="a00567.html">[code]</a></td><td class="indexvalue"></td></tr>
@@ -68,11 +67,11 @@
   <tr><td class="indexkey"><b>tbb_config.h</b> <a href="a00592.html">[code]</a></td><td class="indexvalue"></td></tr>
   <tr><td class="indexkey"><b>tbb_exception.h</b> <a href="a00593.html">[code]</a></td><td class="indexvalue"></td></tr>
   <tr><td class="indexkey"><b>tbb_machine.h</b> <a href="a00594.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>tbb_profiling.h</b> <a href="a00599.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>tbb_stddef.h</b> <a href="a00600.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>tbb_thread.h</b> <a href="a00606.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>tbbmalloc_proxy.h</b> <a href="a00614.html">[code]</a></td><td class="indexvalue"></td></tr>
-  <tr><td class="indexkey"><b>tick_count.h</b> <a href="a00616.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>tbb_profiling.h</b> <a href="a00600.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>tbb_stddef.h</b> <a href="a00601.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>tbb_thread.h</b> <a href="a00608.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>tbbmalloc_proxy.h</b> <a href="a00616.html">[code]</a></td><td class="indexvalue"></td></tr>
+  <tr><td class="indexkey"><b>tick_count.h</b> <a href="a00618.html">[code]</a></td><td class="indexvalue"></td></tr>
 </table>
 <hr>
 <p></p>
diff --git a/doc/html/functions.html b/doc/html/functions.html
index 9d6e83b..4a75e7c 100644
--- a/doc/html/functions.html
+++ b/doc/html/functions.html
@@ -62,21 +62,21 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_a">- a -</a></h3><ul>
 <li>acquire()
-: <a class="el" href="a00289.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00271.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
-: <a class="el" href="a00285.html#d71ed386c53032463f3435f79a15b6ff">tbb::source_node< Output ></a><li>add()
-: <a class="el" href="a00265.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00264.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
-: <a class="el" href="a00266.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
-: <a class="el" href="a00291.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>affinity_id
-: <a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocate()
-: <a class="el" href="a00299.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00296.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00280.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00226.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">tbb::cache_aligned_allocator< T ></a><li>allocate_child()
-: <a class="el" href="a00291.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
-: <a class="el" href="a00291.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
-: <a class="el" href="a00291.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocated
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>allocator_type
-: <a class="el" href="a00296.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00243.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a c [...]
-: <a class="el" href="a00238.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
-: <a class="el" href="a00238.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a><li>automatic
-: <a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a></ul>
+: <a class="el" href="a00308.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00291.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00289.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
+: <a class="el" href="a00304.html#4b647e4a93d08ccdd8d323279e4eaaa6">tbb::flow::interface6::source_node< Output ></a><li>add()
+: <a class="el" href="a00282.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00281.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
+: <a class="el" href="a00284.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
+: <a class="el" href="a00311.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>affinity_id
+: <a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocate()
+: <a class="el" href="a00320.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00317.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00299.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00270.html#365bd64d284c80d85bb2149a12681526">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00238.html#4cdeea67af6c1fcd8f1d5e9 [...]
+: <a class="el" href="a00311.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
+: <a class="el" href="a00311.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
+: <a class="el" href="a00311.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocated
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>allocator_type
+: <a class="el" href="a00317.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00255.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a c [...]
+: <a class="el" href="a00250.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
+: <a class="el" href="a00250.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a><li>automatic
+: <a class="el" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x62.html b/doc/html/functions_0x62.html
index 07268d8..c7802c8 100644
--- a/doc/html/functions_0x62.html
+++ b/doc/html/functions_0x62.html
@@ -62,11 +62,11 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_b">- b -</a></h3><ul>
 <li>back()
-: <a class="el" href="a00238.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
-: <a class="el" href="a00243.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00221.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
-: <a class="el" href="a00221.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
-: <a class="el" href="a00231.html#af34cb91b1d0f36a885a1a3432dd9af1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>buffer_node()
-: <a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">tbb::buffer_node< T ></a></ul>
+: <a class="el" href="a00250.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
+: <a class="el" href="a00255.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00233.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
+: <a class="el" href="a00233.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
+: <a class="el" href="a00243.html#af34cb91b1d0f36a885a1a3432dd9af1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>buffer_node()
+: <a class="el" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">tbb::flow::interface6::buffer_node< T, A ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x63.html b/doc/html/functions_0x63.html
index 472f7a3..573ef7c 100644
--- a/doc/html/functions_0x63.html
+++ b/doc/html/functions_0x63.html
@@ -62,30 +62,29 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_c">- c -</a></h3><ul>
 <li>cancel_group_execution()
-: <a class="el" href="a00291.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00293.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
-: <a class="el" href="a00238.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00235.html#e5d6a0aca1579ecebb716bbe53514963">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>cbegin()
-: <a class="el" href="a00238.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
-: <a class="el" href="a00238.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>change_group()
-: <a class="el" href="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">tbb::task</a><li>clear()
-: <a class="el" href="a00294.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00266.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00243.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#90b31e2954c6e4596c7900435a5f [...]
-: <a class="el" href="a00223.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00222.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
-: <a class="el" href="a00238.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrency
-: <a class="el" href="a00250.html#633b9b55e3248b785efd13264261f0e5">tbb::graph</a><li>concurrent_bounded_queue()
-: <a class="el" href="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
-: <a class="el" href="a00231.html#83c40f2053f208861b90390e12a36436">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_priority_queue()
-: <a class="el" href="a00235.html#509419e320f200456d89dc54a65140b3">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>concurrent_queue()
-: <a class="el" href="a00237.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00236.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
-: <a class="el" href="a00238.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
-: <a class="el" href="a00234.html#27399c613eb1aecd4660803955dda09d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>const_iterator
-: <a class="el" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
-: <a class="el" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#a4ded8601a434098605be0dcc4febc60">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>construct()
-: <a class="el" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00226.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>consume()
-: <a class="el" href="a00304.html#684f6bbc3290270ed43cb34ffd273f71">tbb::internal::two_phase_port< T ></a><li>context()
-: <a class="el" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>continue_receiver()
-: <a class="el" href="a00241.html#799d383813261426d881b10247caadba">tbb::continue_receiver</a><li>count()
-: <a class="el" href="a00231.html#6968eb6feed2df36be421df0464297af">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
-: <a class="el" href="a00238.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
-: <a class="el" href="a00238.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00311.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00313.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
+: <a class="el" href="a00250.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
+: <a class="el" href="a00250.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
+: <a class="el" href="a00250.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>change_group()
+: <a class="el" href="a00311.html#62247be9a637a814c8e8f4bcfb3a1908">tbb::task</a><li>clear()
+: <a class="el" href="a00315.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00284.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00255.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#90b31e2954c6e4596c7900435a5f [...]
+: <a class="el" href="a00235.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00234.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
+: <a class="el" href="a00250.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
+: <a class="el" href="a00242.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
+: <a class="el" href="a00243.html#83c40f2053f208861b90390e12a36436">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_priority_queue()
+: <a class="el" href="a00247.html#c8b20e7430c5302936030bef59a562be">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>concurrent_queue()
+: <a class="el" href="a00249.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00248.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
+: <a class="el" href="a00250.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
+: <a class="el" href="a00246.html#27399c613eb1aecd4660803955dda09d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>const_iterator
+: <a class="el" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
+: <a class="el" href="a00242.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#a4ded8601a434098605be0dcc4febc60">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>construct()
+: <a class="el" href="a00317.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00270.html#c7e1671b725894b94ce9a6ac544e24f2">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00238.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>context()
+: <a class="el" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>continue_node()
+: <a class="el" href="a00252.html#869562787fcb5c57a90aea120f26d492">tbb::flow::interface6::continue_node< Output ></a><li>continue_receiver()
+: <a class="el" href="a00253.html#a0b292ed7fa6556b2a735f6d1e82dc74">tbb::flow::interface6::continue_receiver</a><li>count()
+: <a class="el" href="a00243.html#6968eb6feed2df36be421df0464297af">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
+: <a class="el" href="a00250.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
+: <a class="el" href="a00250.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x64.html b/doc/html/functions_0x64.html
index b3be88e..9e2845e 100644
--- a/doc/html/functions_0x64.html
+++ b/doc/html/functions_0x64.html
@@ -62,15 +62,15 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_d">- d -</a></h3><ul>
 <li>deallocate()
-: <a class="el" href="a00296.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00280.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00226.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement
-: <a class="el" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">tbb::limiter_node< T ></a><li>decrement_ref_count()
-: <a class="el" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>decrement_wait_count()
-: <a class="el" href="a00250.html#ff3b6a3ef2ae1e661dcdb398c227b43c">tbb::graph</a><li>default_num_threads()
-: <a class="el" href="a00295.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>deferred
-: <a class="el" href="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>destroy()
-: <a class="el" href="a00299.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00298.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00296.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
-: <a class="el" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#77399bc76b3ecd60e33f7e35a5becd87">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>downgrade_to_reader()
-: <a class="el" href="a00289.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00273.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00317.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00299.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00270.html#4e24a03de38638af07548383024c54ab">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement
+: <a class="el" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">tbb::flow::interface6::limiter_node< T ></a><li>decrement_ref_count()
+: <a class="el" href="a00311.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>decrement_wait_count()
+: <a class="el" href="a00262.html#29b85506870f13a884a21655aec2a65d">tbb::flow::interface6::graph</a><li>default_num_threads()
+: <a class="el" href="a00316.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>deferred
+: <a class="el" href="a00316.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>destroy()
+: <a class="el" href="a00320.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00273.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00319.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00317.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
+: <a class="el" href="a00242.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#77399bc76b3ecd60e33f7e35a5becd87">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>downgrade_to_reader()
+: <a class="el" href="a00308.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00291.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x65.html b/doc/html/functions_0x65.html
index 3033112..89bfe0d 100644
--- a/doc/html/functions_0x65.html
+++ b/doc/html/functions_0x65.html
@@ -61,17 +61,27 @@
 Here is a list of all documented class members with links to the class documentation for each member:
 <p>
 <h3><a class="anchor" name="index_e">- e -</a></h3><ul>
-<li>empty()
-: <a class="el" href="a00294.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00243.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.htm [...]
-: <a class="el" href="a00243.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00215.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
-: <a class="el" href="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">tbb::task</a><li>enumerable_thread_specific()
-: <a class="el" href="a00243.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
-: <a class="el" href="a00231.html#5f12d150d421420965db07368666a84f">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exact_exception_propagation
-: <a class="el" href="a00245.html#f17200974c33be21f42a5f00893de028">tbb::filter</a><li>exclude()
-: <a class="el" href="a00231.html#0c964214eb38f54603aa75fdff6d2709">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>executable_node()
-: <a class="el" href="a00244.html#c13030111d34feeafd9cdb1dd21584f1">tbb::executable_node< Output ></a><li>execute()
-: <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">tbb::task</a>, <a class="el" href="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">tbb::continue_receiver</a>, <a class="el" href="a00214.html#282d5a2f1216b185c91ed23d00119481">tbb::interface6::internal::aggregator< handler_type, operation_type ></a><li>executing
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a></ul>
+<li>ec_bad_arg
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">tbb::interface6::runtime_loader</a><li>ec_bad_call
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">tbb::interface6::runtime_loader</a><li>ec_bad_lib
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">tbb::interface6::runtime_loader</a><li>ec_bad_ver
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">tbb::interface6::runtime_loader</a><li>ec_no_lib
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">tbb::interface6::runtime_loader</a><li>ec_ok
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">tbb::interface6::runtime_loader</a><li>em_abort
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">tbb::interface6::runtime_loader</a><li>em_status
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">tbb::interface6::runtime_loader</a><li>em_throw
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">tbb::interface6::runtime_loader</a><li>empty()
+: <a class="el" href="a00315.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00255.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.htm [...]
+: <a class="el" href="a00255.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00227.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
+: <a class="el" href="a00311.html#fe6bf6aaf84e664134fabb6c4f409ea9">tbb::task</a><li>enumerable_thread_specific()
+: <a class="el" href="a00255.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
+: <a class="el" href="a00243.html#5f12d150d421420965db07368666a84f">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>error_code
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">tbb::interface6::runtime_loader</a><li>error_mode
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb">tbb::interface6::runtime_loader</a><li>exact_exception_propagation
+: <a class="el" href="a00256.html#f17200974c33be21f42a5f00893de028">tbb::filter</a><li>exclude()
+: <a class="el" href="a00243.html#0c964214eb38f54603aa75fdff6d2709">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
+: <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">tbb::task</a>, <a class="el" href="a00253.html#40ca8b7e96c5bc3428b4d1e409725ee5">tbb::flow::interface6::continue_receiver</a><li>executing
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x66.html b/doc/html/functions_0x66.html
index f710d19..98f21be 100644
--- a/doc/html/functions_0x66.html
+++ b/doc/html/functions_0x66.html
@@ -62,16 +62,16 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_f">- f -</a></h3><ul>
 <li>filter_is_bound
-: <a class="el" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">tbb::filter</a><li>filter_is_out_of_order
-: <a class="el" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter</a><li>filter_is_serial
-: <a class="el" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">tbb::filter</a><li>filter_may_emit_null
-: <a class="el" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">tbb::filter</a><li>finalize()
-: <a class="el" href="a00245.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
-: <a class="el" href="a00231.html#7bc475d1968f7f0af3d736d7e8a0d7df">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>forward()
-: <a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">tbb::buffer_node< T ></a><li>freed
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>front()
-: <a class="el" href="a00238.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a><li>function_node()
-: <a class="el" href="a00249.html#7bde12e8ee43d4cafbdd5b1fc2031e2b">tbb::function_node< Input, Output ></a></ul>
+: <a class="el" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">tbb::filter</a><li>filter_is_out_of_order
+: <a class="el" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter</a><li>filter_is_serial
+: <a class="el" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">tbb::filter</a><li>filter_may_emit_null
+: <a class="el" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">tbb::filter</a><li>finalize()
+: <a class="el" href="a00256.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
+: <a class="el" href="a00243.html#7bc475d1968f7f0af3d736d7e8a0d7df">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>forward()
+: <a class="el" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">tbb::flow::interface6::buffer_node< T, A ></a><li>freed
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>front()
+: <a class="el" href="a00250.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a><li>function_node()
+: <a class="el" href="a00261.html#01055081ed477714503820035db3a965">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>, <a class="el" href="a00260.html#d5132323fd2ac6a00ea0c78beda78723">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x67.html b/doc/html/functions_0x67.html
index f9096f0..b1ff300 100644
--- a/doc/html/functions_0x67.html
+++ b/doc/html/functions_0x67.html
@@ -62,14 +62,13 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_g">- g -</a></h3><ul>
 <li>get_allocator()
-: <a class="el" href="a00238.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#d545d444fb0d16148f9b61fd89f9a337">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="e [...]
-: <a class="el" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>graph()
-: <a class="el" href="a00250.html#1ba8311506558a2419101722f5d49ba9">tbb::graph</a><li>group()
-: <a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">tbb::task</a><li>group_priority()
-: <a class="el" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">tbb::task</a><li>grow_by()
-: <a class="el" href="a00238.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_my_array()
-: <a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">tbb::buffer_node< T ></a><li>grow_to_at_least()
-: <a class="el" href="a00238.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00250.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#d545d444fb0d16148f9b61fd89f9a337">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="e [...]
+: <a class="el" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>graph()
+: <a class="el" href="a00262.html#4ab3d4b5208ece28c4c3ced647e26e12">tbb::flow::interface6::graph</a><li>group()
+: <a class="el" href="a00311.html#5987123486afca36ddebb9e2a8b7779a">tbb::task</a><li>group_priority()
+: <a class="el" href="a00311.html#e1d969a1ccab6796e3b8b2c1a5be33d2">tbb::task</a><li>grow_by()
+: <a class="el" href="a00250.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
+: <a class="el" href="a00250.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x69.html b/doc/html/functions_0x69.html
index 732763d..875163c 100644
--- a/doc/html/functions_0x69.html
+++ b/doc/html/functions_0x69.html
@@ -62,29 +62,29 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_i">- i -</a></h3><ul>
 <li>increment_ref_count()
-: <a class="el" href="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>increment_wait_count()
-: <a class="el" href="a00250.html#1e5c5ae6538ec714cee107d1004705b9">tbb::graph</a><li>init()
-: <a class="el" href="a00293.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
-: <a class="el" href="a00295.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>input_type
-: <a class="el" href="a00304.html#0f464d59e15941d6d625e8c7d634e26b">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#27016487003a4ff2908748c3cf11 [...]
-: <a class="el" href="a00231.html#1dd37fad87e561151ba1e242ca94bcc1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
-: <a class="el" href="a00231.html#72c9c9e9655fcf096f5f0ed9c8ba6669">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
-: <a class="el" href="a00231.html#8f5373b8e1864619d1ffcf3bf3f1f13d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
-: <a class="el" href="a00231.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_forward()
-: <a class="el" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">tbb::queue_node< T ></a>, <a class="el" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">tbb::buffer_node< T ></a><li>internal_reg_succ()
-: <a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">tbb::buffer_node< T ></a><li>internal_rem_succ()
-: <a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">tbb::buffer_node< T ></a><li>interval_t()
-: <a class="el" href="a00303.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
-: <a class="el" href="a00295.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
-: <a class="el" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
-: <a class="el" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
-: <a class="el" href="a00223.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00222.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00221.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
-: <a class="el" href="a00293.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
-: <a class="el" href="a00245.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
-: <a class="el" href="a00291.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
-: <a class="el" href="a00245.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
-: <a class="el" href="a00291.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer
-: <a class="el" href="a00233.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
+: <a class="el" href="a00311.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>increment_wait_count()
+: <a class="el" href="a00262.html#a993b789d1e488e0c3929135beae560e">tbb::flow::interface6::graph</a><li>init()
+: <a class="el" href="a00313.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
+: <a class="el" href="a00316.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>input_type
+: <a class="el" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#af629f26832ff4e476e240637a78bc0c">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">tbb::flow::interface6::queue_node< T, A &gt [...]
+: <a class="el" href="a00243.html#1dd37fad87e561151ba1e242ca94bcc1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
+: <a class="el" href="a00243.html#72c9c9e9655fcf096f5f0ed9c8ba6669">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
+: <a class="el" href="a00243.html#8f5373b8e1864619d1ffcf3bf3f1f13d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
+: <a class="el" href="a00243.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_forward()
+: <a class="el" href="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">tbb::flow::interface6::queue_node< T, A ></a>, <a class="el" href="a00237.html#dcbffbae514f4d95205b0845785c0a91">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_reg_succ()
+: <a class="el" href="a00237.html#df21388252b8963e839dca29d2c67ea5">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_rem_succ()
+: <a class="el" href="a00237.html#6b6cf76dff80fd679251da93351c1291">tbb::flow::interface6::buffer_node< T, A ></a><li>interval_t()
+: <a class="el" href="a00324.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
+: <a class="el" href="a00316.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
+: <a class="el" href="a00256.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
+: <a class="el" href="a00311.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
+: <a class="el" href="a00235.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00234.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00233.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
+: <a class="el" href="a00313.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
+: <a class="el" href="a00256.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
+: <a class="el" href="a00311.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
+: <a class="el" href="a00256.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
+: <a class="el" href="a00311.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer
+: <a class="el" href="a00245.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00308.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x6c.html b/doc/html/functions_0x6c.html
index 89e6902..1017946 100644
--- a/doc/html/functions_0x6c.html
+++ b/doc/html/functions_0x6c.html
@@ -62,11 +62,12 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_l">- l -</a></h3><ul>
 <li>limiter_node()
-: <a class="el" href="a00255.html#f0139fc645a51ce30b7aebb59c38a4ed">tbb::limiter_node< T ></a><li>local()
-: <a class="el" href="a00243.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
-: <a class="el" href="a00288.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00286.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00278.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00258.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
-: <a class="el" href="a00288.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00274.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
-: <a class="el" href="a00231.html#3f3413264a99174a224ef96f6c4ea769">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00266.html#83d3ab884543b070ee5b345a87f241fa">tbb::flow::interface6::limiter_node< T ></a><li>load()
+: <a class="el" href="a00298.html#5f3f6f1683386705a6931acae45f0862">tbb::interface6::runtime_loader</a><li>local()
+: <a class="el" href="a00255.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
+: <a class="el" href="a00307.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00305.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00296.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00275.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
+: <a class="el" href="a00307.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00292.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
+: <a class="el" href="a00243.html#3f3413264a99174a224ef96f6c4ea769">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x6d.html b/doc/html/functions_0x6d.html
index 95a0db3..b50d20d 100644
--- a/doc/html/functions_0x6d.html
+++ b/doc/html/functions_0x6d.html
@@ -62,12 +62,13 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_m">- m -</a></h3><ul>
 <li>make_filter
-: <a class="el" href="a00246.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface6::filter_t< T, U ></a><li>malloc_type
-: <a class="el" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>max_size()
-: <a class="el" href="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00280.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00238.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00231.html#2bce57fe9b594abe1e6d2568aea8b357">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, <a class="el" href="a00226. [...]
-: <a class="el" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex
-: <a class="el" href="a00258.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00289.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a><li>my_exception_data
-: <a class="el" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
+: <a class="el" href="a00257.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface6::filter_t< T, U ></a><li>malloc_type
+: <a class="el" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>max_size()
+: <a class="el" href="a00317.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00299.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00270.html#beebdb6144df8ba219fadfad4de866ea">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00250.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00243.html#2bce57fe9b594abe1e6 [...]
+: <a class="el" href="a00269.html#2822528265718a4c779591fc37c02ca8">tbb::interface6::memory_pool< Alloc ></a><li>move()
+: <a class="el" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex
+: <a class="el" href="a00275.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00308.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a><li>my_exception_data
+: <a class="el" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x6e.html b/doc/html/functions_0x6e.html
index 7755321..6105f3d 100644
--- a/doc/html/functions_0x6e.html
+++ b/doc/html/functions_0x6e.html
@@ -62,10 +62,10 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_n">- n -</a></h3><ul>
 <li>name()
-: <a class="el" href="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00298.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>native_handle_type
-: <a class="el" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>note_affinity()
-: <a class="el" href="a00291.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
-: <a class="el" href="a00302.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
+: <a class="el" href="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00319.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>native_handle_type
+: <a class="el" href="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>note_affinity()
+: <a class="el" href="a00311.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
+: <a class="el" href="a00323.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x6f.html b/doc/html/functions_0x6f.html
index 9bef6ab..8053111 100644
--- a/doc/html/functions_0x6f.html
+++ b/doc/html/functions_0x6f.html
@@ -62,18 +62,18 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_o">- o -</a></h3><ul>
 <li>object_may_be_null()
-: <a class="el" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">tbb::filter</a><li>operator *()
-: <a class="el" href="a00232.html#170280ea807a22e742095de3e8c5ea38">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00234.html#9411df8197ceb4881ec4c7368a0a7f88">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
-: <a class="el" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
-: <a class="el" href="a00245.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00233.html#fa6314b861c574f86ed189b124cf5853">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+
-: <a class="el" href="a00303.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator+=()
-: <a class="el" href="a00303.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-
-: <a class="el" href="a00302.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00303.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a><li>operator-=()
-: <a class="el" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
-: <a class="el" href="a00232.html#a807920cdffe3ec5c5e282b4d1ff92a2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00234.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
-: <a class="el" href="a00238.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#2ab7f7808891027ac0f0f5b3a4be51e9">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00231.html#088d1aaccc816884a49e38f7065622c8">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
-: <a class="el" href="a00238.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a><li>output_type
-: <a class="el" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, <a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#3b3fa4479416e7cb6d4a6a4b175c2b15">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#0c613bb01103dfcfbc3f9cbe943f95b0">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#d2 [...]
+: <a class="el" href="a00256.html#8ec4dfe053e94a2349d56781ddea8477">tbb::filter</a><li>operator *()
+: <a class="el" href="a00244.html#170280ea807a22e742095de3e8c5ea38">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00246.html#9411df8197ceb4881ec4c7368a0a7f88">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
+: <a class="el" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
+: <a class="el" href="a00256.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00245.html#fa6314b861c574f86ed189b124cf5853">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+
+: <a class="el" href="a00324.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator+=()
+: <a class="el" href="a00324.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-
+: <a class="el" href="a00323.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00324.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a><li>operator-=()
+: <a class="el" href="a00324.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
+: <a class="el" href="a00244.html#a807920cdffe3ec5c5e282b4d1ff92a2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00246.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
+: <a class="el" href="a00250.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00247.html#2ab7f7808891027ac0f0f5b3a4be51e9">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00243.html#088d1aaccc816884a49e38f7065622c8">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
+: <a class="el" href="a00250.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a><li>output_type
+: <a class="el" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#2cb099b590246b6bc93cc15e78c6ee5c">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#ca026eaef70e35791c407323199031a7">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#25b5a53ab1f9a342644fa3759bc0b1ad">tbb::flow::interface6::queue_node< T, A &gt [...]
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x70.html b/doc/html/functions_0x70.html
index c3f3ee1..6f5fb7a 100644
--- a/doc/html/functions_0x70.html
+++ b/doc/html/functions_0x70.html
@@ -62,22 +62,22 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_p">- p -</a></h3><ul>
 <li>page_range_type
-: <a class="el" href="a00223.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>pages()
-: <a class="el" href="a00223.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
-: <a class="el" href="a00265.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
-: <a class="el" href="a00291.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
-: <a class="el" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
-: <a class="el" href="a00266.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
-: <a class="el" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
-: <a class="el" href="a00294.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
-: <a class="el" href="a00237.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>predecessor_type
-: <a class="el" href="a00304.html#37ee9b5320b631c39bccc0b4745d88d1">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#fd88ce7670e7107aef2161b45f156185">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#98900a87758cac05500fcbc74113cebf">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#6581686ef0cf8e13c0270687628af5eb">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#83bc7308a38f1d205377d78ec149 [...]
-: <a class="el" href="a00293.html#2f2342b9e6c9c03703248ac13ad0271d">tbb::task_group_context</a><li>priority_queue_node()
-: <a class="el" href="a00268.html#1630f68674c4b201346a391b1e8d3f5d">tbb::priority_queue_node< T, Compare ></a><li>process_item()
-: <a class="el" href="a00301.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
-: <a class="el" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#d905af7b8f6defff562f5ae9c3275763">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>push_back()
-: <a class="el" href="a00294.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
-: <a class="el" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
+: <a class="el" href="a00235.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>pages()
+: <a class="el" href="a00235.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
+: <a class="el" href="a00282.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
+: <a class="el" href="a00311.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
+: <a class="el" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
+: <a class="el" href="a00284.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
+: <a class="el" href="a00242.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
+: <a class="el" href="a00315.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
+: <a class="el" href="a00249.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>predecessor_type
+: <a class="el" href="a00266.html#f89fcf44f38eb33f965ee5362d3e68e9">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#fdea783bf9d5a4c98e794ac7e0f84ccf">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#8127e36811832563fe1e9bc3ba391f79">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#5e2fdd33c45d44549dee9c1638e19898">tbb::flow::interface6::queue_node< T, A &gt [...]
+: <a class="el" href="a00313.html#2f2342b9e6c9c03703248ac13ad0271d">tbb::task_group_context</a><li>priority_queue_node()
+: <a class="el" href="a00286.html#17a4f66e23d54100b64805405e905d62">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a><li>process_item()
+: <a class="el" href="a00322.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
+: <a class="el" href="a00242.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#d905af7b8f6defff562f5ae9c3275763">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>push_back()
+: <a class="el" href="a00315.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
+: <a class="el" href="a00249.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x71.html b/doc/html/functions_0x71.html
index a3a1519..0b42c1c 100644
--- a/doc/html/functions_0x71.html
+++ b/doc/html/functions_0x71.html
@@ -62,9 +62,9 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_q">- q -</a></h3><ul>
 <li>queue_node()
-: <a class="el" href="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">tbb::queue_node< T ></a><li>queuing_mutex()
-: <a class="el" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
-: <a class="el" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
+: <a class="el" href="a00287.html#0226762d9ebba28311b7b1518d948ab1">tbb::flow::interface6::queue_node< T, A ></a><li>queuing_mutex()
+: <a class="el" href="a00288.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
+: <a class="el" href="a00290.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x72.html b/doc/html/functions_0x72.html
index 9d7531a..3d1b8e9 100644
--- a/doc/html/functions_0x72.html
+++ b/doc/html/functions_0x72.html
@@ -62,34 +62,35 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_r">- r -</a></h3><ul>
 <li>range()
-: <a class="el" href="a00243.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
-: <a class="el" href="a00238.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
-: <a class="el" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>ready
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recursive_mutex()
-: <a class="el" href="a00278.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>recycle_as_child_of()
-: <a class="el" href="a00291.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
-: <a class="el" href="a00291.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
-: <a class="el" href="a00291.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
-: <a class="el" href="a00291.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>reexecute
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a><li>ref_count()
-: <a class="el" href="a00291.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>reference
-: <a class="el" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>register_pending_exception()
-: <a class="el" href="a00293.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>register_predecessor()
-: <a class="el" href="a00304.html#6dc1f9bf02109c7f6fe4cc58bc31a00c">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#fb9909b87538f5c881c7cb7577436d14">tbb::limiter_node< T ></a>, <a class="el" href="a00241.html#b9fa9290cbb871f8780f9d69e1ec3b4e">tbb::continue_receiver</a>, <a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">tbb::receiver< T ></a><li>register_successor()
-: <a class="el" href="a00255.html#b8b9dbfbfc52750fa0c6bb8849681e86">tbb::limiter_node< T ></a>, <a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">tbb::buffer_node< T ></a>, <a class="el" href="a00224.html#3f4149fa6b984b2138cb5ed40a2ddc6c">tbb::broadcast_node< T ></a>, <a class="el" href="a00285.html#ce601874ec5cbb0996f6dcb8e43badb8">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">tbb::sender< T & [...]
-: <a class="el" href="a00231.html#94758113d8993cfe5afdf2d63a728869">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
-: <a class="el" href="a00289.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00273.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
-: <a class="el" href="a00304.html#a734a55289804ff34ce1c6ac4c5075e4">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#a05cf39b2825183e9c0393890fbbbb41">tbb::limiter_node< T ></a>, <a class="el" href="a00241.html#02411d8d13b380062548aff133752cc5">tbb::continue_receiver</a>, <a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">tbb::receiver< T ></a><li>remove_successor()
-: <a class="el" href="a00255.html#047d77f583e789e6d3ac6a52aba3168b">tbb::limiter_node< T ></a>, <a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">tbb::buffer_node< T ></a>, <a class="el" href="a00224.html#eefb3210bb9727765ea7385ba163c2a6">tbb::broadcast_node< T ></a>, <a class="el" href="a00285.html#de069bfc6fae7ed4e82b2a1fbb58b721">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#3f345427e812e8741370308ff88f30bf">tbb::sender< T & [...]
-: <a class="el" href="a00238.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
-: <a class="el" href="a00304.html#1d7399cfc77fca8878d8d16049ce4e7e">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00238.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#e7c59f011c4cca83ff210aefe7c9d868">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>reset()
-: <a class="el" href="a00293.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
-: <a class="el" href="a00238.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>root_task()
-: <a class="el" href="a00250.html#34d61d8b6560e5b2eb42e0112701db0f">tbb::graph</a><li>row_range_type
-: <a class="el" href="a00222.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>rows()
-: <a class="el" href="a00223.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00222.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
-: <a class="el" href="a00266.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00265.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a>, <a class="el" href="a00250.html#71213dd18099298dc74731e293c8286a">tbb::graph</a></ul>
+: <a class="el" href="a00255.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
+: <a class="el" href="a00250.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
+: <a class="el" href="a00292.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>ready
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recursive_mutex()
+: <a class="el" href="a00296.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>recycle_as_child_of()
+: <a class="el" href="a00311.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
+: <a class="el" href="a00311.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
+: <a class="el" href="a00311.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
+: <a class="el" href="a00311.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>reexecute
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a><li>ref_count()
+: <a class="el" href="a00311.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>reference
+: <a class="el" href="a00242.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>register_pending_exception()
+: <a class="el" href="a00313.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>register_predecessor()
+: <a class="el" href="a00266.html#de70a0e88ce7655d8c14b6af57f7496f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00253.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver< T ></a><li>register_successor()
+: <a class="el" href="a00266.html#c76561d8d871b4769876988a4de12a9b">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00237.html#f8bf4944ede4fc106423d67715beb695">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00236.html#fd0324c9ddb51fe6f95b3d015d338941">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00304.html#22960d499df9f1569a9d8a544e35afe3">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
+: <a class="el" href="a00243.html#94758113d8993cfe5afdf2d63a728869">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
+: <a class="el" href="a00308.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00291.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00289.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
+: <a class="el" href="a00266.html#c530e7b469454e2340460795f2da3317">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00253.html#cb691b18416d4742265aed84d496ebbd">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver< T ></a><li>remove_successor()
+: <a class="el" href="a00266.html#275e328063c121b3e506ccef2a825d28">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00237.html#2074da0e39b9477c32897d6e5786196f">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00236.html#366efcc046ec08a104281109801ae629">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00304.html#222484bf295f39df36415a29e508e5c9">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
+: <a class="el" href="a00250.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
+: <a class="el" href="a00250.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
+: <a class="el" href="a00313.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
+: <a class="el" href="a00250.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>root_task()
+: <a class="el" href="a00262.html#7f4e3ae90811a5d8b597146b5b586d10">tbb::flow::interface6::graph</a><li>row_range_type
+: <a class="el" href="a00234.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>rows()
+: <a class="el" href="a00235.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00234.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
+: <a class="el" href="a00284.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00282.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a>, <a class="el" href="a00262.html#c1145b00e063793a7e7bf994d202c7a0">tbb::flow::interface6::graph</a><li>runtime_loader()
+: <a class="el" href="a00298.html#7ae5330beb48fce0c702c32a5df0094a">tbb::interface6::runtime_loader</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x73.html b/doc/html/functions_0x73.html
index fab8a63..20bf466 100644
--- a/doc/html/functions_0x73.html
+++ b/doc/html/functions_0x73.html
@@ -62,30 +62,32 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_s">- s -</a></h3><ul>
 <li>scoped_lock()
-: <a class="el" href="a00289.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00275.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00273.html#fbb8798792d3aebb136c46fc63d [...]
-: <a class="el" href="a00276.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
-: <a class="el" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
-: <a class="el" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>sequencer_node()
-: <a class="el" href="a00283.html#c3138c1c96b76ae9f13b0abbf7029590">tbb::sequencer_node< T ></a><li>set_affinity()
-: <a class="el" href="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
-: <a class="el" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_group_priority()
-: <a class="el" href="a00291.html#9ac8d1542d67d9d80121ff986801ac26">tbb::task</a><li>set_priority()
-: <a class="el" href="a00293.html#c4272d4d9ab65d600ca70fc2c8c4b039">tbb::task_group_context</a><li>set_ref_count()
-: <a class="el" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
-: <a class="el" href="a00258.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
-: <a class="el" href="a00238.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#28d113288fc7e0c04c9053ec7de61368">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>size()
-: <a class="el" href="a00243.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00235.html#8b2ae25c61338c6fd59e94fe09822ba5">tbb::interface5::concurrent_priority_queue< T,  [...]
-: <a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>source_node()
-: <a class="el" href="a00285.html#0513272133a06db6742873671af98f21">tbb::source_node< Output ></a><li>spawn_and_wait_for_all()
-: <a class="el" href="a00291.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
-: <a class="el" href="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
-: <a class="el" href="a00286.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
-: <a class="el" href="a00288.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
-: <a class="el" href="a00291.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>state_type
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status_t
-: <a class="el" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a><li>successor_type
-: <a class="el" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, <a class="el" href="a00255.html#754182cc1e5b403201495bc1fd45674b">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#e01014f2e5ceea292c68f6fe47391c57">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#3591313e30d0f485a09106686067411f">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#c3 [...]
-: <a class="el" href="a00238.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00231.html#076f8d9e16110aac5f558777aa744eb6">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00308.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00293.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00291.html#fbb8798792d3aebb136c46fc63d [...]
+: <a class="el" href="a00294.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
+: <a class="el" href="a00324.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
+: <a class="el" href="a00311.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>sequencer_node()
+: <a class="el" href="a00302.html#b38e7a070552960384bcc1d91af13a5c">tbb::flow::interface6::sequencer_node< T, A ></a><li>set_affinity()
+: <a class="el" href="a00311.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
+: <a class="el" href="a00242.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_group_priority()
+: <a class="el" href="a00311.html#9ac8d1542d67d9d80121ff986801ac26">tbb::task</a><li>set_parent()
+: <a class="el" href="a00311.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">tbb::task</a><li>set_priority()
+: <a class="el" href="a00313.html#c4272d4d9ab65d600ca70fc2c8c4b039">tbb::task_group_context</a><li>set_ref_count()
+: <a class="el" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
+: <a class="el" href="a00275.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
+: <a class="el" href="a00250.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
+: <a class="el" href="a00255.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00247.html#8b2ae25c61338c6fd59e94fe09822ba5">tbb::interface5::concurrent_priority_queue< T,  [...]
+: <a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>source_node()
+: <a class="el" href="a00304.html#adaac111fbcace95804219a5f2929304">tbb::flow::interface6::source_node< Output ></a><li>spawn_and_wait_for_all()
+: <a class="el" href="a00311.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
+: <a class="el" href="a00311.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
+: <a class="el" href="a00305.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
+: <a class="el" href="a00307.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
+: <a class="el" href="a00311.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>state_type
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status()
+: <a class="el" href="a00298.html#78d938ed2e54d38dd38d6609e6c60389">tbb::interface6::runtime_loader</a><li>status_t
+: <a class="el" href="a00292.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a><li>successor_type
+: <a class="el" href="a00266.html#e8945e4dd6ea759ff9e4735da13f12ef">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#09ab5064ca8192e68c03da47603e68eb">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#795f3ee75f133b9d3b159172fc4a197f">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#f35076a19f256f9e7a61bed77ca1ccc5">tbb::flow::interface6::queue_node< T, A &gt [...]
+: <a class="el" href="a00250.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00247.html#0ecdc6a04aa259374425d424ca2a6082">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00243.html#076f8d9e16110aac5f558777aa744eb6">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x74.html b/doc/html/functions_0x74.html
index 56fc6d5..c1b9893 100644
--- a/doc/html/functions_0x74.html
+++ b/doc/html/functions_0x74.html
@@ -62,25 +62,24 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_t">- t -</a></h3><ul>
 <li>task()
-: <a class="el" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
-: <a class="el" href="a00293.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
-: <a class="el" href="a00294.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
-: <a class="el" href="a00295.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
-: <a class="el" href="a00295.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
-: <a class="el" href="a00299.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00257.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00298.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
-: <a class="el" href="a00302.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
-: <a class="el" href="a00289.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00273.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00271.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
-: <a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#809f51859ca4dd04204591d76c8572eb">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">tbb::sender< T ></a><li>try_get()
-: <a class="el" href="a00254.html#50c0e6465ac929a2e94d4e62a13ebeff">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, <a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#0434d2933ad082d3c43a4ec774150511">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#bf8c9235810354f3353a899c982645de">tbb::sender< T ></a><li>try_lock()
-: <a class="el" href="a00288.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00286.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00278.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00274.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00258.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
-: <a class="el" href="a00288.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00274.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
-: <a class="el" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#e036461a29cc40902a2bb79abf9f5146">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>try_process_item()
-: <a class="el" href="a00301.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
-: <a class="el" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a><li>try_put()
-: <a class="el" href="a00304.html#f316c0d5ff67068ff23b684accbe87f4">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#a38facb46cde854cb7408bf9f3bf8999">tbb::limiter_node< T ></a>, <a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">tbb::buffer_node< T ></a>, <a class="el" href="a00224.html#9b211e02554d6b39dc04f7e7f4e00073">tbb::broadcast_node< T ></a>, <a class="el" href="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">tbb::contin [...]
-: <a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">tbb::sender< T ></a><li>try_reserve()
-: <a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">tbb::sender< T ></a><li>two_phase_port()
-: <a class="el" href="a00304.html#60e17ef935031c86c4a288eafab5c066">tbb::internal::two_phase_port< T ></a></ul>
+: <a class="el" href="a00311.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
+: <a class="el" href="a00313.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
+: <a class="el" href="a00315.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
+: <a class="el" href="a00316.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
+: <a class="el" href="a00316.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
+: <a class="el" href="a00320.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00273.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00319.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
+: <a class="el" href="a00323.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
+: <a class="el" href="a00308.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00291.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00289.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
+: <a class="el" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">tbb::flow::interface6::sender< T ></a><li>try_get()
+: <a class="el" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#41073ad4d3510ed5a8b6bda9c0f58636">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">tbb::flow::interface6::sender< T ></a><li>try_lock()
+: <a class="el" href="a00307.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00305.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00296.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00292.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00275.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
+: <a class="el" href="a00307.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00292.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
+: <a class="el" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#e036461a29cc40902a2bb79abf9f5146">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>try_process_item()
+: <a class="el" href="a00322.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
+: <a class="el" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a><li>try_put()
+: <a class="el" href="a00266.html#55a02d458a4d8ffa6accd7a70605da2f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00237.html#2b02fe332e704bbe14f297802298b63a">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00236.html#29eb768c10b377880bbf83d31ee49acf">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00253.html#3969c70fb89c0a982f142ae9eb5facae">tbb::flow::interface6::continue_receiver</a>, <a class="el" href=" [...]
+: <a class="el" href="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#494678baf9096835268736b800824460">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< T ></a><li>try_reserve()
+: <a class="el" href="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">tbb::flow::interface6::sender< T ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x75.html b/doc/html/functions_0x75.html
index 0bdb8e4..fbb42cd 100644
--- a/doc/html/functions_0x75.html
+++ b/doc/html/functions_0x75.html
@@ -62,9 +62,9 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_u">- u -</a></h3><ul>
 <li>unlock()
-: <a class="el" href="a00288.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00286.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00278.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00274.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00258.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
-: <a class="el" href="a00236.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
-: <a class="el" href="a00289.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00273.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00307.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00305.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00296.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00292.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00275.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
+: <a class="el" href="a00248.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
+: <a class="el" href="a00308.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00291.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x76.html b/doc/html/functions_0x76.html
index f538a90..5973c8d 100644
--- a/doc/html/functions_0x76.html
+++ b/doc/html/functions_0x76.html
@@ -62,7 +62,7 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_v">- v -</a></h3><ul>
 <li>value_type
-: <a class="el" href="a00265.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00230.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el"  [...]
+: <a class="el" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00242.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el"  [...]
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x77.html b/doc/html/functions_0x77.html
index e499776..6befb6e 100644
--- a/doc/html/functions_0x77.html
+++ b/doc/html/functions_0x77.html
@@ -62,8 +62,8 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_w">- w -</a></h3><ul>
 <li>wait_for_all()
-: <a class="el" href="a00291.html#53d2615ad9c38859b4c8080936600283">tbb::task</a>, <a class="el" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">tbb::graph</a><li>what()
-: <a class="el" href="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
+: <a class="el" href="a00311.html#53d2615ad9c38859b4c8080936600283">tbb::task</a>, <a class="el" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">tbb::flow::interface6::graph</a><li>what()
+: <a class="el" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00319.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_0x7e.html b/doc/html/functions_0x7e.html
index 7cfb90e..04656df 100644
--- a/doc/html/functions_0x7e.html
+++ b/doc/html/functions_0x7e.html
@@ -62,29 +62,31 @@ Here is a list of all documented class members with links to the class documenta
 <p>
 <h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
 <li>~combinable()
-: <a class="el" href="a00229.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
-: <a class="el" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
-: <a class="el" href="a00231.html#2aa8e2d28d5af1284cf78d20a9c22731">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
-: <a class="el" href="a00236.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
-: <a class="el" href="a00238.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
-: <a class="el" href="a00234.html#928769b139d53427e7075c1f86148e4c">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~continue_receiver()
-: <a class="el" href="a00241.html#9a38edb7e1e3c9be4e3848145c51a617">tbb::continue_receiver</a><li>~enumerable_thread_specific()
-: <a class="el" href="a00243.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
-: <a class="el" href="a00245.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~graph()
-: <a class="el" href="a00250.html#55332084e7884a26ff288b8fe960030d">tbb::graph</a><li>~parallel_while()
-: <a class="el" href="a00265.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
-: <a class="el" href="a00266.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
-: <a class="el" href="a00272.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
-: <a class="el" href="a00274.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~receiver()
-: <a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">tbb::receiver< T ></a><li>~scoped_lock()
-: <a class="el" href="a00289.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00275.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00273.html#32c7d67a660d23ebbaab1a1d282 [...]
-: <a class="el" href="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~sequencer_node()
-: <a class="el" href="a00283.html#c87d80feebaf2bae4af22b5f2459b37e">tbb::sequencer_node< T ></a><li>~source_node()
-: <a class="el" href="a00285.html#90c94a8a52cc3d19cf393ce289e80733">tbb::source_node< Output ></a><li>~spin_rw_mutex_v3()
-: <a class="el" href="a00288.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
-: <a class="el" href="a00291.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
-: <a class="el" href="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
-: <a class="el" href="a00295.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
+: <a class="el" href="a00241.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
+: <a class="el" href="a00242.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
+: <a class="el" href="a00243.html#2aa8e2d28d5af1284cf78d20a9c22731">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
+: <a class="el" href="a00248.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
+: <a class="el" href="a00250.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
+: <a class="el" href="a00246.html#928769b139d53427e7075c1f86148e4c">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~continue_receiver()
+: <a class="el" href="a00253.html#1e14828fa079b9835ff7267df5ee45d7">tbb::flow::interface6::continue_receiver</a><li>~enumerable_thread_specific()
+: <a class="el" href="a00255.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
+: <a class="el" href="a00256.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~graph()
+: <a class="el" href="a00262.html#8a7d424c0616a1c37a908ead182e2fe5">tbb::flow::interface6::graph</a><li>~memory_pool()
+: <a class="el" href="a00269.html#fdad7c4ed08332ec384491a71b721957">tbb::interface6::memory_pool< Alloc ></a><li>~parallel_while()
+: <a class="el" href="a00282.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
+: <a class="el" href="a00284.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
+: <a class="el" href="a00290.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
+: <a class="el" href="a00292.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~receiver()
+: <a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">tbb::flow::interface6::receiver< T ></a><li>~runtime_loader()
+: <a class="el" href="a00298.html#c25fec923a751a3e03f5cbe969f1f0c5">tbb::interface6::runtime_loader</a><li>~scoped_lock()
+: <a class="el" href="a00308.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00293.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00291.html#32c7d67a660d23ebbaab1a1d282 [...]
+: <a class="el" href="a00294.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~sequencer_node()
+: <a class="el" href="a00302.html#93d3d8f6a72b3e1387047282116ed6ee">tbb::flow::interface6::sequencer_node< T, A ></a><li>~source_node()
+: <a class="el" href="a00304.html#61700b0865fc17188b0abe26bbde65b6">tbb::flow::interface6::source_node< Output ></a><li>~spin_rw_mutex_v3()
+: <a class="el" href="a00307.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
+: <a class="el" href="a00311.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
+: <a class="el" href="a00315.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
+: <a class="el" href="a00316.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_enum.html b/doc/html/functions_enum.html
index 0101d18..d61b61c 100644
--- a/doc/html/functions_enum.html
+++ b/doc/html/functions_enum.html
@@ -34,11 +34,12 @@
  
 <p>
 <ul>
-<li>concurrency
-: <a class="el" href="a00250.html#633b9b55e3248b785efd13264261f0e5">tbb::graph</a><li>malloc_type
-: <a class="el" href="a00296.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>state_type
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status_t
-: <a class="el" href="a00274.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a></ul>
+<li>error_code
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789">tbb::interface6::runtime_loader</a><li>error_mode
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb">tbb::interface6::runtime_loader</a><li>malloc_type
+: <a class="el" href="a00317.html#09a7f81fb2c3055aaecf058b11538544">tbb::tbb_allocator< T ></a><li>state_type
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e">tbb::task</a><li>status_t
+: <a class="el" href="a00292.html#6f921f0d7c1812ceb5674418c8b6ccaf">tbb::interface5::reader_writer_lock</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_eval.html b/doc/html/functions_eval.html
index 779d408..bdb73c6 100644
--- a/doc/html/functions_eval.html
+++ b/doc/html/functions_eval.html
@@ -35,12 +35,21 @@
 <p>
 <ul>
 <li>allocated
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>executing
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a><li>freed
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>ready
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recycle
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>reexecute
-: <a class="el" href="a00291.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a></ul>
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ebe94d3348dd038e41107819f00c1884c">tbb::task</a><li>ec_bad_arg
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878927e94a7b173bb8d0623bf48aad8fc703">tbb::interface6::runtime_loader</a><li>ec_bad_call
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde018789e6ce2b091083b80878cbb70cd00782a1">tbb::interface6::runtime_loader</a><li>ec_bad_lib
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878903ee81d8c05966bc1125666713dee5f6">tbb::interface6::runtime_loader</a><li>ec_bad_ver
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878907790f32918e60d670a96c1f0349e8d6">tbb::interface6::runtime_loader</a><li>ec_no_lib
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde01878902acc03ebfcdb16e3e26b24f64da2bdb">tbb::interface6::runtime_loader</a><li>ec_ok
+: <a class="el" href="a00298.html#6831be91cdc64e57e565ce0dde0187891e3a364f63f419e5ea2f1d1e52289b27">tbb::interface6::runtime_loader</a><li>em_abort
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcb630dd30c9ba61d5ab187e80313bbad94">tbb::interface6::runtime_loader</a><li>em_status
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdb47fe5ffbd2eaf47e6de0af433ada38">tbb::interface6::runtime_loader</a><li>em_throw
+: <a class="el" href="a00298.html#bb0130fe0f596399707e61431231ebcbdeb59ca2912432b47fd3ec831574653b">tbb::interface6::runtime_loader</a><li>executing
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ead0fe2302ccc360923f738c2ed7ec1b9">tbb::task</a><li>freed
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293ecc67ca92bd6f1ce9738a1e9e7206b735">tbb::task</a><li>ready
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e0841dcf1c2a96dee9aa7b69f636cb81a">tbb::task</a><li>recycle
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e58debec6ab130290640d0cc2eedba35d">tbb::task</a><li>reexecute
+: <a class="el" href="a00311.html#4a3c415562d17905390ea5b49d12293e3bf499aa6e6487cd1ace883a63100513">tbb::task</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html
index 46bfd23..c114b87 100644
--- a/doc/html/functions_func.html
+++ b/doc/html/functions_func.html
@@ -61,18 +61,18 @@
 <p>
 <h3><a class="anchor" name="index_a">- a -</a></h3><ul>
 <li>acquire()
-: <a class="el" href="a00289.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00273.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00271.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
-: <a class="el" href="a00285.html#d71ed386c53032463f3435f79a15b6ff">tbb::source_node< Output ></a><li>add()
-: <a class="el" href="a00265.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00264.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
-: <a class="el" href="a00266.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
-: <a class="el" href="a00291.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>allocate()
-: <a class="el" href="a00299.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00296.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00280.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00226.html#4cdeea67af6c1fcd8f1d5e9c4cab61e8">tbb::cache_aligned_allocator< T ></a><li>allocate_child()
-: <a class="el" href="a00291.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
-: <a class="el" href="a00291.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
-: <a class="el" href="a00291.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocator_type()
-: <a class="el" href="a00296.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00243.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a c [...]
-: <a class="el" href="a00238.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
-: <a class="el" href="a00238.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00308.html#b0b646ec5be02a127d159bbb7ca65353">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#3ee3c338732b1f64b0b32a757807a30d">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#7fb04da37cccf8c99b1f9102d9074f9a">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00291.html#a8dd5ab8686e76de21587544dbb681e0">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00289.html#533e4fc8355ee321206a0609c42d909d">tbb::qu [...]
+: <a class="el" href="a00304.html#4b647e4a93d08ccdd8d323279e4eaaa6">tbb::flow::interface6::source_node< Output ></a><li>add()
+: <a class="el" href="a00282.html#e131c560057a58229992b61eb8dba4c6">tbb::parallel_while< Body ></a>, <a class="el" href="a00281.html#40baaf0f6856f4491dd0adf896c93516">tbb::parallel_do_feeder< Item ></a><li>add_filter()
+: <a class="el" href="a00284.html#38fb5c9c8395dd6f89a4ae2011a83e0d">tbb::pipeline</a><li>affinity()
+: <a class="el" href="a00311.html#3a920a56b0bcf2801518fb45b2c9d2be">tbb::task</a><li>allocate()
+: <a class="el" href="a00320.html#c35e5db8e9cdff5d1387db5b0bad2e4a">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00317.html#f6cb487b1bdce0b581f265a77dca6d53">tbb::tbb_allocator< T ></a>, <a class="el" href="a00299.html#726b1586d05d44665a36e1c7b2699bfd">tbb::scalable_allocator< T ></a>, <a class="el" href="a00270.html#365bd64d284c80d85bb2149a12681526">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00238.html#4cdeea67af6c1fcd8f1d5e9 [...]
+: <a class="el" href="a00311.html#1ff794f7053cd9148d5f280fbf07377f">tbb::task</a><li>allocate_continuation()
+: <a class="el" href="a00311.html#1434c79a5138993269d034008bff7329">tbb::task</a><li>allocate_root()
+: <a class="el" href="a00311.html#8ccc518caf31075a3e073996d2d240a4">tbb::task</a><li>allocator_type()
+: <a class="el" href="a00317.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00255.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a c [...]
+: <a class="el" href="a00250.html#93a06b3112cb804f42f40efb5e7387b4">tbb::concurrent_vector< T, A ></a><li>at()
+: <a class="el" href="a00250.html#23e14a38af748edff96a7adc3a0f1c58">tbb::concurrent_vector< T, A ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x62.html b/doc/html/functions_func_0x62.html
index 39b430f..650d3b4 100644
--- a/doc/html/functions_func_0x62.html
+++ b/doc/html/functions_func_0x62.html
@@ -61,11 +61,11 @@
 <p>
 <h3><a class="anchor" name="index_b">- b -</a></h3><ul>
 <li>back()
-: <a class="el" href="a00238.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
-: <a class="el" href="a00243.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00221.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00215.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
-: <a class="el" href="a00221.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
-: <a class="el" href="a00231.html#af34cb91b1d0f36a885a1a3432dd9af1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>buffer_node()
-: <a class="el" href="a00225.html#7360978fa427d054bc6cde05c80e5e9f">tbb::buffer_node< T ></a></ul>
+: <a class="el" href="a00250.html#bd518e204107d07fd08d0ec5bdfd383d">tbb::concurrent_vector< T, A ></a><li>begin()
+: <a class="el" href="a00255.html#84afb3906a39e399cde1c950d6351300">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#78a06182276ff758788d4c0623ae0d71">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00233.html#18d2258400756ac1446dac7676b18df3">tbb::blocked_range< Value ></a>, <a class="el" href="a00227.html#0d702fc6b9e9d061ace3501b3c861cdf">tbb::aligned_space< T, N ></a><li>blocked_range()
+: <a class="el" href="a00233.html#4c0efd2be3f96a0ab3ba5085e8b3fcc7">tbb::blocked_range< Value ></a><li>bucket_count()
+: <a class="el" href="a00243.html#af34cb91b1d0f36a885a1a3432dd9af1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>buffer_node()
+: <a class="el" href="a00237.html#03ad7b85a8341437f584af06ad050cdc">tbb::flow::interface6::buffer_node< T, A ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x63.html b/doc/html/functions_func_0x63.html
index 6a5f078..71c33a7 100644
--- a/doc/html/functions_func_0x63.html
+++ b/doc/html/functions_func_0x63.html
@@ -61,27 +61,27 @@
 <p>
 <h3><a class="anchor" name="index_c">- c -</a></h3><ul>
 <li>cancel_group_execution()
-: <a class="el" href="a00291.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00293.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
-: <a class="el" href="a00238.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00235.html#e5d6a0aca1579ecebb716bbe53514963">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>cbegin()
-: <a class="el" href="a00238.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
-: <a class="el" href="a00238.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>change_group()
-: <a class="el" href="a00291.html#62247be9a637a814c8e8f4bcfb3a1908">tbb::task</a><li>clear()
-: <a class="el" href="a00294.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00266.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00243.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#90b31e2954c6e4596c7900435a5f [...]
-: <a class="el" href="a00223.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00222.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
-: <a class="el" href="a00238.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
-: <a class="el" href="a00230.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
-: <a class="el" href="a00231.html#83c40f2053f208861b90390e12a36436">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_priority_queue()
-: <a class="el" href="a00235.html#509419e320f200456d89dc54a65140b3">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>concurrent_queue()
-: <a class="el" href="a00237.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00236.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
-: <a class="el" href="a00238.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
-: <a class="el" href="a00234.html#27399c613eb1aecd4660803955dda09d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>construct()
-: <a class="el" href="a00296.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00226.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>consume()
-: <a class="el" href="a00304.html#684f6bbc3290270ed43cb34ffd273f71">tbb::internal::two_phase_port< T ></a><li>context()
-: <a class="el" href="a00291.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>continue_receiver()
-: <a class="el" href="a00241.html#799d383813261426d881b10247caadba">tbb::continue_receiver</a><li>count()
-: <a class="el" href="a00231.html#6968eb6feed2df36be421df0464297af">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
-: <a class="el" href="a00238.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
-: <a class="el" href="a00238.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00311.html#0f3fb4aac549ab642022450a4bd13326">tbb::task</a>, <a class="el" href="a00313.html#8bcdfdf4e6bfb76125b6de15c00b571d">tbb::task_group_context</a><li>capacity()
+: <a class="el" href="a00250.html#3ed6b9ae7217af5103d974045b6f5cd5">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#b2888b3e4e837d7e03f2c731963a402b">tbb::concurrent_bounded_queue< T, A ></a><li>cbegin()
+: <a class="el" href="a00250.html#f88fcf1c920693c39bd9709db33c199f">tbb::concurrent_vector< T, A ></a><li>cend()
+: <a class="el" href="a00250.html#0c15a5d0f1cf75d687dabba07da1d46b">tbb::concurrent_vector< T, A ></a><li>change_group()
+: <a class="el" href="a00311.html#62247be9a637a814c8e8f4bcfb3a1908">tbb::task</a><li>clear()
+: <a class="el" href="a00315.html#fce446ee13e025969945328f3ff59b95">tbb::task_list</a>, <a class="el" href="a00284.html#2c84aef5b834b555ee220b176e25931e">tbb::pipeline</a>, <a class="el" href="a00255.html#a8764176d4b6014c5d65f1051851abc8">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#26f937a359a66b6aae904c3cd9a3c444">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#90b31e2954c6e4596c7900435a5f [...]
+: <a class="el" href="a00235.html#3336ba9480fd6c43e158f9beb024c050">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00234.html#392a46759af2c884957115771affa7f4">tbb::blocked_range2d< RowValue, ColValue ></a><li>compact()
+: <a class="el" href="a00250.html#1693d1da41b1a8235871be9c6633be35">tbb::concurrent_vector< T, A ></a><li>concurrent_bounded_queue()
+: <a class="el" href="a00242.html#a5e04dcd7db9fd9b583b4e7df832246a">tbb::concurrent_bounded_queue< T, A ></a><li>concurrent_hash_map()
+: <a class="el" href="a00243.html#83c40f2053f208861b90390e12a36436">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>concurrent_priority_queue()
+: <a class="el" href="a00247.html#c8b20e7430c5302936030bef59a562be">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>concurrent_queue()
+: <a class="el" href="a00249.html#9102b897776bd2d9e908e6604ff16b5f">tbb::deprecated::concurrent_queue< T, A ></a>, <a class="el" href="a00248.html#8a6b98ea11a867db8ac868f0113ca429">tbb::strict_ppl::concurrent_queue< T, A ></a><li>concurrent_vector()
+: <a class="el" href="a00250.html#4450de83c5862ea4bcd9443fd7e67419">tbb::concurrent_vector< T, A ></a><li>const_accessor()
+: <a class="el" href="a00246.html#27399c613eb1aecd4660803955dda09d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>construct()
+: <a class="el" href="a00317.html#ab228ab9e324ed041c2226e1d717df5f">tbb::tbb_allocator< T ></a>, <a class="el" href="a00270.html#c7e1671b725894b94ce9a6ac544e24f2">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00238.html#958ee8745c86c275bfc9533af565e017">tbb::cache_aligned_allocator< T ></a><li>context()
+: <a class="el" href="a00311.html#d8c36a93f3972590fbb65ff1cef3173b">tbb::task</a><li>continue_node()
+: <a class="el" href="a00252.html#869562787fcb5c57a90aea120f26d492">tbb::flow::interface6::continue_node< Output ></a><li>continue_receiver()
+: <a class="el" href="a00253.html#a0b292ed7fa6556b2a735f6d1e82dc74">tbb::flow::interface6::continue_receiver</a><li>count()
+: <a class="el" href="a00243.html#6968eb6feed2df36be421df0464297af">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>crbegin()
+: <a class="el" href="a00250.html#db78a1d28c9c966050e8a2926d834a33">tbb::concurrent_vector< T, A ></a><li>crend()
+: <a class="el" href="a00250.html#fff9cece89438587997ebedf93c5e962">tbb::concurrent_vector< T, A ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x64.html b/doc/html/functions_func_0x64.html
index 41cd362..ce18572 100644
--- a/doc/html/functions_func_0x64.html
+++ b/doc/html/functions_func_0x64.html
@@ -61,12 +61,12 @@
 <p>
 <h3><a class="anchor" name="index_d">- d -</a></h3><ul>
 <li>deallocate()
-: <a class="el" href="a00296.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00280.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00226.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
-: <a class="el" href="a00291.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>decrement_wait_count()
-: <a class="el" href="a00250.html#ff3b6a3ef2ae1e661dcdb398c227b43c">tbb::graph</a><li>default_num_threads()
-: <a class="el" href="a00295.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>destroy()
-: <a class="el" href="a00299.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00257.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00298.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00296.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
-: <a class="el" href="a00289.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00273.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00317.html#fdd011fdf2f9ad07006dc7c0a7ec1da2">tbb::tbb_allocator< T ></a>, <a class="el" href="a00299.html#f806a238c18cbcfb531e1e0a0d2ec59d">tbb::scalable_allocator< T ></a>, <a class="el" href="a00270.html#4e24a03de38638af07548383024c54ab">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00238.html#3d4eadf188f7d85d3805ae534e0b8e1c">tbb::cache_aligned_allocator< T ></a><li>decrement_ref_count()
+: <a class="el" href="a00311.html#ef4680f5c148020c5e7e43ddef44cd5d">tbb::task</a><li>decrement_wait_count()
+: <a class="el" href="a00262.html#29b85506870f13a884a21655aec2a65d">tbb::flow::interface6::graph</a><li>default_num_threads()
+: <a class="el" href="a00316.html#ba00714c33a41a3c2216f48613971cab">tbb::task_scheduler_init</a><li>destroy()
+: <a class="el" href="a00320.html#921875bbacd2c8a5f324c7da7a415262">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00273.html#7a46873119d9f85a7b0009c13e41a258">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#93d875d3555502ff6f18513525de204c">tbb::captured_exception</a>, <a class="el" href="a00319.html#66c94938eca8bf88b76f3eccaaf215d8">tbb::tbb_exception</a>, <a class="el" href="a00317.html#ef133522bf55f05a605bee0763208281">tbb::tbb_allocator [...]
+: <a class="el" href="a00308.html#c2c2c38a08cb9080e87099fac3e5bc94">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00291.html#0d2f93edf7b15ec4bcee138823220c52">tbb::queuing_rw_mutex::scoped_lock</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x65.html b/doc/html/functions_func_0x65.html
index f1d21cc..a7792ad 100644
--- a/doc/html/functions_func_0x65.html
+++ b/doc/html/functions_func_0x65.html
@@ -61,14 +61,13 @@
 <p>
 <h3><a class="anchor" name="index_e">- e -</a></h3><ul>
 <li>empty()
-: <a class="el" href="a00294.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00243.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.htm [...]
-: <a class="el" href="a00243.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00221.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00215.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
-: <a class="el" href="a00291.html#fe6bf6aaf84e664134fabb6c4f409ea9">tbb::task</a><li>enumerable_thread_specific()
-: <a class="el" href="a00243.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
-: <a class="el" href="a00231.html#5f12d150d421420965db07368666a84f">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
-: <a class="el" href="a00231.html#0c964214eb38f54603aa75fdff6d2709">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>executable_node()
-: <a class="el" href="a00244.html#c13030111d34feeafd9cdb1dd21584f1">tbb::executable_node< Output ></a><li>execute()
-: <a class="el" href="a00291.html#22c298cd40937a431a06777423f002f6">tbb::task</a>, <a class="el" href="a00241.html#e6bf1d21e670b78ea00c71fccbe17c78">tbb::continue_receiver</a>, <a class="el" href="a00214.html#282d5a2f1216b185c91ed23d00119481">tbb::interface6::internal::aggregator< handler_type, operation_type ></a></ul>
+: <a class="el" href="a00315.html#f3ac31e092814b90929f81bb30441959">tbb::task_list</a>, <a class="el" href="a00255.html#72595886d0ac8fd0543f90038570510d">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#c6426cb93cf20d3af40f3c90f1f0481a">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#f64924f2ee9225c368a270fc3c394db9">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.htm [...]
+: <a class="el" href="a00255.html#cb448bb4977ce366ceb7344085cc7050">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#1e6aa764ce5a1cbd24526f68bc0a2f6b">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00233.html#8b929d93ddc13f148b11bceef3a3bdf8">tbb::blocked_range< Value ></a>, <a class="el" href="a00227.html#024be075c23c0394c9a2518d993bcd9e">tbb::aligned_space< T, N ></a><li>enqueue()
+: <a class="el" href="a00311.html#fe6bf6aaf84e664134fabb6c4f409ea9">tbb::task</a><li>enumerable_thread_specific()
+: <a class="el" href="a00255.html#7bce6829981c9efe3f59cae2355e383e">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>erase()
+: <a class="el" href="a00243.html#5f12d150d421420965db07368666a84f">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>exclude()
+: <a class="el" href="a00243.html#0c964214eb38f54603aa75fdff6d2709">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>execute()
+: <a class="el" href="a00311.html#22c298cd40937a431a06777423f002f6">tbb::task</a>, <a class="el" href="a00253.html#40ca8b7e96c5bc3428b4d1e409725ee5">tbb::flow::interface6::continue_receiver</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x66.html b/doc/html/functions_func_0x66.html
index 636de28..d16aafb 100644
--- a/doc/html/functions_func_0x66.html
+++ b/doc/html/functions_func_0x66.html
@@ -61,11 +61,11 @@
 <p>
 <h3><a class="anchor" name="index_f">- f -</a></h3><ul>
 <li>finalize()
-: <a class="el" href="a00245.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
-: <a class="el" href="a00231.html#7bc475d1968f7f0af3d736d7e8a0d7df">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>forward()
-: <a class="el" href="a00225.html#3a31b3b55bee417de3af09c7b45b9ad6">tbb::buffer_node< T ></a><li>front()
-: <a class="el" href="a00238.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a><li>function_node()
-: <a class="el" href="a00249.html#7bde12e8ee43d4cafbdd5b1fc2031e2b">tbb::function_node< Input, Output ></a></ul>
+: <a class="el" href="a00256.html#56275eb889c77c4807967133e21401bd">tbb::filter</a><li>find()
+: <a class="el" href="a00243.html#7bc475d1968f7f0af3d736d7e8a0d7df">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>forward()
+: <a class="el" href="a00237.html#2648324ce0a38b40132b8502ef250e3a">tbb::flow::interface6::buffer_node< T, A ></a><li>front()
+: <a class="el" href="a00250.html#502615a858eb9fa0390ee59169065e90">tbb::concurrent_vector< T, A ></a><li>function_node()
+: <a class="el" href="a00261.html#01055081ed477714503820035db3a965">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>, <a class="el" href="a00260.html#d5132323fd2ac6a00ea0c78beda78723">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x67.html b/doc/html/functions_func_0x67.html
index 759fd8e..89d0fa9 100644
--- a/doc/html/functions_func_0x67.html
+++ b/doc/html/functions_func_0x67.html
@@ -61,14 +61,13 @@
 <p>
 <h3><a class="anchor" name="index_g">- g -</a></h3><ul>
 <li>get_allocator()
-: <a class="el" href="a00238.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#d545d444fb0d16148f9b61fd89f9a337">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="e [...]
-: <a class="el" href="a00221.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>graph()
-: <a class="el" href="a00250.html#1ba8311506558a2419101722f5d49ba9">tbb::graph</a><li>group()
-: <a class="el" href="a00291.html#5987123486afca36ddebb9e2a8b7779a">tbb::task</a><li>group_priority()
-: <a class="el" href="a00291.html#e1d969a1ccab6796e3b8b2c1a5be33d2">tbb::task</a><li>grow_by()
-: <a class="el" href="a00238.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_my_array()
-: <a class="el" href="a00225.html#3ec9d33aa9f1e9292d5952e3eb477ca1">tbb::buffer_node< T ></a><li>grow_to_at_least()
-: <a class="el" href="a00238.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00250.html#2fdba8e90de6a4d2300222236d46758e">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#415eb87e53b1c6a266de06ecbc490d16">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#f034f70caef445fe8abc9113ec926a8d">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#d545d444fb0d16148f9b61fd89f9a337">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="e [...]
+: <a class="el" href="a00233.html#fcd2e5b8b6c11fd3f20fc0aa9f11bbc2">tbb::blocked_range< Value ></a><li>graph()
+: <a class="el" href="a00262.html#4ab3d4b5208ece28c4c3ced647e26e12">tbb::flow::interface6::graph</a><li>group()
+: <a class="el" href="a00311.html#5987123486afca36ddebb9e2a8b7779a">tbb::task</a><li>group_priority()
+: <a class="el" href="a00311.html#e1d969a1ccab6796e3b8b2c1a5be33d2">tbb::task</a><li>grow_by()
+: <a class="el" href="a00250.html#473a59a4c9308b93411b898b3110d26c">tbb::concurrent_vector< T, A ></a><li>grow_to_at_least()
+: <a class="el" href="a00250.html#a7e3b67c8ccab16d0aecc80899ae799d">tbb::concurrent_vector< T, A ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x69.html b/doc/html/functions_func_0x69.html
index eb7cd39..c1f16ed 100644
--- a/doc/html/functions_func_0x69.html
+++ b/doc/html/functions_func_0x69.html
@@ -61,28 +61,28 @@
 <p>
 <h3><a class="anchor" name="index_i">- i -</a></h3><ul>
 <li>increment_ref_count()
-: <a class="el" href="a00291.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>increment_wait_count()
-: <a class="el" href="a00250.html#1e5c5ae6538ec714cee107d1004705b9">tbb::graph</a><li>init()
-: <a class="el" href="a00293.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
-: <a class="el" href="a00295.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>insert()
-: <a class="el" href="a00231.html#1dd37fad87e561151ba1e242ca94bcc1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
-: <a class="el" href="a00231.html#72c9c9e9655fcf096f5f0ed9c8ba6669">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
-: <a class="el" href="a00231.html#8f5373b8e1864619d1ffcf3bf3f1f13d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
-: <a class="el" href="a00231.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_forward()
-: <a class="el" href="a00268.html#79161e73f79cc43b2c2b08367504dfda">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00269.html#fb58bac5ac355e5134c51125e601fa2a">tbb::queue_node< T ></a>, <a class="el" href="a00225.html#a3cb61d8a98bc4bc860b1cb04944b4f8">tbb::buffer_node< T ></a><li>internal_reg_succ()
-: <a class="el" href="a00225.html#017f16c8d6e0fb65d0d3a61aec86b3e2">tbb::buffer_node< T ></a><li>internal_rem_succ()
-: <a class="el" href="a00225.html#a75f731cf9fc93f7487eb72de3fcf7b1">tbb::buffer_node< T ></a><li>interval_t()
-: <a class="el" href="a00303.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
-: <a class="el" href="a00295.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
-: <a class="el" href="a00245.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
-: <a class="el" href="a00291.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
-: <a class="el" href="a00223.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00222.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00221.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
-: <a class="el" href="a00293.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
-: <a class="el" href="a00245.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
-: <a class="el" href="a00291.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
-: <a class="el" href="a00245.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
-: <a class="el" href="a00291.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer()
-: <a class="el" href="a00233.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
+: <a class="el" href="a00311.html#f5fb43c7ad0de5a4b95703cebc39e345">tbb::task</a><li>increment_wait_count()
+: <a class="el" href="a00262.html#a993b789d1e488e0c3929135beae560e">tbb::flow::interface6::graph</a><li>init()
+: <a class="el" href="a00313.html#49a55352084fd44b8863d182e839e6dc">tbb::task_group_context</a><li>initialize()
+: <a class="el" href="a00316.html#d5ed214a8bb53b0466ed91ff4734b9a3">tbb::task_scheduler_init</a><li>insert()
+: <a class="el" href="a00243.html#1dd37fad87e561151ba1e242ca94bcc1">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_copy()
+: <a class="el" href="a00243.html#72c9c9e9655fcf096f5f0ed9c8ba6669">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_equal_range()
+: <a class="el" href="a00243.html#8f5373b8e1864619d1ffcf3bf3f1f13d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_fast_find()
+: <a class="el" href="a00243.html#2f76ed101a0ccc8875b846c2f747897e">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>internal_forward()
+: <a class="el" href="a00286.html#ed2d8dc0a9c1c2571e4a69df2f2209e5">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00287.html#eadcbbb81f9a9d223afabe0f40e77ecb">tbb::flow::interface6::queue_node< T, A ></a>, <a class="el" href="a00237.html#dcbffbae514f4d95205b0845785c0a91">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_reg_succ()
+: <a class="el" href="a00237.html#df21388252b8963e839dca29d2c67ea5">tbb::flow::interface6::buffer_node< T, A ></a><li>internal_rem_succ()
+: <a class="el" href="a00237.html#6b6cf76dff80fd679251da93351c1291">tbb::flow::interface6::buffer_node< T, A ></a><li>interval_t()
+: <a class="el" href="a00324.html#1a21a428e00cced2e6a49e0f5f2258bf">tbb::tick_count::interval_t</a><li>is_active()
+: <a class="el" href="a00316.html#12752282977029f23416642bc03e8b74">tbb::task_scheduler_init</a><li>is_bound()
+: <a class="el" href="a00256.html#15c29cae5d237e6d63dbfe5c94af89d5">tbb::filter</a><li>is_cancelled()
+: <a class="el" href="a00311.html#025f18118c057c4c8db87ff2ce8df975">tbb::task</a><li>is_divisible()
+: <a class="el" href="a00235.html#39d69191721c488e737ae5d9c5336b9c">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00234.html#ad36a9b38e4fef26d376f99552ce2d92">tbb::blocked_range2d< RowValue, ColValue ></a>, <a class="el" href="a00233.html#41a58b703d574b6e1ca155df3576f578">tbb::blocked_range< Value ></a><li>is_group_execution_cancelled()
+: <a class="el" href="a00313.html#4db72f16210b0a991b2c134d6763a4cc">tbb::task_group_context</a><li>is_ordered()
+: <a class="el" href="a00256.html#cd53206c4795ef2df5df26b795caf692">tbb::filter</a><li>is_owned_by_current_thread()
+: <a class="el" href="a00311.html#c26718b3b247cd13deb1a741902e7105">tbb::task</a><li>is_serial()
+: <a class="el" href="a00256.html#fcfec27656a69ff2072802ac001e936f">tbb::filter</a><li>is_stolen_task()
+: <a class="el" href="a00311.html#f9169402702f56bf519448aaf34450aa">tbb::task</a><li>is_writer()
+: <a class="el" href="a00245.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00308.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x6c.html b/doc/html/functions_func_0x6c.html
index 1a1a4b6..39c5b13 100644
--- a/doc/html/functions_func_0x6c.html
+++ b/doc/html/functions_func_0x6c.html
@@ -61,11 +61,12 @@
 <p>
 <h3><a class="anchor" name="index_l">- l -</a></h3><ul>
 <li>limiter_node()
-: <a class="el" href="a00255.html#f0139fc645a51ce30b7aebb59c38a4ed">tbb::limiter_node< T ></a><li>local()
-: <a class="el" href="a00243.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
-: <a class="el" href="a00288.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00286.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00278.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00274.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00258.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
-: <a class="el" href="a00288.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00274.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
-: <a class="el" href="a00231.html#3f3413264a99174a224ef96f6c4ea769">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00266.html#83d3ab884543b070ee5b345a87f241fa">tbb::flow::interface6::limiter_node< T ></a><li>load()
+: <a class="el" href="a00298.html#5f3f6f1683386705a6931acae45f0862">tbb::interface6::runtime_loader</a><li>local()
+: <a class="el" href="a00255.html#7dc79058d2832f7447de8e691c3455ea">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>lock()
+: <a class="el" href="a00307.html#4007d6e1523dbc3c2bb7f889ab789a8a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00305.html#4f748989e19b6045e3a2d2ee73626a28">tbb::spin_mutex</a>, <a class="el" href="a00296.html#4c342c69d47f4bb0b393535dee4015d6">tbb::recursive_mutex</a>, <a class="el" href="a00292.html#2653d1a2d560059a51219a8ceab3ade9">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00275.html#4470e61c24c129a0299ca6c17240adbb">tbb::mutex</a><li>lock_read()
+: <a class="el" href="a00307.html#13f799708ac4ca437a16be202e263e18">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00292.html#d9d16a24d9f6c3dada73c6b9ff214f5b">tbb::interface5::reader_writer_lock</a><li>lookup()
+: <a class="el" href="a00243.html#3f3413264a99174a224ef96f6c4ea769">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x6d.html b/doc/html/functions_func_0x6d.html
index 83efb79..276dca7 100644
--- a/doc/html/functions_func_0x6d.html
+++ b/doc/html/functions_func_0x6d.html
@@ -61,9 +61,10 @@
 <p>
 <h3><a class="anchor" name="index_m">- m -</a></h3><ul>
 <li>max_size()
-: <a class="el" href="a00296.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00280.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00238.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00231.html#2bce57fe9b594abe1e6d2568aea8b357">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>, <a class="el" href="a00226. [...]
-: <a class="el" href="a00257.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00298.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
-: <a class="el" href="a00258.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00289.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
+: <a class="el" href="a00317.html#f059ca2c96243024f0d562ee3a87a3a5">tbb::tbb_allocator< T ></a>, <a class="el" href="a00299.html#880e766f1d913988c21973dbdd874fd5">tbb::scalable_allocator< T ></a>, <a class="el" href="a00270.html#beebdb6144df8ba219fadfad4de866ea">tbb::interface6::memory_pool_allocator< T, P ></a>, <a class="el" href="a00250.html#2c248a017f0576df3e7cd99627836fd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00243.html#2bce57fe9b594abe1e6 [...]
+: <a class="el" href="a00269.html#2822528265718a4c779591fc37c02ca8">tbb::interface6::memory_pool< Alloc ></a><li>move()
+: <a class="el" href="a00273.html#1aea0ad179d6f0481fe7f3495f66adf9">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#837a50b8f6a800bda225c39d1699643f">tbb::captured_exception</a>, <a class="el" href="a00319.html#3e3482bf264d4ca4dde046cd9c02c766">tbb::tbb_exception</a><li>mutex()
+: <a class="el" href="a00275.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00308.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x6e.html b/doc/html/functions_func_0x6e.html
index 5e59bcf..2a91226 100644
--- a/doc/html/functions_func_0x6e.html
+++ b/doc/html/functions_func_0x6e.html
@@ -61,9 +61,9 @@
 <p>
 <h3><a class="anchor" name="index_n">- n -</a></h3><ul>
 <li>name()
-: <a class="el" href="a00257.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00298.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>note_affinity()
-: <a class="el" href="a00291.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
-: <a class="el" href="a00302.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
+: <a class="el" href="a00273.html#bc5f5c4739b17ac5211ac58226c2f5a5">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#5af82fd677449c5ca727fa1d7e16f9f5">tbb::captured_exception</a>, <a class="el" href="a00319.html#d00f6497e552fee978a02bfcbebf46e2">tbb::tbb_exception</a><li>note_affinity()
+: <a class="el" href="a00311.html#713c338c8eeaebdc5a6b10a69c039b06">tbb::task</a><li>now()
+: <a class="el" href="a00323.html#fb7f78ca61cf28398645ace66e284473">tbb::tick_count</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x6f.html b/doc/html/functions_func_0x6f.html
index cba6cd1..ad27829 100644
--- a/doc/html/functions_func_0x6f.html
+++ b/doc/html/functions_func_0x6f.html
@@ -61,15 +61,15 @@
 <p>
 <h3><a class="anchor" name="index_o">- o -</a></h3><ul>
 <li>object_may_be_null()
-: <a class="el" href="a00245.html#8ec4dfe053e94a2349d56781ddea8477">tbb::filter</a><li>operator *()
-: <a class="el" href="a00232.html#170280ea807a22e742095de3e8c5ea38">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00234.html#9411df8197ceb4881ec4c7368a0a7f88">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
-: <a class="el" href="a00298.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
-: <a class="el" href="a00245.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00233.html#fa6314b861c574f86ed189b124cf5853">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+=()
-: <a class="el" href="a00303.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-=()
-: <a class="el" href="a00303.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
-: <a class="el" href="a00232.html#a807920cdffe3ec5c5e282b4d1ff92a2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00234.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
-: <a class="el" href="a00238.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#2ab7f7808891027ac0f0f5b3a4be51e9">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00231.html#088d1aaccc816884a49e38f7065622c8">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
-: <a class="el" href="a00238.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
+: <a class="el" href="a00256.html#8ec4dfe053e94a2349d56781ddea8477">tbb::filter</a><li>operator *()
+: <a class="el" href="a00244.html#170280ea807a22e742095de3e8c5ea38">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00246.html#9411df8197ceb4881ec4c7368a0a7f88">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator delete()
+: <a class="el" href="a00319.html#3f2da7f3d8a6e4c1df522af1213afb5a">tbb::tbb_exception</a><li>operator()()
+: <a class="el" href="a00256.html#fa1b3dc1f4f47563ccab7f4d92f5b543">tbb::filter</a>, <a class="el" href="a00245.html#fa6314b861c574f86ed189b124cf5853">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a><li>operator+=()
+: <a class="el" href="a00324.html#cd9814947902e26463a69a111530f81b">tbb::tick_count::interval_t</a><li>operator-=()
+: <a class="el" href="a00324.html#35ff7eaf7c2031b4a991402ac9ecb940">tbb::tick_count::interval_t</a><li>operator->()
+: <a class="el" href="a00244.html#a807920cdffe3ec5c5e282b4d1ff92a2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>, <a class="el" href="a00246.html#3d03a48ecb8cd9549bd8be64b09c9b0d">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>operator=()
+: <a class="el" href="a00250.html#19f4ab88a01b0fd056af3bba463e7bd6">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00247.html#2ab7f7808891027ac0f0f5b3a4be51e9">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00243.html#088d1aaccc816884a49e38f7065622c8">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>operator[]()
+: <a class="el" href="a00250.html#c6fade5c732cc95274d1d8277ea619d1">tbb::concurrent_vector< T, A ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x70.html b/doc/html/functions_func_0x70.html
index 0920583..a624403 100644
--- a/doc/html/functions_func_0x70.html
+++ b/doc/html/functions_func_0x70.html
@@ -61,20 +61,20 @@
 <p>
 <h3><a class="anchor" name="index_p">- p -</a></h3><ul>
 <li>pages()
-: <a class="el" href="a00223.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
-: <a class="el" href="a00265.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
-: <a class="el" href="a00291.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
-: <a class="el" href="a00218.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
-: <a class="el" href="a00266.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
-: <a class="el" href="a00230.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
-: <a class="el" href="a00294.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
-: <a class="el" href="a00237.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>priority()
-: <a class="el" href="a00293.html#2f2342b9e6c9c03703248ac13ad0271d">tbb::task_group_context</a><li>priority_queue_node()
-: <a class="el" href="a00268.html#1630f68674c4b201346a391b1e8d3f5d">tbb::priority_queue_node< T, Compare ></a><li>process_item()
-: <a class="el" href="a00301.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
-: <a class="el" href="a00230.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#d905af7b8f6defff562f5ae9c3275763">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>push_back()
-: <a class="el" href="a00294.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00238.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
-: <a class="el" href="a00237.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
+: <a class="el" href="a00235.html#cf971430aa12361d3ed245344b7c6764">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>parallel_while()
+: <a class="el" href="a00282.html#36e26ba3880c7bcf804a97ba0cbe133f">tbb::parallel_while< Body ></a><li>parent()
+: <a class="el" href="a00311.html#314e98ee4347ccec83efcb9ee22e8596">tbb::task</a><li>pause()
+: <a class="el" href="a00230.html#a174ea93e3bd3d5cce82389c2f28d037">tbb::internal::atomic_backoff</a><li>pipeline()
+: <a class="el" href="a00284.html#596dc3beba27099c4c8581cb419e1a59">tbb::pipeline</a><li>pop()
+: <a class="el" href="a00242.html#41f4c6bd7a82ab070e840bbf81b0b123">tbb::concurrent_bounded_queue< T, A ></a><li>pop_front()
+: <a class="el" href="a00315.html#5fe85df5ed524418389d34051750347d">tbb::task_list</a><li>pop_if_present()
+: <a class="el" href="a00249.html#48da3536245318af6cb5fd58bac78039">tbb::deprecated::concurrent_queue< T, A ></a><li>priority()
+: <a class="el" href="a00313.html#2f2342b9e6c9c03703248ac13ad0271d">tbb::task_group_context</a><li>priority_queue_node()
+: <a class="el" href="a00286.html#17a4f66e23d54100b64805405e905d62">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a><li>process_item()
+: <a class="el" href="a00322.html#5e726bdc7fbd924c0b07bd558b1d4d5d">tbb::thread_bound_filter</a><li>push()
+: <a class="el" href="a00242.html#ceb08c743b11ba88c878e73fff8af20b">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#73c47563ffcc4c2f6452f25a04ebe2e2">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#d905af7b8f6defff562f5ae9c3275763">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>push_back()
+: <a class="el" href="a00315.html#4cd34756bc4763dafb8c84838a0124ff">tbb::task_list</a>, <a class="el" href="a00250.html#e94e038f915c0268fdf2d3d7f87d81b8">tbb::concurrent_vector< T, A ></a><li>push_if_not_full()
+: <a class="el" href="a00249.html#7c45561bafe71107d09b2bc1b8f4e681">tbb::deprecated::concurrent_queue< T, A ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x71.html b/doc/html/functions_func_0x71.html
index cea02fd..b59f3fa 100644
--- a/doc/html/functions_func_0x71.html
+++ b/doc/html/functions_func_0x71.html
@@ -61,9 +61,9 @@
 <p>
 <h3><a class="anchor" name="index_q">- q -</a></h3><ul>
 <li>queue_node()
-: <a class="el" href="a00269.html#1564c6bf9573b13d6854b0e8f7ce2b68">tbb::queue_node< T ></a><li>queuing_mutex()
-: <a class="el" href="a00270.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
-: <a class="el" href="a00272.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
+: <a class="el" href="a00287.html#0226762d9ebba28311b7b1518d948ab1">tbb::flow::interface6::queue_node< T, A ></a><li>queuing_mutex()
+: <a class="el" href="a00288.html#b389ad9c4db7293e4bdb5b8cda69ec04">tbb::queuing_mutex</a><li>queuing_rw_mutex()
+: <a class="el" href="a00290.html#85c90877c3447690ac4e2ac4ff8dea5e">tbb::queuing_rw_mutex</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x72.html b/doc/html/functions_func_0x72.html
index 2d81cc0..0a26187 100644
--- a/doc/html/functions_func_0x72.html
+++ b/doc/html/functions_func_0x72.html
@@ -61,29 +61,30 @@
 <p>
 <h3><a class="anchor" name="index_r">- r -</a></h3><ul>
 <li>range()
-: <a class="el" href="a00243.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
-: <a class="el" href="a00238.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
-: <a class="el" href="a00274.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>recursive_mutex()
-: <a class="el" href="a00278.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle_as_child_of()
-: <a class="el" href="a00291.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
-: <a class="el" href="a00291.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
-: <a class="el" href="a00291.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
-: <a class="el" href="a00291.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>ref_count()
-: <a class="el" href="a00291.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>register_pending_exception()
-: <a class="el" href="a00293.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>register_predecessor()
-: <a class="el" href="a00304.html#6dc1f9bf02109c7f6fe4cc58bc31a00c">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#fb9909b87538f5c881c7cb7577436d14">tbb::limiter_node< T ></a>, <a class="el" href="a00241.html#b9fa9290cbb871f8780f9d69e1ec3b4e">tbb::continue_receiver</a>, <a class="el" href="a00277.html#14ae737c8fca4c8bf8e1a736dfbac444">tbb::receiver< T ></a><li>register_successor()
-: <a class="el" href="a00255.html#b8b9dbfbfc52750fa0c6bb8849681e86">tbb::limiter_node< T ></a>, <a class="el" href="a00225.html#cd2ef588b0ee6eb8d23ee169e00c73a9">tbb::buffer_node< T ></a>, <a class="el" href="a00224.html#3f4149fa6b984b2138cb5ed40a2ddc6c">tbb::broadcast_node< T ></a>, <a class="el" href="a00285.html#ce601874ec5cbb0996f6dcb8e43badb8">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#be48ac70174cf8e08e2b0279cd6343d3">tbb::sender< T & [...]
-: <a class="el" href="a00231.html#94758113d8993cfe5afdf2d63a728869">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
-: <a class="el" href="a00289.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00273.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00271.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
-: <a class="el" href="a00304.html#a734a55289804ff34ce1c6ac4c5075e4">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#a05cf39b2825183e9c0393890fbbbb41">tbb::limiter_node< T ></a>, <a class="el" href="a00241.html#02411d8d13b380062548aff133752cc5">tbb::continue_receiver</a>, <a class="el" href="a00277.html#d2f23b40b328dc254a7c2a0a30f408e4">tbb::receiver< T ></a><li>remove_successor()
-: <a class="el" href="a00255.html#047d77f583e789e6d3ac6a52aba3168b">tbb::limiter_node< T ></a>, <a class="el" href="a00225.html#415428db02e74a479fb056a8ed72ba53">tbb::buffer_node< T ></a>, <a class="el" href="a00224.html#eefb3210bb9727765ea7385ba163c2a6">tbb::broadcast_node< T ></a>, <a class="el" href="a00285.html#de069bfc6fae7ed4e82b2a1fbb58b721">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#3f345427e812e8741370308ff88f30bf">tbb::sender< T & [...]
-: <a class="el" href="a00238.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
-: <a class="el" href="a00304.html#1d7399cfc77fca8878d8d16049ce4e7e">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00238.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#e7c59f011c4cca83ff210aefe7c9d868">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>reset()
-: <a class="el" href="a00293.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
-: <a class="el" href="a00238.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>root_task()
-: <a class="el" href="a00250.html#34d61d8b6560e5b2eb42e0112701db0f">tbb::graph</a><li>rows()
-: <a class="el" href="a00223.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00222.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
-: <a class="el" href="a00266.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00265.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a>, <a class="el" href="a00250.html#71213dd18099298dc74731e293c8286a">tbb::graph</a></ul>
+: <a class="el" href="a00255.html#3b068000cf4dbf9b40f8bb7e3fc53e0b">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#3d09ccfb581b879ae64203741035e193">tbb::concurrent_vector< T, A ></a><li>rbegin()
+: <a class="el" href="a00250.html#9f9c103e18d5f212703805354074ad44">tbb::concurrent_vector< T, A ></a><li>reader_writer_lock()
+: <a class="el" href="a00292.html#c1431c4293e777efd9aab9a95c2a46e1">tbb::interface5::reader_writer_lock</a><li>recursive_mutex()
+: <a class="el" href="a00296.html#d2fceb7f95c24a8cd1457d4527e4b8c6">tbb::recursive_mutex</a><li>recycle_as_child_of()
+: <a class="el" href="a00311.html#db399855177438bbc9cc61d508dae8d2">tbb::task</a><li>recycle_as_continuation()
+: <a class="el" href="a00311.html#a67a79e18f62b43a623a00cfbd76db4c">tbb::task</a><li>recycle_as_safe_continuation()
+: <a class="el" href="a00311.html#3b290d14109704e2b69dc1ac980a7a76">tbb::task</a><li>recycle_to_reexecute()
+: <a class="el" href="a00311.html#4f1be9bbcdb487830dbe298b68d85144">tbb::task</a><li>ref_count()
+: <a class="el" href="a00311.html#ad774f55eaec008ae02b236423209ced">tbb::task</a><li>register_pending_exception()
+: <a class="el" href="a00313.html#d97c8a03615594b71b4ef06ff75cf561">tbb::task_group_context</a><li>register_predecessor()
+: <a class="el" href="a00266.html#de70a0e88ce7655d8c14b6af57f7496f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00253.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00295.html#30e3316466efe3a713c23062b6e806f3">tbb::flow::interface6::receiver< T ></a><li>register_successor()
+: <a class="el" href="a00266.html#c76561d8d871b4769876988a4de12a9b">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00237.html#f8bf4944ede4fc106423d67715beb695">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00236.html#fd0324c9ddb51fe6f95b3d015d338941">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00304.html#22960d499df9f1569a9d8a544e35afe3">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
+: <a class="el" href="a00243.html#94758113d8993cfe5afdf2d63a728869">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>release()
+: <a class="el" href="a00308.html#61b14d00a78185c9b2d206ebfc379124">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#eeb615e68e963e6bf8d9c11402d0ce8e">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#ac480ea0e9d5ea0345a67d57008b6263">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00291.html#67ae221109ddc69510ab593874e435d4">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00289.html#3bf2b8c87ff22115be9b2eac179f2d30">tbb::qu [...]
+: <a class="el" href="a00266.html#c530e7b469454e2340460795f2da3317">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00253.html#cb691b18416d4742265aed84d496ebbd">tbb::flow::interface6::continue_receiver</a>, <a class="el" href="a00295.html#3bc76547b51d3c9b633e3987d22dce95">tbb::flow::interface6::receiver< T ></a><li>remove_successor()
+: <a class="el" href="a00266.html#275e328063c121b3e506ccef2a825d28">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00237.html#2074da0e39b9477c32897d6e5786196f">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00236.html#366efcc046ec08a104281109801ae629">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00304.html#222484bf295f39df36415a29e508e5c9">tbb::flow::interface6::source_node< Output ></a>, <a class=" [...]
+: <a class="el" href="a00250.html#d438b9b32ea3a8ffb703015b6dce055b">tbb::concurrent_vector< T, A ></a><li>reserve()
+: <a class="el" href="a00250.html#5a0ce05026994b010018f72cfdeb72c1">tbb::concurrent_vector< T, A ></a><li>reset()
+: <a class="el" href="a00313.html#6d30d16bf1cd22f86c6afaf29c2b430c">tbb::task_group_context</a><li>resize()
+: <a class="el" href="a00250.html#98ce6b2c6d2622f0c030b46dfac3880c">tbb::concurrent_vector< T, A ></a><li>root_task()
+: <a class="el" href="a00262.html#7f4e3ae90811a5d8b597146b5b586d10">tbb::flow::interface6::graph</a><li>rows()
+: <a class="el" href="a00235.html#1584623e59ff32a8aa82006827508be4">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>, <a class="el" href="a00234.html#f496e7348a82652fba581203477cc07c">tbb::blocked_range2d< RowValue, ColValue ></a><li>run()
+: <a class="el" href="a00284.html#93d7fec8cd607b803dd2d79fb46bd260">tbb::pipeline</a>, <a class="el" href="a00282.html#b32a0a6e5e09ebb7fad3e6652c19afe5">tbb::parallel_while< Body ></a>, <a class="el" href="a00262.html#c1145b00e063793a7e7bf994d202c7a0">tbb::flow::interface6::graph</a><li>runtime_loader()
+: <a class="el" href="a00298.html#7ae5330beb48fce0c702c32a5df0094a">tbb::interface6::runtime_loader</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x73.html b/doc/html/functions_func_0x73.html
index ca03ec2..ef5e94a 100644
--- a/doc/html/functions_func_0x73.html
+++ b/doc/html/functions_func_0x73.html
@@ -61,26 +61,28 @@
 <p>
 <h3><a class="anchor" name="index_s">- s -</a></h3><ul>
 <li>scoped_lock()
-: <a class="el" href="a00289.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00275.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00273.html#fbb8798792d3aebb136c46fc63d [...]
-: <a class="el" href="a00276.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
-: <a class="el" href="a00303.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
-: <a class="el" href="a00291.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>sequencer_node()
-: <a class="el" href="a00283.html#c3138c1c96b76ae9f13b0abbf7029590">tbb::sequencer_node< T ></a><li>set_affinity()
-: <a class="el" href="a00291.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
-: <a class="el" href="a00230.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_group_priority()
-: <a class="el" href="a00291.html#9ac8d1542d67d9d80121ff986801ac26">tbb::task</a><li>set_priority()
-: <a class="el" href="a00293.html#c4272d4d9ab65d600ca70fc2c8c4b039">tbb::task_group_context</a><li>set_ref_count()
-: <a class="el" href="a00291.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
-: <a class="el" href="a00258.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
-: <a class="el" href="a00238.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#28d113288fc7e0c04c9053ec7de61368">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>size()
-: <a class="el" href="a00243.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00238.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00230.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00235.html#8b2ae25c61338c6fd59e94fe09822ba5">tbb::interface5::concurrent_priority_queue< T,  [...]
-: <a class="el" href="a00285.html#0513272133a06db6742873671af98f21">tbb::source_node< Output ></a><li>spawn_and_wait_for_all()
-: <a class="el" href="a00291.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
-: <a class="el" href="a00291.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
-: <a class="el" href="a00286.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
-: <a class="el" href="a00288.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
-: <a class="el" href="a00291.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>swap()
-: <a class="el" href="a00238.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00235.html#0ecdc6a04aa259374425d424ca2a6082">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00231.html#076f8d9e16110aac5f558777aa744eb6">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
+: <a class="el" href="a00308.html#42a92d4f8fdde425b111cfa8a9228071">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#5ce6807050a9e8f87bcb4a65dccb12ef">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#dec17713c4c1321ac8fec66816d0c602">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00293.html#cf19f20e082887c1bb0ba6b0911c3583">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00291.html#fbb8798792d3aebb136c46fc63d [...]
+: <a class="el" href="a00294.html#87ab0dc8f7216e6ba0f7acd6aec33064">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>seconds()
+: <a class="el" href="a00324.html#d5d8429c0bc59cf6131b2abc7929fa59">tbb::tick_count::interval_t</a><li>self()
+: <a class="el" href="a00311.html#bd43e8d6249738efafd12d6a4c72c5e3">tbb::task</a><li>sequencer_node()
+: <a class="el" href="a00302.html#b38e7a070552960384bcc1d91af13a5c">tbb::flow::interface6::sequencer_node< T, A ></a><li>set_affinity()
+: <a class="el" href="a00311.html#dca19d7a45487a7d67a0db517e2b57c9">tbb::task</a><li>set_capacity()
+: <a class="el" href="a00242.html#f3c6c934f85fd02aedbc83a16943193b">tbb::concurrent_bounded_queue< T, A ></a><li>set_group_priority()
+: <a class="el" href="a00311.html#9ac8d1542d67d9d80121ff986801ac26">tbb::task</a><li>set_parent()
+: <a class="el" href="a00311.html#d2eaf79fcaa3ae473e3bd3f44bd8a464">tbb::task</a><li>set_priority()
+: <a class="el" href="a00313.html#c4272d4d9ab65d600ca70fc2c8c4b039">tbb::task_group_context</a><li>set_ref_count()
+: <a class="el" href="a00311.html#06a4206a57e8e12a439b14d6d41cfd92">tbb::task</a><li>set_state()
+: <a class="el" href="a00275.html#795649a185b0d6af6dc81c5f378616dd">tbb::mutex</a><li>shrink_to_fit()
+: <a class="el" href="a00250.html#03c6f4cf66532bf4cc907ee738a9a186">tbb::concurrent_vector< T, A ></a><li>size()
+: <a class="el" href="a00255.html#33fd6593da1ed14340f10f67d5a69130">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00250.html#715fe313c4a9c22731cc404dd80c9ec9">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00242.html#7dc14d1a579a4cccda9f857585e1768d">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00247.html#8b2ae25c61338c6fd59e94fe09822ba5">tbb::interface5::concurrent_priority_queue< T,  [...]
+: <a class="el" href="a00304.html#adaac111fbcace95804219a5f2929304">tbb::flow::interface6::source_node< Output ></a><li>spawn_and_wait_for_all()
+: <a class="el" href="a00311.html#894ab68378e502776d8220eea7ce9fa1">tbb::task</a><li>spawn_root_and_wait()
+: <a class="el" href="a00311.html#c33c7edbaec67aa8a56f48986a9dc69f">tbb::task</a><li>spin_mutex()
+: <a class="el" href="a00305.html#3d8fb44644fd8d41ada1fbeba7409be3">tbb::spin_mutex</a><li>spin_rw_mutex_v3()
+: <a class="el" href="a00307.html#61332b2756de89f3f5f69310cbb6e70c">tbb::spin_rw_mutex_v3</a><li>state()
+: <a class="el" href="a00311.html#0af7b2d7e6e8b4333b2accfce3dfb374">tbb::task</a><li>status()
+: <a class="el" href="a00298.html#78d938ed2e54d38dd38d6609e6c60389">tbb::interface6::runtime_loader</a><li>swap()
+: <a class="el" href="a00250.html#96c9c4bd968ed3edb8dd276854d2dae0">tbb::concurrent_vector< T, A ></a>, <a class="el" href="a00247.html#0ecdc6a04aa259374425d424ca2a6082">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00243.html#076f8d9e16110aac5f558777aa744eb6">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x74.html b/doc/html/functions_func_0x74.html
index b0a91d5..5b01f3f 100644
--- a/doc/html/functions_func_0x74.html
+++ b/doc/html/functions_func_0x74.html
@@ -61,25 +61,24 @@
 <p>
 <h3><a class="anchor" name="index_t">- t -</a></h3><ul>
 <li>task()
-: <a class="el" href="a00291.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
-: <a class="el" href="a00293.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
-: <a class="el" href="a00294.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
-: <a class="el" href="a00295.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
-: <a class="el" href="a00295.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
-: <a class="el" href="a00299.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00257.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00298.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
-: <a class="el" href="a00302.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
-: <a class="el" href="a00289.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00273.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00271.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
-: <a class="el" href="a00225.html#46b8b257a97e2192a2b11743279e8ffe">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#809f51859ca4dd04204591d76c8572eb">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#add46946c4c7330422733432e4032fac">tbb::sender< T ></a><li>try_get()
-: <a class="el" href="a00254.html#50c0e6465ac929a2e94d4e62a13ebeff">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, <a class="el" href="a00225.html#b68bdec127703dbfb2d93d685abbfd67">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#0434d2933ad082d3c43a4ec774150511">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#bf8c9235810354f3353a899c982645de">tbb::sender< T ></a><li>try_lock()
-: <a class="el" href="a00288.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00286.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00278.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00274.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00258.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
-: <a class="el" href="a00288.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00274.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
-: <a class="el" href="a00230.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#e036461a29cc40902a2bb79abf9f5146">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>try_process_item()
-: <a class="el" href="a00301.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
-: <a class="el" href="a00230.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a><li>try_put()
-: <a class="el" href="a00304.html#f316c0d5ff67068ff23b684accbe87f4">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#a38facb46cde854cb7408bf9f3bf8999">tbb::limiter_node< T ></a>, <a class="el" href="a00225.html#f74899ffb67687998168ad428f586b64">tbb::buffer_node< T ></a>, <a class="el" href="a00224.html#9b211e02554d6b39dc04f7e7f4e00073">tbb::broadcast_node< T ></a>, <a class="el" href="a00241.html#a7f8b9cc6286eb2cd8d429d6279da64d">tbb::contin [...]
-: <a class="el" href="a00225.html#435e29a66f0719d4822a0a8dc78a0405">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#3dd7e998aa3e7258b3b5731307df23a0">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#28c41df1c0c7ed485b4a691ec8f30098">tbb::sender< T ></a><li>try_reserve()
-: <a class="el" href="a00225.html#11ebad4c72082a1a03ecccd3afab4ae2">tbb::buffer_node< T ></a>, <a class="el" href="a00285.html#ecac0bb52cff61912dcd186647ccd1bf">tbb::source_node< Output ></a>, <a class="el" href="a00282.html#3506c7275aeeb2fc3ba5d5f10ee0adac">tbb::sender< T ></a><li>two_phase_port()
-: <a class="el" href="a00304.html#60e17ef935031c86c4a288eafab5c066">tbb::internal::two_phase_port< T ></a></ul>
+: <a class="el" href="a00311.html#2bce8ec6e44706e70128f5cf91b76e67">tbb::task</a><li>task_group_context()
+: <a class="el" href="a00313.html#19fee08fb8ac98adccfe69c1aa63c491">tbb::task_group_context</a><li>task_list()
+: <a class="el" href="a00315.html#416341c2047eaef50417b41eaf7e9de6">tbb::task_list</a><li>task_scheduler_init()
+: <a class="el" href="a00316.html#421600bf9bf9338bcf937063f2ff0e90">tbb::task_scheduler_init</a><li>terminate()
+: <a class="el" href="a00316.html#f73257e04cb7fb9bd5be2b635d9016f1">tbb::task_scheduler_init</a><li>throw_self()
+: <a class="el" href="a00320.html#292832fd5c523e3d8081a22247840a1d">tbb::internal::tbb_exception_ptr</a>, <a class="el" href="a00273.html#17cffba35811c92b7e65d63506b69602">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#2dd1be66ab32fa27e0ddef5707fa67ef">tbb::captured_exception</a>, <a class="el" href="a00319.html#8588e07fa49692f4d734e4f2e4f048f4">tbb::tbb_exception</a><li>tick_count()
+: <a class="el" href="a00323.html#34593326ae4191e02a13c7cbdab9de4c">tbb::tick_count</a><li>try_acquire()
+: <a class="el" href="a00308.html#9879626968d9b9a04cd2ec0fb2e84ae1">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#9297ec188534b45dc0ca48f2f39a0501">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#36bfc3e93e3ef6340abef4901444d340">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00291.html#2e4ff6c9ec2fee6682f95290d1f42baa">tbb::queuing_rw_mutex::scoped_lock</a>, <a class="el" href="a00289.html#e5a014fb817599386a87170cf2cf51a9">tbb::qu [...]
+: <a class="el" href="a00237.html#8ef07c434eb763d947a7b4e80c086a49">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#2c7fcc29e2894b29138be3c1edce9bc9">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#7b840f50da117a0d6848707c1857ea2e">tbb::flow::interface6::sender< T ></a><li>try_get()
+: <a class="el" href="a00237.html#aeb8aec46ca99ca022356a792c46735e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#41073ad4d3510ed5a8b6bda9c0f58636">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#922fb56b0aad090b90a98b7d56b76a59">tbb::flow::interface6::sender< T ></a><li>try_lock()
+: <a class="el" href="a00307.html#088bb256be794cc47d3b83791632fdfc">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00305.html#8f9a58fb56a2b4c5efe1a7f7c1ae2074">tbb::spin_mutex</a>, <a class="el" href="a00296.html#86e719b0afee25704af11ab97694d240">tbb::recursive_mutex</a>, <a class="el" href="a00292.html#721eb173e154ab38292273e9266a9b07">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00275.html#4331652c79dea1c1131bd59ab161b234">tbb::mutex</a><li>try_lock_read()
+: <a class="el" href="a00307.html#b8667415869013f840d976aa406d385a">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00292.html#595fb23952e3b89426b1f7938dea9b11">tbb::interface5::reader_writer_lock</a><li>try_pop()
+: <a class="el" href="a00242.html#0ca487019bbb00a196442aff78a1e4f7">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#ae31ca0db34ef96ef1e74aa0d28c95f8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#e036461a29cc40902a2bb79abf9f5146">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>try_process_item()
+: <a class="el" href="a00322.html#c4f90f2c771bce748beb9be734fa286c">tbb::thread_bound_filter</a><li>try_push()
+: <a class="el" href="a00242.html#2bd6232531279fb3ccbd296bea23066b">tbb::concurrent_bounded_queue< T, A ></a><li>try_put()
+: <a class="el" href="a00266.html#55a02d458a4d8ffa6accd7a70605da2f">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00237.html#2b02fe332e704bbe14f297802298b63a">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00236.html#29eb768c10b377880bbf83d31ee49acf">tbb::flow::interface6::broadcast_node< T ></a>, <a class="el" href="a00253.html#3969c70fb89c0a982f142ae9eb5facae">tbb::flow::interface6::continue_receiver</a>, <a class="el" href=" [...]
+: <a class="el" href="a00237.html#2c8e8f2f5f4ff5be27136cc1184a3c3e">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#494678baf9096835268736b800824460">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#27036b06d6a91e97007e14f400529199">tbb::flow::interface6::sender< T ></a><li>try_reserve()
+: <a class="el" href="a00237.html#1cc889bb6c38bcb81757d0ebbc3a5e64">tbb::flow::interface6::buffer_node< T, A ></a>, <a class="el" href="a00304.html#ad459713ff3c1c9ad0f4826daa141f65">tbb::flow::interface6::source_node< Output ></a>, <a class="el" href="a00301.html#02c05b472271db1b68a48ea2618fa72f">tbb::flow::interface6::sender< T ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x75.html b/doc/html/functions_func_0x75.html
index e6ebc87..fb19c2b 100644
--- a/doc/html/functions_func_0x75.html
+++ b/doc/html/functions_func_0x75.html
@@ -61,9 +61,9 @@
 <p>
 <h3><a class="anchor" name="index_u">- u -</a></h3><ul>
 <li>unlock()
-: <a class="el" href="a00288.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00286.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00278.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00274.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00258.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
-: <a class="el" href="a00236.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
-: <a class="el" href="a00289.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00273.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
+: <a class="el" href="a00307.html#f9f52ead2098eb5fb12da59d5ae53b55">tbb::spin_rw_mutex_v3</a>, <a class="el" href="a00305.html#0e843ee6265f57f27d228ba91e7308ef">tbb::spin_mutex</a>, <a class="el" href="a00296.html#f0a96e26b7f074588dc31e32524856ae">tbb::recursive_mutex</a>, <a class="el" href="a00292.html#5113b32689305599b2c36b5831547704">tbb::interface5::reader_writer_lock</a>, <a class="el" href="a00275.html#5fc9ef443ae75d966695546be399cc6b">tbb::mutex</a><li>unsafe_size()
+: <a class="el" href="a00248.html#eaa35a5274606779802e9a669a706260">tbb::strict_ppl::concurrent_queue< T, A ></a><li>upgrade_to_writer()
+: <a class="el" href="a00308.html#3f0b1e3f2efab63336400348bd070226">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00291.html#11ba1da4a722c9e6f73339a52c487e82">tbb::queuing_rw_mutex::scoped_lock</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x77.html b/doc/html/functions_func_0x77.html
index 3c76237..4d904d2 100644
--- a/doc/html/functions_func_0x77.html
+++ b/doc/html/functions_func_0x77.html
@@ -61,8 +61,8 @@
 <p>
 <h3><a class="anchor" name="index_w">- w -</a></h3><ul>
 <li>wait_for_all()
-: <a class="el" href="a00291.html#53d2615ad9c38859b4c8080936600283">tbb::task</a>, <a class="el" href="a00250.html#bafd6349fdc6563ffa02746866e30bec">tbb::graph</a><li>what()
-: <a class="el" href="a00257.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00228.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00298.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
+: <a class="el" href="a00311.html#53d2615ad9c38859b4c8080936600283">tbb::task</a>, <a class="el" href="a00262.html#a66b0020f7514b86d030fa8aea073d37">tbb::flow::interface6::graph</a><li>what()
+: <a class="el" href="a00273.html#b33a89bccf0c63106f1270c7bfaaf54f">tbb::movable_exception< ExceptionData ></a>, <a class="el" href="a00240.html#6b5988ef74a1fe2a58998d110b3633e0">tbb::captured_exception</a>, <a class="el" href="a00319.html#e8157689ecb66bc6c72d3618bf3cc371">tbb::tbb_exception</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_func_0x7e.html b/doc/html/functions_func_0x7e.html
index 69f38a5..5f016b1 100644
--- a/doc/html/functions_func_0x7e.html
+++ b/doc/html/functions_func_0x7e.html
@@ -61,29 +61,31 @@
 <p>
 <h3><a class="anchor" name="index_~">- ~ -</a></h3><ul>
 <li>~combinable()
-: <a class="el" href="a00229.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
-: <a class="el" href="a00230.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
-: <a class="el" href="a00231.html#2aa8e2d28d5af1284cf78d20a9c22731">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
-: <a class="el" href="a00236.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
-: <a class="el" href="a00238.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
-: <a class="el" href="a00234.html#928769b139d53427e7075c1f86148e4c">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~continue_receiver()
-: <a class="el" href="a00241.html#9a38edb7e1e3c9be4e3848145c51a617">tbb::continue_receiver</a><li>~enumerable_thread_specific()
-: <a class="el" href="a00243.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
-: <a class="el" href="a00245.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~graph()
-: <a class="el" href="a00250.html#55332084e7884a26ff288b8fe960030d">tbb::graph</a><li>~parallel_while()
-: <a class="el" href="a00265.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
-: <a class="el" href="a00266.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
-: <a class="el" href="a00272.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
-: <a class="el" href="a00274.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~receiver()
-: <a class="el" href="a00277.html#18f74b83abae0ee1e4ce07942797ef27">tbb::receiver< T ></a><li>~scoped_lock()
-: <a class="el" href="a00289.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00287.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00279.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00275.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00273.html#32c7d67a660d23ebbaab1a1d282 [...]
-: <a class="el" href="a00276.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~sequencer_node()
-: <a class="el" href="a00283.html#c87d80feebaf2bae4af22b5f2459b37e">tbb::sequencer_node< T ></a><li>~source_node()
-: <a class="el" href="a00285.html#90c94a8a52cc3d19cf393ce289e80733">tbb::source_node< Output ></a><li>~spin_rw_mutex_v3()
-: <a class="el" href="a00288.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
-: <a class="el" href="a00291.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
-: <a class="el" href="a00294.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
-: <a class="el" href="a00295.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
+: <a class="el" href="a00241.html#2c87e79ae98588a5780f708773388843">tbb::combinable< T ></a><li>~concurrent_bounded_queue()
+: <a class="el" href="a00242.html#acaf5b510dc0dfc7780b8c956cf773cf">tbb::concurrent_bounded_queue< T, A ></a><li>~concurrent_hash_map()
+: <a class="el" href="a00243.html#2aa8e2d28d5af1284cf78d20a9c22731">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a><li>~concurrent_queue()
+: <a class="el" href="a00248.html#830b33753d6b149c366344e29b2edd8c">tbb::strict_ppl::concurrent_queue< T, A ></a><li>~concurrent_vector()
+: <a class="el" href="a00250.html#da2444b28bb840d38f60d0030333a5fc">tbb::concurrent_vector< T, A ></a><li>~const_accessor()
+: <a class="el" href="a00246.html#928769b139d53427e7075c1f86148e4c">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a><li>~continue_receiver()
+: <a class="el" href="a00253.html#1e14828fa079b9835ff7267df5ee45d7">tbb::flow::interface6::continue_receiver</a><li>~enumerable_thread_specific()
+: <a class="el" href="a00255.html#5a7907d9e3e5b18e7a7b55211ef3213f">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a><li>~filter()
+: <a class="el" href="a00256.html#66d159f362293e3964ba3da8bc1d2604">tbb::filter</a><li>~graph()
+: <a class="el" href="a00262.html#8a7d424c0616a1c37a908ead182e2fe5">tbb::flow::interface6::graph</a><li>~memory_pool()
+: <a class="el" href="a00269.html#fdad7c4ed08332ec384491a71b721957">tbb::interface6::memory_pool< Alloc ></a><li>~parallel_while()
+: <a class="el" href="a00282.html#6fcfc973cc56b79c6d0fbb8a31be7e84">tbb::parallel_while< Body ></a><li>~pipeline()
+: <a class="el" href="a00284.html#49513c6c24f9d5bbbb27edca5efe01c9">tbb::pipeline</a><li>~queuing_rw_mutex()
+: <a class="el" href="a00290.html#1ba73e3d95cfdf8323880bc623af9099">tbb::queuing_rw_mutex</a><li>~reader_writer_lock()
+: <a class="el" href="a00292.html#5135f64f7b7339017f33d956445edbee">tbb::interface5::reader_writer_lock</a><li>~receiver()
+: <a class="el" href="a00295.html#b00699b235435f7b65b663d5063624a1">tbb::flow::interface6::receiver< T ></a><li>~runtime_loader()
+: <a class="el" href="a00298.html#c25fec923a751a3e03f5cbe969f1f0c5">tbb::interface6::runtime_loader</a><li>~scoped_lock()
+: <a class="el" href="a00308.html#d7eaaa3f2e2c5dc11e7005811b1bdd04">tbb::spin_rw_mutex_v3::scoped_lock</a>, <a class="el" href="a00306.html#ac6fa425d1f06c56d8b70abc51aac844">tbb::spin_mutex::scoped_lock</a>, <a class="el" href="a00297.html#c1197ffb8f3cd9d4fed71d7e06265b7c">tbb::recursive_mutex::scoped_lock</a>, <a class="el" href="a00293.html#70246e0260493625ff956fa5926fc71f">tbb::interface5::reader_writer_lock::scoped_lock</a>, <a class="el" href="a00291.html#32c7d67a660d23ebbaab1a1d282 [...]
+: <a class="el" href="a00294.html#bd21c5f3d555d64d1de8658e15bf4966">tbb::interface5::reader_writer_lock::scoped_lock_read</a><li>~sequencer_node()
+: <a class="el" href="a00302.html#93d3d8f6a72b3e1387047282116ed6ee">tbb::flow::interface6::sequencer_node< T, A ></a><li>~source_node()
+: <a class="el" href="a00304.html#61700b0865fc17188b0abe26bbde65b6">tbb::flow::interface6::source_node< Output ></a><li>~spin_rw_mutex_v3()
+: <a class="el" href="a00307.html#9a815fb2759e55072ed413f1b6970cf3">tbb::spin_rw_mutex_v3</a><li>~task()
+: <a class="el" href="a00311.html#98245ee0473f84cb19dbbf8c81134908">tbb::task</a><li>~task_list()
+: <a class="el" href="a00315.html#6d438f1499a02db1e59c24ab6043e5ba">tbb::task_list</a><li>~task_scheduler_init()
+: <a class="el" href="a00316.html#4da6c86292d80c703a66c1f6f5299488">tbb::task_scheduler_init</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_rela.html b/doc/html/functions_rela.html
index 730db22..b41cc37 100644
--- a/doc/html/functions_rela.html
+++ b/doc/html/functions_rela.html
@@ -35,9 +35,9 @@
 <p>
 <ul>
 <li>make_filter
-: <a class="el" href="a00246.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface6::filter_t< T, U ></a><li>operator+
-: <a class="el" href="a00303.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator-
-: <a class="el" href="a00302.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00303.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a></ul>
+: <a class="el" href="a00257.html#85c2892eff1fddcd06e28911e75838bd">tbb::interface6::filter_t< T, U ></a><li>operator+
+: <a class="el" href="a00324.html#5871ead1ca230efbe52a5008470e6428">tbb::tick_count::interval_t</a><li>operator-
+: <a class="el" href="a00323.html#09dde78a4100800c11bb883d6204b586">tbb::tick_count</a>, <a class="el" href="a00324.html#fa509691e1d689830931e36edd274f76">tbb::tick_count::interval_t</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_type.html b/doc/html/functions_type.html
index 807d610..e92554c 100644
--- a/doc/html/functions_type.html
+++ b/doc/html/functions_type.html
@@ -35,21 +35,21 @@
 <p>
 <ul>
 <li>affinity_id
-: <a class="el" href="a00291.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocator_type
-: <a class="el" href="a00296.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00243.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00230.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a c [...]
-: <a class="el" href="a00221.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
-: <a class="el" href="a00230.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#a4ded8601a434098605be0dcc4febc60">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>difference_type
-: <a class="el" href="a00230.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#77399bc76b3ecd60e33f7e35a5becd87">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>input_type
-: <a class="el" href="a00304.html#0f464d59e15941d6d625e8c7d634e26b">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#f654b8974c613e8fd3de5a40e181d5ff">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#40fdedd4829aeae3ebd1a5fdaf39b23d">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#a73e4a3ae6c430281f08226d448ebfc8">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#27016487003a4ff2908748c3cf11 [...]
-: <a class="el" href="a00278.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00258.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>output_type
-: <a class="el" href="a00254.html#578893d923f91b7e44a15dea8b0d7082">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, <a class="el" href="a00255.html#370f88278dec6f584c1d08a375f9b4cd">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#3b3fa4479416e7cb6d4a6a4b175c2b15">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#0c613bb01103dfcfbc3f9cbe943f95b0">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#d2 [...]
-: <a class="el" href="a00223.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>predecessor_type
-: <a class="el" href="a00304.html#37ee9b5320b631c39bccc0b4745d88d1">tbb::internal::two_phase_port< T ></a>, <a class="el" href="a00255.html#fd88ce7670e7107aef2161b45f156185">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#98900a87758cac05500fcbc74113cebf">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#6581686ef0cf8e13c0270687628af5eb">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#83bc7308a38f1d205377d78ec149 [...]
-: <a class="el" href="a00230.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#5804b3c708ef4e50d603f918ef2b9e58">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>row_range_type
-: <a class="el" href="a00222.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>size_type
-: <a class="el" href="a00230.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#b679eea8d01d041625a39f719ca2b7ed">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00221.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>successor_type
-: <a class="el" href="a00254.html#1212cbaa293a93c3bf334da1539556bd">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>, <a class="el" href="a00255.html#754182cc1e5b403201495bc1fd45674b">tbb::limiter_node< T ></a>, <a class="el" href="a00268.html#e01014f2e5ceea292c68f6fe47391c57">tbb::priority_queue_node< T, Compare ></a>, <a class="el" href="a00283.html#3591313e30d0f485a09106686067411f">tbb::sequencer_node< T ></a>, <a class="el" href="a00269.html#c3 [...]
-: <a class="el" href="a00265.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00230.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00236.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00235.html#7c611a6b5b8f94b0e7f2afc97e31efb1">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el"  [...]
+: <a class="el" href="a00311.html#d61bb32389d3857bf7511d69beaafb76">tbb::task</a><li>allocator_type
+: <a class="el" href="a00317.html#78701e7454ef8e1a25b5acd364367080">tbb::tbb_allocator< T ></a>, <a class="el" href="a00255.html#3c03eb40955b933b01987222722ac4bd">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>, <a class="el" href="a00242.html#2e2726fccf6d975dc1071608cc0bbf90">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#5a3956341728eaa558d8827063718cac">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a c [...]
+: <a class="el" href="a00233.html#1a8d05842c2b3dfc177bc4d347e4cef7">tbb::blocked_range< Value ></a><li>const_reference
+: <a class="el" href="a00242.html#796713d0b9ba93a4721cbe13e4474068">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#4d48e7ff93f81636bca2c74f7da34750">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#a4ded8601a434098605be0dcc4febc60">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>difference_type
+: <a class="el" href="a00242.html#4b45c91297e69515d83d5eef85ae1f49">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#068576d16c7e4e05d52f9db7a45b5b65">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#77399bc76b3ecd60e33f7e35a5becd87">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>input_type
+: <a class="el" href="a00266.html#035196d3c9240ef041f528ebcde8baa7">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#b2829b518979874ad3d2a939e14ae7bd">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#af629f26832ff4e476e240637a78bc0c">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#1e71030845210b6c4c7380eb9e11a2ac">tbb::flow::interface6::queue_node< T, A &gt [...]
+: <a class="el" href="a00296.html#889fa8cc32dd707eef7c0f52dda09c0d">tbb::recursive_mutex</a>, <a class="el" href="a00275.html#9f1ec84d5815263ceae853f06ddb4cac">tbb::mutex</a><li>output_type
+: <a class="el" href="a00266.html#6e67fc480147c0b88a483b85db6457b0">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#2cb099b590246b6bc93cc15e78c6ee5c">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#ca026eaef70e35791c407323199031a7">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#25b5a53ab1f9a342644fa3759bc0b1ad">tbb::flow::interface6::queue_node< T, A &gt [...]
+: <a class="el" href="a00235.html#b8ebf17a552ba47825e9b3887855b719">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a><li>predecessor_type
+: <a class="el" href="a00266.html#f89fcf44f38eb33f965ee5362d3e68e9">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#fdea783bf9d5a4c98e794ac7e0f84ccf">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#8127e36811832563fe1e9bc3ba391f79">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#5e2fdd33c45d44549dee9c1638e19898">tbb::flow::interface6::queue_node< T, A &gt [...]
+: <a class="el" href="a00242.html#dcd44ca6a88c0dc7a847a47a10811f0c">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#a8d725c50a9834bb7af5b67c0aff92b8">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#5804b3c708ef4e50d603f918ef2b9e58">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a><li>row_range_type
+: <a class="el" href="a00234.html#a807a22fe658ec38b8edfd69521d0383">tbb::blocked_range2d< RowValue, ColValue ></a><li>size_type
+: <a class="el" href="a00242.html#a80e4c11dbb324e4b92a24a77bbcde68">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#8fc30e93f8342a1960357f71e4fe8a2b">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#b679eea8d01d041625a39f719ca2b7ed">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el" href="a00233.html#f5707bffea38eee5c9680f37358afb8e">tbb::blocked_range< Value ></a><li>successor_type
+: <a class="el" href="a00266.html#e8945e4dd6ea759ff9e4735da13f12ef">tbb::flow::interface6::limiter_node< T ></a>, <a class="el" href="a00286.html#09ab5064ca8192e68c03da47603e68eb">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>, <a class="el" href="a00302.html#795f3ee75f133b9d3b159172fc4a197f">tbb::flow::interface6::sequencer_node< T, A ></a>, <a class="el" href="a00287.html#f35076a19f256f9e7a61bed77ca1ccc5">tbb::flow::interface6::queue_node< T, A &gt [...]
+: <a class="el" href="a00282.html#fa297e53d3af2a101e712bc200233e9c">tbb::parallel_while< Body ></a>, <a class="el" href="a00242.html#98245517a931e5893f6601e66c51fc75">tbb::concurrent_bounded_queue< T, A ></a>, <a class="el" href="a00248.html#682c3978d5cb0620000994f11c44a476">tbb::strict_ppl::concurrent_queue< T, A ></a>, <a class="el" href="a00247.html#7c611a6b5b8f94b0e7f2afc97e31efb1">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>, <a class="el"  [...]
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html
index ff417cd..76c4d9c 100644
--- a/doc/html/functions_vars.html
+++ b/doc/html/functions_vars.html
@@ -35,17 +35,17 @@
 <p>
 <ul>
 <li>automatic
-: <a class="el" href="a00295.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a><li>decrement
-: <a class="el" href="a00255.html#181fa37d3e3c68ec3819ea46beed79a2">tbb::limiter_node< T ></a><li>deferred
-: <a class="el" href="a00295.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>exact_exception_propagation
-: <a class="el" href="a00245.html#f17200974c33be21f42a5f00893de028">tbb::filter</a><li>filter_is_bound
-: <a class="el" href="a00245.html#dd6a6e7210efc9bcaf2c5e08767d92b5">tbb::filter</a><li>filter_is_out_of_order
-: <a class="el" href="a00245.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter</a><li>filter_is_serial
-: <a class="el" href="a00245.html#4b7de3a76e744f3d9c1bc5d437ea851d">tbb::filter</a><li>filter_may_emit_null
-: <a class="el" href="a00245.html#bdd02a434a6e7499dd1e8f43aae96793">tbb::filter</a><li>is_writer
-: <a class="el" href="a00233.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00289.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a><li>mutex
-: <a class="el" href="a00258.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00289.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a><li>my_exception_data
-: <a class="el" href="a00257.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
+: <a class="el" href="a00316.html#8f5988e2b0fbb2d533fcbb7f2583743f">tbb::task_scheduler_init</a><li>decrement
+: <a class="el" href="a00266.html#a3344b2461966631b6ee34b79fb105c7">tbb::flow::interface6::limiter_node< T ></a><li>deferred
+: <a class="el" href="a00316.html#e6c860f1e559026ff3ef4599c0d6c514">tbb::task_scheduler_init</a><li>exact_exception_propagation
+: <a class="el" href="a00256.html#f17200974c33be21f42a5f00893de028">tbb::filter</a><li>filter_is_bound
+: <a class="el" href="a00256.html#dd6a6e7210efc9bcaf2c5e08767d92b5">tbb::filter</a><li>filter_is_out_of_order
+: <a class="el" href="a00256.html#2e5eb65f95d8050186278077e433c5b1">tbb::filter</a><li>filter_is_serial
+: <a class="el" href="a00256.html#4b7de3a76e744f3d9c1bc5d437ea851d">tbb::filter</a><li>filter_may_emit_null
+: <a class="el" href="a00256.html#bdd02a434a6e7499dd1e8f43aae96793">tbb::filter</a><li>is_writer
+: <a class="el" href="a00245.html#07d958f151a0eaa92f50fd56ad6440e2">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>, <a class="el" href="a00308.html#6b5a7c3c67a36b05c4df8410d32627d8">tbb::spin_rw_mutex_v3::scoped_lock</a><li>mutex
+: <a class="el" href="a00275.html#05313cb77d4f85213103d4dab74ed454">tbb::mutex</a>, <a class="el" href="a00308.html#d96d1a1fcc3d79ef3e5c06a53b8ffeaa">tbb::spin_rw_mutex_v3::scoped_lock</a><li>my_exception_data
+: <a class="el" href="a00273.html#a8c0ae2089ae784b28907cf748b89416">tbb::movable_exception< ExceptionData ></a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/globals.html b/doc/html/globals.html
index 428e922..3165200 100644
--- a/doc/html/globals.html
+++ b/doc/html/globals.html
@@ -28,18 +28,16 @@
 Here is a list of all documented file members with links to the documentation:
 <p>
 <ul>
-<li>make_edge()
-: <a class="el" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">graph.h</a><li>make_edges()
-: <a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">graph.h</a><li>scalable_aligned_free()
-: <a class="el" href="a00373.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
-: <a class="el" href="a00373.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
-: <a class="el" href="a00373.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
-: <a class="el" href="a00373.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
-: <a class="el" href="a00373.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
-: <a class="el" href="a00373.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
-: <a class="el" href="a00373.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
-: <a class="el" href="a00373.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
-: <a class="el" href="a00373.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
+<li>scalable_aligned_free()
+: <a class="el" href="a00397.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
+: <a class="el" href="a00397.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
+: <a class="el" href="a00397.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
+: <a class="el" href="a00397.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
+: <a class="el" href="a00397.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
+: <a class="el" href="a00397.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
+: <a class="el" href="a00397.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
+: <a class="el" href="a00397.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
+: <a class="el" href="a00397.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html
index 7a70e40..e9eed12 100644
--- a/doc/html/globals_func.html
+++ b/doc/html/globals_func.html
@@ -28,18 +28,16 @@
  
 <p>
 <ul>
-<li>make_edge()
-: <a class="el" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">graph.h</a><li>make_edges()
-: <a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">graph.h</a><li>scalable_aligned_free()
-: <a class="el" href="a00373.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
-: <a class="el" href="a00373.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
-: <a class="el" href="a00373.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
-: <a class="el" href="a00373.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
-: <a class="el" href="a00373.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
-: <a class="el" href="a00373.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
-: <a class="el" href="a00373.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
-: <a class="el" href="a00373.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
-: <a class="el" href="a00373.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
+<li>scalable_aligned_free()
+: <a class="el" href="a00397.html#g65a20e812012f15ec7442d5b45d0cba5">scalable_allocator.h</a><li>scalable_aligned_malloc()
+: <a class="el" href="a00397.html#gc1c7aaa1fe85c17ba5a3a96f7e8d89e7">scalable_allocator.h</a><li>scalable_aligned_realloc()
+: <a class="el" href="a00397.html#gbaea91376be80dfabd7c93eaffd9abaa">scalable_allocator.h</a><li>scalable_calloc()
+: <a class="el" href="a00397.html#g3f5a2fde0bcaa3eda35be32c8658f444">scalable_allocator.h</a><li>scalable_free()
+: <a class="el" href="a00397.html#gca3579c21244dba9f0c351e5984d4565">scalable_allocator.h</a><li>scalable_malloc()
+: <a class="el" href="a00397.html#gc25b8e6c76db0b346a8249796a7a2475">scalable_allocator.h</a><li>scalable_msize()
+: <a class="el" href="a00397.html#g0965ce1b4b7835f92869c7fd867265f7">scalable_allocator.h</a><li>scalable_posix_memalign()
+: <a class="el" href="a00397.html#g05dcec987480bb2c82ecdead6a085899">scalable_allocator.h</a><li>scalable_realloc()
+: <a class="el" href="a00397.html#g951bbbbd2d041acb59ba5fa910b52543">scalable_allocator.h</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html
index 4b094d7..b684037 100644
--- a/doc/html/hierarchy.html
+++ b/doc/html/hierarchy.html
@@ -21,187 +21,149 @@
     <li><a href="functions.html"><span>Class Members</span></a></li>
   </ul></div>
 <h1>Class Hierarchy</h1>This inheritance list is sorted roughly, but not completely, alphabetically:<ul>
-<li><a class="el" href="a00212.html">tbb::affinity_partitioner</a>
-<li><a class="el" href="a00213.html">tbb::interface6::internal::aggregated_operation< Derived ></a>
-<li><a class="el" href="a00214.html">tbb::interface6::internal::aggregator< handler_type, operation_type ></a>
-<li><a class="el" href="a00215.html">tbb::aligned_space< T, N ></a>
-<li><a class="el" href="a00216.html">tbb::atomic< T ></a>
-<li><a class="el" href="a00217.html">tbb::atomic< void * ></a>
-<li><a class="el" href="a00218.html">tbb::internal::atomic_backoff</a>
-<li><a class="el" href="a00219.html">tbb::auto_partitioner</a>
-<li><a class="el" href="a00220.html">tbb::bad_last_alloc</a>
-<li><a class="el" href="a00221.html">tbb::blocked_range< Value ></a>
-<li><a class="el" href="a00222.html">tbb::blocked_range2d< RowValue, ColValue ></a>
-<li><a class="el" href="a00223.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>
-<li><a class="el" href="a00221.html">tbb::blocked_range< I ></a>
-<li><a class="el" href="a00226.html">tbb::cache_aligned_allocator< T ></a>
-<li><a class="el" href="a00227.html">tbb::cache_aligned_allocator< void ></a>
-<li><a class="el" href="a00229.html">tbb::combinable< T ></a>
-<li><a class="el" href="a00230.html">tbb::concurrent_bounded_queue< T, A ></a>
+<li><a class="el" href="a00226.html">tbb::internal::affinity_partitioner_base_v3</a>
 <ul>
-<li><a class="el" href="a00237.html">tbb::deprecated::concurrent_queue< T, A ></a>
-</ul>
-<li><a class="el" href="a00231.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>
-<li><a class="el" href="a00233.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>
-<li><a class="el" href="a00234.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>
+<li><a class="el" href="a00225.html">tbb::affinity_partitioner</a>
+</ul>
+<li><a class="el" href="a00227.html">tbb::aligned_space< T, N ></a>
+<li><a class="el" href="a00228.html">tbb::atomic< T ></a>
+<li><a class="el" href="a00229.html">tbb::atomic< void * ></a>
+<li><a class="el" href="a00230.html">tbb::internal::atomic_backoff</a>
+<li><a class="el" href="a00231.html">tbb::auto_partitioner</a>
+<li><a class="el" href="a00232.html">tbb::bad_last_alloc</a>
+<li><a class="el" href="a00233.html">tbb::blocked_range< Value ></a>
+<li><a class="el" href="a00234.html">tbb::blocked_range2d< RowValue, ColValue ></a>
+<li><a class="el" href="a00235.html">tbb::blocked_range3d< PageValue, RowValue, ColValue ></a>
+<li><a class="el" href="a00233.html">tbb::blocked_range< I ></a>
+<li><a class="el" href="a00238.html">tbb::cache_aligned_allocator< T ></a>
+<li><a class="el" href="a00239.html">tbb::cache_aligned_allocator< void ></a>
+<li><a class="el" href="a00241.html">tbb::combinable< T ></a>
+<li><a class="el" href="a00242.html">tbb::concurrent_bounded_queue< T, A ></a>
 <ul>
-<li><a class="el" href="a00232.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>
+<li><a class="el" href="a00249.html">tbb::deprecated::concurrent_queue< T, A ></a>
 </ul>
-<li><a class="el" href="a00235.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>
-<li><a class="el" href="a00236.html">tbb::strict_ppl::concurrent_queue< T, A ></a>
-<li><a class="el" href="a00238.html">tbb::concurrent_vector< T, A ></a>
-<li><a class="el" href="a00239.html">tbb::continue_msg</a>
-<li><a class="el" href="a00243.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>
-<li><a class="el" href="a00245.html">tbb::filter</a>
+<li><a class="el" href="a00243.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator ></a>
+<li><a class="el" href="a00245.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::bucket_accessor</a>
+<li><a class="el" href="a00246.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::const_accessor</a>
+<ul>
+<li><a class="el" href="a00244.html">tbb::interface5::concurrent_hash_map< Key, T, HashCompare, Allocator >::accessor</a>
+</ul>
+<li><a class="el" href="a00247.html">tbb::interface5::concurrent_priority_queue< T, Compare, A ></a>
+<li><a class="el" href="a00248.html">tbb::strict_ppl::concurrent_queue< T, A ></a>
+<li><a class="el" href="a00250.html">tbb::concurrent_vector< T, A ></a>
+<li><a class="el" href="a00251.html">tbb::flow::interface6::continue_msg</a>
+<li><a class="el" href="a00255.html">tbb::interface6::enumerable_thread_specific< T, Allocator, ETS_key_type ></a>
+<li><a class="el" href="a00256.html">tbb::filter</a>
 <ul>
-<li><a class="el" href="a00301.html">tbb::thread_bound_filter</a>
+<li><a class="el" href="a00322.html">tbb::thread_bound_filter</a>
 </ul>
-<li><a class="el" href="a00246.html">tbb::interface6::filter_t< T, U ></a>
-<li><a class="el" href="a00247.html">tbb::final_scan_tag</a>
-<li><a class="el" href="a00248.html">tbb::interface6::flow_control</a>
-<li><a class="el" href="a00250.html">tbb::graph</a>
-<li><a class="el" href="a00251.html">tbb::graph_node</a>
+<li><a class="el" href="a00257.html">tbb::interface6::filter_t< T, U ></a>
+<li><a class="el" href="a00258.html">tbb::final_scan_tag</a>
+<li><a class="el" href="a00259.html">tbb::interface6::flow_control</a>
+<li><a class="el" href="a00262.html">tbb::flow::interface6::graph</a>
+<li><a class="el" href="a00263.html">tbb::flow::interface6::graph_node</a>
 <ul>
-<li><a class="el" href="a00224.html">tbb::broadcast_node< T ></a>
-<li><a class="el" href="a00225.html">tbb::buffer_node< T ></a>
+<li><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a>
+<li><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>
 <ul>
-<li><a class="el" href="a00268.html">tbb::priority_queue_node< T, Compare ></a>
-<li><a class="el" href="a00269.html">tbb::queue_node< T ></a>
+<li><a class="el" href="a00286.html">tbb::flow::interface6::priority_queue_node< T, Compare, A ></a>
+<li><a class="el" href="a00287.html">tbb::flow::interface6::queue_node< T, A ></a>
 <ul>
-<li><a class="el" href="a00283.html">tbb::sequencer_node< T ></a>
-</ul>
-</ul>
-<li><a class="el" href="a00244.html">tbb::executable_node< Output ></a>
-<ul>
-<li><a class="el" href="a00240.html">tbb::continue_node</a>
-</ul>
-<li><a class="el" href="a00244.html">tbb::executable_node< tbb::continue_msg ></a>
-<li><a class="el" href="a00249.html">tbb::function_node< Input, Output ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00255.html">tbb::limiter_node< T ></a>
-<li><a class="el" href="a00285.html">tbb::source_node< Output ></a>
-</ul>
-<li><a class="el" href="a00252.html">tbb::improper_lock</a>
-<li><b>atomic_impl</b><li><b>continue_input</b><ul>
-<li><a class="el" href="a00244.html">tbb::executable_node< tbb::continue_msg ></a>
+<li><a class="el" href="a00302.html">tbb::flow::interface6::sequencer_node< T, A ></a>
 </ul>
-<li><b>function_output</b><ul>
-<li><a class="el" href="a00244.html">tbb::executable_node< tbb::continue_msg ></a>
 </ul>
-<li><a class="el" href="a00253.html">tbb::invalid_multiple_scheduling</a>
-<li><b>join_node_FE</b><ul>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-</ul>
-<li><a class="el" href="a00256.html">tbb::missing_wait</a>
-<li><a class="el" href="a00258.html">tbb::mutex</a>
-<li><a class="el" href="a00259.html">tbb::mutex::scoped_lock</a>
-<li><b>no_copy</b><ul>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-</ul>
-<li><a class="el" href="a00260.html">tbb::null_mutex</a>
-<li><a class="el" href="a00261.html">tbb::null_mutex::scoped_lock</a>
-<li><a class="el" href="a00262.html">tbb::null_rw_mutex</a>
-<li><a class="el" href="a00263.html">tbb::null_rw_mutex::scoped_lock</a>
-<li><a class="el" href="a00264.html">tbb::parallel_do_feeder< Item ></a>
-<li><a class="el" href="a00265.html">tbb::parallel_while< Body ></a>
-<li><a class="el" href="a00266.html">tbb::pipeline</a>
-<li><a class="el" href="a00267.html">tbb::pre_scan_tag</a>
-<li><a class="el" href="a00270.html">tbb::queuing_mutex</a>
-<li><a class="el" href="a00271.html">tbb::queuing_mutex::scoped_lock</a>
-<li><a class="el" href="a00272.html">tbb::queuing_rw_mutex</a>
-<li><a class="el" href="a00273.html">tbb::queuing_rw_mutex::scoped_lock</a>
-<li><a class="el" href="a00274.html">tbb::interface5::reader_writer_lock</a>
-<li><a class="el" href="a00275.html">tbb::interface5::reader_writer_lock::scoped_lock</a>
-<li><a class="el" href="a00276.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>
-<li><a class="el" href="a00277.html">tbb::receiver< T ></a>
+<li><a class="el" href="a00252.html">tbb::flow::interface6::continue_node< Output ></a>
+<li><a class="el" href="a00260.html">tbb::flow::interface6::function_node< Input, Output,, Allocator ></a>
+<li><a class="el" href="a00261.html">tbb::flow::interface6::function_node< Input, Output, queueing, Allocator ></a>
+<li><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a>
+<li><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< Input, Output,, Allocator ></a>
+<li><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator ></a>
 <ul>
-<li><a class="el" href="a00224.html">tbb::broadcast_node< T ></a>
-<li><a class="el" href="a00225.html">tbb::buffer_node< T ></a>
-<li><a class="el" href="a00241.html">tbb::continue_receiver</a>
-<li><a class="el" href="a00304.html">tbb::internal::two_phase_port< T ></a>
-<li><a class="el" href="a00255.html">tbb::limiter_node< T ></a>
-</ul>
-<li><a class="el" href="a00277.html">tbb::receiver< tbb::continue_msg ></a>
-<li><a class="el" href="a00278.html">tbb::recursive_mutex</a>
-<li><a class="el" href="a00279.html">tbb::recursive_mutex::scoped_lock</a>
-<li><a class="el" href="a00280.html">tbb::scalable_allocator< T ></a>
-<li><a class="el" href="a00281.html">tbb::scalable_allocator< void ></a>
-<li><a class="el" href="a00282.html">tbb::sender< T ></a>
+<li><a class="el" href="a00310.html">tbb::flow::interface6::split_node< TupleType, Allocator ></a>
+</ul>
+<li><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a>
+</ul>
+<li><a class="el" href="a00264.html">tbb::improper_lock</a>
+<li><b>atomic_impl</b><li><b>multioutput_function_input</b><ul>
+<li><a class="el" href="a00274.html">tbb::flow::interface6::multioutput_function_node< TupleType, TupleType, rejecting, Allocator ></a>
+</ul>
+<li><a class="el" href="a00265.html">tbb::invalid_multiple_scheduling</a>
+<li><a class="el" href="a00267.html">tbb::internal::machine_load_store_relaxed< T, S ></a>
+<li><a class="el" href="a00268.html">tbb::internal::machine_load_store_seq_cst< T, 8 ></a>
+<li><a class="el" href="a00269.html">tbb::interface6::memory_pool< Alloc ></a>
+<li><a class="el" href="a00270.html">tbb::interface6::memory_pool_allocator< T, P ></a>
+<li><a class="el" href="a00271.html">tbb::interface6::memory_pool_allocator< void, P ></a>
+<li><a class="el" href="a00272.html">tbb::missing_wait</a>
+<li><a class="el" href="a00275.html">tbb::mutex</a>
+<li><a class="el" href="a00276.html">tbb::mutex::scoped_lock</a>
+<li><a class="el" href="a00277.html">tbb::null_mutex</a>
+<li><a class="el" href="a00278.html">tbb::null_mutex::scoped_lock</a>
+<li><a class="el" href="a00279.html">tbb::null_rw_mutex</a>
+<li><a class="el" href="a00280.html">tbb::null_rw_mutex::scoped_lock</a>
+<li><a class="el" href="a00281.html">tbb::parallel_do_feeder< Item ></a>
+<li><a class="el" href="a00282.html">tbb::parallel_while< Body ></a>
+<li><a class="el" href="a00283.html">tbb::internal::partition_type_base</a>
+<li><a class="el" href="a00284.html">tbb::pipeline</a>
+<li><a class="el" href="a00285.html">tbb::pre_scan_tag</a>
+<li><a class="el" href="a00288.html">tbb::queuing_mutex</a>
+<li><a class="el" href="a00289.html">tbb::queuing_mutex::scoped_lock</a>
+<li><a class="el" href="a00290.html">tbb::queuing_rw_mutex</a>
+<li><a class="el" href="a00291.html">tbb::queuing_rw_mutex::scoped_lock</a>
+<li><a class="el" href="a00292.html">tbb::interface5::reader_writer_lock</a>
+<li><a class="el" href="a00293.html">tbb::interface5::reader_writer_lock::scoped_lock</a>
+<li><a class="el" href="a00294.html">tbb::interface5::reader_writer_lock::scoped_lock_read</a>
+<li><a class="el" href="a00295.html">tbb::flow::interface6::receiver< T ></a>
 <ul>
-<li><a class="el" href="a00224.html">tbb::broadcast_node< T ></a>
-<li><a class="el" href="a00225.html">tbb::buffer_node< T ></a>
-<li><a class="el" href="a00255.html">tbb::limiter_node< T ></a>
-</ul>
-<li><a class="el" href="a00282.html">tbb::sender< Output ></a>
+<li><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a>
+<li><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>
+<li><a class="el" href="a00253.html">tbb::flow::interface6::continue_receiver</a>
+<li><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a>
+</ul>
+<li><a class="el" href="a00295.html">tbb::flow::interface6::receiver< tbb::flow::interface6::continue_msg ></a>
+<li><a class="el" href="a00296.html">tbb::recursive_mutex</a>
+<li><a class="el" href="a00297.html">tbb::recursive_mutex::scoped_lock</a>
+<li><a class="el" href="a00298.html">tbb::interface6::runtime_loader</a>
+<li><a class="el" href="a00299.html">tbb::scalable_allocator< T ></a>
+<li><a class="el" href="a00300.html">tbb::scalable_allocator< void ></a>
+<li><a class="el" href="a00301.html">tbb::flow::interface6::sender< T ></a>
 <ul>
-<li><a class="el" href="a00285.html">tbb::source_node< Output ></a>
+<li><a class="el" href="a00236.html">tbb::flow::interface6::broadcast_node< T ></a>
+<li><a class="el" href="a00237.html">tbb::flow::interface6::buffer_node< T, A ></a>
+<li><a class="el" href="a00266.html">tbb::flow::interface6::limiter_node< T ></a>
 </ul>
-<li><a class="el" href="a00282.html">tbb::sender< OutputTuple ></a>
+<li><a class="el" href="a00301.html">tbb::flow::interface6::sender< Output ></a>
 <ul>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< JP, InputTuple, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type > >, OutputTuple ></a>
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-<li><a class="el" href="a00254.html">tbb::internal::join_node_base< two_phase, std::tuple< tbb::internal::two_phase_port< std::tuple_element< 0, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 1, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 2, OutputTuple >::type >, tbb::internal::two_phase_port< std::tuple_element< 3, OutputTuple >::type >, tbb::internal::two_phase_port< std:: [...]
-</ul>
-<li><a class="el" href="a00284.html">tbb::simple_partitioner</a>
-<li><a class="el" href="a00286.html">tbb::spin_mutex</a>
-<li><a class="el" href="a00287.html">tbb::spin_mutex::scoped_lock</a>
-<li><a class="el" href="a00288.html">tbb::spin_rw_mutex_v3</a>
-<li><a class="el" href="a00289.html">tbb::spin_rw_mutex_v3::scoped_lock</a>
-<li><a class="el" href="a00290.html">tbb::split</a>
-<li><a class="el" href="a00291.html">tbb::task</a>
+<li><a class="el" href="a00304.html">tbb::flow::interface6::source_node< Output ></a>
+</ul>
+<li><a class="el" href="a00303.html">tbb::simple_partitioner</a>
+<li><a class="el" href="a00305.html">tbb::spin_mutex</a>
+<li><a class="el" href="a00306.html">tbb::spin_mutex::scoped_lock</a>
+<li><a class="el" href="a00307.html">tbb::spin_rw_mutex_v3</a>
+<li><a class="el" href="a00308.html">tbb::spin_rw_mutex_v3::scoped_lock</a>
+<li><a class="el" href="a00309.html">tbb::split</a>
+<li><a class="el" href="a00311.html">tbb::task</a>
 <ul>
-<li><a class="el" href="a00242.html">tbb::empty_task</a>
-</ul>
-<li><a class="el" href="a00292.html">tbb::interface5::internal::task_base</a>
-<li><a class="el" href="a00293.html">tbb::task_group_context</a>
-<li><a class="el" href="a00294.html">tbb::task_list</a>
-<li><a class="el" href="a00295.html">tbb::task_scheduler_init</a>
-<li><a class="el" href="a00296.html">tbb::tbb_allocator< T ></a>
-<li><a class="el" href="a00297.html">tbb::tbb_allocator< void ></a>
-<li><a class="el" href="a00298.html">tbb::tbb_exception</a>
+<li><a class="el" href="a00254.html">tbb::empty_task</a>
+</ul>
+<li><a class="el" href="a00312.html">tbb::interface5::internal::task_base</a>
+<li><a class="el" href="a00313.html">tbb::task_group_context</a>
+<li><a class="el" href="a00314.html">tbb::task_group_context</a>
+<li><a class="el" href="a00315.html">tbb::task_list</a>
+<li><a class="el" href="a00316.html">tbb::task_scheduler_init</a>
+<li><a class="el" href="a00317.html">tbb::tbb_allocator< T ></a>
+<li><a class="el" href="a00318.html">tbb::tbb_allocator< void ></a>
+<li><a class="el" href="a00319.html">tbb::tbb_exception</a>
 <ul>
-<li><a class="el" href="a00228.html">tbb::captured_exception</a>
-<li><a class="el" href="a00257.html">tbb::movable_exception< ExceptionData ></a>
-</ul>
-<li><a class="el" href="a00299.html">tbb::internal::tbb_exception_ptr</a>
-<li><a class="el" href="a00300.html">tbb::tbb_hash_compare< Key ></a>
-<li><a class="el" href="a00302.html">tbb::tick_count</a>
-<li><a class="el" href="a00303.html">tbb::tick_count::interval_t</a>
-<li><a class="el" href="a00305.html">tbb::internal::work_around_alignment_bug< Size, T ></a>
-<li><a class="el" href="a00306.html">tbb::zero_allocator< T, Allocator ></a>
-<li><a class="el" href="a00307.html">tbb::zero_allocator< void, Allocator ></a>
+<li><a class="el" href="a00240.html">tbb::captured_exception</a>
+<li><a class="el" href="a00273.html">tbb::movable_exception< ExceptionData ></a>
+</ul>
+<li><a class="el" href="a00320.html">tbb::internal::tbb_exception_ptr</a>
+<li><a class="el" href="a00321.html">tbb::tbb_hash_compare< Key ></a>
+<li><a class="el" href="a00323.html">tbb::tick_count</a>
+<li><a class="el" href="a00324.html">tbb::tick_count::interval_t</a>
+<li><a class="el" href="a00325.html">tbb::internal::work_around_alignment_bug< Size, T ></a>
+<li><a class="el" href="a00326.html">tbb::zero_allocator< T, Allocator ></a>
+<li><a class="el" href="a00327.html">tbb::zero_allocator< void, Allocator ></a>
 </ul>
 <hr>
 <p></p>
diff --git a/doc/html/modules.html b/doc/html/modules.html
index f80ae48..a92e814 100644
--- a/doc/html/modules.html
+++ b/doc/html/modules.html
@@ -15,12 +15,12 @@
     <li><a href="pages.html"><span>Related Pages</span></a></li>
   </ul></div>
 <h1>Modules</h1>Here is a list of all modules:<ul>
-<li><a class="el" href="a00371.html">Algorithms</a>
-<li><a class="el" href="a00372.html">Containers</a>
-<li><a class="el" href="a00373.html">Memory Allocation</a>
-<li><a class="el" href="a00374.html">Synchronization</a>
-<li><a class="el" href="a00375.html">Timing</a>
-<li><a class="el" href="a00376.html">Task Scheduling</a>
+<li><a class="el" href="a00395.html">Algorithms</a>
+<li><a class="el" href="a00396.html">Containers</a>
+<li><a class="el" href="a00397.html">Memory Allocation</a>
+<li><a class="el" href="a00398.html">Synchronization</a>
+<li><a class="el" href="a00399.html">Timing</a>
+<li><a class="el" href="a00400.html">Task Scheduling</a>
 </ul>
 <hr>
 <p></p>
diff --git a/doc/html/namespacemembers.html b/doc/html/namespacemembers.html
index b79d04c..64fed08 100644
--- a/doc/html/namespacemembers.html
+++ b/doc/html/namespacemembers.html
@@ -32,26 +32,26 @@ Here is a list of all documented namespace members with links to the namespaces
 <p>
 <ul>
 <li>__TBB_DECL_ATOMIC_ALT()
-: <a class="el" href="a00362.html#ad165cf61abbe349d413df2589679add">tbb</a><li>__TBB_full_fence
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">tbb</a><li>acquire
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>assertion_failure()
-: <a class="el" href="a00362.html#3d1252787be39b4aef311f1cadaff9e8">tbb</a><li>assertion_handler_type
-: <a class="el" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">tbb</a><li>atomic_fence()
-: <a class="el" href="a00362.html#250275615f10d5b5de6ad466ae2f54de">tbb</a><li>ets_key_usage_type
-: <a class="el" href="a00362.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>make_edge()
-: <a class="el" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">tbb</a><li>make_edges()
-: <a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">tbb</a><li>memory_semantics
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fef">tbb</a><li>parallel_do()
-: <a class="el" href="a00371.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
-: <a class="el" href="a00370.html#490399525b1e690ec31d6db964c6b272">tbb::strict_ppl</a>, <a class="el" href="a00371.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
-: <a class="el" href="a00371.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
-: <a class="el" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
-: <a class="el" href="a00371.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
-: <a class="el" href="a00371.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
-: <a class="el" href="a00371.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>release
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a><li>set_assertion_handler()
-: <a class="el" href="a00362.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>TBB_runtime_interface_version()
-: <a class="el" href="a00362.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
+: <a class="el" href="a00383.html#ad165cf61abbe349d413df2589679add">tbb</a><li>acquire
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>assertion_failure()
+: <a class="el" href="a00383.html#3d1252787be39b4aef311f1cadaff9e8">tbb</a><li>assertion_handler_type
+: <a class="el" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">tbb</a><li>atomic_fence()
+: <a class="el" href="a00383.html#250275615f10d5b5de6ad466ae2f54de">tbb</a><li>ets_key_usage_type
+: <a class="el" href="a00383.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>full_fence
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">tbb</a><li>memory_semantics
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef">tbb</a><li>parallel_deterministic_reduce()
+: <a class="el" href="a00395.html#g0a66bc67567b2d01d709b59b9bddf84a">tbb</a><li>parallel_do()
+: <a class="el" href="a00395.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
+: <a class="el" href="a00395.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
+: <a class="el" href="a00395.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
+: <a class="el" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
+: <a class="el" href="a00395.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
+: <a class="el" href="a00395.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
+: <a class="el" href="a00395.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>relaxed
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">tbb</a><li>release
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a><li>set_assertion_handler()
+: <a class="el" href="a00383.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>TBB_runtime_interface_version()
+: <a class="el" href="a00383.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/namespacemembers_enum.html b/doc/html/namespacemembers_enum.html
index 9b77301..b9bb315 100644
--- a/doc/html/namespacemembers_enum.html
+++ b/doc/html/namespacemembers_enum.html
@@ -32,8 +32,8 @@
 <p>
 <ul>
 <li>ets_key_usage_type
-: <a class="el" href="a00362.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>memory_semantics
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fef">tbb</a></ul>
+: <a class="el" href="a00383.html#a8622ae61b7e7737dac26542e181178e">tbb</a><li>memory_semantics
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef">tbb</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/namespacemembers_eval.html b/doc/html/namespacemembers_eval.html
index f4ac168..921c79f 100644
--- a/doc/html/namespacemembers_eval.html
+++ b/doc/html/namespacemembers_eval.html
@@ -31,10 +31,11 @@
  
 <p>
 <ul>
-<li>__TBB_full_fence
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fefc6db01678b1749dff7554688d079520c">tbb</a><li>acquire
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>release
-: <a class="el" href="a00362.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a></ul>
+<li>acquire
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef5f1fafe8d229d348ff91d937f64e79c7">tbb</a><li>full_fence
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fef07b959f69a4f70d821c67b85316803ff">tbb</a><li>relaxed
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fefaba4b1574646947f1b519188a93c1900">tbb</a><li>release
+: <a class="el" href="a00383.html#a8686246bb5d3664bd07563749970fefaa1fa107db0245c41fb109d976ae8d70">tbb</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/namespacemembers_func.html b/doc/html/namespacemembers_func.html
index 022da27..056f2b6 100644
--- a/doc/html/namespacemembers_func.html
+++ b/doc/html/namespacemembers_func.html
@@ -32,20 +32,19 @@
 <p>
 <ul>
 <li>__TBB_DECL_ATOMIC_ALT()
-: <a class="el" href="a00362.html#ad165cf61abbe349d413df2589679add">tbb</a><li>assertion_failure()
-: <a class="el" href="a00362.html#3d1252787be39b4aef311f1cadaff9e8">tbb</a><li>atomic_fence()
-: <a class="el" href="a00362.html#250275615f10d5b5de6ad466ae2f54de">tbb</a><li>make_edge()
-: <a class="el" href="a00362.html#0a5a2559e7d28a9bf8f9e5e60d745e86">tbb</a><li>make_edges()
-: <a class="el" href="a00362.html#9368d2f689961f790bf7aa4a8cc1135e">tbb</a><li>parallel_do()
-: <a class="el" href="a00371.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
-: <a class="el" href="a00370.html#490399525b1e690ec31d6db964c6b272">tbb::strict_ppl</a>, <a class="el" href="a00371.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
-: <a class="el" href="a00371.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
-: <a class="el" href="a00371.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
-: <a class="el" href="a00371.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
-: <a class="el" href="a00371.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
-: <a class="el" href="a00371.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>set_assertion_handler()
-: <a class="el" href="a00362.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>TBB_runtime_interface_version()
-: <a class="el" href="a00362.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
+: <a class="el" href="a00383.html#ad165cf61abbe349d413df2589679add">tbb</a><li>assertion_failure()
+: <a class="el" href="a00383.html#3d1252787be39b4aef311f1cadaff9e8">tbb</a><li>atomic_fence()
+: <a class="el" href="a00383.html#250275615f10d5b5de6ad466ae2f54de">tbb</a><li>parallel_deterministic_reduce()
+: <a class="el" href="a00395.html#g0a66bc67567b2d01d709b59b9bddf84a">tbb</a><li>parallel_do()
+: <a class="el" href="a00395.html#g2617dc9b88b3285a7212599d49f74228">tbb</a><li>parallel_for()
+: <a class="el" href="a00395.html#g04b4696b67370c01353ff5974c8f1196">tbb</a><li>parallel_for_each()
+: <a class="el" href="a00395.html#gc2d710ca573f0a9bd94379cba3772def">tbb</a><li>parallel_invoke()
+: <a class="el" href="a00395.html#gd3e2998f171494f94c2103f4eb924084">tbb</a><li>parallel_reduce()
+: <a class="el" href="a00395.html#g496bd7eadb3b97495ccb5655ef90319e">tbb</a><li>parallel_scan()
+: <a class="el" href="a00395.html#g62fde400a37bbca1a2fddc8e3d22f556">tbb</a><li>parallel_sort()
+: <a class="el" href="a00395.html#gc7576f82fdedc8a701a6c17ad9415926">tbb</a><li>set_assertion_handler()
+: <a class="el" href="a00383.html#823fa1c15dd829d1d9167157450ddcd9">tbb</a><li>TBB_runtime_interface_version()
+: <a class="el" href="a00383.html#a6858b22e90041c9c4669674ff39b056">tbb</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/namespacemembers_type.html b/doc/html/namespacemembers_type.html
index fe239ae..65280f2 100644
--- a/doc/html/namespacemembers_type.html
+++ b/doc/html/namespacemembers_type.html
@@ -32,7 +32,7 @@
 <p>
 <ul>
 <li>assertion_handler_type
-: <a class="el" href="a00362.html#ed375248ff6019a70ca0f9da528e5d0b">tbb</a></ul>
+: <a class="el" href="a00383.html#ed375248ff6019a70ca0f9da528e5d0b">tbb</a></ul>
 <hr>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
diff --git a/doc/html/namespaces.html b/doc/html/namespaces.html
index eb030d5..c3cca49 100644
--- a/doc/html/namespaces.html
+++ b/doc/html/namespaces.html
@@ -20,8 +20,7 @@
     <li><a href="namespacemembers.html"><span>Namespace Members</span></a></li>
   </ul></div>
 <h1>Namespace List</h1>Here is a list of all documented namespaces with brief descriptions:<table>
-  <tr><td class="indexkey"><a class="el" href="a00362.html">tbb</a></td><td class="indexvalue">The namespace tbb contains all components of the library </td></tr>
-  <tr><td class="indexkey"><a class="el" href="a00370.html">tbb::strict_ppl</a></td><td class="indexvalue">For internal use only </td></tr>
+  <tr><td class="indexkey"><a class="el" href="a00383.html">tbb</a></td><td class="indexvalue">The namespace tbb contains all components of the library </td></tr>
 </table>
 <hr>
 <p></p>
diff --git a/examples/GettingStarted/index.html b/examples/GettingStarted/index.html
index bf756eb..dff3353 100644
--- a/examples/GettingStarted/index.html
+++ b/examples/GettingStarted/index.html
@@ -14,10 +14,9 @@ This directory contains the examples referenced by the Threading Building Blocks
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/GettingStarted/sub_string_finder/Makefile b/examples/GettingStarted/sub_string_finder/Makefile
index 83e220b..6fdc52b 100644
--- a/examples/GettingStarted/sub_string_finder/Makefile
+++ b/examples/GettingStarted/sub_string_finder/Makefile
@@ -27,12 +27,17 @@
 # GNU Makefile that builds and runs example.
 PROG=sub_string_finder_extended
 ARGS=
+LIGHT_PROG=sub_string_finder
 
 # The C++ compiler
 ifneq (,$(shell which icc 2>/dev/null))
 CXX=icc
 endif # icc
 
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
 all:	release test
 
 release: *.cpp
@@ -50,3 +55,6 @@ clean:
 
 test:
 	./$(PROG) $(ARGS)
+
+light_test:
+	./$(LIGHT_PROG) $(ARGS)
diff --git a/examples/GettingStarted/sub_string_finder/Makefile.windows b/examples/GettingStarted/sub_string_finder/Makefile.windows
index f0719d6..d379d4e 100644
--- a/examples/GettingStarted/sub_string_finder/Makefile.windows
+++ b/examples/GettingStarted/sub_string_finder/Makefile.windows
@@ -27,6 +27,7 @@
 # Common Makefile that builds and runs examples.
 PROG=sub_string_finder_extended
 ARGS=
+LIGHT_PROG=sub_string_finder
 
 # The C++ compiler options
 # Trying to find if icl.exe is set
@@ -50,6 +51,8 @@ clean:
 	@cmd.exe /C del sub_string_finder*.exe *.obj *.?db *.manifest
 test:
 	$(PROG) $(ARGS)
+light_test:
+	$(LIGHT_PROG) $(ARGS)
 compiler_check:
 	@echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1  || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
 	@cmd.exe /C del compiler_test
diff --git a/examples/GettingStarted/sub_string_finder/index.html b/examples/GettingStarted/sub_string_finder/index.html
index 8dc50f2..17acf9e 100644
--- a/examples/GettingStarted/sub_string_finder/index.html
+++ b/examples/GettingStarted/sub_string_finder/index.html
@@ -51,10 +51,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcproj b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcproj
index 8e20b66..97cc62e 100644
--- a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcproj
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder.vcproj
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -198,7 +198,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -250,7 +250,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -278,7 +278,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -329,7 +329,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcproj b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcproj
index 8eb1b8d..05175b2 100644
--- a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcproj
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_extended.vcproj
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -198,7 +198,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -250,7 +250,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -278,7 +278,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -329,7 +329,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcproj b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcproj
index cff384d..527a11b 100644
--- a/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcproj
+++ b/examples/GettingStarted/sub_string_finder/msvs/sub_string_finder_pretty.vcproj
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -198,7 +198,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -250,7 +250,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -278,7 +278,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -329,7 +329,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/GettingStarted/sub_string_finder/xcode/sub_string_finder.xcodeproj/project.pbxproj b/examples/GettingStarted/sub_string_finder/xcode/sub_string_finder.xcodeproj/project.pbxproj
index e487e98..9e28b39 100644
--- a/examples/GettingStarted/sub_string_finder/xcode/sub_string_finder.xcodeproj/project.pbxproj
+++ b/examples/GettingStarted/sub_string_finder/xcode/sub_string_finder.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -187,9 +187,16 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
 			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "sub_string_finder" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 08FB7794FE84155DC02AAC07 /* sub_string_finder */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -234,14 +241,13 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = sub_string_finder;
 				ZERO_LINK = NO;
@@ -252,12 +258,12 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = sub_string_finder;
 				ZERO_LINK = NO;
@@ -274,7 +280,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -290,7 +295,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -299,18 +303,16 @@
 		A1F593C60B8F0E6E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = sub_string_finder;
 				ZERO_LINK = NO;
@@ -320,15 +322,14 @@
 		A1F593C70B8F0E6E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = sub_string_finder;
 				ZERO_LINK = NO;
@@ -350,7 +351,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -371,7 +371,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -382,17 +381,15 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = sub_string_finder_pretty;
 				ZERO_LINK = NO;
 			};
@@ -401,20 +398,17 @@
 		A1F5940E0B8F1DB600073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = sub_string_finder_pretty;
 				ZERO_LINK = NO;
 			};
@@ -424,16 +418,14 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				COPY_PHASE_STRIP = YES;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = sub_string_finder_pretty;
 				ZERO_LINK = NO;
 			};
@@ -442,17 +434,15 @@
 		A1F594100B8F1DB600073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = sub_string_finder_pretty;
 				ZERO_LINK = NO;
 			};
@@ -463,17 +453,15 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = sub_string_finder_extended;
 				ZERO_LINK = NO;
 			};
@@ -482,20 +470,17 @@
 		A1F594210B8F1F4E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = sub_string_finder_extended;
 				ZERO_LINK = NO;
 			};
@@ -505,16 +490,14 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				COPY_PHASE_STRIP = YES;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = sub_string_finder_extended;
 				ZERO_LINK = NO;
 			};
@@ -523,17 +506,15 @@
 		A1F594230B8F1F4E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = sub_string_finder_extended;
 				ZERO_LINK = NO;
 			};
diff --git a/examples/Makefile b/examples/Makefile
index 018d5e0..d775633 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -41,7 +41,7 @@ include ../build/common.inc
 ifeq ($(filter /% $(SLASH)%, $(subst :, ,$(tbb_root)) ),)
     # also changes related variables like work_dir
     override tbb_root := $(CWD)$(SLASH)..
-    export TBB30_INSTALL_DIR := $(tbb_root)
+    export TBBROOT := $(tbb_root)
 endif
 
 ifeq ($(tbb_os),windows)
@@ -72,7 +72,10 @@ else
     ifeq ($(arch),ia64)
         override CXXFLAGS += $(PIC_KEY)
     endif
-    ifeq ($(compiler),gcc)
+    ifeq ($(subst suncc,gcc,$(compiler)),gcc)
+        ifeq ($(compiler),suncc)
+            override CXXFLAGS += -I$(tbb_root)$(SLASH)include -library=stlport4 -M$(tbb_root)/build/suncc.map.pause -erroff=unassigned,attrskipunsup,badargtype2w,badbinaryopw,wbadasg,wvarhidemem,wbadinit
+        endif
         ifeq ($(arch),intel64)
             override CXXFLAGS += -m64
         endif
@@ -89,16 +92,21 @@ else
             override CXXFLAGS += -mcpu=v9 -m64
         endif
     endif
-    ifeq ($(compiler),suncc)
-        override CXXFLAGS += -I$(tbb_root)$(SLASH)include -library=stlport4 -M$(tbb_root)/build/suncc.map.pause -erroff=unassigned,attrskipunsup,badargtype2w,badbinaryopw,wbadasg,wvarhidemem,wbadinit
+    ifeq ($(compiler),xl)
+        # -qsuppress=1540-0198 suppresses warnings like "1540-0198 (W) The omitted keyword "private" is assumed for base class "no_copy"."
+        # -qsuppress=1540-1401 suppresses warnings like "1540-1401 (I) An unknown "pragma ivdep" is specified."
+        override CXXFLAGS += -I$(tbb_root)$(SLASH)include -qsuppress=1540-0198:1540-1401 -L$(work_dir)_release -L$(work_dir)_debug
         ifeq ($(arch),intel64)
-            override CXXFLAGS += -m64
+            override CXXFLAGS += -q64
         endif
         ifeq ($(arch),ia32)
-            override CXXFLAGS += -m32
+            override CXXFLAGS += -q32
         endif
-        ifeq ($(arch),sparc)
-            override CXXFLAGS += -m64
+        ifeq ($(arch),ppc64)
+            override CXXFLAGS += -q64
+        endif
+        ifeq ($(arch),ppc32)
+            override CXXFLAGS += -q32
         endif
     endif
     ifeq ($(tbb_os),macos)
@@ -111,6 +119,8 @@ else
         endif
         export DYLD_LIBRARY_PATH := $(DYLD_LIBRARY_PATH):$(work_dir)_release:$(work_dir)_debug
     else
+        # -L necessary for non-native compilers which don't search $LIBRARY_PATH
+        override CXXFLAGS += -L$(work_dir)_release -L$(work_dir)_debug
         export LD_LIBRARY_PATH := $(LD_LIBRARY_PATH):$(work_dir)_release:$(work_dir)_debug
     endif
     export LIBS
@@ -118,7 +128,7 @@ else
     export CPATH := $(CPATH):$(tbb_root)/include
 endif
 
-COMMON_TARGETS := all clean release debug test
+COMMON_TARGETS := all clean release debug test perf_build perf_run
 # list of directories of examples
 EXAMPLES_DIRS := $(foreach T,$(EXAMPLES),$(dir $(T)))
 # targets to explicitly call example have format: {example's dir}/{example's target}
@@ -133,6 +143,7 @@ $(COMMON_TARGETS):: % : $(addsuffix %,$(EXAMPLES_DIRS))
 
 # proxy rule for calling appropriate example
 $(EXAMPLES_TARGETS)::
+	@echo --------------------------------------------------
 	-$(MAKE) SHELL=$(SHELL) -C $(@D)  -f $(EXAMPLE_MAKEFILE) $(notdir $@) CXX="$(CPLUS)" CXXFLAGS="$(CXXFLAGS)"
 
 printenv:
diff --git a/examples/common/copy_libraries.bat b/examples/common/copy_libraries.bat
index adbf1b1..eae9e25 100644
--- a/examples/common/copy_libraries.bat
+++ b/examples/common/copy_libraries.bat
@@ -36,9 +36,9 @@ if ("%2") == ("debug") set postfix=_debug
 set output_dir=%3
 
 :: Optional 4th parameter to set install root
-if ("%4") NEQ ("") set TBB30_INSTALL_DIR=%4
+if ("%4") NEQ ("") set TBBROOT=%4
 :: Actually we can set install root by ourselves
-if ("%TBB30_INSTALL_DIR%") == ("") set TBB30_INSTALL_DIR=%~d0%~p0..\..\
+if ("%TBBROOT%") == ("") set TBBROOT=%~d0%~p0..\..\
 
 :: Getting vs folders in case vc_mt binaries are not provided
 if ("%VS80COMNTOOLS%")  NEQ ("") set vc_dir=vc8
@@ -46,23 +46,23 @@ if ("%VS90COMNTOOLS%")  NEQ ("") set vc_dir=vc9
 if ("%VS100COMNTOOLS%") NEQ ("") set vc_dir=vc10
 
 :: Are we standalone/oss or inside compiler?
-if exist "%TBB30_INSTALL_DIR%\bin\%arch%\vc8\tbb%postfix%.dll" set interim_path=bin\%arch%
-if exist "%TBB30_INSTALL_DIR%\..\redist\%arch%\tbb\vc8\tbb%postfix%.dll" set interim_path=..\redist\%arch%\tbb
+if exist "%TBBROOT%\bin\%arch%\vc8\tbb%postfix%.dll" set interim_path=bin\%arch%
+if exist "%TBBROOT%\..\redist\%arch%\tbb\vc8\tbb%postfix%.dll" set interim_path=..\redist\%arch%\tbb
 if ("%interim_path%") == ("") goto error
 
 :: Do we provide vc_mt binaries?
-if exist "%TBB30_INSTALL_DIR%\%interim_path%\vc_mt\tbb%postfix%.dll" set vc_dir=vc_mt
+if exist "%TBBROOT%\%interim_path%\vc_mt\tbb%postfix%.dll" set vc_dir=vc_mt
 if ("%vc_dir%") == ("") goto error
 
 :: We know everything we wanted and there are no errors
 :: Copying binaries
 
-copy "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbb%postfix%.dll" "%output_dir%"
-copy "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbb%postfix%.pdb" "%output_dir%"
-copy "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbbmalloc%postfix%.dll" "%output_dir%"
-copy "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbbmalloc%postfix%.pdb" "%output_dir%"
-if exist "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbb_preview%postfix%.dll" copy "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbb_preview%postfix%.dll" "%output_dir%"
-if exist "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbb_preview%postfix%.pdb" copy "%TBB30_INSTALL_DIR%\%interim_path%\%vc_dir%\tbb_preview%postfix%.pdb" "%output_dir%"
+copy "%TBBROOT%\%interim_path%\%vc_dir%\tbb%postfix%.dll" "%output_dir%"
+copy "%TBBROOT%\%interim_path%\%vc_dir%\tbb%postfix%.pdb" "%output_dir%"
+copy "%TBBROOT%\%interim_path%\%vc_dir%\tbbmalloc%postfix%.dll" "%output_dir%"
+copy "%TBBROOT%\%interim_path%\%vc_dir%\tbbmalloc%postfix%.pdb" "%output_dir%"
+if exist "%TBBROOT%\%interim_path%\%vc_dir%\tbb_preview%postfix%.dll" copy "%TBBROOT%\%interim_path%\%vc_dir%\tbb_preview%postfix%.dll" "%output_dir%"
+if exist "%TBBROOT%\%interim_path%\%vc_dir%\tbb_preview%postfix%.pdb" copy "%TBBROOT%\%interim_path%\%vc_dir%\tbb_preview%postfix%.pdb" "%output_dir%"
 
 goto end
 :error
diff --git a/examples/common/gui/Makefile.gmake b/examples/common/gui/Makefile.gmake
index 4f27a11..ae40dbf 100644
--- a/examples/common/gui/Makefile.gmake
+++ b/examples/common/gui/Makefile.gmake
@@ -50,20 +50,22 @@ endif
 
 ifeq ($(UI),x)
 EXE = $(NAME)$(SUFFIX)
-CXXFLAGS += -I/usr/X11R6/include
+UI_CXXFLAGS += -I/usr/X11R6/include
 LIBS += -lpthread -L/usr/X11R6/lib$(x64) -lX11
 # detect if libXext can be found
 ifeq ($(shell sh -c "[ -f /usr/X11R6/lib$(x64)/libXext.so -o -f /usr/lib$(x64)/libXext.so ] && echo 0"),0)
 LIBS += -lXext
 else  # no libXext
-CXXFLAGS += -DX_NOSHMEM
+UI_CXXFLAGS += -DX_NOSHMEM
 endif # libXext
 
 else # ! X
 ifeq ($(UI),mac)
-TBBLIBSPATH ?= /Library/Frameworks/TBB.framework/Libraries
-CXXFLAGS += -arch i386 -mmacosx-version-min=10.4 -msse3 -ftree-vectorize
-LIBS += -framework OpenGL -framework AGL -framework Carbon -L$(TBBLIBSPATH)
+# TODO: Replace Carbon by Cocoa, SDK10.7 does no support Carbon headers.
+UI_CXXFLAGS += -arch i386 -mmacosx-version-min=10.6 -isysroot /Developer/SDKs/MacOSX10.6.sdk
+# TODO: figure out and comment why these flags are set here (supposedly for Seismic)
+CXXFLAGS += -msse3 -ftree-vectorize
+LIBS += -framework OpenGL -framework AGL -framework Carbon
 APPRES = $(NAME)$(SUFFIX).app/Contents/Resources
 EXE = $(NAME)$(SUFFIX).app/Contents/MacOS/$(NAME)$(SUFFIX)
 ifneq (,$(shell xcode-select -print-path 2>/dev/null))
diff --git a/examples/common/gui/macvideo.cpp b/examples/common/gui/macvideo.cpp
index 17966e2..5bbcc74 100644
--- a/examples/common/gui/macvideo.cpp
+++ b/examples/common/gui/macvideo.cpp
@@ -43,7 +43,7 @@
 #include <Carbon/Carbon.h>
 #include <AGL/agl.h>
 #include <OpenGL/gl.h>    // for OpenGL API
-#include <OpenGL/glext.h> // for OpenGL extension support 
+#include <OpenGL/glext.h> // for OpenGL extension support
 
 unsigned int *      g_pImg = 0;
 int                 g_sizex, g_sizey;
@@ -60,7 +60,7 @@ static OSStatus     WindowEventHandler( EventHandlerCallRef inCaller, EventRef i
 
 static IBNibRef     sNibRef;
 
-//-------------------------------------------------------------------------------------------- 
+//--------------------------------------------------------------------------------------------
 
 // structure for creating a fullscreen context
 struct structGLInfo // storage for setup info
@@ -86,16 +86,16 @@ struct structGLWindowInfo // storage for setup info
     SInt32 VRAM;                // input: minimum VRAM; output: actual (if successful otherwise input)
     SInt32 textureRAM;          // input: amount of texture RAM required on card; output: same (used in allcoation to ensure enough texture
     AGLPixelFormat    fmt;      // input: none; output pixel format...
-    Boolean fDraggable;         // input: is window going to be dragable, 
+    Boolean fDraggable;         // input: is window going to be draggable,
                                 //        if so renderer check (accel, VRAM, textureRAM) will look at all renderers vice just the current one
-                                //        if window is not dragable renderer check will either check the single device or short 
-                                //            circuit to software if window spans multiple devices 
+                                //        if window is not draggable renderer check will either check the single device or short
+                                //            circuit to software if window spans multiple devices
                                 //        software renderer is consider to have unlimited VRAM, unlimited textureRAM and to not be accelerated
 };
 typedef struct structGLWindowInfo structGLWindowInfo;
 typedef struct structGLWindowInfo * pstructGLWindowInfo;
 
-//-------------------------------------------------------------------------------------------- 
+//--------------------------------------------------------------------------------------------
 
 struct recGLCap // structure to store minimum OpenGL capabilites across all displays and GPUs
 {
@@ -117,15 +117,15 @@ struct recImage // OpenGL and image information associated with each window
     structGLWindowInfo glInfo;  // gl info used with SetupGL to build context
     AGLContext aglContext;      // the OpenGL context (read: state)
     GLuint fontList;            // the display list storing the bitmap font created for the context to display info
-    
+
     Boolean fAGPTexturing;      // 10.1+ only: texture from AGP memory without loading to GPU
-    
+
     // texture display stuff
     Boolean fNPOTTextures; // are we using Non-Power Of Two (NPOT) textures?
     Boolean fTileTextures; // are multiple tiled textures used to display image?
     Boolean fOverlapTextures; // do tiled textures overlapped to create correct filtering between tiles? (only applies if using tiled textures)
     Boolean fClientTextures; // 10.1+ only: texture from client memory
-        
+
     unsigned char * pImageBuffer; // image buffer that contains data for image (disposed after loading into texture if not using client textures)
     long imageWidth; // height of orginal image
     long imageHeight; // width of orginal image
@@ -168,7 +168,7 @@ OSStatus ResizeMoveGLWindow (WindowRef window);
 // main GL drawing routine, should be valid window passed in (will setupGL if require).  Draw image
 void DrawGL (WindowRef window);
 
-pRecGLCap gpOpenGLCaps; 
+pRecGLCap gpOpenGLCaps;
 
 // prototypes (internal/private) --------------------------------------------
 
@@ -192,8 +192,8 @@ static long GetTextureNumFromTextureDim (long textureDimension, long maxTextureS
 void ReportErrorNum (char * strError, long numError)
 {
     char errMsgPStr [257];
-    
-    errMsgPStr[0] = (char)snprintf (errMsgPStr+1, 255, "%s %ld (0x%lx)\n", strError, numError, numError); 
+
+    errMsgPStr[0] = (char)snprintf (errMsgPStr+1, 255, "%s %ld (0x%lx)\n", strError, numError, numError);
 
     // ensure we are faded in
     DebugStr ( (ConstStr255Param) errMsgPStr );
@@ -204,8 +204,8 @@ void ReportErrorNum (char * strError, long numError)
 void ReportError (char * strError)
 {
     char errMsgPStr [257];
-    
-    errMsgPStr[0] = (char)snprintf (errMsgPStr+1, 255, "%s\n", strError); 
+
+    errMsgPStr[0] = (char)snprintf (errMsgPStr+1, 255, "%s\n", strError);
 
     // ensure we are faded in
     DebugStr ( (ConstStr255Param) errMsgPStr );
@@ -300,7 +300,7 @@ static Boolean CheckRenderer (GDHandle hGD, long* pVRAM, long* pTextureRAM, GLin
         // see if we have an accelerated renderer, if so ignore non-accelerated ones
         // this prevents returning info on software renderer when actually we'll get the hardware one
         while (info)
-        {    
+        {
             aglDescribeRenderer(info, AGL_ACCELERATED, &dAccel);
             aglReportError ();
             if (dAccel)
@@ -309,14 +309,14 @@ static Boolean CheckRenderer (GDHandle hGD, long* pVRAM, long* pTextureRAM, GLin
             aglReportError ();
             inum++;
         }
-            
+
         info = head_info;
         inum = 0;
         while (info)
         {
             aglDescribeRenderer (info, AGL_ACCELERATED, &dAccel);
             aglReportError ();
-            // if we can accel then we will choose the accelerated renderer 
+            // if we can accel then we will choose the accelerated renderer
             // how about compliant renderers???
             if ((canAccel && dAccel) || (!canAccel && (!fAccelMust || dAccel)))
             {
@@ -350,7 +350,7 @@ static Boolean CheckRenderer (GDHandle hGD, long* pVRAM, long* pTextureRAM, GLin
 
 //-----------------------------------------------------------------------------------------------------------------------
 
-// CheckAllDeviceRenderers 
+// CheckAllDeviceRenderers
 
 // looks at renderer attributes and each device must have at least one renderer that fits the profile
 
@@ -394,14 +394,14 @@ static Boolean CheckAllDeviceRenderers (long* pVRAM, long* pTextureRAM, GLint* p
                 aglReportError ();
                 inum++;
             }
-                
+
             info = head_info;
             inum = 0;
             while (info)
-            {    
+            {
                 aglDescribeRenderer(info, AGL_ACCELERATED, &dAccel);
                 aglReportError ();
-                // if we can accel then we will choose the accelerated renderer 
+                // if we can accel then we will choose the accelerated renderer
                 // how about compliant renderers???
                 if ((canAccel && dAccel) || (!canAccel && (!fAccelMust || dAccel)))
                 {
@@ -428,7 +428,7 @@ static Boolean CheckAllDeviceRenderers (long* pVRAM, long* pTextureRAM, GLint* p
         {
             if (MinVRAM > dMaxVRAM)
                 MinVRAM = dMaxVRAM; // return VRAM
-            
+
         }
         else
             goodCheck = false; // one device failed thus entire requirement fails
@@ -463,7 +463,7 @@ void DumpCurrent (AGLDrawable* paglDraw, AGLContext* paglContext, pstructGLInfo
         aglReportError ();
         *paglContext = NULL;
     }
-    
+
     if (pcontextInfo->fmt)
     {
         aglDestroyPixelFormat (pcontextInfo->fmt); // pixel format is no longer needed
@@ -488,13 +488,13 @@ static OSStatus BuildGLonWindow (WindowPtr pWindow, AGLContext* paglContext, pst
     short numDevices;
     GLint depthSizeSupport;
     OSStatus err = noErr;
-    
+
     if (!pWindow || !pcontextInfo)
     {
         ReportError ("NULL parameter passed to BuildGLonWindow.");
         return paramErr;
     }
-    
+
     GetPort (&cgrafSave);
     SetPortWindowPort(pWindow);
 
@@ -527,13 +527,13 @@ static OSStatus BuildGLonWindow (WindowPtr pWindow, AGLContext* paglContext, pst
         ReportError ("Renderer check failed");
         return err;
     }
-    
+
     // do agl
     if ((Ptr) kUnresolvedCFragSymbolAddress == (Ptr) aglChoosePixelFormat) // check for existance of OpenGL
     {
         ReportError ("OpenGL not installed");
         return noErr;
-    }    
+    }
     // we successfully passed the renderer check
 
     if ((!pcontextInfo->fDraggable && (numDevices == 1)))  // not draggable on a single device
@@ -541,7 +541,7 @@ static OSStatus BuildGLonWindow (WindowPtr pWindow, AGLContext* paglContext, pst
     else
         pcontextInfo->fmt = aglChoosePixelFormat (NULL, 0, pcontextInfo->aglAttributes); // get an appropriate pixel format
     aglReportError ();
-    if (NULL == pcontextInfo->fmt) 
+    if (NULL == pcontextInfo->fmt)
     {
         ReportError("Could not find valid pixel format");
         return noErr;
@@ -551,15 +551,15 @@ static OSStatus BuildGLonWindow (WindowPtr pWindow, AGLContext* paglContext, pst
     if (AGL_BAD_MATCH == aglGetError())
         *paglContext = aglCreateContext (pcontextInfo->fmt, 0); // unable to sahre context, create without sharing
     aglReportError ();
-    if (NULL == *paglContext) 
+    if (NULL == *paglContext)
     {
         ReportError ("Could not create context");
         return noErr;
     }
-    
+
     if (!aglSetDrawable (*paglContext, GetWindowPort (pWindow))) // attach the CGrafPtr to the context
         return aglReportError ();
-    
+
     if(!aglSetCurrentContext (*paglContext)) // make the context the current context
         return aglReportError ();
 
@@ -580,7 +580,7 @@ static OSStatus BuildGLonWindow (WindowPtr pWindow, AGLContext* paglContext, pst
 OSStatus DestroyGLFromWindow (AGLContext* paglContext, pstructGLWindowInfo pcontextInfo)
 {
     OSStatus err;
-    
+
     if ((!paglContext) || (!*paglContext))
         return paramErr; // not a valid context
     glFinish ();
@@ -598,7 +598,7 @@ OSStatus DestroyGLFromWindow (AGLContext* paglContext, pstructGLWindowInfo pcont
         err = aglReportError ();
     }
     pcontextInfo->fmt = 0;
-    
+
     return err;
 }
 
@@ -619,31 +619,31 @@ short FindGDHandleFromWindow (WindowPtr pWindow, GDHandle * phgdOnThisDevice)
     long greatestArea, sectArea;
     short numDevices = 0;
     GDHandle hgdNthDevice;
-    
+
     if (!pWindow || !phgdOnThisDevice)
         return 0;
-        
+
     *phgdOnThisDevice = NULL;
-    
+
     GetPort (&pgpSave);
     SetPortWindowPort (pWindow);
-    
+
 
     GetWindowPortBounds (pWindow, &rectWind);
     LocalToGlobal ((Point*)& rectWind.top);    // convert to global coordinates
     LocalToGlobal ((Point*)& rectWind.bottom);
     hgdNthDevice = GetDeviceList ();
     greatestArea = 0;
-    // check window against all gdRects in gDevice list and remember 
+    // check window against all gdRects in gDevice list and remember
     //  which gdRect contains largest area of window}
     while (hgdNthDevice)
     {
         if (TestDeviceAttribute (hgdNthDevice, screenDevice))
             if (TestDeviceAttribute (hgdNthDevice, screenActive))
             {
-                // The SectRect routine calculates the intersection 
-                //  of the window rectangle and this gDevice 
-                //  rectangle and returns TRUE if the rectangles intersect, 
+                // The SectRect routine calculates the intersection
+                //  of the window rectangle and this gDevice
+                //  rectangle and returns TRUE if the rectangles intersect,
                 //  FALSE if they don't.
                 SectRect (&rectWind, &(**hgdNthDevice).gdRect, &rectSect);
                 // determine which screen holds greatest window area
@@ -659,7 +659,7 @@ short FindGDHandleFromWindow (WindowPtr pWindow, GDHandle * phgdOnThisDevice)
                 hgdNthDevice = GetNextDevice(hgdNthDevice);
             }
     }
-    
+
     SetPort (pgpSave);
     return numDevices;
 }
@@ -683,7 +683,7 @@ static long GetNextTextureSize (long textureDimension, long maxTextureSize, Bool
     else
     {
         do // while we have txture sizes check for texture value being equal or greater
-        {  
+        {
             if (textureDimension >= targetTextureSize) // the texture dimension is greater than the target texture size (i.e., it fits)
                 return targetTextureSize; // return corresponding texture size
         }
@@ -698,12 +698,12 @@ static long GetNextTextureSize (long textureDimension, long maxTextureSize, Bool
 // requirement for power of 2 textures as the maximum texture size
 // for the overlap case each texture effectively covers two less pixels so must iterate through using whole statement
 
-static long GetTextureNumFromTextureDim (long textureDimension, long maxTextureSize, Boolean texturesOverlap, Boolean textureRectangle) 
+static long GetTextureNumFromTextureDim (long textureDimension, long maxTextureSize, Boolean texturesOverlap, Boolean textureRectangle)
 {
-    // start at max texture size 
+    // start at max texture size
     // loop through each texture size, removing textures in turn which are less than the remaining texture dimension
     // each texture has 2 pixels of overlap (one on each side) thus effective texture removed is 2 less than texture size
-    
+
     long i = 0; // initially no textures
     long bitValue = maxTextureSize; // start at max texture size
     long texOverlapx2 = texturesOverlap ? 2 : 0;
@@ -717,7 +717,7 @@ static long GetTextureNumFromTextureDim (long textureDimension, long maxTextureS
             textureDimension -= bitValue - texOverlapx2; // remove effective texture size
         }
         // add one partial texture
-        i++; 
+        i++;
     }
     else
     {
@@ -734,7 +734,7 @@ static long GetTextureNumFromTextureDim (long textureDimension, long maxTextureS
         ReportErrorNum ("GetTextureNumFromTextureDim error: Texture to small to draw, should not ever get here, texture size remaining:", textureDimension);
     }
     return i; // return textures counted
-} 
+}
 
 #pragma mark -
 // ==================================
@@ -788,7 +788,7 @@ OSStatus BuildGLForWindow (WindowRef window)
     pRecImage pWindowInfo = (pRecImage) GetWRefCon (window); // the info structure for the window stored in the refcon
     short i; // iterator
     GLenum textureTarget = GL_TEXTURE_2D;
-   
+
     if (!pWindowInfo->aglContext) // if we get here and do not have a context built, build one
     {
         GetPort (&portSave);    // save current port
@@ -799,7 +799,7 @@ OSStatus BuildGLForWindow (WindowRef window)
         pWindowInfo->glInfo.textureRAM = 0 * 1048576; // minimum texture RAM (if not zero this is always required)
            pWindowInfo->glInfo.fDraggable = true; // is this a draggable window
         pWindowInfo->glInfo.fmt = 0; // output pixel format
-        
+
         i = 0; // first attribute in array
         pWindowInfo->glInfo.aglAttributes [i++] = AGL_RGBA; // RGB + Alpha pixels
         pWindowInfo->glInfo.aglAttributes [i++] = AGL_DOUBLEBUFFER; // doble buffered context
@@ -834,23 +834,23 @@ OSStatus BuildGLForWindow (WindowRef window)
             glViewport (0, 0, rectPort.right - rectPort.left, rectPort.bottom - rectPort.top); // reset viewport to entier window area
 
             aglSetInteger (pWindowInfo->aglContext, AGL_SWAP_INTERVAL, &swap); // set swap interval to account for vbl syncing or not
-            
+
             // set correct texture target // if building on 10.0 or 9 this will be undefined
         #ifdef GL_TEXTURE_RECTANGLE_EXT
             if (pWindowInfo->fNPOTTextures)
                 textureTarget = GL_TEXTURE_RECTANGLE_EXT;
         #endif
-            
+
             // Set texture mapping parameters
             glEnable (textureTarget); // enable texturing
-                
+
             glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // set clear color buffer to dark gray
             glClear (GL_COLOR_BUFFER_BIT); // clear just to color buffer
             aglSwapBuffers (pWindowInfo->aglContext); // swap the cleared buffer to front
-    
+
             //GetFNum ("\pMonaco", &fNum); // get font number for named font
             //pWindowInfo->fontList = BuildFontGL (pWindowInfo->aglContext, fNum, normal, 9); // build display list for fonts for this context (see aglString for more info)
-            
+
             // if we can use texture rectangle // if building on 10.0 or 9 this will be undefined
         #ifdef GL_TEXTURE_RECTANGLE_EXT
             if (pWindowInfo->fNPOTTextures)
@@ -861,23 +861,23 @@ OSStatus BuildGLForWindow (WindowRef window)
             glPixelStorei (GL_UNPACK_ROW_LENGTH, pWindowInfo->textureWidth); // set image width in groups (pixels), accounts for border this ensures proper image alignment row to row
             // get number of textures x and y
                 // extract the number of horiz. textures needed to tile image
-            pWindowInfo->textureX = GetTextureNumFromTextureDim (pWindowInfo->textureWidth, pWindowInfo->maxTextureSize, pWindowInfo->fOverlapTextures, pWindowInfo->fNPOTTextures); 
+            pWindowInfo->textureX = GetTextureNumFromTextureDim (pWindowInfo->textureWidth, pWindowInfo->maxTextureSize, pWindowInfo->fOverlapTextures, pWindowInfo->fNPOTTextures);
                 // extract the number of horiz. textures needed to tile image
-            pWindowInfo->textureY = GetTextureNumFromTextureDim (pWindowInfo->textureHeight, pWindowInfo->maxTextureSize, pWindowInfo->fOverlapTextures, pWindowInfo->fNPOTTextures); 
+            pWindowInfo->textureY = GetTextureNumFromTextureDim (pWindowInfo->textureHeight, pWindowInfo->maxTextureSize, pWindowInfo->fOverlapTextures, pWindowInfo->fNPOTTextures);
             pWindowInfo->pTextureName = (GLuint *) NewPtrClear ((long) sizeof (GLuint) * pWindowInfo->textureX * pWindowInfo->textureY); // allocate storage for texture name lists
             glGenTextures (pWindowInfo->textureX * pWindowInfo->textureY, pWindowInfo->pTextureName); // generate textures names need to support tiling
             {
                 long x, y, k = 0, offsetY, offsetX = 0, currWidth, currHeight; // texture iterators, texture name iterator, image offsets for tiling, current texture width and height
                 for (x = 0; x < pWindowInfo->textureX; x++) // for all horizontal textures
                 {
-                    currWidth = GetNextTextureSize (pWindowInfo->textureWidth - offsetX, pWindowInfo->maxTextureSize, pWindowInfo->fNPOTTextures); // use remaining to determine next texture size 
+                    currWidth = GetNextTextureSize (pWindowInfo->textureWidth - offsetX, pWindowInfo->maxTextureSize, pWindowInfo->fNPOTTextures); // use remaining to determine next texture size
                                                                                                                     // (basically greatest power of 2 which fits into remaining space)
                     offsetY = 0; // reset vertical offest for every column
                     for (y = 0; y < pWindowInfo->textureY; y++) // for all vertical textures
                     {
                         // buffer pointer is at base + rows * row size + columns
-                        unsigned char * pBuffer = pWindowInfo->pImageBuffer + 
-                                                   offsetY * pWindowInfo->textureWidth * (pWindowInfo->imageDepth >> 3) + 
+                        unsigned char * pBuffer = pWindowInfo->pImageBuffer +
+                                                   offsetY * pWindowInfo->textureWidth * (pWindowInfo->imageDepth >> 3) +
                                                    offsetX * (pWindowInfo->imageDepth >> 3);
                         currHeight = GetNextTextureSize (pWindowInfo->textureHeight - offsetY, pWindowInfo->maxTextureSize, pWindowInfo->fNPOTTextures); // use remaining to determine next texture size
                         glBindTexture (textureTarget, pWindowInfo->pTextureName[k++]);
@@ -887,7 +887,7 @@ OSStatus BuildGLForWindow (WindowRef window)
                         }
                         else
                             glTexParameterf (textureTarget, GL_TEXTURE_PRIORITY, 1.0f);
-                            
+
                     #ifdef GL_UNPACK_CLIENT_STORAGE_APPLE
                         if (pWindowInfo->fClientTextures)
                             glPixelStorei (GL_UNPACK_CLIENT_STORAGE_APPLE, 1);
@@ -900,14 +900,14 @@ OSStatus BuildGLForWindow (WindowRef window)
                         glTexParameteri (textureTarget, GL_TEXTURE_WRAP_S, gpOpenGLCaps->edgeClampParam);
                         glTexParameteri (textureTarget, GL_TEXTURE_WRAP_T, gpOpenGLCaps->edgeClampParam);
                         glReportError (); // report any errors so far
-                        glTexImage2D (textureTarget, 0, GL_RGBA, currWidth, currHeight, 0, 
-                                      GL_BGRA_EXT, pWindowInfo->imageDepth == 32 ? GL_UNSIGNED_INT_8_8_8_8_REV : GL_UNSIGNED_SHORT_1_5_5_5_REV, 
+                        glTexImage2D (textureTarget, 0, GL_RGBA, currWidth, currHeight, 0,
+                                      GL_BGRA_EXT, pWindowInfo->imageDepth == 32 ? GL_UNSIGNED_INT_8_8_8_8_REV : GL_UNSIGNED_SHORT_1_5_5_5_REV,
                                       pBuffer); // texture with current width and height at pBuffer location in image buffer with image size as GL_UNPACK_ROW_LENGTH
                         glReportError (); // report any errors
-                        offsetY += currHeight - 2 * pWindowInfo->fOverlapTextures; // offset in for the amount of texture used, 
+                        offsetY += currHeight - 2 * pWindowInfo->fOverlapTextures; // offset in for the amount of texture used,
                                                                                        //  since we are overlapping the effective texture used is 2 texels less than texture width
                     }
-                    offsetX += currWidth - 2 * pWindowInfo->fOverlapTextures; // offset in for the amount of texture used, 
+                    offsetX += currWidth - 2 * pWindowInfo->fOverlapTextures; // offset in for the amount of texture used,
                                                                               //  since we are overlapping the effective texture used is 2 texels less than texture width
                 }
             }
@@ -945,7 +945,7 @@ OSStatus ResizeMoveGLWindow (WindowRef window)
     }
     else
         err = paramErr; // bad window
-    return err; // return any error 
+    return err; // return any error
 }
 
 // ---------------------------------
@@ -955,12 +955,12 @@ OSStatus ResizeMoveGLWindow (WindowRef window)
 void DrawGL (WindowRef window)
 {
     Rect rectPort; // rectangle for port
-    pRecImage pWindowInfo; // the gl info for the target window 
+    pRecImage pWindowInfo; // the gl info for the target window
     long width, height; // width and height or the port and the row of the raster position
     long effectiveTextureMod = 0; // texture size modification (inset) to account for borders
     long x, y, k = 0, offsetY, offsetX = 0, currTextureWidth, currTextureHeight;
     GLenum textureTarget = GL_TEXTURE_2D;
-    
+
     if (NULL == window) // if we do not have a window
         return; // drop out
     pWindowInfo = (pRecImage) GetWRefCon (window); // get the gl info for the window
@@ -970,7 +970,7 @@ void DrawGL (WindowRef window)
         BuildGLForWindow (window);
     if (NULL == pWindowInfo->aglContext) // if we still don't have one then drop out
         return;
-        
+
     if (pWindowInfo->fOverlapTextures)
         effectiveTextureMod = 2; // if we overlap then we need to inset the textures passed to the drawing code
     // set texture target
@@ -986,19 +986,19 @@ void DrawGL (WindowRef window)
     width = rectPort.right - rectPort.left; // find width
     height = rectPort.bottom - rectPort.top; // and height
     glViewport (0, 0, width, height); // set the viewport to cover entire window
-    
+
     glMatrixMode (GL_PROJECTION); // set projection matrix
     glLoadIdentity (); // to indetity
     glMatrixMode (GL_MODELVIEW); // set modelview matrix
     glLoadIdentity (); // to identity
     glReportError (); // report any GL errors so far
-    
+
     // set the model view matrix for an orthographic view scaled to one screen pixel equal image pixel (independent of image zoom)
     glScalef (2.0f / width, -2.0f /  height, 1.0f); // scale to port per pixel scale
     //glTranslatef (pWindowInfo->centerX, pWindowInfo->centerY, 0.0f); // translate for image movement
     //glRotatef (0.0f, 0.0f, 0.0f, 1.0f); // ratate matrix for image rotation
     glReportError (); // report any GL errors
-    
+
     glClear (GL_COLOR_BUFFER_BIT); // clear the color buffer before drawing
 
     // draw image
@@ -1054,7 +1054,7 @@ void DrawGL (WindowRef window)
                     else
                         endYTexCoord = 1.0f -  2.0f * startYTexCoord; // for the last texture in odd size images there are two texels of padding so step in 2
                 }
-                
+
                 glBegin (GL_TRIANGLE_STRIP); // draw either tri strips of line strips
                     glTexCoord2f (startXTexCoord, startYTexCoord); // draw upper left in world coordinates
                     glVertex3d (startXDraw, startYDraw, 0.0);
@@ -1068,7 +1068,7 @@ void DrawGL (WindowRef window)
                     glTexCoord2f (endXTexCoord, endYTexCoord); // draw lower right in world coordinates
                     glVertex3d (endXDraw, endYDraw, 0.0);
                 glEnd();
-                
+
             }
 
             //////////////////////
@@ -1081,7 +1081,7 @@ void DrawGL (WindowRef window)
     glReportError (); // report any errors
 
     glDisable (textureTarget); // done with texturing
-        
+
     aglSwapBuffers (pWindowInfo->aglContext);
 }
 
@@ -1089,13 +1089,13 @@ void DrawGL (WindowRef window)
 
 static void FindMinimumOpenGLCapabilities (pRecGLCap pOpenGLCaps)
 {
-    WindowPtr pWin = NULL; 
+    WindowPtr pWin = NULL;
     Rect rectWin = {0, 0, 10, 10};
     GLint attrib[] = { AGL_RGBA, AGL_NONE };
     AGLPixelFormat fmt = NULL;
     AGLContext ctx = NULL;
     GLint deviceMaxTextureSize = 0, NPOTDMaxTextureSize = 0;
-    
+
     if (NULL != gpOpenGLCaps)
     {
         // init desired caps to max values
@@ -1110,7 +1110,7 @@ static void FindMinimumOpenGLCapabilities (pRecGLCap pOpenGLCaps)
         // build window
         pWin = NewCWindow (0L, &rectWin, NULL, false,
                 plainDBox, (WindowPtr) -1L, true, 0L);
-                
+
         // build context
         fmt = aglChoosePixelFormat(NULL, 0, attrib);
         if (fmt)
@@ -1118,10 +1118,10 @@ static void FindMinimumOpenGLCapabilities (pRecGLCap pOpenGLCaps)
         if (ctx)
         {
             GDHandle hgdNthDevice;
-            
+
             aglSetDrawable(ctx, GetWindowPort (pWin));
             aglSetCurrentContext(ctx);
-            
+
             // for each display
             hgdNthDevice = GetDeviceList ();
             while (hgdNthDevice)
@@ -1132,7 +1132,7 @@ static void FindMinimumOpenGLCapabilities (pRecGLCap pOpenGLCaps)
                         // move window to display
                         MoveWindow (pWin, (**hgdNthDevice).gdRect.left + 5, (**hgdNthDevice).gdRect.top + 5, false);
                         aglUpdateContext(ctx);
-                        
+
                         // for each cap (this can obviously be expanded)
                         // if this driver/GPU/display is less capable
                             // save this minimum capability
@@ -1141,26 +1141,26 @@ static void FindMinimumOpenGLCapabilities (pRecGLCap pOpenGLCaps)
                             enum { kShortVersionLength = 32 };
                             const GLubyte * strVersion = glGetString (GL_VERSION); // get version string
                             const GLubyte * strExtension = glGetString (GL_EXTENSIONS);    // get extension string
-                            
+
                             // get just the non-vendor specific part of version string
                             GLubyte strShortVersion [kShortVersionLength];
                             short i = 0;
                             while ((((strVersion[i] <= '9') && (strVersion[i] >= '0')) || (strVersion[i] == '.')) && (i < kShortVersionLength)) // get only basic version info (until first space)
                                 strShortVersion [i] = strVersion[i++];
                             strShortVersion [i] = 0; //truncate string
-                            
+
                             // compare capabilities based on extension string and GL version
-                            pOpenGLCaps->f_ext_texture_rectangle = 
+                            pOpenGLCaps->f_ext_texture_rectangle =
                                 pOpenGLCaps->f_ext_texture_rectangle && (NULL != strstr ((const char *) strExtension, "GL_EXT_texture_rectangle"));
-                            pOpenGLCaps->f_ext_client_storage = 
+                            pOpenGLCaps->f_ext_client_storage =
                                 pOpenGLCaps->f_ext_client_storage && (NULL != strstr ((const char *) strExtension, "GL_APPLE_client_storage"));
-                            pOpenGLCaps->f_ext_packed_pixel = 
+                            pOpenGLCaps->f_ext_packed_pixel =
                                 pOpenGLCaps->f_ext_packed_pixel && (NULL != strstr ((const char *) strExtension, "GL_APPLE_packed_pixel"));
-                            pOpenGLCaps->f_ext_texture_edge_clamp = 
+                            pOpenGLCaps->f_ext_texture_edge_clamp =
                                 pOpenGLCaps->f_ext_texture_edge_clamp && (NULL != strstr ((const char *) strExtension, "GL_SGIS_texture_edge_clamp"));
-                            pOpenGLCaps->f_gl_texture_edge_clamp = 
+                            pOpenGLCaps->f_gl_texture_edge_clamp =
                                 pOpenGLCaps->f_gl_texture_edge_clamp && (!strstr ((const char *) strShortVersion, "1.0") && !strstr ((const char *) strShortVersion, "1.1")); // if not 1.0 and not 1.1 must be 1.2 or greater
-                            
+
                             // get device max texture size
                             glGetIntegerv (GL_MAX_TEXTURE_SIZE, &deviceMaxTextureSize);
                             if (deviceMaxTextureSize < pOpenGLCaps->maxTextureSize)
@@ -1190,7 +1190,7 @@ static void FindMinimumOpenGLCapabilities (pRecGLCap pOpenGLCaps)
             pOpenGLCaps->f_gl_texture_edge_clamp = false;
             pOpenGLCaps->maxTextureSize = 0;
         }
-        
+
         // set clamp param based on retrieved capabilities
         if (pOpenGLCaps->f_gl_texture_edge_clamp) // if OpenGL 1.2 or later and texture edge clamp is supported natively
                     pOpenGLCaps->edgeClampParam = GL_CLAMP_TO_EDGE;  // use 1.2+ constant to clamp texture coords so as to not sample the border color
@@ -1260,7 +1260,7 @@ WindowEventHandler( EventHandlerCallRef inCaller, EventRef inEvent, void* inRefc
             err = ResizeMoveGLWindow (window);
         }
     }
-    
+
     return err;
 }
 //--------------------------------------------------------------------------------------------
@@ -1291,13 +1291,13 @@ WindowRef HandleNew()
         FindMinimumOpenGLCapabilities (gpOpenGLCaps);
     }
 
-    // Create a window. "MainWindow" is the name of the window object. This name is set in 
+    // Create a window. "MainWindow" is the name of the window object. This name is set in
     // InterfaceBuilder when the nib is created.
     err = CreateWindowFromNib( sNibRef, CFSTR("MainWindow"), &window );
     require_noerr( err, CantCreateWindow );
     // We don't need the nib reference anymore.
     DisposeNibReference(sNibRef);
-    
+
     pWindowInfo = (recImage *) NewPtrClear (sizeof (recImage));
     pWindowInfo->textureWidth = pWindowInfo->imageWidth = g_sizex;
     pWindowInfo->textureHeight = pWindowInfo->imageHeight = g_sizey;
@@ -1329,11 +1329,11 @@ WindowRef HandleNew()
 
     // Position new windows in a staggered arrangement on the main screen
     RepositionWindow( window, NULL, kWindowCascadeOnMainScreen );
-    
+
     // The window was created hidden, so show it
     ShowWindow( window );
     return window;
-  
+
 CantCreateWindow:
     return 0;
 }
@@ -1385,7 +1385,7 @@ bool video::init_window(int x, int y)
     InstallStandardEventHandler(GetApplicationEventTarget()); // Doesn't work?
     verify_noerr( InstallApplicationEventHandler( NewEventHandlerUPP( AppEventHandler ),
                                     GetEventTypeCount( kAppEvents ), kAppEvents, 0, NULL ) );
-    
+
     // Once the nib reference is created, set the menu bar. "MainMenu" is the name of the menu bar
     // object. This name is set in InterfaceBuilder when the nib is created.
     //err = SetMenuBarFromNib( sNibRef, CFSTR("MenuBar") );
diff --git a/examples/common/gui/video.h b/examples/common/gui/video.h
index d969c4a..5e733d0 100644
--- a/examples/common/gui/video.h
+++ b/examples/common/gui/video.h
@@ -55,11 +55,11 @@ public:
     depth_t     pixel_depth;
     int         sizex, sizey;
     //! Get drawing memory
-    inline void* get_address() const { return reinterpret_cast<void*>(my_address); }
+    inline char* get_address() const { return reinterpret_cast<char*>(my_address); }
     //! Get drawing memory size
     inline int get_size() const { return ((pixel_depth>16) ? 4:2) * sizex * sizey; }
     //! Set drawing memory
-    inline void set_address(void *mem) { my_address = reinterpret_cast<uintptr_t>(mem); }
+    inline void set_address(char *mem) { my_address = reinterpret_cast<uintptr_t>(mem); }
 
     friend class drawing_area;
     friend class video;
diff --git a/examples/common/index.html b/examples/common/index.html
index 11c4481..18785f5 100644
--- a/examples/common/index.html
+++ b/examples/common/index.html
@@ -30,10 +30,9 @@ This code is not intended to be used directly.  It is incorporated automatically
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/common/utility/fast_random.h b/examples/common/utility/fast_random.h
new file mode 100644
index 0000000..7616455
--- /dev/null
+++ b/examples/common/utility/fast_random.h
@@ -0,0 +1,90 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef FAST_RANDOM_H_
+#define FAST_RANDOM_H_
+namespace utility{
+//------------------------------------------------------------------------
+// FastRandom
+//------------------------------------------------------------------------
+
+namespace internal{
+    size_t GetPrime ( size_t seed );
+}
+
+//! A fast random number generator.
+/** Uses linear congruential method. */
+class FastRandom {
+    size_t x, a;
+public:
+    //! Get a random number.
+    unsigned short get() {
+        return get(x);
+    }
+        //! Get a random number for the given seed; update the seed for next use.
+    unsigned short get( size_t& seed ) {
+        unsigned short r = (unsigned short)(seed>>16);
+        seed = seed*a+1;
+        return r;
+    }
+    //! Construct a random number generator.
+    FastRandom( size_t seed ) {
+        x = seed*internal::GetPrime(seed);
+        a = internal::GetPrime(x);
+    }
+};
+}
+
+namespace utility {
+namespace internal{
+//! Table of primes used by fast random-number generator (FastRandom).
+    static const unsigned Primes[] = {
+        0x9e3779b1, 0xffe6cc59, 0x2109f6dd, 0x43977ab5,
+        0xba5703f5, 0xb495a877, 0xe1626741, 0x79695e6b,
+        0xbc98c09f, 0xd5bee2b3, 0x287488f9, 0x3af18231,
+        0x9677cd4d, 0xbe3a6929, 0xadc6a877, 0xdcf0674b,
+        0xbe4d6fe9, 0x5f15e201, 0x99afc3fd, 0xf3f16801,
+        0xe222cfff, 0x24ba5fdb, 0x0620452d, 0x79f149e3,
+        0xc8b93f49, 0x972702cd, 0xb07dd827, 0x6c97d5ed,
+        0x085a3d61, 0x46eb5ea7, 0x3d9910ed, 0x2e687b5b,
+        0x29609227, 0x6eb081f1, 0x0954c4e1, 0x9d114db9,
+        0x542acfa9, 0xb3e6bd7b, 0x0742d917, 0xe9f3ffa7,
+        0x54581edb, 0xf2480f45, 0x0bb9288f, 0xef1affc7,
+        0x85fa0ca7, 0x3ccc14db, 0xe6baf34b, 0x343377f7,
+        0x5ca19031, 0xe6d9293b, 0xf0a9f391, 0x5d2e980b,
+        0xfc411073, 0xc3749363, 0xb892d829, 0x3549366b,
+        0x629750ad, 0xb98294e5, 0x892d9483, 0xc235baf3,
+        0x3d2402a3, 0x6bdef3c9, 0xbec333cd, 0x40c9520f
+    };
+    size_t GetPrime ( size_t seed ) {
+        return Primes[seed%(sizeof(Primes)/sizeof(Primes[0]))];
+    }
+}
+}
+
+#endif /* FAST_RANDOM_H_ */
diff --git a/examples/concurrent_hash_map/count_strings/Makefile b/examples/concurrent_hash_map/count_strings/Makefile
index b24a1f5..c8f698f 100644
--- a/examples/concurrent_hash_map/count_strings/Makefile
+++ b/examples/concurrent_hash_map/count_strings/Makefile
@@ -34,6 +34,10 @@ ifneq (,$(shell which icc 2>/dev/null))
 CXX=icc
 endif # icc
 
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
 all:   release test
 
 release: *.cpp
diff --git a/examples/concurrent_hash_map/count_strings/index.html b/examples/concurrent_hash_map/count_strings/index.html
index f6a0ca1..41888b6 100644
--- a/examples/concurrent_hash_map/count_strings/index.html
+++ b/examples/concurrent_hash_map/count_strings/index.html
@@ -45,10 +45,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/concurrent_hash_map/count_strings/msvs/count_strings.vcproj b/examples/concurrent_hash_map/count_strings/msvs/count_strings.vcproj
index bef6268..6a74e2e 100644
--- a/examples/concurrent_hash_map/count_strings/msvs/count_strings.vcproj
+++ b/examples/concurrent_hash_map/count_strings/msvs/count_strings.vcproj
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -198,7 +198,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -250,7 +250,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat" ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat" ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -278,7 +278,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -329,7 +329,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/concurrent_hash_map/count_strings/xcode/count_strings.xcodeproj/project.pbxproj b/examples/concurrent_hash_map/count_strings/xcode/count_strings.xcodeproj/project.pbxproj
index 339cbea..1b90bf7 100644
--- a/examples/concurrent_hash_map/count_strings/xcode/count_strings.xcodeproj/project.pbxproj
+++ b/examples/concurrent_hash_map/count_strings/xcode/count_strings.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -103,9 +103,16 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
 			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "count_strings" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 08FB7794FE84155DC02AAC07 /* count_strings */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -132,14 +139,13 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = count_strings;
 				ZERO_LINK = NO;
@@ -150,12 +156,12 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = count_strings;
 				ZERO_LINK = NO;
@@ -172,7 +178,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -188,7 +193,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -197,18 +201,16 @@
 		A1F593C60B8F0E6E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = count_strings;
 				ZERO_LINK = NO;
@@ -218,15 +220,14 @@
 		A1F593C70B8F0E6E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = count_strings;
 				ZERO_LINK = NO;
@@ -248,7 +249,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -269,7 +269,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
diff --git a/examples/concurrent_hash_map/index.html b/examples/concurrent_hash_map/index.html
index 8956f44..0949575 100644
--- a/examples/concurrent_hash_map/index.html
+++ b/examples/concurrent_hash_map/index.html
@@ -14,10 +14,9 @@ This directory has examples of the template <code>concurrent_hash_map</code>.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/task_group/sudoku/Makefile b/examples/concurrent_priority_queue/shortpath/Makefile
similarity index 88%
copy from examples/task_group/sudoku/Makefile
copy to examples/concurrent_priority_queue/shortpath/Makefile
index 180d19f..a9c358a 100644
--- a/examples/task_group/sudoku/Makefile
+++ b/examples/concurrent_priority_queue/shortpath/Makefile
@@ -25,8 +25,9 @@
 # the GNU General Public License.
 
 # GNU Makefile that builds and runs example.
-PROG=sudoku
-ARGS=input1 4 0 -p
+PROG=shortpath
+ARGS=4 N=1000 start=0 end=999 verbose
+PERF_RUN_ARGS=auto N=1000 start=0 end=99 silent
 
 # The C++ compiler
 ifneq (,$(shell which icc 2>/dev/null))
@@ -36,7 +37,11 @@ ifeq ($(CXX),icc)
 CXX0XFLAGS=-std=c++0x -D_TBB_CPP0X
 endif # icc
 
-all:	release test
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
+all:    release test
 
 release: *.cpp
 	$(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS) $(CXX0XFLAGS)
@@ -49,3 +54,8 @@ clean:
 
 test:
 	./$(PROG) $(ARGS)
+
+perf_build: release
+
+perf_run:
+	./$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/task_group/sudoku/Makefile.windows b/examples/concurrent_priority_queue/shortpath/Makefile.windows
similarity index 93%
copy from examples/task_group/sudoku/Makefile.windows
copy to examples/concurrent_priority_queue/shortpath/Makefile.windows
index 246377f..529e930 100644
--- a/examples/task_group/sudoku/Makefile.windows
+++ b/examples/concurrent_priority_queue/shortpath/Makefile.windows
@@ -27,8 +27,9 @@
 # Common Makefile that builds and runs example.
 
 # Just specify your program basename
-PROG=sudoku
-ARGS=input1 4 2 -p
+PROG=shortpath
+ARGS=4 N=1000 start=0 end=999 verbose
+PERF_RUN_ARGS=auto N=1000 start=0 end=99 silent
 
 # Trying to find if icl.exe is set
 CXX1 = $(TBB_CXX)-
@@ -50,3 +51,8 @@ test:
 	$(PROG) $(ARGS)
 compiler_check:
 	@$(CXX) >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+
+perf_build: release
+
+perf_run:
+	$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/concurrent_priority_queue/shortpath/index.html b/examples/concurrent_priority_queue/shortpath/index.html
new file mode 100644
index 0000000..a6bfdbe
--- /dev/null
+++ b/examples/concurrent_priority_queue/shortpath/index.html
@@ -0,0 +1,82 @@
+<HTML>
+<BODY>
+
+<H2>Overview</H2>
+
+This directory contains a simple example that solves the single source
+shortest path problem.  It is parameterized by N, a number of nodes,
+and a start and end node in [0..N).  A graph is generated with N nodes
+and some random number of connections between those nodes.  A parallel
+algorithm based on A* is used to find the shortest path.  This
+algorithm varies from serial A* in that it needs to add nodes back to
+the open set when the g estimate (shortest path from start to the
+node) is improved, even if the node has already been "visited".  This
+is because nodes are added and removed from the open-set in parallel,
+resulting in some less optimal paths being explored.  The open-set is
+implemented with the concurrent_priority_queue.  Note that since we
+re-visit nodes, the f estimate (on which the priority queue is sorted)
+is not technically needed, so we could use this same parallel
+algorithm with just a concurrent_queue.  However, keeping the f
+estimate and using concurrent_priority_queue results in much better
+performance.  Silent mode prints run time only, regular mode prints
+shortest path length, and verbose mode prints out the shortest path.
+The generated graph follows a pattern in which the closer two pairs of
+node ids are together, the fewer hops there are in a typical path
+between those nodes.  So, for example, the path between 5 and 7 likely
+has few hops whereas 14 to 78 has more and 0 to 9999 has even more,
+etc.
+
+
+<H2>Files</H2>
+<DL>
+<DT><A HREF="shortpath.cpp">shortpath.cpp</A>
+<DD>Driver.
+
+<DT><A HREF="Makefile">Makefile</A>
+<DD>Makefile for building example.
+
+</DL>
+
+<H2>Directories</H2>
+<DL>
+<DT><A HREF="msvs">msvs</A>
+<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example with the Intel® C++ compiler.
+<DT><A HREF="xcode">xcode</A>
+<DD>Contains Mac OS* Xcode* workspace for building and running the example.
+</DL>
+
+<H2>To Build</H2>
+General build directions can be found <A HREF=../../index.html#build>here</A>.
+<P></P>
+
+<H2>Usage</H2>
+<DL>
+
+<DT><TT>shortpath <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>shortpath [<I>#threads</I>=value] [<I>verbose</I>] [<I>silent</I>] [<I>N</I>=value] [<I>start</I>=value] [<I>end</I>=value] [<I>#threads</I>]</TT>
+<DD><I>#threads</I> is the number of threads to use; a range of the form <I>low</I>[:<I>high</I>] where low and optional high are non-negative integers, or 'auto' for the TBB default.<BR>
+    <I>verbose</I> print full path to screen<BR>
+    <I>silent</I> limits output to timing info; overrides verbose<BR>
+    <I>N</I> number of nodes in graph<BR>
+    <I>start</I> node to start path at<BR>
+    <I>end</I> node to end path at<BR>
+
+
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector:
+<DD>Build a <I>debug</I> version of the example
+    (see the <A HREF=../../index.html#build>build directions</A>).
+    <BR>Run it with a small problem size and the desired number of threads, e.g., <TT>shortpath 4 N=20 start=0 end=19</TT>.
+</DL>
+
+<HR>
+<A HREF="../index.html">Up to parent directory</A>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
+</BODY>
+</HTML>
diff --git a/examples/concurrent_priority_queue/shortpath/msvs/shortpath.icproj b/examples/concurrent_priority_queue/shortpath/msvs/shortpath.icproj
new file mode 100644
index 0000000..38334ea
--- /dev/null
+++ b/examples/concurrent_priority_queue/shortpath/msvs/shortpath.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+	ProjectType="Intel C++ Project"
+	Version="11.1"
+	Name="shortpath"
+	ProjectGUID="{D731702C-B704-468D-9497-A75EE0521C89}"
+	VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252A}"
+	VCNestedProjectFileName="shortpath.vcproj">
+	<Configurations/>
+	<Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj b/examples/concurrent_priority_queue/shortpath/msvs/shortpath.vcproj
similarity index 76%
copy from examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj
copy to examples/concurrent_priority_queue/shortpath/msvs/shortpath.vcproj
index 3f43cd2..e5463df 100644
--- a/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj
+++ b/examples/concurrent_priority_queue/shortpath/msvs/shortpath.vcproj
@@ -2,9 +2,9 @@
 <VisualStudioProject
 	ProjectType="Visual C++"
 	Version="8,00"
-	Name="convex_hull_benchmark"
+	Name="shortpath"
 	ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252A}"
-	RootNamespace="convex_hull_benchmark"
+	RootNamespace="shortpath"
 	Keyword="Win32Proj"
 	>
 	<Platforms>
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -198,8 +198,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				Optimization="3"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -219,7 +218,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -251,7 +250,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -279,8 +278,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				Optimization="3"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -299,7 +297,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -331,7 +329,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
@@ -344,15 +342,7 @@
 			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
 			>
 			<File
-				RelativePath="..\convex_hull_bench.cpp"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Header files"
-			>
-			<File
-				RelativePath="..\convex_hull.h"
+				RelativePath="..\shortpath.cpp"
 				>
 			</File>
 		</Filter>
diff --git a/examples/concurrent_priority_queue/shortpath/msvs/shortpath_cl.sln b/examples/concurrent_priority_queue/shortpath/msvs/shortpath_cl.sln
new file mode 100644
index 0000000..cf1789a
--- /dev/null
+++ b/examples/concurrent_priority_queue/shortpath/msvs/shortpath_cl.sln
@@ -0,0 +1,25 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shortpath", "shortpath.vcproj", "{3AA40693-F93D-4D4B-B32E-068F511A252A}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|Win32.ActiveCfg = Debug|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|Win32.Build.0 = Debug|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|x64.ActiveCfg = Debug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|x64.Build.0 = Debug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|Win32.ActiveCfg = Release|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|Win32.Build.0 = Release|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|x64.ActiveCfg = Release|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|x64.Build.0 = Release|x64
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/examples/concurrent_priority_queue/shortpath/msvs/shortpath_icl.sln b/examples/concurrent_priority_queue/shortpath/msvs/shortpath_icl.sln
new file mode 100644
index 0000000..70881aa
--- /dev/null
+++ b/examples/concurrent_priority_queue/shortpath/msvs/shortpath_icl.sln
@@ -0,0 +1,33 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "shortpath", "shortpath.icproj", "{D731702C-B704-468D-9497-A75EE0521C89}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{D731702C-B704-468D-9497-A75EE0521C89}.Debug|Win32.ActiveCfg = Debug|Win32
+		{D731702C-B704-468D-9497-A75EE0521C89}.Debug|Win32.Build.0 = Debug|Win32
+		{D731702C-B704-468D-9497-A75EE0521C89}.Debug|x64.ActiveCfg = Debug|x64
+		{D731702C-B704-468D-9497-A75EE0521C89}.Debug|x64.Build.0 = Debug|x64
+		{D731702C-B704-468D-9497-A75EE0521C89}.Release|Win32.ActiveCfg = Release|Win32
+		{D731702C-B704-468D-9497-A75EE0521C89}.Release|Win32.Build.0 = Release|Win32
+		{D731702C-B704-468D-9497-A75EE0521C89}.Release|x64.ActiveCfg = Release|x64
+		{D731702C-B704-468D-9497-A75EE0521C89}.Release|x64.Build.0 = Release|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|x64.Build.0 = Release|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|x64.ActiveCfg = Release|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|Win32.Build.0 = Release|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Release|Win32.ActiveCfg = Release|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|x64.Build.0 = Debug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|x64.ActiveCfg = Debug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|Win32.Build.0 = Debug|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A252A}.Debug|Win32.ActiveCfg = Debug|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/examples/concurrent_priority_queue/shortpath/shortpath.cpp b/examples/concurrent_priority_queue/shortpath/shortpath.cpp
new file mode 100644
index 0000000..a4cd148
--- /dev/null
+++ b/examples/concurrent_priority_queue/shortpath/shortpath.cpp
@@ -0,0 +1,375 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#include <cstdio>
+#include <vector>
+#include <math.h>
+#include "tbb/atomic.h"
+#include "tbb/tick_count.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/task_group.h"
+#include "tbb/concurrent_priority_queue.h"
+#include "tbb/spin_mutex.h"
+#include "tbb/parallel_for.h"
+#include "tbb/blocked_range.h"
+#include "../../common/utility/utility.h"
+#include "../../common/utility/fast_random.h"
+
+#if defined(_MSC_VER) && defined(_Wp64)
+    // Workaround for overzealous compiler warnings in /Wp64 mode
+    #pragma warning (disable: 4267)
+#endif /* _MSC_VER && _Wp64 */
+
+#define __TBB_LAMBDAS_PRESENT  ( _MSC_VER >= 1600 && !__INTEL_COMPILER || __INTEL_COMPILER > 1100 && _TBB_CPP0X )
+
+using namespace std;
+using namespace tbb;
+
+struct point {
+    double x, y;
+    point() {}
+    point(double _x, double _y) : x(_x), y(_y) {}
+    point(const point& p) : x(p.x), y(p.y) {} 
+};
+
+double get_distance(const point& p1, const point& p2) {
+    double xdiff=p1.x-p2.x, ydiff=p1.y-p2.y;
+    return sqrt(xdiff*xdiff + ydiff*ydiff);
+}
+
+// generates random points on 2D plane within a box of maxsize width & height
+point generate_random_point(utility::FastRandom& mr) {
+    const size_t maxsize=500;
+    double x = (double)(mr.get() % maxsize);
+    double y = (double)(mr.get() % maxsize);
+    return point(x,y);
+}
+
+// weighted toss makes closer nodes (in the point vector) heavily connected
+bool die_toss(size_t a, size_t b, utility::FastRandom& mr) {
+    int node_diff = std::abs((int)(a-b));
+    // near nodes
+    if (node_diff < 16) return true;
+    // mid nodes
+    if (node_diff < 64) return ((int)mr.get() % 8 == 0);
+    // far nodes
+    if (node_diff < 512) return ((int)mr.get() % 16 == 0);
+    return false;
+}
+
+typedef vector<point> point_set;
+typedef size_t vertex_id;
+typedef std::pair<vertex_id,double> vertex_rec;
+typedef vector<vector<vertex_id> > edge_set;
+
+bool verbose = false;          // prints bin details and other diagnostics to screen
+bool silent = false;           // suppress all output except for time
+size_t N = 1000;               // number of vertices
+size_t src = 0;                // start of path
+size_t dst = N-1;              // end of path
+double INF=100000.0;           // infinity
+size_t grainsize = 16;         // number of vertices per task on average
+size_t max_spawn;              // max tasks to spawn
+atomic<size_t> num_spawn;      // number of active tasks
+
+point_set vertices;            // vertices
+edge_set edges;                // edges
+vector<vertex_id> predecessor; // for recreating path from src to dst
+
+vector<double> f_distance;     // estimated distances at particular vertex
+vector<double> g_distance;     // current shortest distances from src vertex
+vector<spin_mutex> locks;      // a lock for each vertex
+task_group *sp_group;          // task group for tasks executing sub-problems
+
+class compare_f {
+public:
+    bool operator()(const vertex_rec& u, const vertex_rec& v) const {
+        return u.second>v.second;
+    }
+};
+
+concurrent_priority_queue<vertex_rec, compare_f> open_set; // tentative vertices
+
+void shortpath_helper();
+
+#if !__TBB_LAMBDAS_PRESENT
+class shortpath_helper_functor {
+public:
+    shortpath_helper_functor() {};
+    void operator() () const { shortpath_helper(); }
+};
+#endif
+
+void shortpath() {
+    g_distance[src] = 0.0; // src's distance from src is zero
+    f_distance[src] = get_distance(vertices[src], vertices[dst]); // estimate distance from src to dst
+    open_set.push(make_pair(src,f_distance[src])); // push src into open_set
+#if __TBB_LAMBDAS_PRESENT    
+    sp_group->run([](){ shortpath_helper(); });
+#else
+    sp_group->run( shortpath_helper_functor() );
+#endif
+    sp_group->wait();
+}
+
+void shortpath_helper() {
+    vertex_rec u_rec;
+    while (open_set.try_pop(u_rec)) {
+        vertex_id u = u_rec.first;
+        if (u==dst) continue;
+        double f = u_rec.second;
+        double old_g_u = 0.0;
+        {
+            spin_mutex::scoped_lock l(locks[u]);
+            if (f > f_distance[u]) continue; // prune search space
+            old_g_u = g_distance[u];
+        }
+        for (size_t i=0; i<edges[u].size(); ++i) {
+            vertex_id v = edges[u][i];
+            double new_g_v = old_g_u + get_distance(vertices[u], vertices[v]);
+            double new_f_v = 0.0;
+            // the push flag lets us move some work out of the critical section below
+            bool push = false;
+            {
+                spin_mutex::scoped_lock l(locks[v]);
+                if (new_g_v < g_distance[v]) {
+                    predecessor[v] = u;
+                    g_distance[v] = new_g_v;
+                    new_f_v = f_distance[v] = g_distance[v] + get_distance(vertices[v], vertices[dst]);
+                    push = true;
+                }
+            }
+            if (push) {
+                open_set.push(make_pair(v,new_f_v));
+                size_t n_spawn = ++num_spawn;
+                if (n_spawn < max_spawn) {
+#if __TBB_LAMBDAS_PRESENT    
+                    sp_group->run([]{ shortpath_helper(); });
+#else
+                    sp_group->run( shortpath_helper_functor() );
+#endif                
+                }
+                else --num_spawn;
+            }
+        }
+    }
+    --num_spawn;
+}
+
+void make_path(vertex_id src, vertex_id dst, vector<vertex_id>& path) {
+    vertex_id at = predecessor[dst];
+    if (at == N) path.push_back(src);
+    else if (at == src) { path.push_back(src); path.push_back(dst); }
+    else { make_path(src, at, path); path.push_back(dst); }
+}
+
+void print_path() {
+    vector<vertex_id> path;
+    double path_length=0.0;
+    make_path(src, dst, path);
+    if (verbose) printf("\n      ");
+    for (size_t i=0; i<path.size(); ++i) {
+        if (path[i] != dst) {
+            double seg_length = get_distance(vertices[path[i]], vertices[path[i+1]]);
+            if (verbose) printf("%6.1f       ", seg_length);
+            path_length += seg_length;
+        }
+        else if (verbose) printf("\n");
+    }
+    if (verbose) {
+        for (size_t i=0; i<path.size(); ++i) {
+            if (path[i] != dst) printf("(%4d)------>", (int)path[i]);
+            else printf("(%4d)\n", (int)path[i]);
+        }
+    }
+    if (verbose) printf("Total distance = %5.1f\n", path_length);
+    else if (!silent) printf(" %5.1f\n", path_length);
+}
+
+int get_default_num_threads() {
+    static int threads = 0;
+    if (threads == 0)
+        threads = tbb::task_scheduler_init::default_num_threads();
+    return threads;
+}
+
+#if !__TBB_LAMBDAS_PRESENT
+class gen_vertices {
+public: 
+    gen_vertices() {}
+    void operator() (blocked_range<size_t>& r) const {
+        utility::FastRandom my_random((unsigned int)r.begin());
+        for (size_t i=r.begin(); i!=r.end(); ++i) {
+            vertices[i] = generate_random_point(my_random);
+        }
+    }
+};
+
+class gen_edges {
+public: 
+    gen_edges() {}
+    void operator() (blocked_range<size_t>& r) const {
+        utility::FastRandom my_random((unsigned int)r.begin());
+        for (size_t i=r.begin(); i!=r.end(); ++i) {
+            for (size_t j=0; j<i; ++j) {
+                if (die_toss(i, j, my_random))
+                    edges[i].push_back(j);
+            }
+        }
+    }
+};
+
+class reset_vertices {
+public: 
+    reset_vertices() {}
+    void operator() (blocked_range<size_t>& r) const {
+        for (size_t i=r.begin(); i!=r.end(); ++i) {
+            f_distance[i] = g_distance[i] = INF;
+            predecessor[i] = N;
+        }
+    }
+};
+#endif
+
+void InitializeGraph() {
+    sp_group = new task_group;
+    vertices.resize(N);
+    edges.resize(N);
+    predecessor.resize(N);
+    g_distance.resize(N);
+    f_distance.resize(N);
+    locks.resize(N);
+    task_scheduler_init init(get_default_num_threads());
+    if (verbose) printf("Generating vertices...\n");
+#if __TBB_LAMBDAS_PRESENT
+    parallel_for(blocked_range<size_t>(0,N,64), 
+                 [&](blocked_range<size_t>& r) {
+                     utility::FastRandom my_random(r.begin());
+                     for (size_t i=r.begin(); i!=r.end(); ++i) {
+                         vertices[i] = generate_random_point(my_random);
+                     }
+                 }, simple_partitioner());
+#else
+    parallel_for(blocked_range<size_t>(0,N,64), gen_vertices(), simple_partitioner());
+#endif
+    if (verbose) printf("Generating edges...\n");
+#if __TBB_LAMBDAS_PRESENT
+    parallel_for(blocked_range<size_t>(0,N,64), 
+                 [&](blocked_range<size_t>& r) {
+                     utility::FastRandom my_random(r.begin());
+                     for (size_t i=r.begin(); i!=r.end(); ++i) {
+                         for (size_t j=0; j<i; ++j) {
+                             if (die_toss(i, j, my_random))
+                                 edges[i].push_back(j);
+                         }
+                     }
+                 }, simple_partitioner());
+#else
+    parallel_for(blocked_range<size_t>(0,N,64), gen_edges(), simple_partitioner());
+#endif
+    for (size_t i=0; i<N; ++i) {
+        for (size_t j=0; j<edges[i].size(); ++j) {
+            vertex_id k = edges[i][j];
+            edges[k].push_back(i);
+        }
+    }
+    if (verbose) printf("Done.\n");
+}
+
+void ResetGraph() {
+    task_scheduler_init init(get_default_num_threads());
+#if __TBB_LAMBDAS_PRESENT
+    parallel_for(blocked_range<size_t>(0,N), 
+                 [&](blocked_range<size_t>& r) {
+                     for (size_t i=r.begin(); i!=r.end(); ++i) {
+                         f_distance[i] = g_distance[i] = INF;
+                         predecessor[i] = N;
+                     }
+                 });
+#else
+    parallel_for(blocked_range<size_t>(0,N), reset_vertices());
+#endif
+}
+
+int main(int argc, char *argv[]) {
+    try {
+        utility::thread_number_range threads(get_default_num_threads);
+        utility::parse_cli_arguments(argc, argv,
+                                     utility::cli_argument_pack()
+                                     //"-h" option for for displaying help is present implicitly
+                                     .positional_arg(threads,"#threads","  number of threads to use; a range of the "
+                                                     "form low[:high]\n              where low and optional high are "
+                                                     "non-negative integers,\n              or 'auto' for the TBB "
+                                                     "default")
+                                     .arg(verbose,"verbose","   print diagnostic output to screen")
+                                     .arg(silent,"silent","    limits output to timing info; overrides verbose")
+                                     .arg(N,"N","         number of vertices")
+                                     .arg(src,"start","      start of path")
+                                     .arg(dst,"end","        end of path")
+        );
+        if (silent) verbose = false;  // make silent override verbose
+        else
+            printf("shortpath will run with %d vertices to find shortest path between vertices"
+                   " %d and %d using %d:%d threads.\n", 
+                   (int)N, (int)src, (int)dst, (int)threads.first, (int)threads.last);
+  
+        if (dst >= N) { 
+            if (verbose) 
+                printf("end value %d is invalid for %d vertices; correcting to %d\n", (int)dst, (int)N, (int)N-1);
+            dst = N-1;
+        }
+        
+        num_spawn = 0;
+        max_spawn = N/grainsize;
+        tick_count t0, t1;
+        InitializeGraph();
+        for (int n_thr=threads.first; n_thr<=threads.last; ++n_thr) {
+            ResetGraph();
+            task_scheduler_init init(n_thr);
+            t0 = tick_count::now();
+            shortpath();
+            t1 = tick_count::now();
+            if (!silent) {
+                if (predecessor[dst] != N) {
+                    printf("%d threads: [%6.6f] The shortest path from vertex %d to vertex %d is:", 
+                           (int)n_thr, (t1-t0).seconds(), (int)src, (int)dst);
+                    print_path();
+                }
+                else {
+                    printf("%d threads: [%6.6f] There is no path from vertex %d to vertex %d\n", 
+                           (int)n_thr, (t1-t0).seconds(), (int)src, (int)dst);
+                }
+            } else
+                utility::report_elapsed_time((t1-t0).seconds());
+        }
+        return 0;
+    } catch(std::exception& e) {
+        cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+        return 1;
+    }
+}
diff --git a/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj b/examples/concurrent_priority_queue/shortpath/xcode/shortpath.xcodeproj/project.pbxproj
similarity index 65%
copy from examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
copy to examples/concurrent_priority_queue/shortpath/xcode/shortpath.xcodeproj/project.pbxproj
index 7eed01d..112449b 100644
--- a/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
+++ b/examples/concurrent_priority_queue/shortpath/xcode/shortpath.xcodeproj/project.pbxproj
@@ -3,15 +3,13 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
-		612CD8DD11F573FC00A587B2 /* Game_of_life.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */; };
-		612CD8DE11F573FC00A587B2 /* Update_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8DC11F573FC00A587B2 /* Update_state.cpp */; };
-		612CD8E111F5742000A587B2 /* Evolution.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8E011F5742000A587B2 /* Evolution.cpp */; };
-		A1F593B70B8F06F900073279 /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
-		A1F593BB0B8F072500073279 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
+		0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0E8A7310136F4A4600453C80 /* libtbb.dylib */; };
+		0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E8A7310136F4A4600453C80 /* libtbb.dylib */; };
+		61C4771B13CE199D0022F8F6 /* shortpath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61C4771A13CE199D0022F8F6 /* shortpath.cpp */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -21,18 +19,16 @@
 			dstPath = "";
 			dstSubfolderSpec = 16;
 			files = (
-				A1F593BB0B8F072500073279 /* libtbb.dylib in CopyFiles */,
+				0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Game_of_life.cpp; path = ../src/Game_of_life.cpp; sourceTree = SOURCE_ROOT; };
-		612CD8DC11F573FC00A587B2 /* Update_state.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Update_state.cpp; path = ../src/Update_state.cpp; sourceTree = SOURCE_ROOT; };
-		612CD8E011F5742000A587B2 /* Evolution.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Evolution.cpp; path = ../src/Evolution.cpp; sourceTree = SOURCE_ROOT; };
-		8DD76F6C0486A84900D96B5E /* game_of_life */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = game_of_life; sourceTree = BUILT_PRODUCTS_DIR; };
-		A1F593B30B8F06F900073279 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb.dylib; path = ../../../../lib/libtbb.dylib; sourceTree = SOURCE_ROOT; };
+		0E8A7310136F4A4600453C80 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libtbb.dylib; sourceTree = "<group>"; };
+		61C4771A13CE199D0022F8F6 /* shortpath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = shortpath.cpp; path = ../shortpath.cpp; sourceTree = "<group>"; };
+		8DD76F6C0486A84900D96B5E /* Shortpath */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Shortpath; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -40,29 +36,27 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A1F593B70B8F06F900073279 /* libtbb.dylib in Frameworks */,
+				0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
-		08FB7794FE84155DC02AAC07 /* game_of_life */ = {
+		08FB7794FE84155DC02AAC07 /* Shortpath */ = {
 			isa = PBXGroup;
 			children = (
 				08FB7795FE84155DC02AAC07 /* Source */,
 				A1F593B20B8F06F900073279 /* External Frameworks and Libraries */,
 				1AB674ADFE9D54B511CA2CBB /* Products */,
 			);
-			name = game_of_life;
+			name = Shortpath;
 			sourceTree = "<group>";
 		};
 		08FB7795FE84155DC02AAC07 /* Source */ = {
 			isa = PBXGroup;
 			children = (
-				612CD8E011F5742000A587B2 /* Evolution.cpp */,
-				612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */,
-				612CD8DC11F573FC00A587B2 /* Update_state.cpp */,
+				61C4771A13CE199D0022F8F6 /* shortpath.cpp */,
 			);
 			name = Source;
 			sourceTree = "<group>";
@@ -70,7 +64,7 @@
 		1AB674ADFE9D54B511CA2CBB /* Products */ = {
 			isa = PBXGroup;
 			children = (
-				8DD76F6C0486A84900D96B5E /* game_of_life */,
+				8DD76F6C0486A84900D96B5E /* Shortpath */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -78,7 +72,7 @@
 		A1F593B20B8F06F900073279 /* External Frameworks and Libraries */ = {
 			isa = PBXGroup;
 			children = (
-				A1F593B30B8F06F900073279 /* libtbb.dylib */,
+				0E8A7310136F4A4600453C80 /* libtbb.dylib */,
 			);
 			name = "External Frameworks and Libraries";
 			sourceTree = "<group>";
@@ -86,9 +80,9 @@
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
-		8DD76F620486A84900D96B5E /* game_of_life */ = {
+		8DD76F620486A84900D96B5E /* Shortpath */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "game_of_life" */;
+			buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Shortpath" */;
 			buildPhases = (
 				8DD76F640486A84900D96B5E /* Sources */,
 				8DD76F660486A84900D96B5E /* Frameworks */,
@@ -98,10 +92,10 @@
 			);
 			dependencies = (
 			);
-			name = game_of_life;
+			name = Shortpath;
 			productInstallPath = "$(HOME)/bin";
-			productName = game_of_life;
-			productReference = 8DD76F6C0486A84900D96B5E /* game_of_life */;
+			productName = Shortpath;
+			productReference = 8DD76F6C0486A84900D96B5E /* Shortpath */;
 			productType = "com.apple.product-type.tool";
 		};
 /* End PBXNativeTarget section */
@@ -109,14 +103,21 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
-			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "game_of_life" */;
-			compatibilityVersion = "Xcode 2.4";
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
+			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "shortpath" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
-			mainGroup = 08FB7794FE84155DC02AAC07 /* game_of_life */;
+			knownRegions = (
+				en,
+			);
+			mainGroup = 08FB7794FE84155DC02AAC07 /* Shortpath */;
 			projectDirPath = "";
 			projectRoot = "";
 			targets = (
-				8DD76F620486A84900D96B5E /* game_of_life */,
+				8DD76F620486A84900D96B5E /* Shortpath */,
 			);
 		};
 /* End PBXProject section */
@@ -126,9 +127,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				612CD8DD11F573FC00A587B2 /* Game_of_life.cpp in Sources */,
-				612CD8DE11F573FC00A587B2 /* Update_state.cpp in Sources */,
-				612CD8E111F5742000A587B2 /* Evolution.cpp in Sources */,
+				61C4771B13CE199D0022F8F6 /* shortpath.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -140,17 +139,21 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
 				);
-				PRODUCT_NAME = game_of_life;
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+				PRODUCT_NAME = Shortpath;
 				ZERO_LINK = NO;
 			};
 			name = Debug;
@@ -159,15 +162,20 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
 				);
-				PRODUCT_NAME = game_of_life;
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+				PRODUCT_NAME = Shortpath;
 				ZERO_LINK = NO;
 			};
 			name = Release;
@@ -182,7 +190,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -198,7 +205,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -207,21 +213,24 @@
 		A1F593C60B8F0E6E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
 				);
-				PRODUCT_NAME = game_of_life;
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+				PRODUCT_NAME = Shortpath;
 				ZERO_LINK = NO;
 			};
 			name = Debug64;
@@ -229,18 +238,22 @@
 		A1F593C70B8F0E6E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
 				);
-				PRODUCT_NAME = game_of_life;
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+				PRODUCT_NAME = Shortpath;
 				ZERO_LINK = NO;
 			};
 			name = Release64;
@@ -260,7 +273,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -281,7 +293,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -290,7 +301,7 @@
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
-		1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "game_of_life" */ = {
+		1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Shortpath" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				1DEB923208733DC60010E9CD /* Debug */,
@@ -301,7 +312,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "game_of_life" */ = {
+		1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "shortpath" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				1DEB923608733DC60010E9CD /* Debug */,
diff --git a/examples/task_group/sudoku/Makefile b/examples/graph/binpack/Makefile
similarity index 90%
copy from examples/task_group/sudoku/Makefile
copy to examples/graph/binpack/Makefile
index 180d19f..8379b1e 100644
--- a/examples/task_group/sudoku/Makefile
+++ b/examples/graph/binpack/Makefile
@@ -25,18 +25,20 @@
 # the GNU General Public License.
 
 # GNU Makefile that builds and runs example.
-PROG=sudoku
-ARGS=input1 4 0 -p
+PROG=binpack
+ARGS=4 N=1000
+PERF_RUN_ARGS=auto N=1000 silent
 
 # The C++ compiler
 ifneq (,$(shell which icc 2>/dev/null))
 CXX=icc
 endif # which icc
-ifeq ($(CXX),icc)
-CXX0XFLAGS=-std=c++0x -D_TBB_CPP0X
-endif # icc
 
-all:	release test
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
+all:    release test
 
 release: *.cpp
 	$(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS) $(CXX0XFLAGS)
@@ -49,3 +51,8 @@ clean:
 
 test:
 	./$(PROG) $(ARGS)
+
+perf_build: release
+
+perf_run:
+	./$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/task_group/sudoku/Makefile.windows b/examples/graph/binpack/Makefile.windows
similarity index 94%
copy from examples/task_group/sudoku/Makefile.windows
copy to examples/graph/binpack/Makefile.windows
index 246377f..00c1e4e 100644
--- a/examples/task_group/sudoku/Makefile.windows
+++ b/examples/graph/binpack/Makefile.windows
@@ -27,8 +27,9 @@
 # Common Makefile that builds and runs example.
 
 # Just specify your program basename
-PROG=sudoku
-ARGS=input1 4 2 -p
+PROG=binpack
+ARGS= 4 N=1000
+PERF_RUN_ARGS=auto N=1000 silent
 
 # Trying to find if icl.exe is set
 CXX1 = $(TBB_CXX)-
@@ -50,3 +51,8 @@ test:
 	$(PROG) $(ARGS)
 compiler_check:
 	@$(CXX) >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+
+perf_build: release
+
+perf_run:
+	$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/graph/binpack/binpack.cpp b/examples/graph/binpack/binpack.cpp
new file mode 100644
index 0000000..0391a78
--- /dev/null
+++ b/examples/graph/binpack/binpack.cpp
@@ -0,0 +1,305 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+
+/* Bin-packing algorithm that attempts to use minimal number of bins B of
+   size V to contain N items of varying sizes. */
+
+#include <string>
+#include <iostream>
+#include <cmath>
+#include "tbb/atomic.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/tick_count.h"
+#include "tbb/flow_graph.h"
+#include "../../common/utility/utility.h"
+
+using namespace std;
+using namespace tbb;
+using namespace tbb::flow;
+
+typedef size_t size_type;        // to represent non-zero indices, capacities, etc.
+typedef size_t value_type;       // the type of items we are attempting to pack into bins
+typedef vector<value_type> bin;  // we use a simple vector to represent a bin
+// Our bin packers will be function nodes in the graph that take value_type items and
+// return a dummy value.  They will also implicitly send packed bins to the bin_buffer
+// node, and unused items back to the value_pool node:
+typedef function_node<value_type, continue_msg, rejecting> bin_packer;
+// Items are placed into a pool that all bin packers grab from, represent by a queue_node:
+typedef queue_node<value_type> value_pool;
+// Packed bins are placed in this buffer waiting to be serially printed and/or accounted for:
+typedef buffer_node<bin> bin_buffer;
+// Packed bins are taken from the_bin_buffer and processed by the_writer:
+typedef function_node<bin, continue_msg, rejecting> bin_writer;
+// Items are injected into the graph when this node sends them to the_value_pool:
+typedef source_node<value_type> value_source;
+
+// User-specified globals with default values
+size_type V = 42;                // desired capacity for each bin
+size_type N = 1000;              // number of elements to generate
+bool verbose = false;            // prints bin details and other diagnostics to screen
+bool silent = false;             // suppress all output except for time
+int num_bin_packers=-1;          // number of concurrent bin packers in operation; default is #threads;
+                                 // larger values can result in more bins at less than full capacity
+size_type optimality=1;          // 1 (default) is highest the algorithm can obtain; larger numbers run faster
+
+// Calculated globals
+size_type min_B;                 // lower bound on the optimal number of bins
+size_type B;                     // the answer, i.e. number of bins used by the algorithm
+size_type *input_array;          // stores randomly generated input values
+value_type item_sum;             // sum of all randomly generated input values
+atomic<value_type> packed_sum;   // sum of all values currently packed into all bins
+atomic<size_type> packed_items;  // number of values currently packed into all bins
+atomic<size_type> active_bins;   // number of active bin_packers
+bin_packer **bins;               // the array of bin packers
+
+// This class is the Body type for bin_packer
+class bin_filler {
+    bin my_bin;                   // the current bin that this bin_filler is packing
+    size_type my_used;            // capacity of bin used by current contents (not to be confused with my_bin.size())
+    size_type relax, relax_val;   // relaxation counter for determining when to settle for a non-full bin
+    bin_packer* my_bin_packer;    // ptr to the bin packer that this body object is associated with
+    size_type bin_index;          // index of the encapsulating bin packer in the global bins array
+    value_pool* the_value_pool;   // ptr to the pool of items to pack
+    bin_buffer* the_bin_buffer;   // ptr to the buffer of resulting bins
+    value_type looking_for;       // the minimum size of item this bin_packer will accept
+    bool done;                    // flag to indicate that this binpacker has been deactivated
+ public:
+    bin_filler(size_t bidx, value_pool* q, bin_buffer* r) :
+        my_used(0), relax(0), relax_val(0), my_bin_packer(NULL), bin_index(bidx), the_value_pool(q),
+        the_bin_buffer(r), looking_for(V), done(false) {}
+    continue_msg operator()(const value_type& item) {
+        if (!my_bin_packer) my_bin_packer = bins[bin_index];
+        if (done) the_value_pool->try_put(item); // this bin_packer is done packing items; put item back to pool
+        else if (item > V) { // signal that packed_sum has reached item_sum at some point
+            size_type remaining = active_bins--;
+            if (remaining == 1 && packed_sum == item_sum) { // this is the last bin and it has seen everything
+                // this bin_packer may not have seen everything, so stay active
+                if (my_used>0) the_bin_buffer->try_put(my_bin);
+                my_bin.clear();
+                my_used = 0;
+                looking_for = V;
+                ++active_bins;
+            }
+            else if (remaining == 1) { // this is the last bin, but there are remaining items
+                the_value_pool->try_put(V+1); // send out signal
+                ++active_bins;
+            }
+            else if (remaining > 1) { // this is not the last bin; deactivate
+                if (my_used < V/(1+optimality*.1)) { // this bin is ill-utilized; throw back items and deactivate
+                    packed_sum -= my_used;
+                    packed_items -= my_bin.size();
+                    for (size_type i=0; i<my_bin.size(); ++i)
+                        the_value_pool->try_put(my_bin[i]);
+                    the_value_pool->remove_successor(*my_bin_packer); // deactivate
+                    done = true;
+                    the_value_pool->try_put(V+1); // send out signal
+                }
+                else { // this bin is well-utilized; send out bin and deactivate
+                    the_value_pool->remove_successor(*my_bin_packer); // build no more bins
+                    done = true;
+                    if (my_used>0) the_bin_buffer->try_put(my_bin);
+                    the_value_pool->try_put(V+1); // send out signal
+                }
+            }
+        }
+        else if (item <= V-my_used && item >= looking_for) { // this item can be packed
+            my_bin.push_back(item);
+            my_used += item;
+            packed_sum += item;
+            ++packed_items;
+            looking_for = V-my_used;
+            relax = 0;
+            if (packed_sum == item_sum) {
+                the_value_pool->try_put(V+1); // send out signal
+            }
+            if (my_used == V) {
+                the_bin_buffer->try_put(my_bin);
+                my_bin.clear();
+                my_used = 0;
+                looking_for = V;
+            }
+        }
+        else { // this item can't be packed; relax constraints
+            ++relax;
+            if (relax >= (N-packed_items)/optimality) { // this bin_packer has looked through enough items
+                relax = 0;
+                --looking_for; // accept a wider range of items
+                if (looking_for == 0 && my_used < V/(1+optimality*.1) && my_used > 0 && active_bins > 1) {
+                    // this bin_packer is ill-utilized and can't find items; deactivate and throw back items
+                    size_type remaining = active_bins--;
+                    if (remaining > 1) { // not the last bin_packer
+                        the_value_pool->remove_successor(*my_bin_packer); // deactivate
+                        done = true;
+                    }
+                    else active_bins++; // can't deactivate last bin_packer
+                    packed_sum -= my_used;
+                    packed_items -= my_bin.size();
+                    for (size_type i=0; i<my_bin.size(); ++i)
+                        the_value_pool->try_put(my_bin[i]);
+                    my_bin.clear();
+                    my_used = 0;
+                }
+                else if (looking_for == 0 && (my_used >= V/(1+optimality*.1) || active_bins == 1)) {
+                    // this bin_packer can't find items but is well-utilized, so send it out and reset
+                    the_bin_buffer->try_put(my_bin);
+                    my_bin.clear();
+                    my_used = 0;
+                    looking_for = V;
+                }
+            }
+            the_value_pool->try_put(item); // put unused item back to pool
+        }
+        return continue_msg();  // need to return something
+    }
+};
+
+// source node uses this to send the values to the value_pool
+class item_generator {
+    size_type counter;
+public:
+    item_generator() : counter(0) {}
+    bool operator()(value_type& m) {
+        if (counter<N) {
+            m = input_array[counter];
+            ++counter;
+            return true;
+        }
+        return false;
+    }
+};
+
+// the terminal function_node uses this to gather stats and print bin information
+class bin_printer {
+    value_type running_count;
+    size_type item_count;
+    value_type my_min, my_max;
+    double avg;
+public:
+    bin_printer() : running_count(0), item_count(0), my_min(V), my_max(0), avg(0) {}
+    continue_msg operator()(bin b) {
+        value_type sum=0;
+        ++B;
+        if (verbose)
+            cout << "[ ";
+        for (size_type i=0; i<b.size(); ++i) {
+            if (verbose)
+                cout << b[i] << " ";
+            sum+=b[i];
+            ++item_count;
+        }
+        if (sum < my_min) my_min = sum;
+        if (sum > my_max) my_max = sum;
+        avg += sum;
+        running_count += sum;
+        if (verbose)
+        cout << "]=" << sum << "; Done/Packed/Total cap: " << running_count << "/" << packed_sum << "/" << item_sum
+             << " items:" << item_count << "/" << packed_items << "/" << N << " B=" << B << endl;
+        if (item_count == N) { // should be the last; print stats
+            avg = avg/(double)B;
+            if (!silent)
+                cout << "SUMMARY: #Bins used: " << B << "; Avg size: " << avg << "; Max size: " << my_max
+                     << "; Min size: " << my_min << "\n         Lower bound on optimal #bins: " << min_B
+                     << "; Start #bins: " << num_bin_packers << endl;
+        }
+        return continue_msg();  // need to return something
+    }
+};
+
+int get_default_num_threads() {
+    static int threads = 0;
+    if (threads == 0)
+        threads = tbb::task_scheduler_init::default_num_threads();
+    return threads;
+}
+
+int main(int argc, char *argv[]) {
+    try {
+        utility::thread_number_range threads(get_default_num_threads);
+        utility::parse_cli_arguments(argc, argv,
+                                     utility::cli_argument_pack()
+                                     //"-h" option for for displaying help is present implicitly
+                                     .positional_arg(threads,"#threads","  number of threads to use; a range of the "
+                                                     "form low[:high]\n              where low and optional high are "
+                                                     "non-negative integers,\n              or 'auto' for the TBB "
+                                                     "default")
+                                     .arg(verbose,"verbose","   print diagnostic output to screen")
+                                     .arg(silent,"silent","    limits output to timing info; overrides verbose")
+                                     .arg(N,"N","         number of values to pack")
+                                     .arg(V,"V","         capacity of each bin")
+                                     .arg(num_bin_packers,"#packers","  number of concurrent bin packers to use "
+                                          "(default=#threads)")
+                                     .arg(optimality,"optimality","controls optimality of solution; 1 is highest, use\n"
+                                          "              larger numbers for less optimal but faster solution")
+        );
+
+        if (silent) verbose = false;  // make silent override verbose
+        // Generate random input data
+        srand(42);
+        input_array = new value_type[N];
+        item_sum = 0;
+        for (size_type i=0; i<N; ++i) {
+            input_array[i] = rand() % V + 1;  // generate items that fit in a bin
+            item_sum += input_array[i];
+        }
+        min_B = (item_sum % V) ? item_sum/V + 1 : item_sum/V;
+
+        tick_count start = tick_count::now();
+        for(int p = threads.first; p <= threads.last; ++p ) {
+            task_scheduler_init init(p);
+            packed_sum = 0;
+            packed_items = 0;
+            B = 0;
+            if (num_bin_packers == -1) num_bin_packers = p;
+            active_bins = num_bin_packers;
+            if (!silent)
+                cout << "binpack running with " << item_sum << " capacity over " << N << " items, optimality="
+                     << optimality << ", " << num_bin_packers << " bins of capacity=" << V << " on " << p
+                     << " threads.\n";
+            graph g;
+            value_source the_source(g, item_generator(), false);
+            value_pool the_value_pool(g);
+            make_edge(the_source, the_value_pool);
+            bin_buffer the_bin_buffer(g);
+            bins = new bin_packer*[num_bin_packers];
+            for (int i=0; i<num_bin_packers; ++i) {
+                bins[i] = new bin_packer(g, 1, bin_filler(i, &the_value_pool, &the_bin_buffer));
+                make_edge(the_value_pool, *(bins[i]));
+            }
+            bin_writer the_writer(g, 1, bin_printer());
+            make_edge(the_bin_buffer, the_writer);
+            the_source.activate();
+            g.wait_for_all();
+        }
+        utility::report_elapsed_time((tbb::tick_count::now() - start).seconds());
+        return 0;
+    } catch(std::exception& e) {
+        cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+        return 1;
+    }
+}
diff --git a/examples/graph/binpack/index.html b/examples/graph/binpack/index.html
new file mode 100644
index 0000000..14908aa
--- /dev/null
+++ b/examples/graph/binpack/index.html
@@ -0,0 +1,72 @@
+<HTML>
+<BODY>
+
+<H2>Overview</H2>
+
+This directory contains a simple tbb::flow example that performs 
+binpacking of N integer values into a near-optimal number of bins
+of capacity V. It features a source_node which passes randomly
+generated integer values of size<=V to a queue_node.  Multiple
+function_nodes set about taking values from this queue_node and 
+packing them into bins according to a best-fit policy.  Items that
+cannot be made to fit are rejected and returned to the queue. When 
+a bin is packed as well as it can be, it is passed to a buffer_node
+where it waits to be picked up by another function_node.  This final
+function nodes gathers stats about the bin and optionally prints its
+contents.  When all bins are accounted for, it optionally prints a 
+summary of the quality of the bin-packing.
+
+<H2>Files</H2>
+<DL>
+<DT><A HREF="binpack.cpp">binpack.cpp</A>
+<DD>Driver.
+
+<DT><A HREF="Makefile">Makefile</A>
+<DD>Makefile for building example.
+
+</DL>
+
+<H2>Directories</H2>
+<DL>
+<DT><A HREF="msvs">msvs</A>
+<DD>Contains Microsoft* Visual Studio* 2008 workspace for building and running the example with the Intel® C++ compiler.
+<DT><A HREF="xcode">xcode</A>
+<DD>Contains Mac OS* Xcode* workspace for building and running the example.
+</DL>
+
+<H2>To Build</H2>
+General build directions can be found <A HREF=../../index.html#build>here</A>.
+<P></P>
+
+<H2>Usage</H2>
+<DL>
+
+<DT><TT>binpack <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>binpack [<I>#threads</I>=value] [<I>verbose</I>] [<I>silent</I>] [<I>N</I>=value] [<I>V</I>=value] [<I>#packers</I>=value] [<I>optimality</I>=value] [<I>#threads</I>]</TT>
+<DD><I>#threads</I> is the number of threads to use; a range of the form <I>low</I>[:<I>high</I>] where low and optional high are non-negative integers, or 'auto' for the TBB default.<BR>
+    <I>verbose</I> print diagnostic output to screen<BR>
+    <I>silent</I> limits output to timing info; overrides verbose<BR>
+    <I>N</I> number of values to pack<BR>
+    <I>V</I> capacity of each bin<BR>
+    <I>#packers</I> number of concurrent bin packers to use (default=#threads)<BR>
+    <I>optimality</I> controls optimality of solution; 1 is highest, use larger numbers for less optimal but faster solution<BR>
+
+
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector:
+<DD>Build a <I>debug</I> version of the example
+    (see the <A HREF=../../index.html#build>build directions</A>).
+    <BR>Run it with a small problem size and the desired number of threads, e.g., <TT>binpack 4 N=100</TT>.
+</DL>
+
+<HR>
+<A HREF="../index.html">Up to parent directory</A>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
+</BODY>
+</HTML>
diff --git a/examples/graph/binpack/msvs/binpack.icproj b/examples/graph/binpack/msvs/binpack.icproj
new file mode 100644
index 0000000..74a4049
--- /dev/null
+++ b/examples/graph/binpack/msvs/binpack.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Intel C++ Project"
+	Version="11.1"
+	Name="binpack"
+	ProjectGUID="{CB292CD9-903E-464C-AAFE-E7A49003565C}"
+	VCNestedProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
+	VCNestedProjectFileName="binpack.vcproj">
+	<Configurations/>
+	<Files/>
+</VisualStudioProject>
diff --git a/examples/task/tree_sum/msvs/tree_sum.vcproj b/examples/graph/binpack/msvs/binpack.vcproj
similarity index 76%
copy from examples/task/tree_sum/msvs/tree_sum.vcproj
copy to examples/graph/binpack/msvs/binpack.vcproj
index 4f85ec3..b93a9ae 100644
--- a/examples/task/tree_sum/msvs/tree_sum.vcproj
+++ b/examples/graph/binpack/msvs/binpack.vcproj
@@ -2,9 +2,9 @@
 <VisualStudioProject
 	ProjectType="Visual C++"
 	Version="8,00"
-	Name="tree_sum"
+	Name="binpack"
 	ProjectGUID="{C931C7A2-074E-4150-9E7A-39A03250411E}"
-	RootNamespace="tree_sum"
+	RootNamespace="binpack"
 	Keyword="Win32Proj"
 	>
 	<Platforms>
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -198,7 +198,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib tbbmalloc.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -250,7 +250,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -278,7 +278,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib tbbmalloc.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -329,7 +329,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
@@ -342,23 +342,7 @@
 			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
 			>
 			<File
-				RelativePath="..\common.h"
-				>
-			</File>
-			<File
-				RelativePath="..\main.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\OptimizedParallelSumTree.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\SerialSumTree.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\SimpleParallelSumTree.cpp"
+				RelativePath="..\binpack.cpp"
 				>
 			</File>
 		</Filter>
diff --git a/examples/graph/binpack/msvs/binpack_cl.sln b/examples/graph/binpack/msvs/binpack_cl.sln
new file mode 100644
index 0000000..ac5cd2f
--- /dev/null
+++ b/examples/graph/binpack/msvs/binpack_cl.sln
@@ -0,0 +1,25 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "binpack", "binpack.vcproj", "{C931C7A2-074E-4150-9E7A-39A03250411E}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.ActiveCfg = Debug|Win32
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.Build.0 = Debug|Win32
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.ActiveCfg = Debug|x64
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.Build.0 = Debug|x64
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.ActiveCfg = Release|Win32
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.Build.0 = Release|Win32
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.ActiveCfg = Release|x64
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.Build.0 = Release|x64
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/examples/graph/binpack/msvs/binpack_icl.sln b/examples/graph/binpack/msvs/binpack_icl.sln
new file mode 100644
index 0000000..4f86c03
--- /dev/null
+++ b/examples/graph/binpack/msvs/binpack_icl.sln
@@ -0,0 +1,33 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "binpack", "binpack.icproj", "{CB292CD9-903E-464C-AAFE-E7A49003565C}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{CB292CD9-903E-464C-AAFE-E7A49003565C}.Debug|Win32.ActiveCfg = Debug|Win32
+		{CB292CD9-903E-464C-AAFE-E7A49003565C}.Debug|Win32.Build.0 = Debug|Win32
+		{CB292CD9-903E-464C-AAFE-E7A49003565C}.Debug|x64.ActiveCfg = Debug|x64
+		{CB292CD9-903E-464C-AAFE-E7A49003565C}.Debug|x64.Build.0 = Debug|x64
+		{CB292CD9-903E-464C-AAFE-E7A49003565C}.Release|Win32.ActiveCfg = Release|Win32
+		{CB292CD9-903E-464C-AAFE-E7A49003565C}.Release|Win32.Build.0 = Release|Win32
+		{CB292CD9-903E-464C-AAFE-E7A49003565C}.Release|x64.ActiveCfg = Release|x64
+		{CB292CD9-903E-464C-AAFE-E7A49003565C}.Release|x64.Build.0 = Release|x64
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.Build.0 = Release|x64
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Release|x64.ActiveCfg = Release|x64
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.Build.0 = Release|Win32
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Release|Win32.ActiveCfg = Release|Win32
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.Build.0 = Debug|x64
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|x64.ActiveCfg = Debug|x64
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.Build.0 = Debug|Win32
+		{C931C7A2-074E-4150-9E7A-39A03250411E}.Debug|Win32.ActiveCfg = Debug|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj b/examples/graph/binpack/xcode/binpack.xcodeproj/project.pbxproj
similarity index 65%
copy from examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
copy to examples/graph/binpack/xcode/binpack.xcodeproj/project.pbxproj
index 7eed01d..fe95d4d 100644
--- a/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
+++ b/examples/graph/binpack/xcode/binpack.xcodeproj/project.pbxproj
@@ -3,15 +3,13 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
-		612CD8DD11F573FC00A587B2 /* Game_of_life.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */; };
-		612CD8DE11F573FC00A587B2 /* Update_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8DC11F573FC00A587B2 /* Update_state.cpp */; };
-		612CD8E111F5742000A587B2 /* Evolution.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 612CD8E011F5742000A587B2 /* Evolution.cpp */; };
-		A1F593B70B8F06F900073279 /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
-		A1F593BB0B8F072500073279 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
+		0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0E8A7310136F4A4600453C80 /* libtbb.dylib */; };
+		0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E8A7310136F4A4600453C80 /* libtbb.dylib */; };
+		A1F593A60B8F042A00073279 /* binpack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* binpack.cpp */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -21,18 +19,16 @@
 			dstPath = "";
 			dstSubfolderSpec = 16;
 			files = (
-				A1F593BB0B8F072500073279 /* libtbb.dylib in CopyFiles */,
+				0E8A7311136F4A4600453C80 /* libtbb.dylib in CopyFiles */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Game_of_life.cpp; path = ../src/Game_of_life.cpp; sourceTree = SOURCE_ROOT; };
-		612CD8DC11F573FC00A587B2 /* Update_state.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Update_state.cpp; path = ../src/Update_state.cpp; sourceTree = SOURCE_ROOT; };
-		612CD8E011F5742000A587B2 /* Evolution.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Evolution.cpp; path = ../src/Evolution.cpp; sourceTree = SOURCE_ROOT; };
-		8DD76F6C0486A84900D96B5E /* game_of_life */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = game_of_life; sourceTree = BUILT_PRODUCTS_DIR; };
-		A1F593B30B8F06F900073279 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb.dylib; path = ../../../../lib/libtbb.dylib; sourceTree = SOURCE_ROOT; };
+		0E8A7310136F4A4600453C80 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libtbb.dylib; sourceTree = "<group>"; };
+		8DD76F6C0486A84900D96B5E /* Binpack */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Binpack; sourceTree = BUILT_PRODUCTS_DIR; };
+		A1F593A50B8F042A00073279 /* binpack.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = binpack.cpp; path = ../binpack.cpp; sourceTree = SOURCE_ROOT; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -40,29 +36,27 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A1F593B70B8F06F900073279 /* libtbb.dylib in Frameworks */,
+				0E8A7325136F4D3600453C80 /* libtbb.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
-		08FB7794FE84155DC02AAC07 /* game_of_life */ = {
+		08FB7794FE84155DC02AAC07 /* Binpack */ = {
 			isa = PBXGroup;
 			children = (
 				08FB7795FE84155DC02AAC07 /* Source */,
 				A1F593B20B8F06F900073279 /* External Frameworks and Libraries */,
 				1AB674ADFE9D54B511CA2CBB /* Products */,
 			);
-			name = game_of_life;
+			name = Binpack;
 			sourceTree = "<group>";
 		};
 		08FB7795FE84155DC02AAC07 /* Source */ = {
 			isa = PBXGroup;
 			children = (
-				612CD8E011F5742000A587B2 /* Evolution.cpp */,
-				612CD8DB11F573FC00A587B2 /* Game_of_life.cpp */,
-				612CD8DC11F573FC00A587B2 /* Update_state.cpp */,
+				A1F593A50B8F042A00073279 /* binpack.cpp */,
 			);
 			name = Source;
 			sourceTree = "<group>";
@@ -70,7 +64,7 @@
 		1AB674ADFE9D54B511CA2CBB /* Products */ = {
 			isa = PBXGroup;
 			children = (
-				8DD76F6C0486A84900D96B5E /* game_of_life */,
+				8DD76F6C0486A84900D96B5E /* Binpack */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -78,7 +72,7 @@
 		A1F593B20B8F06F900073279 /* External Frameworks and Libraries */ = {
 			isa = PBXGroup;
 			children = (
-				A1F593B30B8F06F900073279 /* libtbb.dylib */,
+				0E8A7310136F4A4600453C80 /* libtbb.dylib */,
 			);
 			name = "External Frameworks and Libraries";
 			sourceTree = "<group>";
@@ -86,9 +80,9 @@
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
-		8DD76F620486A84900D96B5E /* game_of_life */ = {
+		8DD76F620486A84900D96B5E /* Binpack */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "game_of_life" */;
+			buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Binpack" */;
 			buildPhases = (
 				8DD76F640486A84900D96B5E /* Sources */,
 				8DD76F660486A84900D96B5E /* Frameworks */,
@@ -98,10 +92,10 @@
 			);
 			dependencies = (
 			);
-			name = game_of_life;
+			name = Binpack;
 			productInstallPath = "$(HOME)/bin";
-			productName = game_of_life;
-			productReference = 8DD76F6C0486A84900D96B5E /* game_of_life */;
+			productName = Binpack;
+			productReference = 8DD76F6C0486A84900D96B5E /* Binpack */;
 			productType = "com.apple.product-type.tool";
 		};
 /* End PBXNativeTarget section */
@@ -109,14 +103,21 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
-			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "game_of_life" */;
-			compatibilityVersion = "Xcode 2.4";
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
+			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "binpack" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
-			mainGroup = 08FB7794FE84155DC02AAC07 /* game_of_life */;
+			knownRegions = (
+				en,
+			);
+			mainGroup = 08FB7794FE84155DC02AAC07 /* Binpack */;
 			projectDirPath = "";
 			projectRoot = "";
 			targets = (
-				8DD76F620486A84900D96B5E /* game_of_life */,
+				8DD76F620486A84900D96B5E /* Binpack */,
 			);
 		};
 /* End PBXProject section */
@@ -126,9 +127,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				612CD8DD11F573FC00A587B2 /* Game_of_life.cpp in Sources */,
-				612CD8DE11F573FC00A587B2 /* Update_state.cpp in Sources */,
-				612CD8E111F5742000A587B2 /* Evolution.cpp in Sources */,
+				A1F593A60B8F042A00073279 /* binpack.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -140,17 +139,21 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
 				);
-				PRODUCT_NAME = game_of_life;
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+				PRODUCT_NAME = Binpack;
 				ZERO_LINK = NO;
 			};
 			name = Debug;
@@ -159,15 +162,20 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
 				);
-				PRODUCT_NAME = game_of_life;
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+				PRODUCT_NAME = Binpack;
 				ZERO_LINK = NO;
 			};
 			name = Release;
@@ -182,7 +190,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -198,7 +205,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -207,21 +213,24 @@
 		A1F593C60B8F0E6E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
 				);
-				PRODUCT_NAME = game_of_life;
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+				PRODUCT_NAME = Binpack;
 				ZERO_LINK = NO;
 			};
 			name = Debug64;
@@ -229,18 +238,22 @@
 		A1F593C70B8F0E6E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2)",
+					"$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3)",
 				);
-				PRODUCT_NAME = game_of_life;
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_2 = "\"$(SRCROOT)\"";
+				LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_3 = "\"$(SRCROOT)\"";
+				PRODUCT_NAME = Binpack;
 				ZERO_LINK = NO;
 			};
 			name = Release64;
@@ -260,7 +273,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -281,7 +293,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -290,7 +301,7 @@
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
-		1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "game_of_life" */ = {
+		1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Binpack" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				1DEB923208733DC60010E9CD /* Debug */,
@@ -301,7 +312,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "game_of_life" */ = {
+		1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "binpack" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				1DEB923608733DC60010E9CD /* Debug */,
diff --git a/examples/parallel_for/game_of_life/Makefile b/examples/graph/dining_philosophers/Makefile
similarity index 85%
copy from examples/parallel_for/game_of_life/Makefile
copy to examples/graph/dining_philosophers/Makefile
index dd68eac..a80a4f9 100644
--- a/examples/parallel_for/game_of_life/Makefile
+++ b/examples/graph/dining_philosophers/Makefile
@@ -25,22 +25,31 @@
 # the GNU General Public License.
 
 # GNU Makefile that builds and runs example.
-PROG=game_of_life
-ARGS=2:4 -t 5
+PROG=dining_philosophers
+ARGS= auto 5
+LIGHT_ARGS= auto 3
+
 ifneq (,$(shell which icc 2>/dev/null))
 CXX=icc
 endif # icc
 
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
 all:	release test
 
-release: src/Evolution.cpp src/Update_state.cpp src/Game_of_life.cpp
+release: src/dining_philosophers.cpp
 	$(CXX) -O2 -DNDEBUG -D_CONSOLE $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS)
 
-debug: src/Evolution.cpp src/Update_state.cpp src/Game_of_life.cpp
-	$(CXX) -O0 -D_CONSOLE -g -DTBB_DO_ASSERT $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
+debug:  src/dining_philosophers.cpp
+	$(CXX) -O0 -D_CONSOLE -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
 
 clean:
 	rm -f $(PROG) *.o *.d
 
 test:
 	./$(PROG) $(ARGS)
+
+light_test:
+	./$(PROG) $(LIGHT_ARGS)
diff --git a/examples/task_group/sudoku/Makefile.windows b/examples/graph/dining_philosophers/Makefile.windows
similarity index 82%
copy from examples/task_group/sudoku/Makefile.windows
copy to examples/graph/dining_philosophers/Makefile.windows
index 246377f..a63b74a 100644
--- a/examples/task_group/sudoku/Makefile.windows
+++ b/examples/graph/dining_philosophers/Makefile.windows
@@ -27,8 +27,9 @@
 # Common Makefile that builds and runs example.
 
 # Just specify your program basename
-PROG=sudoku
-ARGS=input1 4 2 -p
+PROG=dining_philosophers
+ARGS= auto 5
+LIGHT_ARGS= auto 3
 
 # Trying to find if icl.exe is set
 CXX1 = $(TBB_CXX)-
@@ -40,13 +41,14 @@ MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_
 MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
 
 all: release test
-release:
-	$(CXX) *.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
-debug:
-	$(CXX) *.cpp /MDd /Od /Zi /D TBB_USE_DEBUG /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
+release: 
+	$(CXX) ./src/dining_philosophers.cpp /MD /O2 /D NDEBUG $(MYCXXFLAGS) /link tbb.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
+debug: 
+	$(CXX) ./src/dining_philosophers.cpp /MDd /Od /Zi /D _DEBUG $(MYCXXFLAGS) /link tbb_debug.lib $(LIBS) $(MYLDFLAGS) /OUT:$(PROG).exe
 clean:
 	@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest
 test:
 	$(PROG) $(ARGS)
-compiler_check:
-	@$(CXX) >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+light_test:
+	$(PROG) $(LIGHT_ARGS)
+
diff --git a/examples/graph/dining_philosophers/index.html b/examples/graph/dining_philosophers/index.html
new file mode 100644
index 0000000..3cd6177
--- /dev/null
+++ b/examples/graph/dining_philosophers/index.html
@@ -0,0 +1,48 @@
+<HTML>
+<BODY>
+
+<H2>Overview</H2>
+The Dining Philosophers problem demonstrates tbb::flow and the use of the reserving join node to
+solve the potential deadlock.
+<br>This program runs some number of philosophers in parallel, each thinking and then waiting for chopsticks
+to be available before eating.  Eating and thinking are implemented with sleep().  The chopstick positions are represented by a queue_node with one item.
+
+<H2>Source Files</H2>
+<DL>
+<DT><A HREF="src/dining_philosophers.cpp">dining_philosophers.cpp</A>
+<DD>Source code for the example.
+<DT><A HREF="Makefile">Makefile</A>, <A HREF=Makefile.windows>Makefile.windows</A>
+<DD>Makefiles for building example.
+</DL>
+
+<H2>Directories</H2>
+<DL>
+<DT><A HREF="src">src</A>
+<DD>Contains source file mentioned above.
+<DT><A HREF="msvs">msvs</A>
+<DD>Contains Microsoft* Visual Studio* 2005 workspace for building and running the example.
+<DT><A HREF="xcode">xcode</A>
+<DD>Contains Mac OS* Xcode* workspace for building and running the example.
+</DL>
+
+<H2>To Build</H2>
+General build directions can be found <A HREF=../../index.html#build>here</A>.
+<P></P>
+
+<H2>Usage</H2>
+<DL>
+For Windows* systems, Microsoft* Visual Studio* projects are provided for each of the above versions. 
+</DL>
+
+<HR>
+<A HREF="../index.html">Up to parent directory</A>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
+</BODY>
+</HTML>
+
diff --git a/examples/graph/dining_philosophers/msvs/dining_philosophers.icproj b/examples/graph/dining_philosophers/msvs/dining_philosophers.icproj
new file mode 100644
index 0000000..c27e179
--- /dev/null
+++ b/examples/graph/dining_philosophers/msvs/dining_philosophers.icproj
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+	ProjectType="Intel C++ Project"
+	Version="11.1"
+	Name="dining_philosophers"
+	ProjectGUID="{bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}"
+	VCNestedProjectGUID="{3894d1d2-a574-4937-ad56-726758efe5b7}"
+	VCNestedProjectFileName="dining_philosophers.vcproj">
+	<Configurations/>
+	<Files/>
+</VisualStudioProject>
diff --git a/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj b/examples/graph/dining_philosophers/msvs/dining_philosophers.vcproj
similarity index 74%
copy from examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj
copy to examples/graph/dining_philosophers/msvs/dining_philosophers.vcproj
index a8aa8af..431b47a 100644
--- a/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj
+++ b/examples/graph/dining_philosophers/msvs/dining_philosophers.vcproj
@@ -2,9 +2,9 @@
 <VisualStudioProject
 	ProjectType="Visual C++"
 	Version="8,00"
-	Name="parallel_preorder"
-	ProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A252B}"
-	RootNamespace="parallel_preorder"
+	Name="dining_philosophers"
+	ProjectGUID="{3894d1d2-a574-4937-ad56-726758efe5b7}"
+	RootNamespace="dining_philosophers"
 	Keyword="Win32Proj"
 	>
 	<Platforms>
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -198,7 +198,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -250,7 +250,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -278,7 +278,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -329,7 +329,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
@@ -339,32 +339,10 @@
 		<Filter
 			Name="Source Files"
 			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			UniqueIdentifier="{64630469-f82d-4c18-a957-20e5b93130f8}"
 			>
 			<File
-				RelativePath="..\Graph.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\main.cpp"
-				>
-			</File>
-			<File
-				RelativePath="..\parallel_preorder.cpp"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath="..\Graph.h"
-				>
-			</File>
-			<File
-				RelativePath="..\Matrix.h"
+				RelativePath="..\src\dining_philosophers.cpp"
 				>
 			</File>
 		</Filter>
diff --git a/examples/graph/dining_philosophers/msvs/dining_philosophers_cl.sln b/examples/graph/dining_philosophers/msvs/dining_philosophers_cl.sln
new file mode 100644
index 0000000..ed55faa
--- /dev/null
+++ b/examples/graph/dining_philosophers/msvs/dining_philosophers_cl.sln
@@ -0,0 +1,25 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{3EC5FFF9-397F-47A7-BAF9-FDD602956644}") = "dining_philosophers", "dining_philosophers.vcproj", "{3894D1D2-A574-4937-AD56-726758EFE5B7}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{3894D1D2-A574-4937-AD56-726758EFE5B7}.Debug|Win32.ActiveCfg = Debug|Win32
+		{3894D1D2-A574-4937-AD56-726758EFE5B7}.Debug|Win32.Build.0 = Debug|Win32
+		{3894D1D2-A574-4937-AD56-726758EFE5B7}.Debug|x64.ActiveCfg = Debug|x64
+		{3894D1D2-A574-4937-AD56-726758EFE5B7}.Debug|x64.Build.0 = Debug|x64
+		{3894D1D2-A574-4937-AD56-726758EFE5B7}.Release|Win32.ActiveCfg = Release|Win32
+		{3894D1D2-A574-4937-AD56-726758EFE5B7}.Release|Win32.Build.0 = Release|Win32
+		{3894D1D2-A574-4937-AD56-726758EFE5B7}.Release|x64.ActiveCfg = Release|x64
+		{3894D1D2-A574-4937-AD56-726758EFE5B7}.Release|x64.Build.0 = Release|x64
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/examples/graph/dining_philosophers/msvs/dining_philosophers_icl.sln b/examples/graph/dining_philosophers/msvs/dining_philosophers_icl.sln
new file mode 100644
index 0000000..d86e64b
--- /dev/null
+++ b/examples/graph/dining_philosophers/msvs/dining_philosophers_icl.sln
@@ -0,0 +1,33 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{b651a8c1-851b-4873-ab7a-428d9f15be2d}") = "dining_philosophers", "dining_philosophers.icproj", "{bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Debug|Win32.ActiveCfg = Debug|Win32
+		{bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Debug|Win32.Build.0 = Debug|Win32
+		{bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Debug|x64.ActiveCfg = Debug|x64
+		{bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Debug|x64.Build.0 = Debug|x64
+		{bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Release|Win32.ActiveCfg = Release|Win32
+		{bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Release|Win32.Build.0 = Release|Win32
+		{bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Release|x64.ActiveCfg = Release|x64
+		{bbdf68ee-c8b2-4836-b3fc-385ce2265dc0}.Release|x64.Build.0 = Release|x64
+		{3894d1d2-a574-4937-ad56-726758efe5b7}.Release|x64.Build.0 = Release|x64
+		{3894d1d2-a574-4937-ad56-726758efe5b7}.Release|x64.ActiveCfg = Release|x64
+		{3894d1d2-a574-4937-ad56-726758efe5b7}.Release|Win32.Build.0 = Release|Win32
+		{3894d1d2-a574-4937-ad56-726758efe5b7}.Release|Win32.ActiveCfg = Release|Win32
+		{3894d1d2-a574-4937-ad56-726758efe5b7}.Debug|x64.Build.0 = Debug|x64
+		{3894d1d2-a574-4937-ad56-726758efe5b7}.Debug|x64.ActiveCfg = Debug|x64
+		{3894d1d2-a574-4937-ad56-726758efe5b7}.Debug|Win32.Build.0 = Debug|Win32
+		{3894d1d2-a574-4937-ad56-726758efe5b7}.Debug|Win32.ActiveCfg = Debug|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/examples/graph/dining_philosophers/src/dining_philosophers.cpp b/examples/graph/dining_philosophers/src/dining_philosophers.cpp
new file mode 100644
index 0000000..03d7f71
--- /dev/null
+++ b/examples/graph/dining_philosophers/src/dining_philosophers.cpp
@@ -0,0 +1,318 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#if _MSC_VER
+    // Suppress "decorated name length exceeded, name was truncated" warning
+    #pragma warning (disable: 4503)
+#endif
+
+#include "tbb/flow_graph.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/tick_count.h"
+#include "tbb/atomic.h"
+#include "tbb/spin_mutex.h"
+#include <iostream>
+#include "../../../common/utility/utility.h"
+#include <cstdlib>
+#include <cstdio>
+
+#if _WIN32 || _WIN64
+#include "windows.h"
+#define SLEEP(a) Sleep(a*1000)
+#else
+#define SLEEP(a) sleep(a)
+#endif
+
+// Each philosopher is run as a task in the graph, and its first action is to execute
+// a think(), and then call make_my_node().  make_my_node() will
+//
+//     1) allocate a join_node,
+//     2) link the left and right chopstick queues to the join,
+//     3) allocate a function_node with a node_body that calls eat_and_think().
+//     4) link the join_node to the function_node.
+//
+// While the philosopher participates in the game, it will (when eat_and_think() is invoked)
+//
+//     a) eat (the funtion_node will be invoked only when both chopsticks are available)
+//     b) if we are going to eventually eat again, we just try_put() the chopsticks
+//        back into our queues.  If not, we disconnect our join_node from the queues,
+//        and then place the chopsticks back.
+//     c) If we are going to eat again, we think().
+//
+// philosopher_by_ref allows us to pass an object to g.run() that can be copied, but will
+// retain a reference to our original philosopher.  If this wasn't done, g.run() would store a
+// copy of philosopher, and the original wouldn't be used.
+
+const int think_time = 1;
+const int eat_time = 1;
+const int num_times = 10;
+
+tbb::tick_count t0;
+bool verbose = false;
+
+const char *names[] = { "Archimedes", "Bakunin", "Confucius", "Democritus", "Euclid"
+                      , "Favorinus", "Geminus", "Heraclitus", "Ichthyas", "Jason of Nysa",
+                          "Kant", "Lavrov", "Metrocles", "Nausiphanes", "Onatas", "Phaedrus",
+                          "Quillot", "Russell", "Socrates", "Thales", "Udayana",
+                          "Vernadsky", "Wittgenstein", "Xenophilus", "Yen Yuan", "Zenodotus"
+};
+const int NumPhilosophers = sizeof(names) / sizeof(char*);
+
+// from seismic
+int get_default_num_threads() {
+    static int threads = 0;
+    if ( threads == 0 )
+        threads = tbb::task_scheduler_init::default_num_threads();
+    return threads;
+}
+
+struct RunOptions {
+    utility::thread_number_range threads;
+    int number_of_philosophers;
+    bool silent;
+    RunOptions(utility::thread_number_range threads_, int number_of_philosophers_, bool silent_) :
+        threads(threads_), number_of_philosophers(number_of_philosophers_), silent(silent_) { }
+};
+
+RunOptions ParseCommandLine(int argc, char *argv[]) {
+    int auto_threads = get_default_num_threads();
+    utility::thread_number_range threads(get_default_num_threads, auto_threads, auto_threads);
+    int nPhilosophers = 5;
+    bool verbose = false;
+    char charbuf[100];
+    std::sprintf(charbuf, "%d", NumPhilosophers);
+    std::string pCount = "how many philosophers, from 2-";
+    pCount += charbuf;
+
+    utility::cli_argument_pack cli_pack;
+    cli_pack.positional_arg(threads, "n-of_threads", "number of threads to use, a range of the form low[:high], where low and high are non-negative integers or 'auto' for the TBB default.")
+            .positional_arg(nPhilosophers, "n-of-philosophers", pCount)
+            .arg(verbose,"verbose","verbose output");
+    utility::parse_cli_arguments(argc, argv, cli_pack);
+    if(nPhilosophers < 2 || nPhilosophers > NumPhilosophers) {
+        std::cout << "Number of philosophers (" << nPhilosophers << ") out of range [2:" << NumPhilosophers << "]\n";
+        std::cout << cli_pack.usage_string(argv[0]) << std::flush;
+        std::exit(1);
+    }
+    return RunOptions(threads, nPhilosophers,!verbose);
+}
+
+
+tbb::spin_mutex my_mutex;
+
+class chopstick {};
+
+class philosopher {
+public:
+
+    typedef tbb::flow::queue_node< chopstick > chopstick_buffer;
+    typedef tbb::flow::join_node< std::tuple<chopstick, chopstick>, tbb::flow::reserving > join_type;
+
+    philosopher( const char *name, tbb::flow::graph &the_graph, chopstick_buffer *left, chopstick_buffer *right ) : 
+        my_name(name), my_graph(&the_graph), my_left_chopstick(left), my_right_chopstick(right),
+        my_join(NULL), my_function_node(NULL), my_count(num_times) { }
+
+    ~philosopher() {
+        if(my_join) delete my_join;
+        if(my_function_node) delete my_function_node;
+    }
+
+    void operator()();
+    void check();
+
+    void link_left_chopstick() { my_left_chopstick->register_successor( std::get<0>(my_join->inputs()) ); }
+    void link_right_chopstick() { my_right_chopstick->register_successor( std::get<1>(my_join->inputs()) ); }
+    const char *name() const { return my_name; }
+
+private:
+
+  friend std::ostream& operator<<(std::ostream& o, philosopher const &p);
+
+  const char *my_name;
+  tbb::flow::graph *my_graph;
+  chopstick_buffer *my_left_chopstick;
+  chopstick_buffer *my_right_chopstick;
+  join_type *my_join;
+  tbb::flow::function_node< join_type::output_type, tbb::flow::continue_msg, tbb::flow::rejecting > *my_function_node;
+  int my_count;
+
+  friend class node_body;
+
+  void eat_and_think( );
+  void eat( );
+  void think( );
+  void make_my_node();
+
+};
+
+class philosopher_by_ref {
+    philosopher &my_guy;
+public:
+    philosopher_by_ref(philosopher &_my_guy) : my_guy(_my_guy) { }
+    void operator()() {
+        my_guy();
+    };
+};
+
+std::ostream& operator<<(std::ostream& o, philosopher const &p) {
+    o << "< philosopher[" << reinterpret_cast<uintptr_t>(const_cast<philosopher *>(&p)) << "] " << p.name() 
+        << ", my_count=" << p.my_count;
+    return o;
+}
+
+class node_body {
+  philosopher& my_philosopher;
+public:
+  node_body( philosopher &p ) : my_philosopher(p) { }
+  void operator()( philosopher::join_type::output_type ) {
+    my_philosopher.eat_and_think();
+  } 
+};
+
+void philosopher::operator()() {
+  think();
+  make_my_node(); 
+} 
+
+void philosopher::check() {
+  if ( my_count != 0 ) {
+    std::printf("ERROR: philosopher %s still had to run %d more times\n", name(), my_count);
+    std::exit(1);
+  } else {
+    if(verbose) std::printf("%s done.\n", name());
+  }
+}
+
+void philosopher::eat_and_think( ) { 
+  eat();
+  if(my_count < 0) abort();
+  --my_count;
+
+  if (my_count > 0) {
+    my_left_chopstick->try_put( chopstick() );
+    my_right_chopstick->try_put( chopstick() );
+    think();
+  } else {
+    my_left_chopstick->remove_successor( std::get<0>(my_join->inputs()) );
+    my_right_chopstick->remove_successor( std::get<1>(my_join->inputs()) );
+    my_left_chopstick->try_put( chopstick() );
+    my_right_chopstick->try_put( chopstick() );
+    if(verbose) {
+      tbb::spin_mutex::scoped_lock lock(my_mutex);
+      std::printf("%s has left the building\n", name());
+    }
+ 
+  }
+}
+
+void philosopher::eat() { 
+  if(verbose) {
+    tbb::spin_mutex::scoped_lock lock(my_mutex);
+    std::printf("%s eating\n", name());
+  }
+  SLEEP(eat_time); 
+  if(verbose) {
+    tbb::spin_mutex::scoped_lock lock(my_mutex);
+    std::printf("%s done eating\n", name());
+  }
+}
+
+void philosopher::think() { 
+  if(verbose) {
+    tbb::spin_mutex::scoped_lock lock(my_mutex);
+    std::printf("%s thinking\n", name());
+  }
+  SLEEP(think_time); 
+  if(verbose) {
+    tbb::spin_mutex::scoped_lock lock(my_mutex);
+    std::printf("%s done thinking\n", name());
+  }
+}
+
+void philosopher::make_my_node() {
+  my_join = new join_type(*my_graph);
+  link_left_chopstick();
+  link_right_chopstick();
+  my_function_node = 
+    new tbb::flow::function_node< join_type::output_type, tbb::flow::continue_msg , tbb::flow::rejecting >( *my_graph, 
+                                                                         tbb::flow::serial, 
+                                                                         node_body( *this ) );
+  tbb::flow::make_edge( *my_join, *my_function_node );
+}
+
+typedef std::vector<philosopher> p_vector;
+typedef std::vector<tbb::flow::queue_node< chopstick > > chopstick_places;
+
+int main(int argc, char *argv[]) {
+    int num_threads;
+    int num_philosophers;
+
+    RunOptions options = ParseCommandLine(argc, argv);
+    num_philosophers = options.number_of_philosophers;
+    verbose = !options.silent;
+
+    for(num_threads = options.threads.first; num_threads <= options.threads.last; ++num_threads) {
+    
+        tbb::task_scheduler_init init(num_threads);
+
+        tbb::flow::graph g;
+
+        if(verbose) std::printf("\n%d philosophers with %d threads", num_philosophers, num_threads);
+
+        if(verbose) std::printf("\n\n");
+        t0 = tbb::tick_count::now();
+
+        // create queues of (one) chopstick
+        chopstick_places places(num_philosophers, tbb::flow::queue_node<chopstick>(g));
+        for ( int i = 0; i < num_philosophers; ++i ) {
+            places[i].try_put(chopstick());
+        }
+  
+       p_vector philosophers;
+       // must reserve the vector so no reallocation occurs (we're passing references to the vector elements)
+       philosophers.reserve(num_philosophers);
+       for ( int i = 0; i < num_philosophers; ++i ) {
+           philosophers.push_back( philosopher( names[i], g, &(places[i]), &(places[(i+1)%num_philosophers]) ) );
+           if(verbose) {
+               tbb::spin_mutex::scoped_lock lock(my_mutex);
+               std::cout << "Built philosopher " << philosophers[i] << std::endl;
+           }
+           g.run( philosopher_by_ref(philosophers[i]) );
+       }
+
+       g.wait_for_all();
+
+       tbb::tick_count t1 = tbb::tick_count::now();
+       if(verbose) utility::report_elapsed_time((t1-t0).seconds());
+
+       for ( int i = 0; i < num_philosophers; ++i ) 
+           philosophers[i].check();
+   }
+
+   return 0;
+}
diff --git a/examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj b/examples/graph/dining_philosophers/xcode/dining_philosophers.xcodeproj/project.pbxproj
similarity index 77%
copy from examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj
copy to examples/graph/dining_philosophers/xcode/dining_philosophers.xcodeproj/project.pbxproj
index f6957d7..477fde1 100644
--- a/examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj
+++ b/examples/graph/dining_philosophers/xcode/dining_philosophers.xcodeproj/project.pbxproj
@@ -3,11 +3,11 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
-		A1F593A60B8F042A00073279 /* Fibonacci.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* Fibonacci.cpp */; };
+		A1F593A60B8F042A00073279 /* dining_philosophers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F593A50B8F042A00073279 /* dining_philosophers.cpp */; };
 		A1F593B70B8F06F900073279 /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
 		A1F593BB0B8F072500073279 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A1F593B30B8F06F900073279 /* libtbb.dylib */; };
 /* End PBXBuildFile section */
@@ -26,8 +26,8 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		8DD76F6C0486A84900D96B5E /* Fibonacci */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Fibonacci; sourceTree = BUILT_PRODUCTS_DIR; };
-		A1F593A50B8F042A00073279 /* Fibonacci.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Fibonacci.cpp; path = ../Fibonacci.cpp; sourceTree = SOURCE_ROOT; };
+		8DD76F6C0486A84900D96B5E /* dining_philosophers */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dining_philosophers; sourceTree = BUILT_PRODUCTS_DIR; };
+		A1F593A50B8F042A00073279 /* dining_philosophers.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = dining_philosophers.cpp; path = ../src/dining_philosophers.cpp; sourceTree = SOURCE_ROOT; };
 		A1F593B30B8F06F900073279 /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb.dylib; path = ../../../../lib/libtbb.dylib; sourceTree = SOURCE_ROOT; };
 /* End PBXFileReference section */
 
@@ -43,20 +43,20 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
-		08FB7794FE84155DC02AAC07 /* Fibonacci */ = {
+		08FB7794FE84155DC02AAC07 /* dining_philosophers */ = {
 			isa = PBXGroup;
 			children = (
 				08FB7795FE84155DC02AAC07 /* Source */,
 				A1F593B20B8F06F900073279 /* External Frameworks and Libraries */,
 				1AB674ADFE9D54B511CA2CBB /* Products */,
 			);
-			name = Fibonacci;
+			name = dining_philosophers;
 			sourceTree = "<group>";
 		};
 		08FB7795FE84155DC02AAC07 /* Source */ = {
 			isa = PBXGroup;
 			children = (
-				A1F593A50B8F042A00073279 /* Fibonacci.cpp */,
+				A1F593A50B8F042A00073279 /* dining_philosophers.cpp */,
 			);
 			name = Source;
 			sourceTree = "<group>";
@@ -64,7 +64,7 @@
 		1AB674ADFE9D54B511CA2CBB /* Products */ = {
 			isa = PBXGroup;
 			children = (
-				8DD76F6C0486A84900D96B5E /* Fibonacci */,
+				8DD76F6C0486A84900D96B5E /* dining_philosophers */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -80,9 +80,9 @@
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
-		8DD76F620486A84900D96B5E /* Fibonacci */ = {
+		8DD76F620486A84900D96B5E /* dining_philosophers */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Fibonacci" */;
+			buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "dining_philosophers" */;
 			buildPhases = (
 				8DD76F640486A84900D96B5E /* Sources */,
 				8DD76F660486A84900D96B5E /* Frameworks */,
@@ -92,10 +92,10 @@
 			);
 			dependencies = (
 			);
-			name = Fibonacci;
+			name = dining_philosophers;
 			productInstallPath = "$(HOME)/bin";
-			productName = Fibonacci;
-			productReference = 8DD76F6C0486A84900D96B5E /* Fibonacci */;
+			productName = dining_philosophers;
+			productReference = 8DD76F6C0486A84900D96B5E /* dining_philosophers */;
 			productType = "com.apple.product-type.tool";
 		};
 /* End PBXNativeTarget section */
@@ -103,14 +103,21 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
-			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "fibonacci" */;
-			compatibilityVersion = "Xcode 2.4";
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
+			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "dining_philosophers" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
-			mainGroup = 08FB7794FE84155DC02AAC07 /* Fibonacci */;
+			knownRegions = (
+				en,
+			);
+			mainGroup = 08FB7794FE84155DC02AAC07 /* dining_philosophers */;
 			projectDirPath = "";
 			projectRoot = "";
 			targets = (
-				8DD76F620486A84900D96B5E /* Fibonacci */,
+				8DD76F620486A84900D96B5E /* dining_philosophers */,
 			);
 		};
 /* End PBXProject section */
@@ -120,7 +127,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A1F593A60B8F042A00073279 /* Fibonacci.cpp in Sources */,
+				A1F593A60B8F042A00073279 /* dining_philosophers.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -132,16 +139,15 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PRODUCT_NAME = Fibonacci;
+				PRODUCT_NAME = dining_philosophers;
 				ZERO_LINK = NO;
 			};
 			name = Debug;
@@ -150,14 +156,14 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PRODUCT_NAME = Fibonacci;
+				PRODUCT_NAME = dining_philosophers;
 				ZERO_LINK = NO;
 			};
 			name = Release;
@@ -172,7 +178,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -188,7 +193,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -197,20 +201,18 @@
 		A1F593C60B8F0E6E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PRODUCT_NAME = Fibonacci;
+				PRODUCT_NAME = dining_philosophers;
 				ZERO_LINK = NO;
 			};
 			name = Debug64;
@@ -218,17 +220,16 @@
 		A1F593C70B8F0E6E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PRODUCT_NAME = Fibonacci;
+				PRODUCT_NAME = dining_philosophers;
 				ZERO_LINK = NO;
 			};
 			name = Release64;
@@ -248,7 +249,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -269,7 +269,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -278,7 +277,7 @@
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
-		1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "Fibonacci" */ = {
+		1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "dining_philosophers" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				1DEB923208733DC60010E9CD /* Debug */,
@@ -289,7 +288,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "fibonacci" */ = {
+		1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "dining_philosophers" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				1DEB923608733DC60010E9CD /* Debug */,
diff --git a/examples/graph/index.html b/examples/graph/index.html
new file mode 100644
index 0000000..5b9e942
--- /dev/null
+++ b/examples/graph/index.html
@@ -0,0 +1,26 @@
+<HTML>
+<BODY>
+
+<H2>Overview</H2>
+This directory has examples of <code>tbb::flow</code>.
+
+<H2>Directories</H2>
+<DL>
+<DT><A HREF="dining_philosophers/index.html">dining_philosophers</A>
+<DD>An implementation of dining philosophers in graph using the reserving join node.
+<DT><A HREF="binpack/index.html">binpack</A>
+<DD>A solution to the binpacking problem using a queue_node, a buffer_node and function_nodes.
+</DL>
+
+<HR>
+<A HREF="../index.html">Up to parent directory</A>
+<p></p>
+Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
+<p></p>
+* Other names and brands may be claimed as the property of others.
+</BODY>
+</HTML>
+
diff --git a/examples/index.html b/examples/index.html
index c7efb78..e4d1cc0 100644
--- a/examples/index.html
+++ b/examples/index.html
@@ -10,6 +10,10 @@ This directory has example usages of Threading Building Blocks.
 <DD>Examples from the Getting Started Guide.
 <DT><A HREF="concurrent_hash_map/index.html">concurrent_hash_map</A>
 <DD>Examples using <CODE>concurrent_hash_map</CODE>.
+<DT><A HREF="concurrent_priority_queue/index.html">concurrent_priority_queue</A>
+<DD>Examples using <CODE>concurrent_priority_queue</CODE>.
+<DT><A HREF="graph/index.html">graph</A>
+<DD>Examples using <CODE>tbb::flow graph</CODE>.
 <DT><A HREF="parallel_do/index.html">parallel_do</A>
 <DD>Examples using <CODE>parallel_do</CODE>.
 <DT><A HREF="parallel_for/index.html">parallel_for</A>
@@ -169,10 +173,9 @@ The environment may be set up, for a given type of shell window, by using one of
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/parallel_do/index.html b/examples/parallel_do/index.html
index 55572f2..1bb68b3 100644
--- a/examples/parallel_do/index.html
+++ b/examples/parallel_do/index.html
@@ -14,10 +14,9 @@ This directory has examples of the template <code>parallel_do</code>.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/parallel_do/parallel_preorder/Makefile b/examples/parallel_do/parallel_preorder/Makefile
index 1aca995..5eea72c 100644
--- a/examples/parallel_do/parallel_preorder/Makefile
+++ b/examples/parallel_do/parallel_preorder/Makefile
@@ -34,6 +34,10 @@ ifneq (,$(shell which icc 2>/dev/null))
 CXX=icc
 endif # icc
 
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
 all:	release test
 
 release: *.cpp
diff --git a/examples/parallel_do/parallel_preorder/index.html b/examples/parallel_do/parallel_preorder/index.html
index 31744ce..f1a059c 100644
--- a/examples/parallel_do/parallel_preorder/index.html
+++ b/examples/parallel_do/parallel_preorder/index.html
@@ -84,10 +84,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj b/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj
index a8aa8af..2a0d923 100644
--- a/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj
+++ b/examples/parallel_do/parallel_preorder/msvs/parallel_preorder.vcproj
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -198,7 +198,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -250,7 +250,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -278,7 +278,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -329,7 +329,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/parallel_do/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj b/examples/parallel_do/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj
index 3c39a52..6773133 100644
--- a/examples/parallel_do/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj
+++ b/examples/parallel_do/parallel_preorder/xcode/parallel_preorder.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -113,9 +113,16 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
 			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "parallel_preorder" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 08FB7794FE84155DC02AAC07 /* parallel_preorder */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -144,14 +151,13 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = parallel_preorder;
 				ZERO_LINK = NO;
@@ -162,12 +168,12 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = parallel_preorder;
 				ZERO_LINK = NO;
@@ -184,7 +190,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -200,7 +205,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -209,18 +213,16 @@
 		A1F593C60B8F0E6E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = parallel_preorder;
 				ZERO_LINK = NO;
@@ -230,15 +232,14 @@
 		A1F593C70B8F0E6E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = parallel_preorder;
 				ZERO_LINK = NO;
@@ -260,7 +261,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -281,7 +281,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
diff --git a/examples/parallel_for/game_of_life/Makefile b/examples/parallel_for/game_of_life/Makefile
index dd68eac..39091c2 100644
--- a/examples/parallel_for/game_of_life/Makefile
+++ b/examples/parallel_for/game_of_life/Makefile
@@ -27,20 +27,27 @@
 # GNU Makefile that builds and runs example.
 PROG=game_of_life
 ARGS=2:4 -t 5
+LIGHT_ARGS=1:2 -t 5
 ifneq (,$(shell which icc 2>/dev/null))
 CXX=icc
 endif # icc
 
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt
+endif
+
 all:	release test
 
 release: src/Evolution.cpp src/Update_state.cpp src/Game_of_life.cpp
 	$(CXX) -O2 -DNDEBUG -D_CONSOLE $(CXXFLAGS) -o $(PROG) $^ -ltbb $(LIBS)
 
 debug: src/Evolution.cpp src/Update_state.cpp src/Game_of_life.cpp
-	$(CXX) -O0 -D_CONSOLE -g -DTBB_DO_ASSERT $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
+	$(CXX) -O0 -D_CONSOLE -g -DTBB_USE_DEBUG $(CXXFLAGS) -o $(PROG) $^ -ltbb_debug $(LIBS)
 
 clean:
 	rm -f $(PROG) *.o *.d
 
 test:
 	./$(PROG) $(ARGS)
+light_test:
+	./$(PROG) $(LIGHT_ARGS)
diff --git a/examples/parallel_for/game_of_life/Makefile.windows b/examples/parallel_for/game_of_life/Makefile.windows
index 6a5ad9a..d6c81ac 100644
--- a/examples/parallel_for/game_of_life/Makefile.windows
+++ b/examples/parallel_for/game_of_life/Makefile.windows
@@ -29,9 +29,12 @@
 # Just specify your program basename
 PROG=game_of_life
 ARGS=2:4 -t 5
+LIGHT_ARGS=1:2 -t 5
 
 # Trying to find if icl.exe is set
-CXX  = cl.exe
+CXX1 = $(TBB_CXX)-
+CXX2 = $(CXX1:icl.exe-=icl.exe)
+CXX  = $(CXX2:-=cl.exe)
 
 # The C++ compiler options
 MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _CRT_SECURE_NO_DEPRECATE $(CXXFLAGS)
@@ -46,4 +49,6 @@ clean:
 	@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest
 test:
 	$(PROG) $(ARGS)
+light_test:
+	$(PROG) $(LIGHT_ARGS)
 
diff --git a/examples/parallel_for/game_of_life/index.html b/examples/parallel_for/game_of_life/index.html
index cbb1d00..ebf0c86 100644
--- a/examples/parallel_for/game_of_life/index.html
+++ b/examples/parallel_for/game_of_life/index.html
@@ -44,10 +44,9 @@ For Windows* systems, Microsoft* Visual Studio* projects are provided for each o
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/parallel_for/game_of_life/msvs/Game_of_life.vcproj b/examples/parallel_for/game_of_life/msvs/Game_of_life.vcproj
index 0d976a8..554055a 100644
--- a/examples/parallel_for/game_of_life/msvs/Game_of_life.vcproj
+++ b/examples/parallel_for/game_of_life/msvs/Game_of_life.vcproj
@@ -45,7 +45,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG;USE_SSE"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -67,7 +67,7 @@
 				IgnoreImportLibrary="false"
 				AdditionalDependencies="tbb_debug.lib user32.lib $(NOINHERIT)"
 				LinkIncremental="2"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;"
 				GenerateDebugInformation="true"
 				AssemblyDebug="1"
 				SubSystem="2"
@@ -98,7 +98,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-        CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+        CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
         />
 		</Configuration>
 		<Configuration
@@ -129,7 +129,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_WINDOWS;_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -152,7 +152,7 @@
 				IgnoreImportLibrary="false"
 				AdditionalDependencies="tbb_debug.lib user32.lib $(NOINHERIT)"
 				LinkIncremental="2"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				AssemblyDebug="1"
 				SubSystem="2"
@@ -183,7 +183,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-        CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+        CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -213,7 +213,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				AdditionalOptions="-S -03&#x0D;&#x0A;"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
@@ -235,7 +235,7 @@
 				IgnoreImportLibrary="false"
 				AdditionalDependencies="tbb.lib user32.lib $(NOINHERIT)"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -267,7 +267,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-        CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+        CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -298,7 +298,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				AdditionalOptions="-S -03&#x0D;&#x0A;"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_WINDOWS;NDEBUG"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
@@ -320,7 +320,7 @@
 				IgnoreImportLibrary="false"
 				AdditionalDependencies="tbb.lib user32.lib $(NOINHERIT)"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -352,7 +352,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-        CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+        CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -382,7 +382,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
 				ExceptionHandling="1"
 				RuntimeLibrary="3"
@@ -402,7 +402,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;"
 				GenerateDebugInformation="true"
 				ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
 				SubSystem="1"
@@ -432,7 +432,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-        CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+        CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -463,7 +463,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
 				ExceptionHandling="1"
 				RuntimeLibrary="3"
@@ -483,7 +483,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;"
 				GenerateDebugInformation="true"
 				ProgramDatabaseFile="$(TargetDir)$(TargetName).pdb"
 				SubSystem="1"
@@ -514,7 +514,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-        CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+        CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -543,7 +543,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
 				RuntimeLibrary="2"
 				Detect64BitPortabilityProblems="true"
@@ -562,7 +562,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -594,7 +594,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-        CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+        CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -624,7 +624,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;USE_SSE"
 				RuntimeLibrary="2"
 				Detect64BitPortabilityProblems="false"
@@ -643,7 +643,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -675,7 +675,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-        CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+        CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj b/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
index 7eed01d..1c1cd6a 100644
--- a/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
+++ b/examples/parallel_for/game_of_life/xcode/game_of_life.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -109,9 +109,16 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
 			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "game_of_life" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 08FB7794FE84155DC02AAC07 /* game_of_life */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -140,10 +147,9 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
@@ -160,7 +166,7 @@
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
 				GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
@@ -182,7 +188,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -198,7 +203,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -207,14 +211,12 @@
 		A1F593C60B8F0E6E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
@@ -229,11 +231,10 @@
 		A1F593C70B8F0E6E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
 				GCC_PREPROCESSOR_DEFINITIONS = _CONSOLE;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
@@ -260,7 +261,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -281,7 +281,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
diff --git a/examples/parallel_for/index.html b/examples/parallel_for/index.html
index 86e978d..95f226c 100644
--- a/examples/parallel_for/index.html
+++ b/examples/parallel_for/index.html
@@ -20,10 +20,9 @@ This directory has examples of the template <code>parallel_for</code>.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/parallel_for/polygon_overlay/Makefile b/examples/parallel_for/polygon_overlay/Makefile
index ae18695..2c4061d 100644
--- a/examples/parallel_for/polygon_overlay/Makefile
+++ b/examples/parallel_for/polygon_overlay/Makefile
@@ -27,6 +27,7 @@
 # GNU Makefile that builds and runs example.
 NAME=pover
 ARGS=
+LIGHT_ARGS= --polys 10 --size 5x5
 
 # The C++ compiler
 ifneq (,$(shell which icc 2>/dev/null))
@@ -36,11 +37,17 @@ endif # icc
 include ../../common/gui/Makefile.gmake
 
 ifeq ($(UI),x)
-CXXFLAGS += -DX_FULLSYNC # TODO: is this necessary? -DUSE_SCALABLE_ALLOC=0 
+UI_CXXFLAGS += -DX_FULLSYNC
 endif # X
 
+override CXXFLAGS += $(UI_CXXFLAGS)
+
 SRCFILES = ../../common/gui/$(UI)video.cpp pover_video.cpp polymain.cpp polyover.cpp
 
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
 all:	release test
 
 resources:
@@ -51,7 +58,12 @@ ifeq ($(UI),mac)
 endif
 
 release: $(SRCFILES) resources
+ifeq ($(compiler),xl)
+	# Avoiding "1586-346 (U) An error occurred during code generation.  The code generation return code was 40." with -O3.
+	$(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SRCFILES) -ltbb -ltbbmalloc $(LIBS)
+else
 	$(CXX) -O3 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SRCFILES) -ltbb -ltbbmalloc $(LIBS)
+endif
 
 debug:  $(SRCFILES) resources
 	$(CXX) -g -O0 -DTBB_USE_DEBUG -D_DEBUG $(CXXFLAGS) -o $(EXE) $(SRCFILES) -ltbb_debug -ltbbmalloc_debug $(LIBS)
@@ -68,3 +80,10 @@ ifeq ($(UI),mac)
 else
 	./$(EXE) $(ARGS)
 endif
+
+light_test:
+ifeq ($(UI),mac)
+	export DYLD_LIBRARY_PATH="$(DYLD_LIBRARY_PATH):$(TBBLIBSPATH)"; ./$(EXE) $(LIGHT_ARGS)
+else
+	./$(EXE) $(LIGHT_ARGS)
+endif
diff --git a/examples/parallel_for/polygon_overlay/Makefile.windows b/examples/parallel_for/polygon_overlay/Makefile.windows
index a2c9707..2e5b9f6 100644
--- a/examples/parallel_for/polygon_overlay/Makefile.windows
+++ b/examples/parallel_for/polygon_overlay/Makefile.windows
@@ -29,6 +29,7 @@
 # Just specify your program basename
 PROG=Pover
 ARGS=
+LIGHT_ARGS= --polys 10 --size 5x5
 
 # Trying to find if icl.exe is set
 CXX1 = $(TBB_CXX)-
@@ -60,6 +61,8 @@ clean:
 	@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest msvs\pover.res
 test:
 	$(PROG) $(ARGS)
+light_test:
+	$(PROG) $(LIGHT_ARGS)
 compiler_check:
 	@echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1  || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
 	@cmd.exe /C del compiler_test
diff --git a/examples/parallel_for/polygon_overlay/index.html b/examples/parallel_for/polygon_overlay/index.html
index 70b8ccc..19d3f46 100644
--- a/examples/parallel_for/polygon_overlay/index.html
+++ b/examples/parallel_for/polygon_overlay/index.html
@@ -119,10 +119,9 @@ named pover.exe.  To run these executables directly, use one or more of the foll
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/parallel_for/polygon_overlay/msvs/pover.vcproj b/examples/parallel_for/polygon_overlay/msvs/pover.vcproj
index 690197e..ac773e3 100644
--- a/examples/parallel_for/polygon_overlay/msvs/pover.vcproj
+++ b/examples/parallel_for/polygon_overlay/msvs/pover.vcproj
@@ -46,7 +46,7 @@
 				Optimization="0"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				EnableFunctionLevelLinking="true"
@@ -67,7 +67,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="1"
@@ -97,7 +97,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -129,7 +129,7 @@
 				Optimization="0"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				EnableFunctionLevelLinking="true"
@@ -149,7 +149,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="17"
@@ -179,7 +179,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -211,7 +211,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
@@ -232,7 +232,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib tbbmalloc.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -264,7 +264,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -297,7 +297,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
@@ -317,7 +317,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib tbbmalloc.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -349,7 +349,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -382,7 +382,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
 				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
@@ -403,7 +403,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib tbbmalloc.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -435,7 +435,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -469,7 +469,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
 				PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
@@ -489,7 +489,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib tbbmalloc.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -521,7 +521,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -553,7 +553,7 @@
 				Optimization="0"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
 				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				EnableFunctionLevelLinking="true"
@@ -574,7 +574,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;"$(DXSDK_DIR)\lib\x86""
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;"$(DXSDK_DIR)\lib\x86""
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="1"
@@ -604,7 +604,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -637,7 +637,7 @@
 				Optimization="0"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
 				PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				EnableFunctionLevelLinking="true"
@@ -657,7 +657,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;"$(DXSDK_DIR)\lib\x64""
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;"$(DXSDK_DIR)\lib\x64""
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="17"
@@ -687,7 +687,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/parallel_for/polygon_overlay/msvs/pover_cl.sln b/examples/parallel_for/polygon_overlay/msvs/pover_cl.sln
index bb1211d..50f9b86 100644
--- a/examples/parallel_for/polygon_overlay/msvs/pover_cl.sln
+++ b/examples/parallel_for/polygon_overlay/msvs/pover_cl.sln
@@ -10,8 +10,8 @@ Global
 		DD Release|x64 = DD Release|x64
 		GDI Debug|Win32 = GDI Debug|Win32
 		GDI Debug|x64 = GDI Debug|x64
-		GDI Release|Win32 = GDI Release|Win32
-		GDI Release|x64 = GDI Release|x64
+		_GDI Release|Win32 = _GDI Release|Win32
+		_GDI Release|x64 = _GDI Release|x64
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
@@ -26,10 +26,10 @@ Global
 		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|Win32.Build.0 = Debug|Win32
 		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|x64.ActiveCfg = Debug|x64
 		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|x64.Build.0 = Debug|x64
-		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|Win32.Build.0 = Release|Win32
-		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|x64.ActiveCfg = Release|x64
-		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|x64.Build.0 = Release|x64
+		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|Win32.ActiveCfg = Release|Win32
+		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|Win32.Build.0 = Release|Win32
+		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|x64.ActiveCfg = Release|x64
+		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/examples/parallel_for/polygon_overlay/msvs/pover_icl.sln b/examples/parallel_for/polygon_overlay/msvs/pover_icl.sln
index 8c2c6cf..bf88dd2 100644
--- a/examples/parallel_for/polygon_overlay/msvs/pover_icl.sln
+++ b/examples/parallel_for/polygon_overlay/msvs/pover_icl.sln
@@ -10,8 +10,8 @@ Global
 		DD Release|x64 = DD Release|x64
 		GDI Debug|Win32 = GDI Debug|Win32
 		GDI Debug|x64 = GDI Debug|x64
-		GDI Release|Win32 = GDI Release|Win32
-		GDI Release|x64 = GDI Release|x64
+		_GDI Release|Win32 = _GDI Release|Win32
+		_GDI Release|x64 = _GDI Release|x64
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{B175D396-7260-45F8-9E18-842ED8A32A16}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
@@ -26,14 +26,14 @@ Global
 		{B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Debug|Win32.Build.0 = Debug|Win32
 		{B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Debug|x64.ActiveCfg = Debug|x64
 		{B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Debug|x64.Build.0 = Debug|x64
-		{B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Release|Win32.Build.0 = Release|Win32
-		{B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Release|x64.ActiveCfg = Release|x64
-		{B175D396-7260-45F8-9E18-842ED8A32A16}.GDI Release|x64.Build.0 = Release|x64
-		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|x64.Build.0 = Release|x64
-		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|x64.ActiveCfg = Release|x64
-		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|Win32.Build.0 = Release|Win32
-		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Release|Win32.ActiveCfg = Release|Win32
+		{B175D396-7260-45F8-9E18-842ED8A32A16}._GDI Release|Win32.ActiveCfg = Release|Win32
+		{B175D396-7260-45F8-9E18-842ED8A32A16}._GDI Release|Win32.Build.0 = Release|Win32
+		{B175D396-7260-45F8-9E18-842ED8A32A16}._GDI Release|x64.ActiveCfg = Release|x64
+		{B175D396-7260-45F8-9E18-842ED8A32A16}._GDI Release|x64.Build.0 = Release|x64
+		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|x64.Build.0 = Release|x64
+		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|x64.ActiveCfg = Release|x64
+		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|Win32.Build.0 = Release|Win32
+		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}._GDI Release|Win32.ActiveCfg = Release|Win32
 		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|x64.Build.0 = Debug|x64
 		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|x64.ActiveCfg = Debug|x64
 		{4BB7B455-1E09-41D3-BC89-6E67C9032F8C}.GDI Debug|Win32.Build.0 = Debug|Win32
diff --git a/examples/parallel_for/polygon_overlay/xcode/PolygonOverlay.xcodeproj/project.pbxproj b/examples/parallel_for/polygon_overlay/xcode/PolygonOverlay.xcodeproj/project.pbxproj
index 0d4575c..b31a8db 100644
--- a/examples/parallel_for/polygon_overlay/xcode/PolygonOverlay.xcodeproj/project.pbxproj
+++ b/examples/parallel_for/polygon_overlay/xcode/PolygonOverlay.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -11,7 +11,6 @@
 		6A6DAA980DA2C0B3008D95BD /* polyover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6A6DAA900DA2C0B3008D95BD /* polyover.cpp */; };
 		6A6DAA9B0DA2C0B3008D95BD /* pover_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6A6DAA930DA2C0B3008D95BD /* pover_video.cpp */; };
 		8D0C4E8E0486CD37000505A6 /* main.nib in Resources */ = {isa = PBXBuildFile; fileRef = 02345980000FD03B11CA0E72 /* main.nib */; };
-		A12649490B8392750091D5AD /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */; };
 		A126495E0B83936D0091D5AD /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8D0C4E960486CD37000505A6 /* Info.plist */; };
 		A18D2A340B861B99007D8D2C /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb.dylib */; };
 		A1976ADA0DF6A6910032C3EA /* libtbbmalloc.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A1976AD90DF6A6910032C3EA /* libtbbmalloc.dylib */; };
@@ -65,7 +64,6 @@
 			buildActionMask = 2147483647;
 			files = (
 				A1E3E7BD0B3AD4EC007C3AB5 /* OpenGL.framework in Frameworks */,
-				A12649490B8392750091D5AD /* OpenGL.framework in Frameworks */,
 				A18D2A340B861B99007D8D2C /* libtbb.dylib in Frameworks */,
 				A1976ADF0DF6A6E10032C3EA /* libtbbmalloc.dylib in Frameworks */,
 				A1A8F41E0B8B4DBE001C55B1 /* AGL.framework in Frameworks */,
@@ -161,9 +159,16 @@
 /* Begin PBXProject section */
 		20286C28FDCF999611CA2CEA /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
 			buildConfigurationList = C0E91AC908A95435008D54AB /* Build configuration list for PBXProject "PolygonOverlay" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 20286C29FDCF999611CA2CEA /* PolygonOverlay */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -216,17 +221,17 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_MODEL_TUNING = "";
 				GCC_OPTIMIZATION_LEVEL = 0;
-				INSTALL_PATH = "$(HOME)/Applications";
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
+				IBC_STRIP_NIBS = NO;
+				INSTALL_PATH = "$(HOME)/Applications";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
 				);
 				PRODUCT_NAME = PolygonOverlay;
-				GCC_VERSION = 4.0;
 			};
 			name = Debug;
 		};
@@ -235,31 +240,33 @@
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
 				GCC_MODEL_TUNING = "";
-				INSTALL_PATH = "$(HOME)/Applications";
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
+				IBC_STRIP_NIBS = NO;
+				INSTALL_PATH = "$(HOME)/Applications";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
 				);
 				PRODUCT_NAME = PolygonOverlay;
-				GCC_VERSION = 4.0;
 			};
 			name = Release;
 		};
 		C0E91ACA08A95435008D54AB /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = i386;
+				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
 				GCC_AUTO_VECTORIZATION = YES;
 				GCC_ENABLE_CPP_RTTI = YES;
 				GCC_ENABLE_SSE3_EXTENSIONS = YES;
 				GCC_MODEL_TUNING = "";
 				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_VERSION = "";
 				GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+				IBC_STRIP_NIBS = NO;
 				MACH_O_TYPE = mh_execute;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
-				GCC_VERSION = 4.0;
+				SDKROOT = macosx10.6;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
 			name = Debug;
@@ -267,17 +274,18 @@
 		C0E91ACB08A95435008D54AB /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = i386;
+				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
 				GCC_AUTO_VECTORIZATION = YES;
 				GCC_ENABLE_CPP_RTTI = YES;
 				GCC_ENABLE_SSE3_EXTENSIONS = YES;
 				GCC_MODEL_TUNING = "";
 				GCC_OPTIMIZATION_LEVEL = 3;
+				GCC_VERSION = "";
 				GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+				IBC_STRIP_NIBS = NO;
 				MACH_O_TYPE = mh_execute;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
-				GCC_VERSION = 4.0;
+				SDKROOT = macosx10.6;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
 			name = Release;
diff --git a/examples/parallel_for/seismic/Makefile b/examples/parallel_for/seismic/Makefile
index b5e700c..4f57ee6 100644
--- a/examples/parallel_for/seismic/Makefile
+++ b/examples/parallel_for/seismic/Makefile
@@ -26,7 +26,9 @@
 
 # GNU Makefile that builds and runs example.
 NAME=seismic
-ARGS=- 300
+ARGS=0:4 300
+PERF_RUN_ARGS=auto 10000 silent
+LIGHT_ARGS=1:2 100
 
 # The C++ compiler
 ifneq (,$(shell which icc 2>/dev/null))
@@ -34,6 +36,13 @@ CXX=icc
 endif # icc
 
 include ../../common/gui/Makefile.gmake
+override CXXFLAGS += $(UI_CXXFLAGS)
+
+SOURCES= ../../common/gui/$(UI)video.cpp universe.cpp seismic_video.cpp main.cpp
+
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
 
 all:	release test
 
@@ -44,11 +53,11 @@ ifeq ($(UI),mac)
 	$(PBXCP) xcode/Info.plist $(APPRES)
 endif
 
-release: ../../common/gui/$(UI)video.cpp SeismicSimulation.cpp resources
-	$(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $< SeismicSimulation.cpp -ltbb $(LIBS)
+release: $(SOURCES) resources
+	$(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb $(LIBS)
 
-debug: ../../common/gui/$(UI)video.cpp SeismicSimulation.cpp resources
-	$(CXX) -g -O0 -DTBB_USE_DEBUG $(CXXFLAGS) -o $(EXE) $< SeismicSimulation.cpp -ltbb_debug $(LIBS)
+debug: resources
+	$(CXX) -g -O0 -DTBB_USE_DEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb_debug $(LIBS)
 
 clean:
 	$(RM) $(EXE) *.o *.d
@@ -62,3 +71,12 @@ ifeq ($(UI),mac)
 else
 	./$(EXE) $(ARGS)
 endif
+
+perf_build: resources
+	$(CXX) -O2 -msse2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb $(LIBS)
+
+perf_run:
+	./$(EXE) $(PERF_RUN_ARGS)
+
+light_test:
+	./$(EXE) $(LIGHT_ARGS)
diff --git a/examples/parallel_for/seismic/Makefile.windows b/examples/parallel_for/seismic/Makefile.windows
index 3b00698..eb92761 100644
--- a/examples/parallel_for/seismic/Makefile.windows
+++ b/examples/parallel_for/seismic/Makefile.windows
@@ -28,7 +28,9 @@
 
 # Just specify your program basename
 PROG=Seismic
-ARGS=- 300
+ARGS=0:4 300
+PERF_RUN_ARGS=auto 10000 silent
+LIGHT_ARGS=1:2 100
 
 # Trying ot find if icl.exe is set
 CXX1 = $(TBB_CXX)-
@@ -48,16 +50,26 @@ ARCH2 = $(ARCH1:intel64-=AMD64)
 XARCH = $(ARCH2:-=x86)
 
 MAKEINC = ../../common/gui/Makefile.win
-
+SOURCES = seismic_video.cpp universe.cpp main.cpp 
+ 
 all: release test
 release: compiler_check
-	@$(MAKE) -f $(MAKEINC) UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib $(LIBS)" XARCH=$(XARCH) RCNAME=SeismicSimulation SOURCE=SeismicSimulation.cpp EXE=$(PROG).exe build_one
+	@$(MAKE) -f $(MAKEINC) UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib $(LIBS)" XARCH=$(XARCH) RCNAME=SeismicSimulation SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one
 debug: compiler_check
-	@$(MAKE) -f $(MAKEINC) UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS) /D TBB_USE_DEBUG" LFLAGS="$(LDFLAGS) tbb_debug.lib $(LIBS)" XARCH=$(XARCH) RCNAME=SeismicSimulation SOURCE=SeismicSimulation.cpp EXE=$(PROG).exe build_one
+	@$(MAKE) -f $(MAKEINC) UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS) /D TBB_USE_DEBUG" LFLAGS="$(LDFLAGS) tbb_debug.lib $(LIBS)" XARCH=$(XARCH) RCNAME=SeismicSimulation SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one
 clean:
 	@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest msvs\SeismicSimulation.res >nul 2>&1
 test:
-	$(PROG) $(ARGS)
+	$(PROG) $(ARGS) 
+
+perf_build: compiler_check
+	@$(MAKE) -f $(MAKEINC) UI=con CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib $(LIBS)" XARCH=$(XARCH) RCNAME=SeismicSimulation SOURCE="$(SOURCES) " EXE=$(PROG).exe build_one
+perf_run:
+	$(PROG) $(PERF_RUN_ARGS)
+
+light_test:
+	$(PROG) $(LIGHT_ARGS)
+
 compiler_check:
 	@echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1  || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
 	@cmd.exe /C del compiler_test
diff --git a/examples/parallel_for/seismic/SeismicSimulation.cpp b/examples/parallel_for/seismic/SeismicSimulation.cpp
deleted file mode 100644
index 985af68..0000000
--- a/examples/parallel_for/seismic/SeismicSimulation.cpp
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
-    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
-
-    This file is part of Threading Building Blocks.
-
-    Threading Building Blocks is free software; you can redistribute it
-    and/or modify it under the terms of the GNU General Public License
-    version 2 as published by the Free Software Foundation.
-
-    Threading Building Blocks is distributed in the hope that it will be
-    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Threading Building Blocks; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-    As a special exception, you may use this file as part of a free software
-    library without restriction.  Specifically, if other files instantiate
-    templates or use macros or inline functions from this file, or you compile
-    this file and link it with other files to produce an executable, this
-    file does not by itself cause the resulting executable to be covered by
-    the GNU General Public License.  This exception does not however
-    invalidate any other reasons why the executable file might be covered by
-    the GNU General Public License.
-*/
-
-//#define _CRT_SECURE_NO_DEPRECATE
-#define VIDEO_WINMAIN_ARGS
-#include "../../common/gui/video.h"
-#include <cstdlib>
-#include <cstdio>
-#include <cstring>
-#include <cctype>
-#include <cassert>
-#include <math.h>
-#include "tbb/task_scheduler_init.h"
-#include "tbb/blocked_range.h"
-#include "tbb/parallel_for.h"
-#include "tbb/tick_count.h"
-
-using namespace std;
-
-#ifdef _MSC_VER
-// warning C4068: unknown pragma
-#pragma warning(disable: 4068)
-#endif
-
-#define DEFAULT_NUMBER_OF_FRAMES 100
-int number_of_frames = -1;
-const size_t MAX_WIDTH = 1024;
-const size_t MAX_HEIGHT = 512;
-
-int UniverseHeight=MAX_HEIGHT;
-int UniverseWidth=MAX_WIDTH;
-
-typedef float value;
-
-//! Velocity at each grid point
-static value V[MAX_HEIGHT][MAX_WIDTH];
-
-//! Horizontal stress
-static value S[MAX_HEIGHT][MAX_WIDTH];
-
-//! Vertical stress
-static value T[MAX_HEIGHT][MAX_WIDTH];
-
-//! Coefficient related to modulus
-static value M[MAX_HEIGHT][MAX_WIDTH];
-
-//! Coefficient related to lightness
-static value L[MAX_HEIGHT][MAX_WIDTH];
-
-//! Damping coefficients
-static value D[MAX_HEIGHT][MAX_WIDTH];
-
-/** Affinity is an argument to parallel_for to hint that an iteration of a loop 
-    is best replayed on the same processor for each execution of the loop. 
-    It is a global object because it must remember where the iterations happened
-    in previous executions. */
-static tbb::affinity_partitioner Affinity;
-
-enum MaterialType {
-    WATER=0,
-    SANDSTONE=1,
-    SHALE=2
-};
-
-//! Values are MaterialType, cast to an unsigned char to save space.
-static unsigned char Material[MAX_HEIGHT][MAX_WIDTH];
-
-static const colorcomp_t MaterialColor[4][3] = { // BGR
-    {96,0,0},     // WATER
-    {0,48,48},    // SANDSTONE
-    {32,32,23}    // SHALE
-};
-
-static const int DamperSize = 32;
-
-static const int ColorMapSize = 1024;
-static color_t ColorMap[4][ColorMapSize];
-
-static int PulseTime = 100;
-static int PulseCounter;
-static int PulseX = UniverseWidth/3;
-static int PulseY = UniverseHeight/4;
-
-static bool InitIsParallel = true;
-const char *titles[2] = {"Seismic Simulation: Serial", "Seismic Simulation: Parallel"};
-//! It is used for console mode for test with different number of threads and also has
-//! meaning for gui: threads_low  - use sepatate event/updating loop thread (>0) or not (0).
-//!                  threads_high - initialization value for scheduler
-int threads_low = 0, threads_high = tbb::task_scheduler_init::automatic;
-
-static void UpdatePulse() {
-    if( PulseCounter>0 ) {
-        value t = (PulseCounter-PulseTime/2)*0.05f;
-        V[PulseY][PulseX] += 64*sqrt(M[PulseY][PulseX])*exp(-t*t);
-        --PulseCounter;
-    }
-}
-
-static void SerialUpdateStress() {
-    drawing_area drawing(0, 0, UniverseWidth, UniverseHeight);
-    for( int i=1; i<UniverseHeight-1; ++i ) {
-        drawing.set_pos(1, i);
-#pragma ivdep
-        for( int j=1; j<UniverseWidth-1; ++j ) {
-            S[i][j] += M[i][j]*(V[i][j+1]-V[i][j]);
-            T[i][j] += M[i][j]*(V[i+1][j]-V[i][j]);
-            int index = (int)(V[i][j]*(ColorMapSize/2)) + ColorMapSize/2;
-            if( index<0 ) index = 0;
-            if( index>=ColorMapSize ) index = ColorMapSize-1;
-            color_t* c = ColorMap[Material[i][j]];
-            drawing.put_pixel(c[index]);
-        }
-    }
-}
-
-struct UpdateStressBody {
-    void operator()( const tbb::blocked_range<int>& range ) const {
-        drawing_area drawing(0, range.begin(), UniverseWidth, range.end()-range.begin());
-        int i_end = range.end();
-        for( int y = 0, i=range.begin(); i!=i_end; ++i,y++ ) {
-            drawing.set_pos(1, y);
-#pragma ivdep
-            for( int j=1; j<UniverseWidth-1; ++j ) {
-                S[i][j] += M[i][j]*(V[i][j+1]-V[i][j]);
-                T[i][j] += M[i][j]*(V[i+1][j]-V[i][j]);
-                int index = (int)(V[i][j]*(ColorMapSize/2)) + ColorMapSize/2;
-                if( index<0 ) index = 0;
-                if( index>=ColorMapSize ) index = ColorMapSize-1;
-                color_t* c = ColorMap[Material[i][j]];
-                drawing.put_pixel(c[index]);
-            }
-        }
-    }
-};
-
-static void ParallelUpdateStress() {
-    tbb::parallel_for( tbb::blocked_range<int>( 1, UniverseHeight-1 ), // Index space for loop
-                       UpdateStressBody(),                             // Body of loop
-                       Affinity );                                     // Affinity hint
-}
-
-static void SerialUpdateVelocity() {
-    for( int i=1; i<UniverseHeight-1; ++i ) 
-#pragma ivdep
-        for( int j=1; j<UniverseWidth-1; ++j ) 
-            V[i][j] = D[i][j]*(V[i][j] + L[i][j]*(S[i][j] - S[i][j-1] + T[i][j] - T[i-1][j]));
-}
-
-struct UpdateVelocityBody {
-    void operator()( const tbb::blocked_range<int>& range ) const {
-        int i_end = range.end();
-        for( int i=range.begin(); i!=i_end; ++i ) 
-#pragma ivdep
-            for( int j=1; j<UniverseWidth-1; ++j ) 
-                V[i][j] = D[i][j]*(V[i][j] + L[i][j]*(S[i][j] - S[i][j-1] + T[i][j] - T[i-1][j]));
-    }
-};
-
-static void ParallelUpdateVelocity() {
-    tbb::parallel_for( tbb::blocked_range<int>( 1, UniverseHeight-1 ), // Index space for loop
-                       UpdateVelocityBody(),                           // Body of loop
-                       Affinity );                                     // Affinity hint
-}
-
-void SerialUpdateUniverse() {
-    UpdatePulse();
-    SerialUpdateStress();
-    SerialUpdateVelocity();
-}
-
-void ParallelUpdateUniverse() {
-    UpdatePulse();
-    ParallelUpdateStress();
-    ParallelUpdateVelocity();
-}
-
-class seismic_video : public video
-{
-    void on_mouse(int x, int y, int key) {
-        if(key == 1 && PulseCounter == 0) {
-            PulseCounter = PulseTime;
-            PulseX = x; PulseY = y;
-        }
-    }
-    void on_key(int key) {
-        key &= 0xff;
-        if(char(key) == ' ') InitIsParallel = !InitIsParallel;
-        else if(char(key) == 'p') InitIsParallel = true;
-        else if(char(key) == 's') InitIsParallel = false;
-        else if(char(key) == 'e') updating = true;
-        else if(char(key) == 'd') updating = false;
-        else if(key == 27) running = false;
-        title = InitIsParallel?titles[1]:titles[0];
-    }
-    void on_process() {
-        tbb::task_scheduler_init Init(threads_high);
-        do {
-            if( InitIsParallel )
-                ParallelUpdateUniverse();
-            else
-                SerialUpdateUniverse();
-            if( number_of_frames > 0 ) --number_of_frames;
-        } while(next_frame() && number_of_frames);
-    }
-} video;
-
-void InitializeUniverse() {
-    PulseCounter = PulseTime;
-    // Initialize V, S, and T to slightly non-zero values, in order to avoid denormal waves.
-    for( int i=0; i<UniverseHeight; ++i ) 
-#pragma ivdep
-        for( int j=0; j<UniverseWidth; ++j ) {
-            T[i][j] = S[i][j] = V[i][j] = value(1.0E-6);
-        }
-    for( int i=1; i<UniverseHeight-1; ++i ) {
-        for( int j=1; j<UniverseWidth-1; ++j ) {
-            float x = float(j-UniverseWidth/2)/(UniverseWidth/2);
-            value t = (value)i/UniverseHeight;
-            MaterialType m;
-            D[i][j] = 1.0;
-            // Coefficient values are fictitious, and chosen to visually exaggerate 
-            // physical effects such as Rayleigh waves.  The fabs/exp line generates
-            // a shale layer with a gentle upwards slope and an anticline.
-            if( t<0.3f ) {
-                m = WATER;
-                M[i][j] = 0.125;
-                L[i][j] = 0.125;
-            } else if( fabs(t-0.7+0.2*exp(-8*x*x)+0.025*x)<=0.1 ) {
-                m = SHALE;
-                M[i][j] = 0.5;
-                L[i][j] = 0.6;
-            } else {
-                m = SANDSTONE;
-                M[i][j] = 0.3;
-                L[i][j] = 0.4;
-            } 
-            Material[i][j] = m;
-        }
-    }
-    value scale = 2.0f/ColorMapSize;
-    for( int k=0; k<4; ++k ) {
-        for( int i=0; i<ColorMapSize; ++i ) {
-            colorcomp_t c[3];
-            value t = (i-ColorMapSize/2)*scale;
-            value r = t>0 ? t : 0;
-            value b = t<0 ? -t : 0;
-            value g = 0.5f*fabs(t);
-            memcpy(c, MaterialColor[k], sizeof(c));
-            c[2] = colorcomp_t(r*(255-c[2])+c[2]);
-            c[1] = colorcomp_t(g*(255-c[1])+c[1]);
-            c[0] = colorcomp_t(b*(255-c[0])+c[0]);
-            ColorMap[k][i] = video.get_color(c[2], c[1], c[0]);
-        }
-    }
-    // Set damping coefficients around border to reduce reflections from boundaries.
-    value d = 1.0;
-    for( int k=DamperSize-1; k>0; --k ) {
-        d *= 1-1.0f/(DamperSize*DamperSize);
-        for( int j=1; j<UniverseWidth-1; ++j ) {
-            D[k][j] *= d;
-            D[UniverseHeight-1-k][j] *= d;
-        }
-        for( int i=1; i<UniverseHeight-1; ++i ) {
-            D[i][k] *= d;
-            D[i][UniverseWidth-1-k] *= d;
-        }
-    }
-}
-
-//////////////////////////////// Interface ////////////////////////////////////
-#ifdef _WINDOWS
-#include "msvs/resource.h"
-#endif
-
-int main(int argc, char *argv[])
-{
-    // threads number init
-    if(argc > 1 && isdigit(argv[1][0])) {
-        char* end; threads_high = threads_low = (int)strtol(argv[1],&end,0);
-        switch( *end ) {
-            case ':': threads_high = (int)strtol(end+1,0,0); break;
-            case '\0': break;
-            default: printf("unexpected character = %c\n",*end);
-        }
-    }
-    if (argc > 2 && isdigit(argv[2][0])){
-        number_of_frames = (int)strtol(argv[2],0,0);
-    }
-    // video layer init
-    video.title = InitIsParallel?titles[1]:titles[0];
-#ifdef _WINDOWS
-    #define MAX_LOADSTRING 100
-    TCHAR szWindowClass[MAX_LOADSTRING];    // the main window class name
-    LoadStringA(video::win_hInstance, IDC_SEISMICSIMULATION, szWindowClass, MAX_LOADSTRING);
-    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
-    WNDCLASSEX wcex; memset(&wcex, 0, sizeof(wcex));
-    wcex.lpfnWndProc    = (WNDPROC)WndProc;
-    wcex.hIcon          = LoadIcon(video::win_hInstance, MAKEINTRESOURCE(IDI_SEISMICSIMULATION));
-    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
-    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
-    wcex.lpszMenuName   = LPCTSTR(IDC_SEISMICSIMULATION);
-    wcex.lpszClassName  = szWindowClass;
-    wcex.hIconSm        = LoadIcon(video::win_hInstance, MAKEINTRESOURCE(IDI_SMALL));
-    video.win_set_class(wcex); // ascii convention here
-    video.win_load_accelerators(IDC_SEISMICSIMULATION);
-#endif
-    if(video.init_window(UniverseWidth, UniverseHeight)) {
-        video.calc_fps = true;
-        video.threaded = threads_low > 0;
-        // video is ok, init universe
-        InitializeUniverse();
-        // main loop
-        video.main_loop();
-    }
-    else if(video.init_console()) {
-        // do console mode
-        if(number_of_frames <= 0) number_of_frames = DEFAULT_NUMBER_OF_FRAMES;
-        if(threads_high == tbb::task_scheduler_init::automatic) threads_high = 4;
-        if(threads_high < threads_low) threads_high = threads_low;
-        for( int p = threads_low; p <= threads_high; ++p ) {
-            InitializeUniverse();
-            tbb::task_scheduler_init init(tbb::task_scheduler_init::deferred);
-            if( p > 0 )
-                init.initialize( p );
-            tbb::tick_count t0 = tbb::tick_count::now();
-            if( p > 0 )
-                for( int i=0; i<number_of_frames; ++i )
-                    ParallelUpdateUniverse();
-            else
-                for( int i=0; i<number_of_frames; ++i )
-                    SerialUpdateUniverse();
-            tbb::tick_count t1 = tbb::tick_count::now();
-            printf("%.1f frame per sec", number_of_frames/(t1-t0).seconds());
-            if( p > 0 ) 
-                printf(" with %d way parallelism\n",p);
-            else
-                printf(" with serial version\n"); 
-        }
-    }
-    video.terminate();
-    return 0;
-}
-
-#ifdef _WINDOWS
-//
-//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
-//
-//  PURPOSE:  Processes messages for the main window.
-//
-//  WM_COMMAND  - process the application menu
-//  WM_PAINT    - Paint the main window
-//  WM_DESTROY  - post a quit message and return
-//
-//
-LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
-{
-    switch (message)
-    {
-    case WM_INITDIALOG: return TRUE;
-    case WM_COMMAND:
-        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
-            EndDialog(hDlg, LOWORD(wParam));
-            return TRUE;
-        }
-        break;
-    }
-    return FALSE;
-}
-
-LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
-    int wmId, wmEvent;
-    switch (message) {
-    case WM_COMMAND:
-        wmId    = LOWORD(wParam); 
-        wmEvent = HIWORD(wParam); 
-        // Parse the menu selections:
-        switch (wmId)
-        {
-        case IDM_ABOUT:
-            DialogBox(video::win_hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)About);
-            break;
-        case IDM_EXIT:
-            PostQuitMessage(0);
-            break;
-        case ID_FILE_PARALLEL:
-            if( !InitIsParallel ) {
-                InitIsParallel = true;
-                video.title = titles[1];
-            }
-            break;
-        case ID_FILE_SERIAL:
-            if( InitIsParallel ) {
-                InitIsParallel = false;
-                video.title = titles[0];
-            }
-            break;
-        case ID_FILE_ENABLEGUI:
-            video.updating = true;
-            break;
-        case ID_FILE_DISABLEGUI:
-            video.updating = false;
-            break;
-        default:
-            return DefWindowProc(hWnd, message, wParam, lParam);
-        }
-        break;
-    default:
-        return DefWindowProc(hWnd, message, wParam, lParam);
-    }
-    return 0;
-}
-
-#endif
diff --git a/examples/parallel_for/seismic/index.html b/examples/parallel_for/seismic/index.html
index ff3e812..453cdad 100644
--- a/examples/parallel_for/seismic/index.html
+++ b/examples/parallel_for/seismic/index.html
@@ -2,12 +2,20 @@
 <BODY>
 
 <H2>Overview</H2>
-Parallel seismic simulation that demonstrates use of parallel_for.
+Parallel seismic wave simulation that demonstrates use of parallel_for and affinity_partitioner.
 
 <H2>Files</H2>
 <DL>
-<DT><A HREF="SeismicSimulation.cpp">SeismicSimulation.cpp</A>
-<DD>Source code that does wave propagation.
+<DT><A HREF="main.cpp">main.cpp</A>
+<DD>Main program which parses command line options and runs the algorithm with different numbers of threads.
+<DT><A HREF="universe.h">universe.h</A>
+<DD>Wave propagation methods interface.
+<DT><A HREF="universe.cpp">universe.cpp</A>
+<DD>Wave propagation methods implementation.
+<DT><A HREF="seismic_video.h">seismic_video.h</A>
+<DD>GUI mode support interface.
+<DT><A HREF="seismic_video.cpp">seismic_video.cpp</A>
+<DD>GUI mode support implementation.
 <DT><A HREF="Makefile">Makefile</A>
 <DD>Makefile for building example.
 </DL>
@@ -26,14 +34,14 @@ The following additional options are supported:
 <DL>
 <DT><TT>make [(general targets: {release, debug} [test])] UI={con, gdi, dd, x, mac}</TT>
 <DD>Build and run as usual, but build with the specified GUI driver: console, GDI+*, Direct Draw*, X11, or OpenGL*
-	(see the description of the <A HREF=../../common/index.html>common GUI code</A>
-	for more information on available graphics support).
+    (see the description of the <A HREF=../../common/index.html>common GUI code</A>
+    for more information on available graphics support).
     For Linux* and Mac OS* X systems, the best available driver is detected automatically by the Makefile.
     For Windows* systems, UI=gdi is the default GUI driver; compiling with UI=dd may offer superior
-	performance, but can only be used if the Microsoft* Direct Draw* SDK is installed on your system 
-	and if overlay is supported by your graphics card.
+    performance, but can only be used if the Microsoft* Direct Draw* SDK is installed on your system 
+    and if overlay is supported by your graphics card.
     Use UI=con to build without the GUI for use in making performance measurements
-	<I>(strongly recommended when measuring performance or scalability; see note below)</I>.
+    <I>(strongly recommended when measuring performance or scalability; see note below)</I>.
 <DT><TT>make [(above options or targets)] XARCH=x64</TT>
 <DD>Build and run as above, but also specify XARCH=x64
     (or XARCH=AMD64 for older compilers) when building the example on Windows* as a 64-bit binary.
@@ -45,16 +53,16 @@ The following additional options are supported:
 
 <H2>Usage</H2>
 <DL>
-<DT><TT>seismic [<I>M</I>[:<I>N</I>] [<I>F</I>]]</TT>
-<DD>For non-interactive mode, <I>M</I> and <I>N</I> are a range of numbers of threads to be used.
-    For interactive mode,  <I>N</I> is the number of threads to use while <I>M</I> indicates if
-    a separate thread will be used for the GUI (>0) or not (0).  For example,
-    <TT>seismic 1:3</TT> will use 3 threads for computation and a separate thread for
-    processing GUI events; this option may give better visible performance on a 4-processor
-    system when using GDI+ graphics.
-<DD><I>F</I> is the number of frames the example processes internally. Default value is 100;
-    reduce it to shorten example run time.
-<DT>To run a short version of this example, e.g., for use with Intel® Threading Tools:
+<DT><TT>seismic <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>seismic [<I>n-of-threads</I>=value] [<I>n-of-frames</I>=value] [<I>silent</I>] [<I>serial</I>]</TT>
+<DT><TT>seismic [<I>n-of-threads</I> [<I>n-of-frames</I>]] [<I>silent</I>] [<I>serial</I>]</TT>
+<DD><I>n-of-threads</I> is the number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default.<BR>
+    <I>n-of-frames</I> is a number of frames the example processes internally.<BR>
+    <I>silent</I> - no output except elapsed time.<BR>
+    <I>serial</I> - in GUI mode start with serial version of algorithm.<BR>
+
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector::
 <DD>Build a <I>debug</I> version of the example
     (see the <A HREF=../../index.html#build>build directions</A>).
     <BR>Run it with the desired number of threads and smaller number of frames, e.g., <TT>seismic 4 5</TT>.
@@ -93,10 +101,9 @@ user interface:
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/parallel_for/seismic/main.cpp b/examples/parallel_for/seismic/main.cpp
new file mode 100644
index 0000000..d9e3f92
--- /dev/null
+++ b/examples/parallel_for/seismic/main.cpp
@@ -0,0 +1,133 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#define VIDEO_WINMAIN_ARGS
+
+#include <iostream>
+#include "tbb/tick_count.h"
+#include "../../common/utility/utility.h"
+
+#include "seismic_video.h"
+#include "universe.h"
+#include "tbb/task_scheduler_init.h"
+
+Universe u;
+
+struct RunOptions {
+    //! It is used for console mode for test with different number of threads and also has
+    //! meaning for GUI: threads.first  - use separate event/updating loop thread (>0) or not (0).
+    //!                  threads.second - initialization value for scheduler
+    utility::thread_number_range threads;
+    int numberOfFrames;
+    bool silent;
+    bool parallel;
+    RunOptions(utility::thread_number_range threads_ ,    int number_of_frames_ ,     bool silent_ , bool parallel_ )
+        : threads(threads_),numberOfFrames(number_of_frames_), silent(silent_), parallel(parallel_)
+    {
+    }
+};
+
+int get_default_num_threads() {
+    static int threads = 0;
+    if ( threads == 0 )
+        threads = tbb::task_scheduler_init::default_num_threads();
+    return threads;
+}
+
+RunOptions ParseCommandLine(int argc, char *argv[]){
+    // zero number of threads means to run serial version
+    utility::thread_number_range threads(get_default_num_threads,0,get_default_num_threads());
+
+    int numberOfFrames = 1000;
+    bool silent = false;
+    bool serial = false;
+
+    utility::parse_cli_arguments(argc,argv,
+        utility::cli_argument_pack()
+            //"-h" option for for displaying help is present implicitly
+            .positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default.")
+            .positional_arg(numberOfFrames,"n-of-frames","number of frames the example processes internally")
+            .arg(silent,"silent","no output except elapsed time")
+            .arg(serial,"serial","in GUI mode start with serial version of algorithm")
+    );
+    return RunOptions(threads,numberOfFrames,silent,!serial);
+}
+
+int main(int argc, char *argv[])
+{
+    try{
+        tbb::tick_count mainStartTime = tbb::tick_count::now();
+        RunOptions options = ParseCommandLine(argc,argv);
+        SeismicVideo video(u,options.numberOfFrames,options.threads.last,options.parallel);
+
+        // video layer init
+        if(video.init_window(u.UniverseWidth, u.UniverseHeight)) {
+            video.calc_fps = true;
+            video.threaded = options.threads.first > 0;
+            // video is ok, init Universe
+            u.InitializeUniverse(video);
+            // main loop
+            video.main_loop();
+        }
+        else if(video.init_console()) {
+            // do console mode
+            for(int p = options.threads.first;  p <= options.threads.last; ++p ) {
+                tbb::tick_count xwayParallelismStartTime = tbb::tick_count::now();
+                u.InitializeUniverse(video);
+                int numberOfFrames = options.numberOfFrames;
+                if (p==0){
+                    //run a serial version
+                    for( int i=0; i<numberOfFrames; ++i ){
+                        u.SerialUpdateUniverse();
+                    }
+                }else{
+                    tbb::task_scheduler_init init(p);
+                    for( int i=0; i<numberOfFrames; ++i ){
+                        u.ParallelUpdateUniverse();
+                    }
+                }
+
+                if (!options.silent){
+                    double fps =  options.numberOfFrames/((tbb::tick_count::now()-xwayParallelismStartTime).seconds());
+                    std::cout<<fps<<" frame per sec with ";
+                    if (p==0){
+                        std::cout<<"serial code\n";
+                    }else{
+                        std::cout<<p<<" way parallelism\n";
+                    }
+                }
+            }
+        }
+        video.terminate();
+        utility::report_elapsed_time((tbb::tick_count::now() - mainStartTime).seconds());
+        return 0;
+    }catch(std::exception& e){
+        std::cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+        return 1;
+    }
+}
diff --git a/examples/parallel_for/seismic/msvs/SeismicSimulation.icproj b/examples/parallel_for/seismic/msvs/SeismicSimulation.icproj
index 2db9709..1af37bc 100644
--- a/examples/parallel_for/seismic/msvs/SeismicSimulation.icproj
+++ b/examples/parallel_for/seismic/msvs/SeismicSimulation.icproj
@@ -3,7 +3,7 @@
 	ProjectType="Intel C++ Project"
 	Version="11.1"
 	Name="SeismicSimulation"
-	ProjectGUID="{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}"
+	ProjectGUID="{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}"
 	VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2527}"
 	VCNestedProjectFileName="SeismicSimulation.vcproj">
 	<Configurations/>
diff --git a/examples/parallel_for/seismic/msvs/SeismicSimulation.vcproj b/examples/parallel_for/seismic/msvs/SeismicSimulation.vcproj
index 7980d42..61e7535 100644
--- a/examples/parallel_for/seismic/msvs/SeismicSimulation.vcproj
+++ b/examples/parallel_for/seismic/msvs/SeismicSimulation.vcproj
@@ -46,7 +46,7 @@
 				Optimization="0"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				EnableFunctionLevelLinking="true"
@@ -67,7 +67,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="1"
@@ -97,7 +97,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -129,7 +129,7 @@
 				Optimization="0"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				EnableFunctionLevelLinking="true"
@@ -149,7 +149,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="17"
@@ -179,7 +179,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -211,7 +211,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
@@ -232,7 +232,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -264,7 +264,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -297,7 +297,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
@@ -317,7 +317,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -349,11 +349,11 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Release|Win32"
+			Name="DDRelease|Win32"
 			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
 			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
 			ConfigurationType="1"
@@ -382,7 +382,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
 				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
@@ -403,7 +403,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -435,11 +435,11 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Release|x64"
+			Name="DDRelease|x64"
 			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
 			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
 			ConfigurationType="1"
@@ -469,7 +469,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
 				PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
@@ -489,7 +489,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -521,11 +521,11 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Debug|Win32"
+			Name="DDDebug|Win32"
 			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
 			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
 			ConfigurationType="1"
@@ -553,7 +553,7 @@
 				Optimization="0"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
 				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				EnableFunctionLevelLinking="true"
@@ -574,7 +574,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="1"
@@ -604,11 +604,11 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Debug|x64"
+			Name="DDDebug|x64"
 			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
 			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
 			ConfigurationType="1"
@@ -637,7 +637,7 @@
 				Optimization="0"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
 				PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				EnableFunctionLevelLinking="true"
@@ -657,7 +657,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="17"
@@ -687,7 +687,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
@@ -700,7 +700,23 @@
 			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
 			>
 			<File
-				RelativePath="..\SeismicSimulation.cpp"
+				RelativePath="..\main.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\seismic_video.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\seismic_video.h"
+				>
+			</File>
+			<File
+				RelativePath="..\universe.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\universe.h"
 				>
 			</File>
 		</Filter>
@@ -769,7 +785,7 @@
 				RelativePath="..\..\..\common\gui\gdivideo.cpp"
 				>
 				<FileConfiguration
-					Name="DD Release|Win32"
+					Name="DDRelease|Win32"
 					ExcludedFromBuild="true"
 					>
 					<Tool
@@ -777,7 +793,7 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="DD Release|x64"
+					Name="DDRelease|x64"
 					ExcludedFromBuild="true"
 					>
 					<Tool
@@ -785,7 +801,7 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="DD Debug|Win32"
+					Name="DDDebug|Win32"
 					ExcludedFromBuild="true"
 					>
 					<Tool
@@ -793,7 +809,7 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="DD Debug|x64"
+					Name="DDDebug|x64"
 					ExcludedFromBuild="true"
 					>
 					<Tool
diff --git a/examples/parallel_for/seismic/msvs/SeismicSimulation_cl.sln b/examples/parallel_for/seismic/msvs/SeismicSimulation_cl.sln
index 7bd1fb7..a953c4a 100644
--- a/examples/parallel_for/seismic/msvs/SeismicSimulation_cl.sln
+++ b/examples/parallel_for/seismic/msvs/SeismicSimulation_cl.sln
@@ -10,26 +10,26 @@ Global
 		DD Release|x64 = DD Release|x64
 		GDI Debug|Win32 = GDI Debug|Win32
 		GDI Debug|x64 = GDI Debug|x64
-		GDI Release|Win32 = GDI Release|Win32
-		GDI Release|x64 = GDI Release|x64
+		_GDI Release|Win32 = _GDI Release|Win32
+		_GDI Release|x64 = _GDI Release|x64
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = DD Debug|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.Build.0 = DD Release|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = DD Release|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = DD Release|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.Build.0 = DDDebug|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = DDDebug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = DDDebug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.Build.0 = DDRelease|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = DDRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = DDRelease|x64
 		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.ActiveCfg = Debug|Win32
 		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.Build.0 = Debug|Win32
 		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.ActiveCfg = Debug|x64
 		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.Build.0 = Debug|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.Build.0 = Release|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.ActiveCfg = Release|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.Build.0 = Release|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|Win32.ActiveCfg = Release|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|Win32.Build.0 = Release|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.ActiveCfg = Release|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/examples/parallel_for/seismic/msvs/SeismicSimulation_icl.sln b/examples/parallel_for/seismic/msvs/SeismicSimulation_icl.sln
index 77ce9b2..6bca0c1 100644
--- a/examples/parallel_for/seismic/msvs/SeismicSimulation_icl.sln
+++ b/examples/parallel_for/seismic/msvs/SeismicSimulation_icl.sln
@@ -1,6 +1,6 @@
 Microsoft Visual Studio Solution File, Format Version 9.00
 # Visual Studio 2005
-Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "SeismicSimulation", "SeismicSimulation.icproj", "{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}"
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "SeismicSimulation", "SeismicSimulation.icproj", "{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -10,42 +10,42 @@ Global
 		DD Release|x64 = DD Release|x64
 		GDI Debug|Win32 = GDI Debug|Win32
 		GDI Debug|x64 = GDI Debug|x64
-		GDI Release|Win32 = GDI Release|Win32
-		GDI Release|x64 = GDI Release|x64
+		_GDI Release|Win32 = _GDI Release|Win32
+		_GDI Release|x64 = _GDI Release|x64
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|x64.Build.0 = DD Debug|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|Win32.Build.0 = DD Release|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|x64.ActiveCfg = DD Release|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|x64.Build.0 = DD Release|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|Win32.ActiveCfg = Debug|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|Win32.Build.0 = Debug|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|x64.ActiveCfg = Debug|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|x64.Build.0 = Debug|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|Win32.Build.0 = Release|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|x64.ActiveCfg = Release|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|x64.Build.0 = Release|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.Build.0 = Release|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.ActiveCfg = Release|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.Build.0 = Release|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.ActiveCfg = Release|Win32
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Debug|Win32.Build.0 = DDDebug|Win32
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Debug|x64.ActiveCfg = DDDebug|x64
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Debug|x64.Build.0 = DDDebug|x64
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Release|Win32.Build.0 = DDRelease|Win32
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Release|x64.ActiveCfg = DDRelease|x64
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.DD Release|x64.Build.0 = DDRelease|x64
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.GDI Debug|Win32.Build.0 = Debug|Win32
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.GDI Debug|x64.ActiveCfg = Debug|x64
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}.GDI Debug|x64.Build.0 = Debug|x64
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}._GDI Release|Win32.ActiveCfg = Release|Win32
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}._GDI Release|Win32.Build.0 = Release|Win32
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}._GDI Release|x64.ActiveCfg = Release|x64
+		{87C5A3E0-E1C8-457F-AA2F-B3E455214E76}._GDI Release|x64.Build.0 = Release|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.Build.0 = Release|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.ActiveCfg = Release|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|Win32.Build.0 = Release|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|Win32.ActiveCfg = Release|Win32
 		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.Build.0 = Debug|x64
 		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.ActiveCfg = Debug|x64
 		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.Build.0 = Debug|Win32
 		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.ActiveCfg = Debug|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = DD Release|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = DD Release|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.Build.0 = DD Release|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = DD Debug|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = DDRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = DDRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.Build.0 = DDRelease|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = DDDebug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = DDDebug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.Build.0 = DDDebug|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/examples/parallel_for/seismic/seismic_video.cpp b/examples/parallel_for/seismic/seismic_video.cpp
new file mode 100644
index 0000000..c916f85
--- /dev/null
+++ b/examples/parallel_for/seismic/seismic_video.cpp
@@ -0,0 +1,156 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#include "seismic_video.h"
+#include "universe.h"
+#include "tbb/task_scheduler_init.h"
+
+const char * const SeismicVideo::titles[2] = {"Seismic Simulation: Serial", "Seismic Simulation: Parallel"};
+void SeismicVideo::on_mouse(int x, int y, int key) {
+    if(key == 1){
+        u_.TryPutNewPulseSource(x,y);
+    }
+}
+
+void SeismicVideo::on_key(int key) {
+    key &= 0xff;
+    if(char(key) == ' ') initIsParallel = !initIsParallel;
+    else if(char(key) == 'p') initIsParallel = true;
+    else if(char(key) == 's') initIsParallel = false;
+    else if(char(key) == 'e') updating = true;
+    else if(char(key) == 'd') updating = false;
+    else if(key == 27) running = false;
+    title = initIsParallel?titles[1]:titles[0];
+}
+
+void SeismicVideo::on_process() {
+    tbb::task_scheduler_init Init(threadsHigh);
+    do {
+        if( initIsParallel )
+            u_.ParallelUpdateUniverse();
+        else
+            u_.SerialUpdateUniverse();
+        if( numberOfFrames_ > 0 ) --numberOfFrames_;
+    } while(next_frame() && numberOfFrames_);
+}
+
+#ifdef _WINDOWS
+#include "msvs/resource.h"
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
+SeismicVideo * gVideo = NULL;
+#endif
+
+SeismicVideo::SeismicVideo(    Universe &u, int number_of_frames, int threads_high, bool init_is_parallel)
+    :numberOfFrames_(number_of_frames),initIsParallel(init_is_parallel),u_(u),threadsHigh(threads_high)
+{
+    title = initIsParallel?titles[1]:titles[0];
+#ifdef _WINDOWS
+    gVideo = this;
+    LoadStringA(video::win_hInstance, IDC_SEISMICSIMULATION, szWindowClass, MAX_LOADSTRING);
+    memset(&wcex, 0, sizeof(wcex));
+    wcex.lpfnWndProc    = (WNDPROC)WndProc;
+    wcex.hIcon          = LoadIcon(video::win_hInstance, MAKEINTRESOURCE(IDI_SEISMICSIMULATION));
+    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
+    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
+    wcex.lpszMenuName   = LPCTSTR(IDC_SEISMICSIMULATION);
+    wcex.lpszClassName  = szWindowClass;
+    wcex.hIconSm        = LoadIcon(video::win_hInstance, MAKEINTRESOURCE(IDI_SMALL));
+    win_set_class(wcex); // ascii convention here
+    win_load_accelerators(IDC_SEISMICSIMULATION);
+#endif
+
+}
+
+
+
+
+
+#ifdef _WINDOWS
+//
+//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
+//
+//  PURPOSE:  Processes messages for the main window.
+//
+//  WM_COMMAND  - process the application menu
+//  WM_PAINT    - Paint the main window
+//  WM_DESTROY  - post a quit message and return
+//
+//
+LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    switch (message)
+    {
+    case WM_INITDIALOG: return TRUE;
+    case WM_COMMAND:
+        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
+            EndDialog(hDlg, LOWORD(wParam));
+            return TRUE;
+        }
+        break;
+    }
+    return FALSE;
+}
+
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    int wmId;
+    switch (message) {
+    case WM_COMMAND:
+        wmId    = LOWORD(wParam);
+        // Parse the menu selections:
+        switch (wmId)
+        {
+        case IDM_ABOUT:
+            DialogBox(video::win_hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)About);
+            break;
+        case IDM_EXIT:
+            PostQuitMessage(0);
+            break;
+        case ID_FILE_PARALLEL:
+            gVideo->on_key('p');
+            break;
+        case ID_FILE_SERIAL:
+            gVideo->on_key('s');
+            break;
+        case ID_FILE_ENABLEGUI:
+            gVideo->on_key('e');
+            break;
+        case ID_FILE_DISABLEGUI:
+            gVideo->on_key('d');
+            break;
+        default:
+            return DefWindowProc(hWnd, message, wParam, lParam);
+        }
+        break;
+    default:
+        return DefWindowProc(hWnd, message, wParam, lParam);
+    }
+    return 0;
+}
+
+#endif
diff --git a/src/tbbmalloc/win-gcc-tbbmalloc-export.def b/examples/parallel_for/seismic/seismic_video.h
similarity index 66%
copy from src/tbbmalloc/win-gcc-tbbmalloc-export.def
copy to examples/parallel_for/seismic/seismic_video.h
index c6090ee..d9d2dd1 100644
--- a/src/tbbmalloc/win-gcc-tbbmalloc-export.def
+++ b/examples/parallel_for/seismic/seismic_video.h
@@ -26,20 +26,37 @@
     the GNU General Public License.
 */
 
+#ifndef SEISMIC_VIDEO_H_
+#define SEISMIC_VIDEO_H_
+
+#include "../../common/gui/video.h"
+
+class Universe;
+
+class SeismicVideo : public video
 {
-global:
-scalable_calloc;
-scalable_free;
-scalable_malloc;
-scalable_realloc;
-scalable_posix_memalign;
-scalable_aligned_malloc;
-scalable_aligned_realloc;
-scalable_aligned_free;
-safer_scalable_free;
-safer_scalable_realloc;
-scalable_msize;
-safer_scalable_msize;
-safer_scalable_aligned_realloc;
-local:*;
+#ifdef _WINDOWS
+    #define MAX_LOADSTRING 100
+    TCHAR szWindowClass[MAX_LOADSTRING];    // the main window class name
+    WNDCLASSEX wcex;
+#endif
+    static const char * const titles[2];
+
+    bool initIsParallel ;
+
+    Universe &u_;
+    int numberOfFrames_;
+    int threadsHigh;
+private:
+    void on_mouse(int x, int y, int key);
+    void on_process();
+
+#ifdef _WINDOWS
+public:
+#endif
+    void on_key(int key);
+
+public:
+    SeismicVideo(    Universe &u,int numberOfFrames, int threadsHigh, bool initIsParallel=true);
 };
+#endif /* SEISMIC_VIDEO_H_ */
diff --git a/examples/parallel_for/seismic/universe.cpp b/examples/parallel_for/seismic/universe.cpp
new file mode 100644
index 0000000..fcaae06
--- /dev/null
+++ b/examples/parallel_for/seismic/universe.cpp
@@ -0,0 +1,230 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+
+#include "../../common/gui/video.h"
+#include <cmath>
+#include "tbb/blocked_range.h"
+#include "tbb/parallel_for.h"
+
+
+using namespace std;
+
+#ifdef _MSC_VER
+// warning C4068: unknown pragma
+#pragma warning(disable: 4068)
+// warning C4351: new behavior: elements of array 'array' will be default initialized
+#pragma warning(disable: 4351)
+#endif
+
+#include "universe.h"
+
+const colorcomp_t MaterialColor[4][3] = { // BGR
+    {96,0,0},     // WATER
+    {0,48,48},    // SANDSTONE
+    {32,32,23}    // SHALE
+};
+
+void Universe::InitializeUniverse(video const& colorizer) {
+
+    pulseCounter = pulseTime = 100;
+    pulseX = UniverseWidth/3;
+    pulseY = UniverseHeight/4;
+    // Initialize V, S, and T to slightly non-zero values, in order to avoid denormal waves.
+    for( int i=0; i<UniverseHeight; ++i )
+#pragma ivdep
+        for( int j=0; j<UniverseWidth; ++j ) {
+            T[i][j] = S[i][j] = V[i][j] = ValueType(1.0E-6);
+        }
+    for( int i=1; i<UniverseHeight-1; ++i ) {
+        for( int j=1; j<UniverseWidth-1; ++j ) {
+            float x = float(j-UniverseWidth/2)/(UniverseWidth/2);
+            ValueType t = (ValueType)i/UniverseHeight;
+            MaterialType m;
+            D[i][j] = 1.0;
+            // Coefficient values are fictitious, and chosen to visually exaggerate
+            // physical effects such as Rayleigh waves.  The fabs/exp line generates
+            // a shale layer with a gentle upwards slope and an anticline.
+            if( t<0.3f ) {
+                m = WATER;
+                M[i][j] = 0.125;
+                L[i][j] = 0.125;
+            } else if( fabs(t-0.7+0.2*exp(-8*x*x)+0.025*x)<=0.1 ) {
+                m = SHALE;
+                M[i][j] = 0.5;
+                L[i][j] = 0.6;
+            } else {
+                m = SANDSTONE;
+                M[i][j] = 0.3;
+                L[i][j] = 0.4;
+            }
+            material[i][j] = m;
+        }
+    }
+    ValueType scale = 2.0f/ColorMapSize;
+    for( int k=0; k<4; ++k ) {
+        for( int i=0; i<ColorMapSize; ++i ) {
+            colorcomp_t c[3];
+            ValueType t = (i-ColorMapSize/2)*scale;
+            ValueType r = t>0 ? t : 0;
+            ValueType b = t<0 ? -t : 0;
+            ValueType g = 0.5f*fabs(t);
+            memcpy(c, MaterialColor[k], sizeof(c));
+            c[2] = colorcomp_t(r*(255-c[2])+c[2]);
+            c[1] = colorcomp_t(g*(255-c[1])+c[1]);
+            c[0] = colorcomp_t(b*(255-c[0])+c[0]);
+            ColorMap[k][i] = colorizer.get_color(c[2], c[1], c[0]);
+        }
+    }
+    // Set damping coefficients around border to reduce reflections from boundaries.
+    ValueType d = 1.0;
+    for( int k=DamperSize-1; k>0; --k ) {
+        d *= 1-1.0f/(DamperSize*DamperSize);
+        for( int j=1; j<UniverseWidth-1; ++j ) {
+            D[k][j] *= d;
+            D[UniverseHeight-1-k][j] *= d;
+        }
+        for( int i=1; i<UniverseHeight-1; ++i ) {
+            D[i][k] *= d;
+            D[i][UniverseWidth-1-k] *= d;
+        }
+    }
+    drawingMemory = colorizer.get_drawing_memory();
+}
+void Universe::UpdatePulse() {
+    if( pulseCounter>0 ) {
+        ValueType t = (pulseCounter-pulseTime/2)*0.05f;
+        V[pulseY][pulseX] += 64*sqrt(M[pulseY][pulseX])*exp(-t*t);
+        --pulseCounter;
+    }
+}
+
+struct Universe::Rectangle {
+    struct std::pair<int,int> xRange;
+    struct std::pair<int,int> yRange;
+    Rectangle (int startX, int startY, int width, int height):xRange(startX,width),yRange(startY,height){}
+    int StartX() const {return xRange.first;}
+    int StartY() const {return yRange.first;}
+    int Width()   const {return xRange.second;}
+    int Height()  const {return yRange.second;}
+    int EndX() const {return xRange.first + xRange.second;}
+    int EndY() const {return yRange.first + yRange.second;}
+
+};
+
+void Universe::UpdateStress(Rectangle const& r ) {
+    drawing_area  drawing(r.StartX(),r.StartY(),r.Width(),r.Height(),drawingMemory);
+    for( int i=r.StartY(); i<r.EndY() ; ++i ) {
+        drawing.set_pos(1, i-r.StartY());
+#pragma ivdep
+        for( int j=r.StartX(); j<r.EndX() ; ++j ) {
+            S[i][j] += M[i][j]*(V[i][j+1]-V[i][j]);
+            T[i][j] += M[i][j]*(V[i+1][j]-V[i][j]);
+            int index = (int)(V[i][j]*(ColorMapSize/2)) + ColorMapSize/2;
+            if( index<0 ) index = 0;
+            if( index>=ColorMapSize ) index = ColorMapSize-1;
+            color_t* c = ColorMap[material[i][j]];
+            drawing.put_pixel(c[index]);
+        }
+    }
+}
+
+void Universe::SerialUpdateStress() {
+    Rectangle  area(0, 0, UniverseWidth-1, UniverseHeight-1);
+    UpdateStress(area);
+}
+
+struct UpdateStressBody {
+    Universe & u_;
+    UpdateStressBody(Universe & u):u_(u){}
+    void operator()( const tbb::blocked_range<int>& range ) const {
+        Universe::Rectangle area(0, range.begin(), u_.UniverseWidth-1, range.size());
+        u_.UpdateStress(area);
+    }
+};
+
+void Universe::ParallelUpdateStress(tbb::affinity_partitioner &affinity) {
+    tbb::parallel_for( tbb::blocked_range<int>( 0, UniverseHeight-1 ), // Index space for loop
+                       UpdateStressBody(*this),                             // Body of loop
+                       affinity );                                     // Affinity hint
+}
+
+void Universe::UpdateVelocity(Rectangle const& r) {
+    for( int i=r.StartY(); i<r.EndY(); ++i )
+#pragma ivdep
+        for( int j=r.StartX(); j<r.EndX(); ++j )
+            V[i][j] = D[i][j]*(V[i][j] + L[i][j]*(S[i][j] - S[i][j-1] + T[i][j] - T[i-1][j]));
+}
+
+void Universe::SerialUpdateVelocity() {
+    UpdateVelocity(Rectangle(1,1,UniverseWidth-1,UniverseHeight-1));
+}
+
+struct UpdateVelocityBody {
+    Universe & u_;
+    UpdateVelocityBody(Universe & u):u_(u){}
+    void operator()( const tbb::blocked_range<int>& y_range ) const {
+        u_.UpdateVelocity(Universe::Rectangle(0,y_range.begin(),u_.UniverseWidth-1,y_range.size()));
+    }
+};
+
+void Universe::ParallelUpdateVelocity(tbb::affinity_partitioner &affinity) {
+    tbb::parallel_for( tbb::blocked_range<int>( 0, UniverseHeight-1 ), // Index space for loop
+                       UpdateVelocityBody(*this),                           // Body of loop
+                       affinity );                                     // Affinity hint
+}
+
+void Universe::SerialUpdateUniverse() {
+    UpdatePulse();
+    SerialUpdateStress();
+    SerialUpdateVelocity();
+}
+
+void Universe::ParallelUpdateUniverse() {
+    /** Affinity is an argument to parallel_for to hint that an iteration of a loop
+    is best replayed on the same processor for each execution of the loop.
+    It is a static object because it must remember where the iterations happened
+    in previous executions. */
+    static tbb::affinity_partitioner affinity;
+    UpdatePulse();
+    ParallelUpdateStress(affinity);
+    ParallelUpdateVelocity(affinity);
+}
+
+bool Universe::TryPutNewPulseSource(int x, int y){
+    if(pulseCounter == 0) {
+        pulseCounter = pulseTime;
+        pulseX = x; pulseY = y;
+        return true;
+    }
+    return false;
+}
+
+void Universe::SetDrawingMemory(const drawing_memory &dmem) {
+    drawingMemory = dmem;
+}
diff --git a/examples/parallel_for/seismic/universe.h b/examples/parallel_for/seismic/universe.h
new file mode 100644
index 0000000..4ebb2c1
--- /dev/null
+++ b/examples/parallel_for/seismic/universe.h
@@ -0,0 +1,120 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef UNIVERSE_H_
+#define UNIVERSE_H_
+
+#include "../../common/gui/video.h"
+#include "tbb/partitioner.h"
+
+
+class Universe {
+public:
+    enum {
+        UniverseWidth = 1024
+        ,UniverseHeight  = 512
+    };
+private:
+    //in order to avoid performance degradation due to cache aliasing issue
+    //some padding is needed after each row in array, and between array themselves.
+    //the padding is achieved by adjusting number of rows and columns.
+    //as the compiler is forced to place class members of the same clause in order of the
+    //declaration this seems to be the right way of padding.
+
+    //magic constants what are being added bellow are chosen experimentally.
+    enum {
+        MaxWidth = UniverseWidth+1,
+        MaxHeight = UniverseHeight+3
+    };
+
+    typedef float ValueType;
+
+    //! Horizontal stress
+    ValueType S[MaxHeight][MaxWidth];
+
+    //! Velocity at each grid point
+    ValueType V[MaxHeight][MaxWidth];
+
+    //! Vertical stress
+    ValueType T[MaxHeight][MaxWidth];
+
+    //! Coefficient related to modulus
+    ValueType M[MaxHeight][MaxWidth];
+
+    //! Damping coefficients
+    ValueType D[MaxHeight][MaxWidth];
+
+    //! Coefficient related to lightness
+    ValueType L[MaxHeight][MaxWidth];
+
+    enum { ColorMapSize = 1024};
+    color_t ColorMap[4][ColorMapSize];
+
+    enum MaterialType {
+        WATER=0,
+        SANDSTONE=1,
+        SHALE=2
+    };
+
+    //! Values are MaterialType, cast to an unsigned char to save space.
+    unsigned char material[MaxHeight][MaxWidth];
+
+private:
+    enum { DamperSize = 32};
+
+    int pulseTime;
+    int pulseCounter;
+    int pulseX;
+    int pulseY;
+
+    drawing_memory drawingMemory;
+
+public:
+    void InitializeUniverse(video const& colorizer);
+
+    void SerialUpdateUniverse();
+    void ParallelUpdateUniverse();
+    bool TryPutNewPulseSource(int x, int y);
+    void SetDrawingMemory(const drawing_memory &dmem);
+private:
+    struct Rectangle;
+    void UpdatePulse();
+    void UpdateStress(Rectangle const& r );
+
+    void SerialUpdateStress() ;
+    friend struct UpdateStressBody;
+    friend struct UpdateVelocityBody;
+    void ParallelUpdateStress(tbb::affinity_partitioner &affinity);
+
+    void UpdateVelocity(Rectangle const& r);
+
+    void SerialUpdateVelocity() ;
+    void ParallelUpdateVelocity(tbb::affinity_partitioner &affinity);
+};
+
+#endif /* UNIVERSE_H_ */
diff --git a/examples/parallel_for/seismic/xcode/SeismicSimulation.xcodeproj/project.pbxproj b/examples/parallel_for/seismic/xcode/SeismicSimulation.xcodeproj/project.pbxproj
index 8179416..e2ddd98 100644
--- a/examples/parallel_for/seismic/xcode/SeismicSimulation.xcodeproj/project.pbxproj
+++ b/examples/parallel_for/seismic/xcode/SeismicSimulation.xcodeproj/project.pbxproj
@@ -3,19 +3,20 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
+		61C4770113CE179A0022F8F6 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61C4770013CE179A0022F8F6 /* main.cpp */; };
+		61C4770813CE17B40022F8F6 /* seismic_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61C4770313CE17B40022F8F6 /* seismic_video.cpp */; };
+		61C4770A13CE17B40022F8F6 /* universe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61C4770613CE17B40022F8F6 /* universe.cpp */; };
 		8D0C4E8E0486CD37000505A6 /* main.nib in Resources */ = {isa = PBXBuildFile; fileRef = 02345980000FD03B11CA0E72 /* main.nib */; };
-		A12649490B8392750091D5AD /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */; };
 		A126495E0B83936D0091D5AD /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8D0C4E960486CD37000505A6 /* Info.plist */; };
 		A18D2A340B861B99007D8D2C /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb.dylib */; };
 		A1A8F41E0B8B4DBE001C55B1 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A8F41D0B8B4DBE001C55B1 /* AGL.framework */; };
 		A1A8F4310B8B4EA8001C55B1 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A8F4300B8B4EA8001C55B1 /* Carbon.framework */; };
 		A1D44D9A0B861E8A0006E401 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb.dylib */; };
 		A1E3E7BD0B3AD4EC007C3AB5 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */; };
-		A1F591A90B8DFC7100073279 /* SeismicSimulation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F591A80B8DFC7100073279 /* SeismicSimulation.cpp */; };
 		A1F591AC0B8DFC9600073279 /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F591AA0B8DFC9600073279 /* macvideo.cpp */; };
 /* End PBXBuildFile section */
 
@@ -35,13 +36,17 @@
 /* Begin PBXFileReference section */
 		1870340FFE93FCAF11CA0CD7 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/main.nib; sourceTree = "<group>"; };
 		32DBCF6D0370B57F00C91783 /* SeismicSimulation.pch */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SeismicSimulation.pch; sourceTree = "<group>"; };
+		61C4770013CE179A0022F8F6 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = ../main.cpp; sourceTree = "<group>"; };
+		61C4770313CE17B40022F8F6 /* seismic_video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = seismic_video.cpp; path = ../seismic_video.cpp; sourceTree = "<group>"; };
+		61C4770413CE17B40022F8F6 /* seismic_video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = seismic_video.h; path = ../seismic_video.h; sourceTree = "<group>"; };
+		61C4770613CE17B40022F8F6 /* universe.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = universe.cpp; path = ../universe.cpp; sourceTree = "<group>"; };
+		61C4770713CE17B40022F8F6 /* universe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = universe.h; path = ../universe.h; sourceTree = "<group>"; };
 		8D0C4E960486CD37000505A6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
 		8D0C4E970486CD37000505A6 /* SeismicSimulation.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SeismicSimulation.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		A18D2A330B861B99007D8D2C /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb.dylib; path = ../../../../lib/libtbb.dylib; sourceTree = SOURCE_ROOT; };
 		A1A8F41D0B8B4DBE001C55B1 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; };
 		A1A8F4300B8B4EA8001C55B1 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
 		A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
-		A1F591A80B8DFC7100073279 /* SeismicSimulation.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SeismicSimulation.cpp; path = ../SeismicSimulation.cpp; sourceTree = SOURCE_ROOT; };
 		A1F591AA0B8DFC9600073279 /* macvideo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macvideo.cpp; path = ../../../common/gui/macvideo.cpp; sourceTree = SOURCE_ROOT; };
 		A1F591AB0B8DFC9600073279 /* video.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = video.h; path = ../../../common/gui/video.h; sourceTree = SOURCE_ROOT; };
 /* End PBXFileReference section */
@@ -52,7 +57,6 @@
 			buildActionMask = 2147483647;
 			files = (
 				A1E3E7BD0B3AD4EC007C3AB5 /* OpenGL.framework in Frameworks */,
-				A12649490B8392750091D5AD /* OpenGL.framework in Frameworks */,
 				A18D2A340B861B99007D8D2C /* libtbb.dylib in Frameworks */,
 				A1A8F41E0B8B4DBE001C55B1 /* AGL.framework in Frameworks */,
 				A1A8F4310B8B4EA8001C55B1 /* Carbon.framework in Frameworks */,
@@ -84,7 +88,11 @@
 		20286C2AFDCF999611CA2CEA /* Sources */ = {
 			isa = PBXGroup;
 			children = (
-				A1F591A80B8DFC7100073279 /* SeismicSimulation.cpp */,
+				61C4770313CE17B40022F8F6 /* seismic_video.cpp */,
+				61C4770413CE17B40022F8F6 /* seismic_video.h */,
+				61C4770613CE17B40022F8F6 /* universe.cpp */,
+				61C4770713CE17B40022F8F6 /* universe.h */,
+				61C4770013CE179A0022F8F6 /* main.cpp */,
 				A1F591AA0B8DFC9600073279 /* macvideo.cpp */,
 				A1F591AB0B8DFC9600073279 /* video.h */,
 				32DBCF6D0370B57F00C91783 /* SeismicSimulation.pch */,
@@ -139,9 +147,16 @@
 /* Begin PBXProject section */
 		20286C28FDCF999611CA2CEA /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
 			buildConfigurationList = C0E91AC908A95435008D54AB /* Build configuration list for PBXProject "SeismicSimulation" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 20286C29FDCF999611CA2CEA /* SeismicSimulation */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -168,8 +183,10 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A1F591A90B8DFC7100073279 /* SeismicSimulation.cpp in Sources */,
 				A1F591AC0B8DFC9600073279 /* macvideo.cpp in Sources */,
+				61C4770113CE179A0022F8F6 /* main.cpp in Sources */,
+				61C4770813CE17B40022F8F6 /* seismic_video.cpp in Sources */,
+				61C4770A13CE17B40022F8F6 /* universe.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -192,17 +209,16 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_MODEL_TUNING = "";
 				GCC_OPTIMIZATION_LEVEL = 0;
-				INSTALL_PATH = "$(HOME)/Applications";
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
+				INSTALL_PATH = "$(HOME)/Applications";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
 				);
 				PRODUCT_NAME = SeismicSimulation;
-				GCC_VERSION = 4.0;
 			};
 			name = Debug;
 		};
@@ -211,14 +227,14 @@
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
 				GCC_MODEL_TUNING = "";
-				INSTALL_PATH = "$(HOME)/Applications";
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
+				INSTALL_PATH = "$(HOME)/Applications";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
 				);
 				PRODUCT_NAME = SeismicSimulation;
-				GCC_VERSION = 4.0;
 			};
 			name = Release;
 		};
@@ -231,11 +247,12 @@
 				GCC_ENABLE_SSE3_EXTENSIONS = YES;
 				GCC_MODEL_TUNING = "";
 				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_VERSION = "";
 				GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+				IBC_STRIP_NIBS = NO;
 				MACH_O_TYPE = mh_execute;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
-				GCC_VERSION = 4.0;
+				SDKROOT = macosx10.6;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
 			name = Debug;
@@ -249,11 +266,12 @@
 				GCC_ENABLE_SSE3_EXTENSIONS = YES;
 				GCC_MODEL_TUNING = "";
 				GCC_OPTIMIZATION_LEVEL = 3;
+				GCC_VERSION = "";
 				GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+				IBC_STRIP_NIBS = NO;
 				MACH_O_TYPE = mh_execute;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
-				GCC_VERSION = 4.0;
+				SDKROOT = macosx10.6;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
 			name = Release;
diff --git a/examples/parallel_for/tachyon/Makefile b/examples/parallel_for/tachyon/Makefile
index 848fbd4..9ab1b51 100644
--- a/examples/parallel_for/tachyon/Makefile
+++ b/examples/parallel_for/tachyon/Makefile
@@ -59,10 +59,10 @@ ifneq (,$(shell which icc 2>/dev/null))
 CXX=icc
 endif # icc
 
-# The default dataset
-export DATASET = balls
 # The default runtime arguments
-export ARGS =
+export ARGS = dat/balls.dat
+export PERF_RUN_ARGS = silent dat/balls3.dat
+export LIGHT_ARGS= dat/model2.dat
 
 # define name suffix
 SUFFIX = .$(VERSION)
@@ -72,13 +72,13 @@ LIBS ?= -lm
 include ../../common/gui/Makefile.gmake
 
 ifeq ($(UI),x)
-CXXFLAGS += -DX_FULLSYNC 
+UI_CXXFLAGS += -DX_FULLSYNC 
 ifneq (,$(findstring -lXext,$(LIBS)))
-CXXFLAGS += -DX_NOSHMPIX
+UI_CXXFLAGS += -DX_NOSHMPIX
 endif
 endif # X
 
-MYCXXFLAGS = $(CXXFLAGS)
+MYCXXFLAGS = $(CXXFLAGS) $(UI_CXXFLAGS)
 
 all: build run
 release: build
@@ -118,6 +118,15 @@ run_tbb1d:
 	$(MAKE) VERSION=tbb1d run_one
 
 
+perf_build:
+	$(MAKE) UI=con VERSION=tbb ADD_TBB=1 build_one
+perf_run:
+	$(MAKE) UI=con VERSION=tbb run_perf_one
+
+light_test:
+	$(MAKE) UI=con VERSION=tbb light_test_one
+
+
 #
 # Per-build Makefile rules (for recursive $(MAKE) calls from above)
 #
@@ -127,7 +136,7 @@ SVERSION = $(VERSION)
 ifeq ($(ADD_DEBUG),1)
 MYCXXFLAGS += -O0 -g -D_DEBUG
 else
-MYCXXFLAGS += -O2
+MYCXXFLAGS += -O2 -DNDEBUG
 endif
 
 
@@ -141,17 +150,27 @@ LIBS += -ltbb
 endif
 endif
 
-SOURCE = ../../common/gui/$(UI)video.cpp src/trace.$(SVERSION).cpp src/pthread.cpp src/video.cpp src/api.cpp src/apigeom.cpp src/apitrigeom.cpp src/bndbox.cpp src/box.cpp src/camera.cpp src/coordsys.cpp src/cylinder.cpp src/extvol.cpp src/getargs.cpp src/global.cpp src/grid.cpp src/imageio.cpp src/imap.cpp src/intersect.cpp src/jpeg.cpp src/light.cpp src/objbound.cpp src/parse.cpp src/plane.cpp src/ppm.cpp src/quadric.cpp src/render.cpp src/ring.cpp src/shade.cpp src/sphere.cpp src/textu [...]
+ifeq ($(shell uname), Linux)
+LIBS += -lrt 
+endif
+
+SOURCE = ../../common/gui/$(UI)video.cpp src/trace.$(SVERSION).cpp src/main.cpp src/pthread.cpp src/tachyon_video.cpp src/api.cpp src/apigeom.cpp src/apitrigeom.cpp src/bndbox.cpp src/box.cpp src/camera.cpp src/coordsys.cpp src/cylinder.cpp src/extvol.cpp src/global.cpp src/grid.cpp src/imageio.cpp src/imap.cpp src/intersect.cpp src/jpeg.cpp src/light.cpp src/objbound.cpp src/parse.cpp src/plane.cpp src/ppm.cpp src/quadric.cpp src/render.cpp src/ring.cpp src/shade.cpp src/sphere.cpp src/ [...]
 
 build_one:	$(EXE)
 
 run_one:
 ifeq ($(UI),mac)
-	export DYLD_LIBRARY_PATH="$(DYLD_LIBRARY_PATH):$(TBBLIBSPATH)"; ./$(EXE) $(ARGS) dat/$(DATASET).dat
+	export DYLD_LIBRARY_PATH="$(DYLD_LIBRARY_PATH):$(TBBLIBSPATH)"; ./$(EXE) $(ARGS)
 else
-	./$(EXE) $(ARGS) dat/$(DATASET).dat
+	./$(EXE) $(ARGS)
 endif
 
+run_perf_one:
+	./$(EXE) $(PERF_RUN_ARGS)
+
+light_test_one:
+	./$(EXE) $(LIGHT_ARGS)
+
 $(EXE): $(SOURCE)
 ifeq ($(UI),mac)
 	mkdir -p $(APPRES)/English.lproj $(NAME).$(VERSION).app/Contents/MacOS
diff --git a/examples/parallel_for/tachyon/Makefile.windows b/examples/parallel_for/tachyon/Makefile.windows
index cbdd2f1..7c3bad4 100644
--- a/examples/parallel_for/tachyon/Makefile.windows
+++ b/examples/parallel_for/tachyon/Makefile.windows
@@ -70,10 +70,10 @@ ARCH1 = $(ARCH0:ia32-=x86)
 ARCH2 = $(ARCH1:intel64-=AMD64)
 XARCH = $(ARCH2:-=x86)
 
-# The default dataset
-DATASET = balls
 # The default runtime arguments
-ARGS =
+ARGS = dat\balls.dat
+PERF_RUN_ARGS = silent dat\balls3.dat
+LIGHT_ARGS=dat\model2.dat
 
 # Add these for tbb/tbb1d release builds
 # /GL is a workaround to prevent run-time crash when built by VS2010
@@ -86,7 +86,7 @@ LIBS_TBB_DEBUG =  tbb_debug.lib $(LIBS)
 
 
 MAKEINC = ../../common/gui/Makefile.win
-SOURCE = src/pthread.cpp src/video.cpp src/api.cpp src/apigeom.cpp src/apitrigeom.cpp src/bndbox.cpp src/box.cpp src/camera.cpp src/coordsys.cpp src/cylinder.cpp src/extvol.cpp src/getargs.cpp src/global.cpp src/grid.cpp src/imageio.cpp src/imap.cpp src/intersect.cpp src/jpeg.cpp src/light.cpp src/objbound.cpp src/parse.cpp src/plane.cpp src/ppm.cpp src/quadric.cpp src/render.cpp src/ring.cpp src/shade.cpp src/sphere.cpp src/texture.cpp src/tgafile.cpp src/trace_rest.cpp src/triangle.cpp [...]
+SOURCE = src/main.cpp src/pthread.cpp src/tachyon_video.cpp src/api.cpp src/apigeom.cpp src/apitrigeom.cpp src/bndbox.cpp src/box.cpp src/camera.cpp src/coordsys.cpp src/cylinder.cpp src/extvol.cpp src/global.cpp src/grid.cpp src/imageio.cpp src/imap.cpp src/intersect.cpp src/jpeg.cpp src/light.cpp src/objbound.cpp src/parse.cpp src/plane.cpp src/ppm.cpp src/quadric.cpp src/render.cpp src/ring.cpp src/shade.cpp src/sphere.cpp src/texture.cpp src/tgafile.cpp src/trace_rest.cpp src/triangl [...]
 
 # Targets
 all: build run
@@ -110,22 +110,30 @@ build_serial:
 build_serial_debug:
 	@$(MAKE) -f $(MAKEINC) SOURCE="src/trace.serial.cpp $(SOURCE)" EXE=tachyon.serial.exe RCNAME=gui UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS=$(CXXFLAGS) XARCH=$(XARCH) build_one
 run_serial:
-	-.\tachyon.serial.exe $(ARGS) dat\$(DATASET).dat
+	-.\tachyon.serial.exe $(ARGS)
 
 build_tbb:
 	@$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb.cpp $(SOURCE)" EXE=tachyon.tbb.exe RCNAME=gui UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_NDEBUG)" LFLAGS="$(LIBS_TBB_NDEBUG)" XARCH=$(XARCH) build_one
 build_tbb_debug:
 	@$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb.cpp $(SOURCE)" EXE=tachyon.tbb.exe RCNAME=gui UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_DEBUG)" LFLAGS="$(LIBS_TBB_DEBUG)" XARCH=$(XARCH) build_one
 run_tbb:
-	-.\tachyon.tbb.exe $(ARGS) dat\$(DATASET).dat
+	-.\tachyon.tbb.exe $(ARGS)
 
 build_tbb1d:
 	@$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb1d.cpp $(SOURCE)" EXE=tachyon.tbb1d.exe RCNAME=gui UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_NDEBUG)" LFLAGS="$(LIBS_TBB_NDEBUG)" XARCH=$(XARCH) build_one
 build_tbb1d_debug:
 	@$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb1d.cpp $(SOURCE)" EXE=tachyon.tbb1d.exe RCNAME=gui UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_DEBUG)" LFLAGS="$(LIBS_TBB_DEBUG)" XARCH=$(XARCH) build_one
 run_tbb1d:
-	-.\tachyon.tbb1d.exe $(ARGS) dat\$(DATASET).dat
+	-.\tachyon.tbb1d.exe $(ARGS)
 
 
 clean:
 	@cmd.exe /C del tachyon.* *.manifest *.obj msvs\gui.res *.?db
+
+perf_build:
+	@$(MAKE) -f $(MAKEINC) SOURCE="src/trace.tbb.cpp $(SOURCE)" EXE=tachyon.tbb.exe RCNAME=gui UI=con CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS_TBB_NDEBUG)" LFLAGS="$(LIBS_TBB_NDEBUG)" XARCH=$(XARCH) build_one
+perf_run:
+	-.\tachyon.tbb.exe $(PERF_RUN_ARGS)
+
+light_test:
+	-.\tachyon.tbb.exe $(LIGHT_ARGS)
diff --git a/examples/parallel_for/tachyon/index.html b/examples/parallel_for/tachyon/index.html
index 151255b..91caf79 100644
--- a/examples/parallel_for/tachyon/index.html
+++ b/examples/parallel_for/tachyon/index.html
@@ -49,8 +49,10 @@ The following versions of the example are provided:
 
 <H2>Files</H2>
 <DL>
-<DT><A HREF="src/video.cpp">src/video.cpp</A>
-<DD>Source code for main program and GUI interfaces.
+<DT><A HREF="src/main.cpp">src/main.cpp</A>
+<DD>Main program which parses command line options and runs the raytracer.
+<DT><A HREF="src/tachyon_video.cpp">src/tachyon_video.cpp</A>
+<DD>Source code for GUI interfaces.
 <DT><A HREF="src/trace.serial.cpp">src/trace.serial.cpp</A>
 <DD>Source code for original sequential version of example.
 <DT><A HREF="src/trace.tbb1d.cpp">src/trace.tbb1d.cpp</A>
@@ -122,19 +124,25 @@ Here, <<I>version</I>> is one of the above versions of the example, i.e.,
 
 <H2>Usage</H2>
 Building via the above make commands, or via Visual Studio projects on Windows* systems, produces executable files
-named tachyon.<<I>version</I>>.exe.  To run these executables directly, use one or more of the following commands.
+named <TT>tachyon.<<I>version</I>>.exe</TT>.  To run these executables directly, use one or more of the following commands.
 <DL>
-<DT><TT>tachyon.<<I>version</I>>.exe <<I>dataset</I>></TT>
-<DD>Run this version (release or debug), where <<I>dataset</I>> is the path/name of
-    one of the *.dat files in the <A HREF="dat">dat</A> directory for the example.
-<DT><TT>tachyon.<<I>version</I>>.exe -D <<I>dataset</I>></TT>
+<DT><TT>tachyon.<<I>version</I>> <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>tachyon.<<I>version</I>> [<I>dataset</I>=value] [<I>boundthresh</I>=value] [<I>no-display-updating</I>] [<I>nobounding</I>] [<I>silent</I>]</TT>
+<DT><TT>tachyon.<<I>version</I>> [<I>dataset</I> [<I>boundthresh</I>]] [<I>no-display-updating</I>] [<I>nobounding</I>] [<I>silent</I>]</TT> 
+<DD><I>dataset</I> is the path/name of one of the *.dat files in the <A HREF="dat">dat</A> directory for the example.<BR>
+    <I>boundthresh</I> is a bounding threshold value.<BR>
+    <I>no-display-updating</I> - disable run-time display updating.<BR>
+    <I>no-bounding</I> - disable bounding technique.<BR>
+    <I>silent</I> - no output except elapsed time.<BR>
+<DT><TT>tachyon.<<I>version</I>> [<I>dataset</I>] [<I>no-display-updating</I>]</TT>
 <DD>Run this version (release or debug), but run with disabled run-time display updating
     for use in making performance measurements
     <I>(strongly recommended when measuring performance or scalability; see note below)</I>.
-<DT>To run a short version of this example, e.g., for use with Intel® Threading Tools:
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector:
 <DD>Build a <I>debug</I> version of the <TT>tbb</TT> example with the GUI turned off
     (e.g., <TT>make UI=con tbb_debug</TT>; see also the build directions above).
-    <BR>Run it with a small dataset, e.g., <TT>tachyon.tbb.exe -D dat/820spheres.dat</TT>.
+    <BR>Run it with a small dataset, e.g., <TT>tachyon.tbb.exe dat/820spheres.dat no-display-updating</TT>.
 </DL>
 
 <H2>Notes</H2>
@@ -152,10 +160,9 @@ named tachyon.<<I>version</I>>.exe.  To run these executables directly, us
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 
diff --git a/examples/parallel_for/tachyon/msvs/tachyon.serial.vcproj b/examples/parallel_for/tachyon/msvs/tachyon.serial.vcproj
index a81953e..e100afc 100644
--- a/examples/parallel_for/tachyon/msvs/tachyon.serial.vcproj
+++ b/examples/parallel_for/tachyon/msvs/tachyon.serial.vcproj
@@ -20,8 +20,8 @@
 	<Configurations>
 		<Configuration
 			Name="Debug|Win32"
-			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
 			ConfigurationType="1"
 			CharacterSet="2"
 			>
@@ -68,7 +68,6 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="$(OutDir)tachyon.common.lib"
 				LinkIncremental="1"
 				GenerateDebugInformation="true"
 				SubSystem="2"
@@ -103,8 +102,8 @@
 		</Configuration>
 		<Configuration
 			Name="Debug|x64"
-			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
 			ConfigurationType="1"
 			CharacterSet="2"
 			>
@@ -150,7 +149,6 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="$(OutDir)tachyon.common.lib"
 				LinkIncremental="1"
 				GenerateDebugInformation="true"
 				SubSystem="2"
@@ -185,8 +183,8 @@
 		</Configuration>
 		<Configuration
 			Name="Release|Win32"
-			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
 			ConfigurationType="1"
 			CharacterSet="2"
 			WholeProgramOptimization="1"
@@ -232,7 +230,6 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="$(OutDir)tachyon.common.lib"
 				LinkIncremental="1"
 				GenerateDebugInformation="true"
 				SubSystem="2"
@@ -268,8 +265,8 @@
 		</Configuration>
 		<Configuration
 			Name="Release|x64"
-			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
 			ConfigurationType="1"
 			CharacterSet="2"
 			WholeProgramOptimization="1"
@@ -314,7 +311,6 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="$(OutDir)tachyon.common.lib"
 				LinkIncremental="1"
 				GenerateDebugInformation="true"
 				SubSystem="2"
@@ -349,9 +345,9 @@
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Release|Win32"
-			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+			Name="DDRelease|Win32"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
 			ConfigurationType="1"
 			CharacterSet="2"
 			WholeProgramOptimization="1"
@@ -397,7 +393,6 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="$(OutDir)tachyon.common.lib"
 				LinkIncremental="1"
 				AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x86"
 				GenerateDebugInformation="true"
@@ -433,9 +428,9 @@
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Release|x64"
-			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+			Name="DDRelease|x64"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
 			ConfigurationType="1"
 			CharacterSet="2"
 			WholeProgramOptimization="1"
@@ -480,7 +475,6 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="$(OutDir)tachyon.common.lib"
 				LinkIncremental="1"
 				AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x64"
 				GenerateDebugInformation="true"
@@ -516,9 +510,9 @@
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Debug|Win32"
-			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+			Name="DDDebug|Win32"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
 			ConfigurationType="1"
 			CharacterSet="2"
 			>
@@ -565,7 +559,6 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="$(OutDir)tachyon.common.lib"
 				LinkIncremental="1"
 				AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x86"
 				GenerateDebugInformation="true"
@@ -600,9 +593,9 @@
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Debug|x64"
-			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+			Name="DDDebug|x64"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\serial"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\serial"
 			ConfigurationType="1"
 			CharacterSet="2"
 			>
@@ -648,7 +641,6 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="$(OutDir)tachyon.common.lib"
 				LinkIncremental="1"
 				AdditionalLibraryDirectories="$(DXSDK_DIR)\lib\x64"
 				GenerateDebugInformation="true"
diff --git a/examples/parallel_for/tachyon/msvs/tachyon.tbb.vcproj b/examples/parallel_for/tachyon/msvs/tachyon.tbb.vcproj
index 96a2dda..1e104a2 100644
--- a/examples/parallel_for/tachyon/msvs/tachyon.tbb.vcproj
+++ b/examples/parallel_for/tachyon/msvs/tachyon.tbb.vcproj
@@ -20,8 +20,8 @@
 	<Configurations>
 		<Configuration
 			Name="Debug|Win32"
-			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
 			ConfigurationType="1"
 			CharacterSet="2"
 			>
@@ -47,7 +47,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
@@ -69,9 +69,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				LinkTimeCodeGeneration="1"
@@ -102,13 +102,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
 			Name="Debug|x64"
-			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
 			ConfigurationType="1"
 			CharacterSet="2"
 			>
@@ -135,7 +135,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
@@ -155,9 +155,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				LinkTimeCodeGeneration="1"
@@ -188,13 +188,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
 			Name="Release|Win32"
-			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
 			ConfigurationType="1"
 			CharacterSet="2"
 			WholeProgramOptimization="1"
@@ -220,7 +220,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="2"
@@ -241,9 +241,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -275,13 +275,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
 			Name="Release|x64"
-			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
 			ConfigurationType="1"
 			CharacterSet="2"
 			WholeProgramOptimization="1"
@@ -308,7 +308,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -327,9 +327,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -361,13 +361,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Release|Win32"
-			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+			Name="DDRelease|Win32"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
 			ConfigurationType="1"
 			CharacterSet="2"
 			WholeProgramOptimization="1"
@@ -393,7 +393,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="2"
@@ -414,9 +414,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -448,13 +448,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Release|x64"
-			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+			Name="DDRelease|x64"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
 			ConfigurationType="1"
 			CharacterSet="2"
 			WholeProgramOptimization="1"
@@ -481,7 +481,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -500,9 +500,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -534,13 +534,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Debug|Win32"
-			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+			Name="DDDebug|Win32"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
 			ConfigurationType="1"
 			CharacterSet="2"
 			>
@@ -566,7 +566,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
@@ -588,9 +588,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				LinkTimeCodeGeneration="1"
@@ -621,13 +621,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Debug|x64"
-			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+			Name="DDDebug|x64"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb"
 			ConfigurationType="1"
 			CharacterSet="2"
 			>
@@ -654,7 +654,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
@@ -674,9 +674,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				LinkTimeCodeGeneration="1"
@@ -707,7 +707,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcproj b/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcproj
index a16037e..d30edec 100644
--- a/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcproj
+++ b/examples/parallel_for/tachyon/msvs/tachyon.tbb1d.vcproj
@@ -20,8 +20,8 @@
 	<Configurations>
 		<Configuration
 			Name="Debug|Win32"
-			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
 			ConfigurationType="1"
 			CharacterSet="2"
 			>
@@ -47,7 +47,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
@@ -69,9 +69,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				LinkTimeCodeGeneration="1"
@@ -102,13 +102,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
 			Name="Debug|x64"
-			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
 			ConfigurationType="1"
 			CharacterSet="2"
 			>
@@ -135,7 +135,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
@@ -155,9 +155,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				LinkTimeCodeGeneration="1"
@@ -188,13 +188,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
 			Name="Release|Win32"
-			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
 			ConfigurationType="1"
 			CharacterSet="2"
 			WholeProgramOptimization="1"
@@ -220,7 +220,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="2"
@@ -241,9 +241,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -275,13 +275,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
 			Name="Release|x64"
-			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
 			ConfigurationType="1"
 			CharacterSet="2"
 			WholeProgramOptimization="1"
@@ -308,7 +308,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -327,9 +327,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -361,13 +361,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Release|Win32"
-			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+			Name="DDRelease|Win32"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
 			ConfigurationType="1"
 			CharacterSet="2"
 			WholeProgramOptimization="1"
@@ -393,7 +393,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;NDEBUG"
 				RuntimeLibrary="2"
 				EnableEnhancedInstructionSet="2"
@@ -414,9 +414,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -448,13 +448,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Release|x64"
-			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+			Name="DDRelease|x64"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
 			ConfigurationType="1"
 			CharacterSet="2"
 			WholeProgramOptimization="1"
@@ -481,7 +481,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;NDEBUG"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -500,9 +500,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -534,13 +534,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Debug|Win32"
-			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
+			Name="DDDebug|Win32"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
 			ConfigurationType="1"
 			CharacterSet="2"
 			>
@@ -566,7 +566,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN32;_WINDOWS;_DEBUG"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
@@ -588,9 +588,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				LinkTimeCodeGeneration="1"
@@ -621,13 +621,13 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Debug|x64"
-			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
-			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
+			Name="DDDebug|x64"
+			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)\tbb1d"
+			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)\tbb1d"
 			ConfigurationType="1"
 			CharacterSet="2"
 			>
@@ -654,7 +654,7 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE;WIN64;_WINDOWS;_DEBUG"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
@@ -674,9 +674,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_debug.lib $(OutDir)tachyon.common.lib"
+				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				LinkTimeCodeGeneration="1"
@@ -707,7 +707,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/parallel_for/tachyon/msvs/tachyon.vcproj b/examples/parallel_for/tachyon/msvs/tachyon.vcproj
index 8ea73b2..97da311 100644
--- a/examples/parallel_for/tachyon/msvs/tachyon.vcproj
+++ b/examples/parallel_for/tachyon/msvs/tachyon.vcproj
@@ -285,7 +285,7 @@
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Release|Win32"
+			Name="DDRelease|Win32"
 			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
 			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
 			ConfigurationType="4"
@@ -352,7 +352,7 @@
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Release|x64"
+			Name="DDRelease|x64"
 			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
 			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
 			ConfigurationType="4"
@@ -418,7 +418,7 @@
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Debug|Win32"
+			Name="DDDebug|Win32"
 			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
 			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
 			ConfigurationType="4"
@@ -487,7 +487,7 @@
 			/>
 		</Configuration>
 		<Configuration
-			Name="DD Debug|x64"
+			Name="DDDebug|x64"
 			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
 			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
 			ConfigurationType="4"
@@ -600,10 +600,6 @@
 				>
 			</File>
 			<File
-				RelativePath="..\src\getargs.cpp"
-				>
-			</File>
-			<File
 				RelativePath="..\src\global.cpp"
 				>
 			</File>
@@ -632,6 +628,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\src\main.cpp"
+				>
+			</File>
+			<File
 				RelativePath="..\src\objbound.cpp"
 				>
 			</File>
@@ -672,6 +672,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\src\tachyon_video.cpp"
+				>
+			</File>
+			<File
 				RelativePath="..\src\texture.cpp"
 				>
 			</File>
@@ -700,10 +704,6 @@
 				>
 			</File>
 			<File
-				RelativePath="..\src\video.cpp"
-				>
-			</File>
-			<File
 				RelativePath="..\src\vol.cpp"
 				>
 			</File>
@@ -746,10 +746,6 @@
 				>
 			</File>
 			<File
-				RelativePath="..\src\getargs.h"
-				>
-			</File>
-			<File
 				RelativePath="..\src\global.h"
 				>
 			</File>
@@ -830,6 +826,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\src\tachyon_video.h"
+				>
+			</File>
+			<File
 				RelativePath="..\src\texture.h"
 				>
 			</File>
@@ -862,10 +862,6 @@
 				>
 			</File>
 			<File
-				RelativePath="..\src\video.h"
-				>
-			</File>
-			<File
 				RelativePath="..\src\vol.h"
 				>
 			</File>
@@ -927,7 +923,7 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="DD Release|Win32"
+					Name="DDRelease|Win32"
 					>
 					<Tool
 						Name="VCCLCompilerTool"
@@ -936,7 +932,7 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="DD Release|x64"
+					Name="DDRelease|x64"
 					>
 					<Tool
 						Name="VCCLCompilerTool"
@@ -945,7 +941,7 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="DD Debug|Win32"
+					Name="DDDebug|Win32"
 					>
 					<Tool
 						Name="VCCLCompilerTool"
@@ -954,7 +950,7 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="DD Debug|x64"
+					Name="DDDebug|x64"
 					>
 					<Tool
 						Name="VCCLCompilerTool"
@@ -999,7 +995,7 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="DD Release|Win32"
+					Name="DDRelease|Win32"
 					ExcludedFromBuild="true"
 					>
 					<Tool
@@ -1007,7 +1003,7 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="DD Release|x64"
+					Name="DDRelease|x64"
 					ExcludedFromBuild="true"
 					>
 					<Tool
@@ -1015,7 +1011,7 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="DD Debug|Win32"
+					Name="DDDebug|Win32"
 					ExcludedFromBuild="true"
 					>
 					<Tool
@@ -1023,7 +1019,7 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="DD Debug|x64"
+					Name="DDDebug|x64"
 					ExcludedFromBuild="true"
 					>
 					<Tool
diff --git a/examples/parallel_for/tachyon/msvs/tachyon_cl.sln b/examples/parallel_for/tachyon/msvs/tachyon_cl.sln
index f298725..602c949 100644
--- a/examples/parallel_for/tachyon/msvs/tachyon_cl.sln
+++ b/examples/parallel_for/tachyon/msvs/tachyon_cl.sln
@@ -1,13 +1,13 @@
 Microsoft Visual Studio Solution File, Format Version 9.00
 # Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.tbb", "tachyon.tbb.vcproj", "{6E9B1702-78E0-4D64-B771-8B274D963B58}"
+EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.common", "tachyon.vcproj", "{924517DF-2B6A-47D5-8A11-CC247CC4D810}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.serial", "tachyon.serial.vcproj", "{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.tbb1d", "tachyon.tbb1d.vcproj", "{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tachyon.tbb", "tachyon.tbb.vcproj", "{6E9B1702-78E0-4D64-B771-8B274D963B58}"
-EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		DD Debug|Win32 = DD Debug|Win32
@@ -16,75 +16,75 @@ Global
 		DD Release|x64 = DD Release|x64
 		GDI Debug|Win32 = GDI Debug|Win32
 		GDI Debug|x64 = GDI Debug|x64
-		GDI Release|Win32 = GDI Release|Win32
-		GDI Release|x64 = GDI Release|x64
+		_GDI Release Release|Win32 = _GDI Release Release|Win32
+		_GDI Release Release|x64 = _GDI Release Release|x64
 		Description = Tachyon ray-tracer example
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.Build.0 = DD Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.Build.0 = DD Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.ActiveCfg = DD Release|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.Build.0 = DD Release|x64
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.Build.0 = DDDebug|Win32
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.ActiveCfg = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.Build.0 = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.Build.0 = DDRelease|Win32
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.ActiveCfg = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.Build.0 = Release|x64
 		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|Win32.ActiveCfg = Debug|Win32
 		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|Win32.Build.0 = Debug|Win32
 		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.ActiveCfg = Debug|x64
 		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.Build.0 = Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Release|Win32.Build.0 = Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Release|x64.ActiveCfg = Release|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Release|x64.Build.0 = Release|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.Build.0 = DD Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.Build.0 = DD Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.ActiveCfg = DD Release|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.Build.0 = DD Release|x64
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release Release|Win32.ActiveCfg = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release Release|Win32.Build.0 = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release Release|x64.ActiveCfg = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release Release|x64.Build.0 = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.Build.0 = DDDebug|Win32
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.ActiveCfg = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.Build.0 = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.Build.0 = DDRelease|Win32
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.ActiveCfg = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.Build.0 = Release|x64
 		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|Win32.ActiveCfg = Debug|Win32
 		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|Win32.Build.0 = Debug|Win32
 		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64
 		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Release|Win32.Build.0 = Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Release|x64.ActiveCfg = Release|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Release|x64.Build.0 = Release|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.Build.0 = DD Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.Build.0 = DD Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.ActiveCfg = DD Release|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.Build.0 = DD Release|x64
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release Release|Win32.ActiveCfg = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release Release|Win32.Build.0 = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release Release|x64.ActiveCfg = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release Release|x64.Build.0 = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.Build.0 = DDDebug|Win32
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.ActiveCfg = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.Build.0 = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.Build.0 = DDRelease|Win32
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.ActiveCfg = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.Build.0 = Release|x64
 		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|Win32.ActiveCfg = Debug|Win32
 		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|Win32.Build.0 = Debug|Win32
 		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64
 		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Release|Win32.Build.0 = Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Release|x64.ActiveCfg = Release|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Release|x64.Build.0 = Release|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.Build.0 = DD Debug|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.Build.0 = DD Release|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.ActiveCfg = DD Release|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.Build.0 = DD Release|x64
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release Release|Win32.ActiveCfg = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release Release|Win32.Build.0 = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release Release|x64.ActiveCfg = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release Release|x64.Build.0 = Release|x64
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.Build.0 = DDDebug|Win32
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.ActiveCfg = Debug|x64
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.Build.0 = Debug|x64
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.Build.0 = DDRelease|Win32
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.ActiveCfg = Release|x64
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.Build.0 = Release|x64
 		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.ActiveCfg = Debug|Win32
 		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.Build.0 = Debug|Win32
 		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.ActiveCfg = Debug|x64
 		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.Build.0 = Debug|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Release|Win32.Build.0 = Release|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Release|x64.ActiveCfg = Release|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Release|x64.Build.0 = Release|x64
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release Release|Win32.ActiveCfg = Release|Win32
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release Release|Win32.Build.0 = Release|Win32
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release Release|x64.ActiveCfg = Release|x64
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/examples/parallel_for/tachyon/msvs/tachyon_icl.sln b/examples/parallel_for/tachyon/msvs/tachyon_icl.sln
index 76e3a54..3f2ae66 100644
--- a/examples/parallel_for/tachyon/msvs/tachyon_icl.sln
+++ b/examples/parallel_for/tachyon/msvs/tachyon_icl.sln
@@ -1,12 +1,21 @@
 Microsoft Visual Studio Solution File, Format Version 9.00
 # Visual Studio 2005
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "tachyon.tbb", "tachyon.tbb.icproj", "{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}"
+	ProjectSection(ProjectDependencies) = postProject
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830} = {5F685DBD-9A04-4E94-A1CA-FC48FE799830}
+	EndProjectSection
+EndProject
 Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "tachyon.common", "tachyon.icproj", "{5F685DBD-9A04-4E94-A1CA-FC48FE799830}"
 EndProject
 Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "tachyon.serial", "tachyon.serial.icproj", "{E085A8DB-75D4-4927-9631-6368E6D0EE72}"
+	ProjectSection(ProjectDependencies) = postProject
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830} = {5F685DBD-9A04-4E94-A1CA-FC48FE799830}
+	EndProjectSection
 EndProject
 Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "tachyon.tbb1d", "tachyon.tbb1d.icproj", "{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}"
-EndProject
-Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "tachyon.tbb", "tachyon.tbb.icproj", "{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}"
+	ProjectSection(ProjectDependencies) = postProject
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830} = {5F685DBD-9A04-4E94-A1CA-FC48FE799830}
+	EndProjectSection
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -16,139 +25,123 @@ Global
 		DD Release|x64 = DD Release|x64
 		GDI Debug|Win32 = GDI Debug|Win32
 		GDI Debug|x64 = GDI Debug|x64
-		GDI Release|Win32 = GDI Release|Win32
-		GDI Release|x64 = GDI Release|x64
+		_GDI Release|Win32 = _GDI Release|Win32
+		_GDI Release|x64 = _GDI Release|x64
 		Description = Tachyon ray-tracer example
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
-		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|x64.Build.0 = DD Debug|x64
-		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|Win32.Build.0 = DD Release|Win32
-		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|x64.ActiveCfg = DD Release|x64
-		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|x64.Build.0 = DD Release|x64
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|Win32.Build.0 = DDDebug|Win32
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|x64.ActiveCfg = DDDebug|x64
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|x64.Build.0 = DDDebug|x64
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|Win32.Build.0 = DDRelease|Win32
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|x64.ActiveCfg = DDRelease|x64
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|x64.Build.0 = DDRelease|x64
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|Win32.Build.0 = Debug|Win32
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|x64.ActiveCfg = Debug|x64
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|x64.Build.0 = Debug|x64
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}._GDI Release|Win32.ActiveCfg = Release|Win32
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}._GDI Release|Win32.Build.0 = Release|Win32
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}._GDI Release|x64.ActiveCfg = Release|x64
+		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}._GDI Release|x64.Build.0 = Release|x64
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|Win32.Build.0 = DDDebug|Win32
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|x64.ActiveCfg = DDDebug|x64
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Debug|x64.Build.0 = DDDebug|x64
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|Win32.Build.0 = DDRelease|Win32
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|x64.ActiveCfg = DDRelease|x64
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.DD Release|x64.Build.0 = DDRelease|x64
 		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Debug|Win32.ActiveCfg = Debug|Win32
 		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Debug|Win32.Build.0 = Debug|Win32
 		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Debug|x64.ActiveCfg = Debug|x64
 		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Debug|x64.Build.0 = Debug|x64
-		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Release|Win32.Build.0 = Release|Win32
-		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Release|x64.ActiveCfg = Release|x64
-		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}.GDI Release|x64.Build.0 = Release|x64
-		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
-		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|x64.Build.0 = DD Debug|x64
-		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|Win32.Build.0 = DD Release|Win32
-		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|x64.ActiveCfg = DD Release|x64
-		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|x64.Build.0 = DD Release|x64
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}._GDI Release|Win32.ActiveCfg = Release|Win32
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}._GDI Release|Win32.Build.0 = Release|Win32
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}._GDI Release|x64.ActiveCfg = Release|x64
+		{5F685DBD-9A04-4E94-A1CA-FC48FE799830}._GDI Release|x64.Build.0 = Release|x64
+		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|Win32.Build.0 = DDDebug|Win32
+		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|x64.ActiveCfg = DDDebug|x64
+		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Debug|x64.Build.0 = DDDebug|x64
+		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|Win32.Build.0 = DDRelease|Win32
+		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|x64.ActiveCfg = DDRelease|x64
+		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.DD Release|x64.Build.0 = DDRelease|x64
 		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Debug|Win32.ActiveCfg = Debug|Win32
 		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Debug|Win32.Build.0 = Debug|Win32
 		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Debug|x64.ActiveCfg = Debug|x64
 		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Debug|x64.Build.0 = Debug|x64
-		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Release|Win32.Build.0 = Release|Win32
-		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Release|x64.ActiveCfg = Release|x64
-		{E085A8DB-75D4-4927-9631-6368E6D0EE72}.GDI Release|x64.Build.0 = Release|x64
-		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
-		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|x64.Build.0 = DD Debug|x64
-		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|Win32.Build.0 = DD Release|Win32
-		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|x64.ActiveCfg = DD Release|x64
-		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|x64.Build.0 = DD Release|x64
+		{E085A8DB-75D4-4927-9631-6368E6D0EE72}._GDI Release|Win32.ActiveCfg = Release|Win32
+		{E085A8DB-75D4-4927-9631-6368E6D0EE72}._GDI Release|Win32.Build.0 = Release|Win32
+		{E085A8DB-75D4-4927-9631-6368E6D0EE72}._GDI Release|x64.ActiveCfg = Release|x64
+		{E085A8DB-75D4-4927-9631-6368E6D0EE72}._GDI Release|x64.Build.0 = Release|x64
+		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|Win32.Build.0 = DDDebug|Win32
+		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|x64.ActiveCfg = DDDebug|x64
+		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Debug|x64.Build.0 = DDDebug|x64
+		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|Win32.Build.0 = DDRelease|Win32
+		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|x64.ActiveCfg = DDRelease|x64
+		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.DD Release|x64.Build.0 = DDRelease|x64
 		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Debug|Win32.ActiveCfg = Debug|Win32
 		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Debug|Win32.Build.0 = Debug|Win32
 		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Debug|x64.ActiveCfg = Debug|x64
 		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Debug|x64.Build.0 = Debug|x64
-		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Release|Win32.Build.0 = Release|Win32
-		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Release|x64.ActiveCfg = Release|x64
-		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}.GDI Release|x64.Build.0 = Release|x64
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Debug|x64.Build.0 = DD Debug|x64
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|Win32.Build.0 = DD Release|Win32
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|x64.ActiveCfg = DD Release|x64
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.DD Release|x64.Build.0 = DD Release|x64
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|Win32.ActiveCfg = Debug|Win32
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|Win32.Build.0 = Debug|Win32
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|x64.ActiveCfg = Debug|x64
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Debug|x64.Build.0 = Debug|x64
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Release|Win32.Build.0 = Release|Win32
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Release|x64.ActiveCfg = Release|x64
-		{2D08E05F-D0E0-48A7-9597-28B95ACE70B6}.GDI Release|x64.Build.0 = Release|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Release|x64.Build.0 = Release|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Release|x64.ActiveCfg = Release|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Release|Win32.Build.0 = Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.Build.0 = Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.ActiveCfg = Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|Win32.Build.0 = Debug|Win32
+		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}._GDI Release|Win32.ActiveCfg = Release|Win32
+		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}._GDI Release|Win32.Build.0 = Release|Win32
+		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}._GDI Release|x64.ActiveCfg = Release|x64
+		{4F173D3A-AE8C-4F7E-A4D0-6527F46B8495}._GDI Release|x64.Build.0 = Release|x64
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.ActiveCfg = Debug|Win32
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.ActiveCfg = Debug|x64
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.ActiveCfg = Release|Win32
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.ActiveCfg = Release|x64
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.ActiveCfg = Debug|Win32
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.Build.0 = Debug|Win32
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.ActiveCfg = Debug|x64
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.Build.0 = Debug|x64
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|Win32.ActiveCfg = Release|Win32
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|Win32.Build.0 = Release|Win32
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|x64.ActiveCfg = Release|x64
+		{6E9B1702-78E0-4D64-B771-8B274D963B58}._GDI Release|x64.Build.0 = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.ActiveCfg = Debug|Win32
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.ActiveCfg = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.ActiveCfg = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.ActiveCfg = Release|x64
 		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|Win32.ActiveCfg = Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.Build.0 = DD Release|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|x64.ActiveCfg = DD Release|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.Build.0 = DD Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.Build.0 = DD Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Release|x64.Build.0 = Release|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Release|x64.ActiveCfg = Release|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Release|Win32.Build.0 = Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|Win32.Build.0 = Debug|Win32
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|Win32.Build.0 = Debug|Win32
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.ActiveCfg = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}.GDI Debug|x64.Build.0 = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|Win32.ActiveCfg = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|Win32.Build.0 = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|x64.ActiveCfg = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC247CC4D810}._GDI Release|x64.Build.0 = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.ActiveCfg = Debug|Win32
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.ActiveCfg = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.ActiveCfg = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.ActiveCfg = Release|x64
 		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|Win32.ActiveCfg = Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.Build.0 = DD Release|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|x64.ActiveCfg = DD Release|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.Build.0 = DD Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.Build.0 = DD Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Release|x64.Build.0 = Release|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Release|x64.ActiveCfg = Release|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Release|Win32.Build.0 = Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|Win32.Build.0 = Debug|Win32
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|Win32.Build.0 = Debug|Win32
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|Win32.ActiveCfg = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|Win32.Build.0 = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|x64.ActiveCfg = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC047CC4D8E9}._GDI Release|x64.Build.0 = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.ActiveCfg = Debug|Win32
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.ActiveCfg = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.ActiveCfg = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.ActiveCfg = Release|x64
 		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|Win32.ActiveCfg = Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.Build.0 = DD Release|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|x64.ActiveCfg = DD Release|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.Build.0 = DD Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.Build.0 = DD Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Release|x64.Build.0 = Release|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Release|x64.ActiveCfg = Release|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Release|Win32.Build.0 = Release|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.Build.0 = Debug|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|x64.ActiveCfg = Debug|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.Build.0 = Debug|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.GDI Debug|Win32.ActiveCfg = Debug|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.Build.0 = DD Release|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|x64.ActiveCfg = DD Release|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.Build.0 = DD Release|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Release|Win32.ActiveCfg = DD Release|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.Build.0 = DD Debug|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|x64.ActiveCfg = DD Debug|x64
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.Build.0 = DD Debug|Win32
-		{6E9B1702-78E0-4D64-B771-8B274D963B58}.DD Debug|Win32.ActiveCfg = DD Debug|Win32
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|Win32.Build.0 = Debug|Win32
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.ActiveCfg = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}.GDI Debug|x64.Build.0 = Debug|x64
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|Win32.ActiveCfg = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|Win32.Build.0 = Release|Win32
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|x64.ActiveCfg = Release|x64
+		{924517DF-2B6A-47D5-8A11-CC347CC4D8E9}._GDI Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/examples/parallel_for/tachyon/src/api.cpp b/examples/parallel_for/tachyon/src/api.cpp
index 127d019..e59b5fb 100644
--- a/examples/parallel_for/tachyon/src/api.cpp
+++ b/examples/parallel_for/tachyon/src/api.cpp
@@ -87,7 +87,7 @@
 #include "imap.h"
 #include "global.h"
 
-#include "video.h"
+#include "tachyon_video.h"
 
 typedef void * SceneHandle;
 #include "api.h"
@@ -113,7 +113,7 @@ color rt_color(apiflt r, apiflt g, apiflt b) {
   return c;
 }
 
-void rt_initialize(int * argc, char ***argv) {
+void rt_initialize() {
   rpcmsg msg;
 
   reset_object();
diff --git a/examples/parallel_for/tachyon/src/api.h b/examples/parallel_for/tachyon/src/api.h
index 8bed972..f68068c 100644
--- a/examples/parallel_for/tachyon/src/api.h
+++ b/examples/parallel_for/tachyon/src/api.h
@@ -122,7 +122,7 @@ typedef struct {
 vector rt_vector(apiflt x, apiflt y, apiflt z); /* helper to make vectors */
 color  rt_color(apiflt r, apiflt g, apiflt b);  /* helper to make colors */
 
-void rt_initialize(int *, char ***);/* reset raytracer, memory deallocation */
+void rt_initialize();/* reset raytracer, memory deallocation */
 void rt_finalize(void); /* close down for good.. */
 
 SceneHandle rt_newscene(void);        /* allocate new scene */
diff --git a/examples/parallel_for/tachyon/src/getargs.cpp b/examples/parallel_for/tachyon/src/getargs.cpp
deleted file mode 100644
index 16379ad..0000000
--- a/examples/parallel_for/tachyon/src/getargs.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
-    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
-
-    This file is part of Threading Building Blocks.
-
-    Threading Building Blocks is free software; you can redistribute it
-    and/or modify it under the terms of the GNU General Public License
-    version 2 as published by the Free Software Foundation.
-
-    Threading Building Blocks is distributed in the hope that it will be
-    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Threading Building Blocks; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-    As a special exception, you may use this file as part of a free software
-    library without restriction.  Specifically, if other files instantiate
-    templates or use macros or inline functions from this file, or you compile
-    this file and link it with other files to produce an executable, this
-    file does not by itself cause the resulting executable to be covered by
-    the GNU General Public License.  This exception does not however
-    invalidate any other reasons why the executable file might be covered by
-    the GNU General Public License.
-*/
-
-/*
-    The original source for this example is
-    Copyright (c) 1994-2008 John E. Stone
-    All rights reserved.
-
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions
-    are met:
-    1. Redistributions of source code must retain the above copyright
-       notice, this list of conditions and the following disclaimer.
-    2. Redistributions in binary form must reproduce the above copyright
-       notice, this list of conditions and the following disclaimer in the
-       documentation and/or other materials provided with the distribution.
-    3. The name of the author may not be used to endorse or promote products
-       derived from this software without specific prior written permission.
-
-    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
-    OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-    ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-    SUCH DAMAGE.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "types.h"
-#include "api.h"
-#include "getargs.h"
-
-void printusage(char **argv) {
-  fprintf(stderr, "Usage: \n");
-  fprintf(stderr, "  %s modelfile [options] \n", argv[0]);
-  fprintf(stderr, "\n");
-  fprintf(stderr, "Model file formats supported:\n");
-  fprintf(stderr, "  filename.dat -- The model files originated with this package.\n");
-  fprintf(stderr, "  filaname.ac  -- AC3D model files.\n");
-  fprintf(stderr, "  filename.nff -- The NFF scene format used by Eric Haines' SPD.\n");
-  fprintf(stderr, "\n");
-  fprintf(stderr, "Valid options:  (** denotes default behaviour)\n");
-  fprintf(stderr, " +D enable run-time display updating (if build supports it) **\n");
-  fprintf(stderr, " -D disable run-time display updating\n");
-  fprintf(stderr, " -nobounding\n");
-  fprintf(stderr, " -boundthresh XXX  (** default threshold is 25)\n");
-  fprintf(stderr, "\n");
-}
-
-void initoptions(argoptions * opt) {
-  memset(opt, 0, sizeof(argoptions));
-  opt->foundfilename = -1;
-  opt->useoutfilename = -1;
-  opt->verbosemode = -1;
-  opt->antialiasing = -1;
-  opt->displaymode = -1;
-  opt->boundmode = -1; 
-  opt->boundthresh = -1; 
-  opt->usecamfile = -1;
-}
-
-int useoptions(argoptions * opt, SceneHandle scene) {
-  if (opt->useoutfilename == 1) {
-    rt_outputfile(scene, opt->outfilename);
-  }
-
-  if (opt->verbosemode == 1) {
-    rt_verbose(scene, 1);
-  }
-
-  if (opt->antialiasing != -1) {
-    /* need new api code for this */
-  } 
-
-  if (opt->displaymode != -1) {
-    rt_displaymode(scene, opt->displaymode);
-  }
-
-  if (opt->boundmode != -1) {
-    rt_boundmode(scene, opt->boundmode);
-  }
-
-  if (opt->boundthresh != -1) {
-    rt_boundthresh(scene, opt->boundthresh);
-  }
-
-  return 0;
-}    
-
-int getparm(int argc, char **argv, int num, argoptions * opt) {
-  if (!strcmp(argv[num], "+D")) {
-    /* turn video on */
-    opt->displaymode = RT_DISPLAY_ENABLED;
-    return 1;
-  }
-  if (!strcmp(argv[num], "-D")) {
-    /* turn video off */
-    opt->displaymode = RT_DISPLAY_DISABLED;
-    return 1;
-  }
-  if (!strcmp(argv[num], "-nobounding")) {
-    /* disable automatic spatial subdivision optimizations */
-    opt->boundmode = RT_BOUNDING_DISABLED;
-    return 1;
-  }
-  if (!strcmp(argv[num], "-boundthresh")) {
-    /* set automatic bounding threshold control value */
-    sscanf(argv[num + 1], "%d", &opt->boundthresh);
-    return 2;
-  }
-
-  /* unknown parameter setting */
-  fprintf(stderr, "Unrecognized parameter/option flag: %s\n", argv[num]);
-  return -1;
-}
-
-int getargs(int argc, char **argv, argoptions * opt) {
-  int i, rc, unknowncnt;
-
-  if (opt == NULL)
-    return -1;
-
-  initoptions(opt);  
-
-  if (argc < 2) {
-    printusage(argv);
-#ifndef DEFAULT_MODELFILE
-    return -1;
-#else
-    return 0;
-#endif//DEFAULT_MODELFILE
-  }
-
-  i = 1;
-  unknowncnt = 0;
-  while (i < argc) {
-    if (argv[i][0] == '-' || argv[i][0] == '+') {
-      rc = getparm(argc, argv, i, opt);
-      if (rc != -1) {
-        i += rc;
-      }
-      else {
-        printusage(argv);
-        return -1;
-      }
-    }
-    else {
-      unknowncnt++;
-      if (unknowncnt > 1) {
-        fprintf(stderr, "Too many model file names found!\n");
-        printusage(argv); 
-        return -1;
-      } 
-      else {
-        strcpy(opt->filename, argv[i]);        
-        opt->foundfilename = 1;
-        i++;
-      }
-    }
-  }
-
-  if (opt->foundfilename == -1) {
-    fprintf(stderr, "Missing model file name!\n");
-    printusage(argv);
-    return -1;
-  }
-
-  return 0;
-}
-
-
-
diff --git a/examples/parallel_for/tachyon/src/grid.cpp b/examples/parallel_for/tachyon/src/grid.cpp
index c614975..1d733d3 100644
--- a/examples/parallel_for/tachyon/src/grid.cpp
+++ b/examples/parallel_for/tachyon/src/grid.cpp
@@ -88,6 +88,8 @@ static object_methods grid_methods = {
   grid_free 
 };
 
+extern bool silent_mode;
+
 object * newgrid(int xsize, int ysize, int zsize, vector min, vector max) {
   grid * g;
 
@@ -283,7 +285,8 @@ int engrid_scene(object ** list) {
 
   numobj = countobj(*list);
 
-fprintf(stderr, "Scene contains %d bounded objects.\n", numobj);
+  if ( !silent_mode )
+    fprintf(stderr, "Scene contains %d bounded objects.\n", numobj);
 
   if (numobj > 16) {
     numcbrt = (int) cbrt(4*numobj);
@@ -635,7 +638,7 @@ static void voxel_intersect(grid * g, ray * ry, int voxindex) {
   }
 }
 
-static int grid_bounds_intersect(grid * g, ray * ry, flt *near, flt *far) {
+static int grid_bounds_intersect(grid * g, ray * ry, flt *nr, flt *fr) {
   flt a, tx1, tx2, ty1, ty2, tz1, tz2;
   flt tnear, tfar;
 
@@ -681,7 +684,7 @@ static int grid_bounds_intersect(grid * g, ray * ry, flt *near, flt *far) {
   if (tnear > tfar) return 0;
   if (tfar < 0.0) return 0;
 
-  *near = tnear;
-  *far = tfar; 
+  *nr = tnear;
+  *fr = tfar; 
   return 1;
 }
diff --git a/examples/parallel_for/tachyon/src/video.cpp b/examples/parallel_for/tachyon/src/main.cpp
similarity index 54%
rename from examples/parallel_for/tachyon/src/video.cpp
rename to examples/parallel_for/tachyon/src/main.cpp
index 113c1b1..54b1a01 100644
--- a/examples/parallel_for/tachyon/src/video.cpp
+++ b/examples/parallel_for/tachyon/src/main.cpp
@@ -55,12 +55,6 @@
     SUCH DAMAGE.
 */
 
-/*
- * video.c - routines for putting pixels on a screen if one is available.
- *
- *  $Id: video.cpp,v 1.20 2007-02-28 18:35:22 amalakho Exp $
- */
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -68,21 +62,39 @@
 #define VIDEO_WINMAIN_ARGS
 #include "types.h"
 #include "api.h"       /* The ray tracing library API */
-#include "getargs.h"   /* command line argument/option parsing */
 #include "parse.h"     /* Support for my own file format */
 #include "ui.h"
 #include "util.h"
-#include "video.h"
+#include "tachyon_video.h"
+#include "../../../common/utility/utility.h"
 
-static SceneHandle global_scene;
-static int global_xsize;     /*  size of graphic image rendered in window (from hres, vres)  */
-static int global_ysize;
-static int global_xwinsize;  /*  size of window (may be larger than above)  */
-static int global_ywinsize;
-static char *global_window_title;
-static bool global_usegraphics;
+SceneHandle global_scene;
+int global_xsize;     /*  size of graphic image rendered in window (from hres, vres)  */
+int global_ysize;
+int global_xwinsize;  /*  size of window (may be larger than above)  */
+int global_ywinsize;
+char *global_window_title;
+bool global_usegraphics;
 
-static char *window_title_string (int argc, char **argv)
+bool silent_mode = false; /* silent mode */
+
+class video *video = 0;
+
+typedef struct {
+  int foundfilename;      /* was a model file name found in the args? */
+  char filename[1024];    /* model file to render */
+  int useoutfilename;     /* command line override of output filename */
+  char outfilename[1024]; /* name of output image file */
+  int verbosemode;        /* verbose flags */
+  int antialiasing;       /* antialiasing setting */
+  int displaymode;        /* display mode */
+  int boundmode;          /* bounding mode */
+  int boundthresh;        /* bounding threshold */
+  int usecamfile;         /* use camera file */
+  char camfilename[1024]; /* camera filename */
+} argoptions;
+
+static char *window_title_string (int argc, const char **argv)
 {
     int i;
     char *name;
@@ -102,24 +114,92 @@ static char *window_title_string (int argc, char **argv)
     return name;
 }
 
-static int main_init_parts (int argc, char **argv)
-{
-    int rc;
+void rt_finalize(void) {
+    timer t0, t1;
+    t0 = gettimer();
+    if(global_usegraphics)
+        do { rt_sleep(10); t1 = gettimer(); }
+        while(timertime(t0, t1) < 10 && video->next_frame());
+#ifdef _WINDOWS
+    else rt_sleep(10000);
+#endif
+}
+
+void initoptions(argoptions * opt) {
+    memset(opt, 0, sizeof(argoptions));
+    opt->foundfilename = -1;
+    opt->useoutfilename = -1;
+    opt->verbosemode = -1;
+    opt->antialiasing = -1;
+    opt->displaymode = -1;
+    opt->boundmode = -1; 
+    opt->boundthresh = -1; 
+    opt->usecamfile = -1;
+}
+
+int useoptions(argoptions * opt, SceneHandle scene) {
+  if (opt->useoutfilename == 1) {
+    rt_outputfile(scene, opt->outfilename);
+  }
+
+  if (opt->verbosemode == 1) {
+    rt_verbose(scene, 1);
+  }
+
+  if (opt->antialiasing != -1) {
+    /* need new api code for this */
+  } 
+
+  if (opt->displaymode != -1) {
+    rt_displaymode(scene, opt->displaymode);
+  }
+
+  if (opt->boundmode != -1) {
+    rt_boundmode(scene, opt->boundmode);
+  }
+
+  if (opt->boundthresh != -1) {
+    rt_boundthresh(scene, opt->boundthresh);
+  }
+
+  return 0;
+}    
+
+argoptions ParseCommandLine(int argc, const char *argv[]) {
     argoptions opt;
-    char * filename;
 
-    global_window_title = window_title_string (argc, argv);
+    initoptions(&opt);
 
-    global_scene = rt_newscene();
+    bool nobounding = false;
+    bool nodisp = false;
 
-    rt_initialize(&argc, &argv);
+    string filename;
 
-    if ((rc = getargs(argc, argv, &opt)) == -1) {
-#if _WIN32||_WIN64
-        rt_sleep(10000);
-#endif
-        exit(rc);
-    }
+    utility::parse_cli_arguments(argc,argv,
+        utility::cli_argument_pack()
+        .positional_arg(filename,"dataset", "Model file")
+        .positional_arg(opt.boundthresh,"boundthresh","bounding threshold value")
+        .arg(nodisp,"no-display-updating","disable run-time display updating")
+        .arg(nobounding,"no-bounding","disable bounding technique")
+        .arg(silent_mode,"silent","no output except elapsed time")
+    );
+
+    strcpy(opt.filename, filename.c_str());
+
+    opt.displaymode = nodisp ? RT_DISPLAY_DISABLED : RT_DISPLAY_ENABLED;
+    opt.boundmode = nobounding ? RT_BOUNDING_DISABLED : RT_BOUNDING_ENABLED;
+
+    return opt;
+}
+
+int CreateScene(argoptions &opt) {
+    char *filename;
+
+    global_scene = rt_newscene();
+    rt_initialize();
+
+    /* process command line overrides */
+    useoptions(&opt, global_scene);
 
 #ifdef DEFAULT_MODELFILE
 #if  _WIN32||_WIN64
@@ -134,18 +214,13 @@ static int main_init_parts (int argc, char **argv)
 #endif//DEFAULT_MODELFILE
         filename = opt.filename;
 
-    rc = readmodel(filename, global_scene);
-
-    if (rc != 0) {
+    if ( readmodel(filename, global_scene) != 0 ) {
         fprintf(stderr, "Parser returned a non-zero error code reading %s\n", filename);
         fprintf(stderr, "Aborting Render...\n");
         rt_finalize();
         return -1;
     }
 
-    /* process command line overrides */
-    useoptions(&opt, global_scene);
-
     // need these early for create_graphics_window() so grab these here...
     scenedef *scene = (scenedef *) global_scene;
     global_xsize = scene->hres;
@@ -157,60 +232,36 @@ static int main_init_parts (int argc, char **argv)
     return 0;
 }
 
-class tachyon_video : public video
-{
-    void on_process()
-    {
-        char buf[128];
-        flt runtime;
-        timerstart();
-        rt_renderscene(global_scene);
-        timerstop();
-        runtime=timertime();
-        sprintf(buf, "\nCPU Time: %.3f seconds.", runtime);
-        rt_ui_message(MSG_0, buf); buf[0] = ' ';
-        strcat(global_window_title, buf);
-        title = global_window_title; updating = true;
-        show_title();
-        rt_finalize();
-    }
-    void on_key(int key) {
-        key &= 0xff; if(key == 27) running = false;
-    }
-};
-class video *video = 0;
+int main (int argc, char *argv[]) {
+    try {
+        timer mainStartTime = gettimer();
 
-void rt_finalize(void) {
-    timerstart();
-    if(global_usegraphics)
-        do { rt_sleep(10); timerstop(); }
-        while(timertime() < 10 && video->next_frame());
-#ifdef _WINDOWS
-    else rt_sleep(10000);
-#endif
-}
+        global_window_title = window_title_string (argc, (const char**)argv);
 
-int main (int argc, char **argv)
-{
-    int rc;
+        argoptions opt = ParseCommandLine(argc, (const char**)argv);
 
-    tachyon_video tachyon;
-    tachyon.threaded = true;
-    tachyon.init_console();
+        if ( CreateScene(opt) != 0 )
+            return -1;
 
-    rc = main_init_parts (argc, argv);
-    if (rc) return rc;
+        tachyon_video tachyon;
+        tachyon.threaded = true;
+        tachyon.init_console();
 
-    tachyon.title = global_window_title;
-    tachyon.updating = global_usegraphics;
-    // always using window even if(!global_usegraphics)
-    global_usegraphics = 
-        tachyon.init_window(global_xwinsize, global_ywinsize);
-    if(!tachyon.running)
-        return -1;
+        tachyon.title = global_window_title;
+        tachyon.updating = global_usegraphics;
+        // always using window even if(!global_usegraphics)
+        global_usegraphics = 
+            tachyon.init_window(global_xwinsize, global_ywinsize);
+        if(!tachyon.running)
+            return -1;
 
-    video = &tachyon;
-    tachyon.main_loop();
+        video = &tachyon;
+        tachyon.main_loop();
 
-    return 0;
+        utility::report_elapsed_time(timertime(mainStartTime, gettimer()));
+        return 0;
+    } catch ( std::exception& e ) {
+        std::cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+        return 1;
+    }
 }
diff --git a/examples/parallel_for/tachyon/src/render.cpp b/examples/parallel_for/tachyon/src/render.cpp
index 0f15846..a1c2bd8 100644
--- a/examples/parallel_for/tachyon/src/render.cpp
+++ b/examples/parallel_for/tachyon/src/render.cpp
@@ -71,7 +71,7 @@
 #include "light.h"
 #include "global.h"
 #include "ui.h"
-#include "video.h"
+#include "tachyon_video.h"
 #include "objbound.h"
 #include "grid.h"
 
@@ -96,8 +96,6 @@ void renderscene(scenedef scene) {
   outfile = opentgafile(scene.outfilename);
   */
 
-  timerstart();
-
   trace_region (scene, 0/*outfile*/, 0, 0, scene.hres, scene.vres);
   //fclose((FILE *)outfile);
 } /* end of renderscene() */
diff --git a/examples/parallel_for/tachyon/src/getargs.h b/examples/parallel_for/tachyon/src/tachyon_video.cpp
similarity index 77%
rename from examples/parallel_for/tachyon/src/getargs.h
rename to examples/parallel_for/tachyon/src/tachyon_video.cpp
index bcf5d7f..f04923a 100644
--- a/examples/parallel_for/tachyon/src/getargs.h
+++ b/examples/parallel_for/tachyon/src/tachyon_video.cpp
@@ -55,20 +55,35 @@
     SUCH DAMAGE.
 */
 
-typedef struct {
-  int foundfilename;      /* was a model file name found in the args? */
-  char filename[1024];    /* model file to render */
-  int useoutfilename;     /* command line override of output filename */
-  char outfilename[1024]; /* name of output image file */
-  int verbosemode;        /* verbose flags */
-  int antialiasing;       /* antialiasing setting */
-  int displaymode;        /* display mode */
-  int boundmode;          /* bounding mode */
-  int boundthresh;        /* bounding threshold */
-  int usecamfile;         /* use camera file */
-  char camfilename[1024]; /* camera filename */
-} argoptions;
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 
+#include "types.h"
+#include "api.h"       /* The ray tracing library API */
+#include "ui.h"
+#include "util.h"
+#include "tachyon_video.h"
 
-int getargs(int argc, char **argv, argoptions * opt);
-int useoptions(argoptions * opt, SceneHandle scene);
+extern SceneHandle global_scene;
+extern char *global_window_title;
+extern bool global_usegraphics;
+
+void tachyon_video::on_process() {
+    char buf[128];
+    flt runtime;
+    timer start_timer = gettimer();
+    rt_renderscene(global_scene);
+    timer end_timer = gettimer();
+    runtime=timertime(start_timer, end_timer);
+    sprintf(buf, "\nCPU Time: %.3f seconds.", runtime);
+    rt_ui_message(MSG_0, buf); buf[0] = ' ';
+    strcat(global_window_title, buf);
+    title = global_window_title; updating = true;
+    show_title();
+    rt_finalize();
+}
+
+void tachyon_video::on_key(int key) {
+    key &= 0xff; if(key == 27) running = false;
+}
diff --git a/examples/parallel_for/tachyon/src/video.h b/examples/parallel_for/tachyon/src/tachyon_video.h
similarity index 97%
rename from examples/parallel_for/tachyon/src/video.h
rename to examples/parallel_for/tachyon/src/tachyon_video.h
index 67a721c..94370ac 100644
--- a/examples/parallel_for/tachyon/src/video.h
+++ b/examples/parallel_for/tachyon/src/tachyon_video.h
@@ -57,3 +57,9 @@
 
 #include "../../../common/gui/video.h"
 extern class video *video;
+
+class tachyon_video : public video
+{
+    void on_process();
+    void on_key(int key);
+};
diff --git a/examples/parallel_for/tachyon/src/trace.serial.cpp b/examples/parallel_for/tachyon/src/trace.serial.cpp
index bb3f743..e4ffb47 100644
--- a/examples/parallel_for/tachyon/src/trace.serial.cpp
+++ b/examples/parallel_for/tachyon/src/trace.serial.cpp
@@ -68,7 +68,7 @@
 #include "intersect.h"
 #include "global.h"
 #include "ui.h"
-#include "video.h"
+#include "tachyon_video.h"
 
 // shared but read-only so could be private too
 static thr_parms *all_parms;
diff --git a/examples/parallel_for/tachyon/src/trace.tbb.cpp b/examples/parallel_for/tachyon/src/trace.tbb.cpp
index e3f832b..dab32f3 100644
--- a/examples/parallel_for/tachyon/src/trace.tbb.cpp
+++ b/examples/parallel_for/tachyon/src/trace.tbb.cpp
@@ -68,7 +68,7 @@
 #include "intersect.h"
 #include "global.h"
 #include "ui.h"
-#include "video.h"
+#include "tachyon_video.h"
 
 // shared but read-only so could be private too
 static thr_parms *all_parms;
diff --git a/examples/parallel_for/tachyon/src/trace.tbb1d.cpp b/examples/parallel_for/tachyon/src/trace.tbb1d.cpp
index 701ff44..dd1e787 100644
--- a/examples/parallel_for/tachyon/src/trace.tbb1d.cpp
+++ b/examples/parallel_for/tachyon/src/trace.tbb1d.cpp
@@ -68,7 +68,7 @@
 #include "intersect.h"
 #include "global.h"
 #include "ui.h"
-#include "video.h"
+#include "tachyon_video.h"
 
 // shared but read-only so could be private too
 static thr_parms *all_parms;
diff --git a/examples/parallel_for/tachyon/src/trace_rest.cpp b/examples/parallel_for/tachyon/src/trace_rest.cpp
index d3c43c5..ec27cb5 100644
--- a/examples/parallel_for/tachyon/src/trace_rest.cpp
+++ b/examples/parallel_for/tachyon/src/trace_rest.cpp
@@ -75,7 +75,7 @@
 #include "intersect.h"
 #include "global.h"
 #include "ui.h"
-#include "video.h"
+#include "tachyon_video.h"
 
 color trace(ray * primary) {
   if (primary->depth > 0) {
diff --git a/examples/parallel_for/tachyon/src/types.h b/examples/parallel_for/tachyon/src/types.h
index ec9457c..52a5991 100644
--- a/examples/parallel_for/tachyon/src/types.h
+++ b/examples/parallel_for/tachyon/src/types.h
@@ -60,7 +60,7 @@
 #elif _WIN32
 #include <malloc.h>
 #define alloca _alloca
-#elif __FreeBSD__
+#elif __FreeBSD__||__NetBSD__
 #include <stdlib.h>
 #else
 #include <alloca.h>
diff --git a/examples/parallel_for/tachyon/src/ui.cpp b/examples/parallel_for/tachyon/src/ui.cpp
index 8826c75..7b272a2 100644
--- a/examples/parallel_for/tachyon/src/ui.cpp
+++ b/examples/parallel_for/tachyon/src/ui.cpp
@@ -71,6 +71,8 @@ static void (* rt_static_ui_message) (int, const char *) = NULL;
 static void (* rt_static_ui_progress) (int) = NULL;
 static int (* rt_static_ui_checkaction) (void) = NULL;
 
+extern bool silent_mode;
+
 void set_rt_ui_message(void (* func) (int, const char *)) {
   rt_static_ui_message = func;
 }
@@ -81,8 +83,10 @@ void set_rt_ui_progress(void (* func) (int)) {
 
 void rt_ui_message(int level, const char * msg) {
   if (rt_static_ui_message == NULL) {
-    fprintf(stderr, "%s\n", msg);
-    fflush (stderr);
+    if ( !silent_mode ) {
+      fprintf(stderr, "%s\n", msg);
+      fflush (stderr);
+    }
   } else {
     rt_static_ui_message(level, msg);
   }
@@ -92,8 +96,10 @@ void rt_ui_progress(int percent) {
   if (rt_static_ui_progress != NULL)
     rt_static_ui_progress(percent);
   else {
-    fprintf(stderr, "\r %3d%% Complete            \r", percent);
-    fflush(stderr);
+    if ( !silent_mode ) {
+      fprintf(stderr, "\r %3d%% Complete            \r", percent);
+      fflush(stderr);
+    }
   }
 }
 
diff --git a/examples/parallel_for/tachyon/src/util.cpp b/examples/parallel_for/tachyon/src/util.cpp
index 1c70d28..cb9f5c1 100644
--- a/examples/parallel_for/tachyon/src/util.cpp
+++ b/examples/parallel_for/tachyon/src/util.cpp
@@ -71,7 +71,7 @@
 
 void rt_finalize(void);
 
-#ifndef _WIN32
+#if !defined( _WIN32 )
 #include <sys/time.h>
 #include <unistd.h>
 
@@ -90,22 +90,15 @@ void rt_sleep(int msec) {
     Sleep(msec);
 }
 
-DWORD starttime;
-DWORD stoptime;
-
-void timerstart(void) {
-    starttime = GetTickCount ();
-}
-
-void timerstop(void) {
-    stoptime = GetTickCount ();
+timer gettimer(void) {
+    return GetTickCount ();
 }
 
-flt timertime(void) {
+flt timertime(timer st, timer fn) {
    double ttime, start, end;
 
-   start = ((double) starttime) / ((double) 1000.00);
-     end = ((double) stoptime) / ((double) 1000.00);
+   start = ((double) st) / ((double) 1000.00);
+     end = ((double) fn) / ((double) 1000.00);
    ttime = end - start;
 
    return ttime;
@@ -113,23 +106,20 @@ flt timertime(void) {
 #endif  /*  _WIN32  */
 
 /* if we're on a Unix with gettimeofday() we'll use newer timers */
-#ifdef STDTIME 
-  struct timeval starttime, endtime;
+#if defined( STDTIME )
   struct timezone tz;
- 
-void timerstart(void) {
-  gettimeofday(&starttime, &tz);
-} 
-  
-void timerstop(void) {
-  gettimeofday(&endtime, &tz);
+
+timer gettimer(void) {
+  timer t;
+  gettimeofday(&t, &tz);
+  return t;
 } 
   
-flt timertime(void) {
+flt timertime(timer st, timer fn) {
    double ttime, start, end;
 
-   start = (starttime.tv_sec+1.0*starttime.tv_usec / 1000000.0);
-     end = (endtime.tv_sec+1.0*endtime.tv_usec / 1000000.0);
+   start = (st.tv_sec+1.0*st.tv_usec / 1000000.0);
+     end = (fn.tv_sec+1.0*fn.tv_usec / 1000000.0);
    ttime = end - start;
 
    return ttime;
@@ -139,22 +129,13 @@ flt timertime(void) {
 
 
 /* use the old fashioned Unix time functions */
-#ifdef OLDUNIXTIME
-time_t starttime;
-time_t stoptime;
-
-void timerstart(void) {
-  starttime=time(NULL);
-}
-
-void timerstop(void) {
-  stoptime=time(NULL);
+#if defined( OLDUNIXTIME )
+timer gettimer(void) {
+  return time(NULL);
 }
 
-flt timertime(void) {
-  flt a;
-  a = difftime(stoptime, starttime);
-  return a;
+flt timertime(timer st, timer fn) {
+  return difftime(fn, st);;
 }
 #endif  /*  OLDUNIXTIME  */
 
diff --git a/examples/parallel_for/tachyon/src/util.h b/examples/parallel_for/tachyon/src/util.h
index ad71b14..4f2a989 100644
--- a/examples/parallel_for/tachyon/src/util.h
+++ b/examples/parallel_for/tachyon/src/util.h
@@ -61,9 +61,23 @@
  *  $Id: util.h,v 1.3 2007-02-22 17:54:17 dpoulsen Exp $
  */
 
-void timerstart(void);
-void timerstop(void);
-flt timertime(void);
+#include "machine.h"
+
+#if defined( _WIN32 )
+  #include <windows.h>
+  typedef DWORD timer;
+#else
+  #include <sys/time.h>
+  #include <unistd.h>
+  #if defined( STDTIME )
+    typedef timeval timer;
+  #elif defined ( OLDUNIXTIME )
+    typedef time_t timer;
+  #endif  /*  OLDUNIXTIME  */ /*  STDTIME  */
+ #endif  /*  _WIN32  */
+
+timer gettimer(void);
+flt timertime(timer st, timer fn);
 void rt_sleep(int);
 int rt_meminuse(void);
 void * rt_getmem(unsigned int);
diff --git a/examples/parallel_for/tachyon/xcode/tachyon.xcodeproj/project.pbxproj b/examples/parallel_for/tachyon/xcode/tachyon.xcodeproj/project.pbxproj
index 4842dde..b9386b7 100644
--- a/examples/parallel_for/tachyon/xcode/tachyon.xcodeproj/project.pbxproj
+++ b/examples/parallel_for/tachyon/xcode/tachyon.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -38,7 +38,6 @@
 		A1F590C90B8DF81800073279 /* coordsys.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A40B8DF81800073279 /* coordsys.cpp */; };
 		A1F590CA0B8DF81800073279 /* cylinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A50B8DF81800073279 /* cylinder.cpp */; };
 		A1F590CB0B8DF81800073279 /* extvol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A60B8DF81800073279 /* extvol.cpp */; };
-		A1F590CC0B8DF81800073279 /* getargs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A70B8DF81800073279 /* getargs.cpp */; };
 		A1F590CD0B8DF81800073279 /* global.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A80B8DF81800073279 /* global.cpp */; };
 		A1F590CE0B8DF81800073279 /* grid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A90B8DF81800073279 /* grid.cpp */; };
 		A1F590CF0B8DF81800073279 /* imageio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590AA0B8DF81800073279 /* imageio.cpp */; };
@@ -62,7 +61,6 @@
 		A1F590E30B8DF81800073279 /* ui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590BE0B8DF81800073279 /* ui.cpp */; };
 		A1F590E40B8DF81800073279 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590BF0B8DF81800073279 /* util.cpp */; };
 		A1F590E50B8DF81800073279 /* vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C00B8DF81800073279 /* vector.cpp */; };
-		A1F590E60B8DF81800073279 /* video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C10B8DF81800073279 /* video.cpp */; };
 		A1F590E70B8DF81800073279 /* vol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C20B8DF81800073279 /* vol.cpp */; };
 		A1F5910D0B8DF81800073279 /* api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5909E0B8DF81800073279 /* api.cpp */; };
 		A1F5910E0B8DF81800073279 /* apigeom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5909F0B8DF81800073279 /* apigeom.cpp */; };
@@ -73,7 +71,6 @@
 		A1F591130B8DF81800073279 /* coordsys.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A40B8DF81800073279 /* coordsys.cpp */; };
 		A1F591140B8DF81800073279 /* cylinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A50B8DF81800073279 /* cylinder.cpp */; };
 		A1F591150B8DF81800073279 /* extvol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A60B8DF81800073279 /* extvol.cpp */; };
-		A1F591160B8DF81800073279 /* getargs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A70B8DF81800073279 /* getargs.cpp */; };
 		A1F591170B8DF81800073279 /* global.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A80B8DF81800073279 /* global.cpp */; };
 		A1F591180B8DF81800073279 /* grid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A90B8DF81800073279 /* grid.cpp */; };
 		A1F591190B8DF81800073279 /* imageio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590AA0B8DF81800073279 /* imageio.cpp */; };
@@ -97,7 +94,6 @@
 		A1F5912D0B8DF81800073279 /* ui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590BE0B8DF81800073279 /* ui.cpp */; };
 		A1F5912E0B8DF81800073279 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590BF0B8DF81800073279 /* util.cpp */; };
 		A1F5912F0B8DF81800073279 /* vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C00B8DF81800073279 /* vector.cpp */; };
-		A1F591300B8DF81800073279 /* video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C10B8DF81800073279 /* video.cpp */; };
 		A1F591310B8DF81800073279 /* vol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C20B8DF81800073279 /* vol.cpp */; };
 		A1F591320B8DF81800073279 /* api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5909E0B8DF81800073279 /* api.cpp */; };
 		A1F591330B8DF81800073279 /* apigeom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5909F0B8DF81800073279 /* apigeom.cpp */; };
@@ -108,7 +104,6 @@
 		A1F591380B8DF81800073279 /* coordsys.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A40B8DF81800073279 /* coordsys.cpp */; };
 		A1F591390B8DF81800073279 /* cylinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A50B8DF81800073279 /* cylinder.cpp */; };
 		A1F5913A0B8DF81800073279 /* extvol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A60B8DF81800073279 /* extvol.cpp */; };
-		A1F5913B0B8DF81800073279 /* getargs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A70B8DF81800073279 /* getargs.cpp */; };
 		A1F5913C0B8DF81800073279 /* global.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A80B8DF81800073279 /* global.cpp */; };
 		A1F5913D0B8DF81800073279 /* grid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590A90B8DF81800073279 /* grid.cpp */; };
 		A1F5913E0B8DF81800073279 /* imageio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590AA0B8DF81800073279 /* imageio.cpp */; };
@@ -132,11 +127,16 @@
 		A1F591520B8DF81800073279 /* ui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590BE0B8DF81800073279 /* ui.cpp */; };
 		A1F591530B8DF81800073279 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590BF0B8DF81800073279 /* util.cpp */; };
 		A1F591540B8DF81800073279 /* vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C00B8DF81800073279 /* vector.cpp */; };
-		A1F591550B8DF81800073279 /* video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C10B8DF81800073279 /* video.cpp */; };
 		A1F591560B8DF81800073279 /* vol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F590C20B8DF81800073279 /* vol.cpp */; };
 		A1F5915D0B8DF94400073279 /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5915C0B8DF94400073279 /* macvideo.cpp */; };
 		A1F5915E0B8DF94400073279 /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5915C0B8DF94400073279 /* macvideo.cpp */; };
 		A1F591600B8DF94400073279 /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F5915C0B8DF94400073279 /* macvideo.cpp */; };
+		EA135ECB13123E2200807847 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135EC813123E2200807847 /* main.cpp */; };
+		EA135ECC13123E2200807847 /* tachyon_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135EC913123E2200807847 /* tachyon_video.cpp */; };
+		EA135ECD13123E2200807847 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135EC813123E2200807847 /* main.cpp */; };
+		EA135ECE13123E2200807847 /* tachyon_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135EC913123E2200807847 /* tachyon_video.cpp */; };
+		EA135ECF13123E2200807847 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135EC813123E2200807847 /* main.cpp */; };
+		EA135ED013123E2200807847 /* tachyon_video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135EC913123E2200807847 /* tachyon_video.cpp */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -187,7 +187,6 @@
 		A1F590370B8DF7D100073279 /* coordsys.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = coordsys.h; path = ../src/coordsys.h; sourceTree = SOURCE_ROOT; };
 		A1F590380B8DF7D100073279 /* cylinder.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = cylinder.h; path = ../src/cylinder.h; sourceTree = SOURCE_ROOT; };
 		A1F590390B8DF7D100073279 /* extvol.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = extvol.h; path = ../src/extvol.h; sourceTree = SOURCE_ROOT; };
-		A1F5903A0B8DF7D100073279 /* getargs.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = getargs.h; path = ../src/getargs.h; sourceTree = SOURCE_ROOT; };
 		A1F5903B0B8DF7D100073279 /* global.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = global.h; path = ../src/global.h; sourceTree = SOURCE_ROOT; };
 		A1F5903C0B8DF7D100073279 /* grid.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = grid.h; path = ../src/grid.h; sourceTree = SOURCE_ROOT; };
 		A1F5903D0B8DF7D100073279 /* imageio.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = imageio.h; path = ../src/imageio.h; sourceTree = SOURCE_ROOT; };
@@ -213,7 +212,6 @@
 		A1F590510B8DF7D100073279 /* ui.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ui.h; path = ../src/ui.h; sourceTree = SOURCE_ROOT; };
 		A1F590520B8DF7D100073279 /* util.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = util.h; path = ../src/util.h; sourceTree = SOURCE_ROOT; };
 		A1F590530B8DF7D100073279 /* vector.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vector.h; path = ../src/vector.h; sourceTree = SOURCE_ROOT; };
-		A1F590540B8DF7D100073279 /* video.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = video.h; path = ../src/video.h; sourceTree = SOURCE_ROOT; };
 		A1F590550B8DF7D100073279 /* vol.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vol.h; path = ../src/vol.h; sourceTree = SOURCE_ROOT; };
 		A1F5909E0B8DF81800073279 /* api.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = api.cpp; path = ../src/api.cpp; sourceTree = SOURCE_ROOT; };
 		A1F5909F0B8DF81800073279 /* apigeom.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = apigeom.cpp; path = ../src/apigeom.cpp; sourceTree = SOURCE_ROOT; };
@@ -224,7 +222,6 @@
 		A1F590A40B8DF81800073279 /* coordsys.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = coordsys.cpp; path = ../src/coordsys.cpp; sourceTree = SOURCE_ROOT; };
 		A1F590A50B8DF81800073279 /* cylinder.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = cylinder.cpp; path = ../src/cylinder.cpp; sourceTree = SOURCE_ROOT; };
 		A1F590A60B8DF81800073279 /* extvol.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = extvol.cpp; path = ../src/extvol.cpp; sourceTree = SOURCE_ROOT; };
-		A1F590A70B8DF81800073279 /* getargs.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = getargs.cpp; path = ../src/getargs.cpp; sourceTree = SOURCE_ROOT; };
 		A1F590A80B8DF81800073279 /* global.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = global.cpp; path = ../src/global.cpp; sourceTree = SOURCE_ROOT; };
 		A1F590A90B8DF81800073279 /* grid.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = grid.cpp; path = ../src/grid.cpp; sourceTree = SOURCE_ROOT; };
 		A1F590AA0B8DF81800073279 /* imageio.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = imageio.cpp; path = ../src/imageio.cpp; sourceTree = SOURCE_ROOT; };
@@ -248,11 +245,13 @@
 		A1F590BE0B8DF81800073279 /* ui.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = ui.cpp; path = ../src/ui.cpp; sourceTree = SOURCE_ROOT; };
 		A1F590BF0B8DF81800073279 /* util.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = util.cpp; path = ../src/util.cpp; sourceTree = SOURCE_ROOT; };
 		A1F590C00B8DF81800073279 /* vector.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = vector.cpp; path = ../src/vector.cpp; sourceTree = SOURCE_ROOT; };
-		A1F590C10B8DF81800073279 /* video.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = video.cpp; path = ../src/video.cpp; sourceTree = SOURCE_ROOT; };
 		A1F590C20B8DF81800073279 /* vol.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = vol.cpp; path = ../src/vol.cpp; sourceTree = SOURCE_ROOT; };
 		A1F5915A0B8DF8FA00073279 /* triangle.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = triangle.h; path = ../src/triangle.h; sourceTree = SOURCE_ROOT; };
 		A1F5915C0B8DF94400073279 /* macvideo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macvideo.cpp; path = ../../../common/gui/macvideo.cpp; sourceTree = SOURCE_ROOT; };
 		A1F591610B8DF96500073279 /* video.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = video.h; path = ../../../common/gui/video.h; sourceTree = SOURCE_ROOT; };
+		EA135EC813123E2200807847 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = ../src/main.cpp; sourceTree = SOURCE_ROOT; };
+		EA135EC913123E2200807847 /* tachyon_video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tachyon_video.cpp; path = ../src/tachyon_video.cpp; sourceTree = SOURCE_ROOT; };
+		EA135ECA13123E2200807847 /* tachyon_video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tachyon_video.h; path = ../src/tachyon_video.h; sourceTree = SOURCE_ROOT; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -353,6 +352,7 @@
 		A1F5902E0B8DF71200073279 /* Sources */ = {
 			isa = PBXGroup;
 			children = (
+				EA135EC913123E2200807847 /* tachyon_video.cpp */,
 				A1F5915C0B8DF94400073279 /* macvideo.cpp */,
 				A1F5909E0B8DF81800073279 /* api.cpp */,
 				A1F5909F0B8DF81800073279 /* apigeom.cpp */,
@@ -363,7 +363,6 @@
 				A1F590A40B8DF81800073279 /* coordsys.cpp */,
 				A1F590A50B8DF81800073279 /* cylinder.cpp */,
 				A1F590A60B8DF81800073279 /* extvol.cpp */,
-				A1F590A70B8DF81800073279 /* getargs.cpp */,
 				A1F590A80B8DF81800073279 /* global.cpp */,
 				A1F590A90B8DF81800073279 /* grid.cpp */,
 				A1F590AA0B8DF81800073279 /* imageio.cpp */,
@@ -387,7 +386,6 @@
 				A1F590BE0B8DF81800073279 /* ui.cpp */,
 				A1F590BF0B8DF81800073279 /* util.cpp */,
 				A1F590C00B8DF81800073279 /* vector.cpp */,
-				A1F590C10B8DF81800073279 /* video.cpp */,
 				A1F590C20B8DF81800073279 /* vol.cpp */,
 			);
 			name = Sources;
@@ -399,6 +397,7 @@
 				A1F591610B8DF96500073279 /* video.h */,
 				A1F5915A0B8DF8FA00073279 /* triangle.h */,
 				A1F590320B8DF7D100073279 /* api.h */,
+				EA135ECA13123E2200807847 /* tachyon_video.h */,
 				A1F590330B8DF7D100073279 /* apitrigeom.h */,
 				A1F590340B8DF7D100073279 /* bndbox.h */,
 				A1F590350B8DF7D100073279 /* box.h */,
@@ -406,7 +405,6 @@
 				A1F590370B8DF7D100073279 /* coordsys.h */,
 				A1F590380B8DF7D100073279 /* cylinder.h */,
 				A1F590390B8DF7D100073279 /* extvol.h */,
-				A1F5903A0B8DF7D100073279 /* getargs.h */,
 				A1F5903B0B8DF7D100073279 /* global.h */,
 				A1F5903C0B8DF7D100073279 /* grid.h */,
 				A1F5903D0B8DF7D100073279 /* imageio.h */,
@@ -432,7 +430,6 @@
 				A1F590510B8DF7D100073279 /* ui.h */,
 				A1F590520B8DF7D100073279 /* util.h */,
 				A1F590530B8DF7D100073279 /* vector.h */,
-				A1F590540B8DF7D100073279 /* video.h */,
 				A1F590550B8DF7D100073279 /* vol.h */,
 			);
 			name = Headers;
@@ -441,6 +438,7 @@
 		A1F590310B8DF75E00073279 /* Tachyon */ = {
 			isa = PBXGroup;
 			children = (
+				EA135EC813123E2200807847 /* main.cpp */,
 				A1F58D8C0B8DEFE900073279 /* trace.serial.cpp */,
 				A1F58D3D0B8DEB8E00073279 /* trace.threads.cpp */,
 				A1F58D8B0B8DEFD900073279 /* trace.tbb1d.cpp */,
@@ -512,9 +510,16 @@
 /* Begin PBXProject section */
 		20286C28FDCF999611CA2CEA /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
 			buildConfigurationList = C0E91AC908A95435008D54AB /* Build configuration list for PBXProject "tachyon" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 20286C29FDCF999611CA2CEA /* tachyon */;
 			productRefGroup = A1F58CD30B8DE85300073279 /* Products */;
 			projectDirPath = "";
@@ -572,7 +577,6 @@
 				A1F591380B8DF81800073279 /* coordsys.cpp in Sources */,
 				A1F591390B8DF81800073279 /* cylinder.cpp in Sources */,
 				A1F5913A0B8DF81800073279 /* extvol.cpp in Sources */,
-				A1F5913B0B8DF81800073279 /* getargs.cpp in Sources */,
 				A1F5913C0B8DF81800073279 /* global.cpp in Sources */,
 				A1F5913D0B8DF81800073279 /* grid.cpp in Sources */,
 				A1F5913E0B8DF81800073279 /* imageio.cpp in Sources */,
@@ -596,9 +600,10 @@
 				A1F591520B8DF81800073279 /* ui.cpp in Sources */,
 				A1F591530B8DF81800073279 /* util.cpp in Sources */,
 				A1F591540B8DF81800073279 /* vector.cpp in Sources */,
-				A1F591550B8DF81800073279 /* video.cpp in Sources */,
 				A1F591560B8DF81800073279 /* vol.cpp in Sources */,
 				A1F5915D0B8DF94400073279 /* macvideo.cpp in Sources */,
+				EA135ECF13123E2200807847 /* main.cpp in Sources */,
+				EA135ED013123E2200807847 /* tachyon_video.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -616,7 +621,6 @@
 				A1F591130B8DF81800073279 /* coordsys.cpp in Sources */,
 				A1F591140B8DF81800073279 /* cylinder.cpp in Sources */,
 				A1F591150B8DF81800073279 /* extvol.cpp in Sources */,
-				A1F591160B8DF81800073279 /* getargs.cpp in Sources */,
 				A1F591170B8DF81800073279 /* global.cpp in Sources */,
 				A1F591180B8DF81800073279 /* grid.cpp in Sources */,
 				A1F591190B8DF81800073279 /* imageio.cpp in Sources */,
@@ -640,9 +644,10 @@
 				A1F5912D0B8DF81800073279 /* ui.cpp in Sources */,
 				A1F5912E0B8DF81800073279 /* util.cpp in Sources */,
 				A1F5912F0B8DF81800073279 /* vector.cpp in Sources */,
-				A1F591300B8DF81800073279 /* video.cpp in Sources */,
 				A1F591310B8DF81800073279 /* vol.cpp in Sources */,
 				A1F5915E0B8DF94400073279 /* macvideo.cpp in Sources */,
+				EA135ECD13123E2200807847 /* main.cpp in Sources */,
+				EA135ECE13123E2200807847 /* tachyon_video.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -660,7 +665,6 @@
 				A1F590C90B8DF81800073279 /* coordsys.cpp in Sources */,
 				A1F590CA0B8DF81800073279 /* cylinder.cpp in Sources */,
 				A1F590CB0B8DF81800073279 /* extvol.cpp in Sources */,
-				A1F590CC0B8DF81800073279 /* getargs.cpp in Sources */,
 				A1F590CD0B8DF81800073279 /* global.cpp in Sources */,
 				A1F590CE0B8DF81800073279 /* grid.cpp in Sources */,
 				A1F590CF0B8DF81800073279 /* imageio.cpp in Sources */,
@@ -684,9 +688,10 @@
 				A1F590E30B8DF81800073279 /* ui.cpp in Sources */,
 				A1F590E40B8DF81800073279 /* util.cpp in Sources */,
 				A1F590E50B8DF81800073279 /* vector.cpp in Sources */,
-				A1F590E60B8DF81800073279 /* video.cpp in Sources */,
 				A1F590E70B8DF81800073279 /* vol.cpp in Sources */,
 				A1F591600B8DF94400073279 /* macvideo.cpp in Sources */,
+				EA135ECB13123E2200807847 /* main.cpp in Sources */,
+				EA135ECC13123E2200807847 /* tachyon_video.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -708,24 +713,25 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
 				GCC_PREPROCESSOR_DEFINITIONS = "DEFAULT_MODELFILE=\"$(SOURCE_ROOT)/../dat/balls.dat\"";
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
+				IBC_STRIP_NIBS = NO;
 				INFOPLIST_FILE = Info.plist;
 				INSTALL_PATH = "$(HOME)/Applications";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = "tachyon-tbb1d";
+				SDKROOT = macosx10.6;
 				WRAPPER_EXTENSION = app;
 				ZERO_LINK = NO;
 			};
@@ -735,22 +741,23 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
 				COPY_PHASE_STRIP = YES;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
 				GCC_PREPROCESSOR_DEFINITIONS = "DEFAULT_MODELFILE=\"$(SOURCE_ROOT)/../dat/balls.dat\"";
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
+				IBC_STRIP_NIBS = NO;
 				INFOPLIST_FILE = Info.plist;
 				INSTALL_PATH = "$(HOME)/Applications";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = "tachyon-tbb1d";
+				SDKROOT = macosx10.6;
 				WRAPPER_EXTENSION = app;
 				ZERO_LINK = NO;
 			};
@@ -760,19 +767,20 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
 				GCC_PREPROCESSOR_DEFINITIONS = "DEFAULT_MODELFILE=\"$(SOURCE_ROOT)/../dat/balls.dat\"";
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
+				IBC_STRIP_NIBS = NO;
 				INFOPLIST_FILE = Info.plist;
 				INSTALL_PATH = "$(HOME)/Applications";
-				PREBINDING = NO;
 				PRODUCT_NAME = "tachyon-serial";
+				SDKROOT = macosx10.6;
 				WRAPPER_EXTENSION = app;
 				ZERO_LINK = NO;
 			};
@@ -782,17 +790,18 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
 				COPY_PHASE_STRIP = YES;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
 				GCC_PREPROCESSOR_DEFINITIONS = "DEFAULT_MODELFILE=\"$(SOURCE_ROOT)/../dat/balls.dat\"";
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
+				IBC_STRIP_NIBS = NO;
 				INFOPLIST_FILE = Info.plist;
 				INSTALL_PATH = "$(HOME)/Applications";
-				PREBINDING = NO;
 				PRODUCT_NAME = "tachyon-serial";
+				SDKROOT = macosx10.6;
 				WRAPPER_EXTENSION = app;
 				ZERO_LINK = NO;
 			};
@@ -805,13 +814,13 @@
 				ARCHS = i386;
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_MODEL_TUNING = "";
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = tachyon.pch;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
+				IBC_STRIP_NIBS = NO;
 				INFOPLIST_FILE = Info.plist;
 				INSTALL_PATH = "$(HOME)/Applications";
 				LIBRARY_SEARCH_PATHS = (
@@ -819,6 +828,7 @@
 					../../../../lib,
 				);
 				PRODUCT_NAME = "tachyon-tbb";
+				SDKROOT = macosx10.6;
 				WRAPPER_EXTENSION = app;
 				ZERO_LINK = NO;
 			};
@@ -833,8 +843,9 @@
 				GCC_MODEL_TUNING = "";
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = tachyon.pch;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
+				IBC_STRIP_NIBS = NO;
 				INFOPLIST_FILE = Info.plist;
 				INSTALL_PATH = "$(HOME)/Applications";
 				LIBRARY_SEARCH_PATHS = (
@@ -842,6 +853,7 @@
 					../../../../lib,
 				);
 				PRODUCT_NAME = "tachyon-tbb";
+				SDKROOT = macosx10.6;
 				WRAPPER_EXTENSION = app;
 				ZERO_LINK = NO;
 			};
@@ -855,11 +867,13 @@
 				GCC_ENABLE_SSE3_EXTENSIONS = YES;
 				GCC_MODEL_TUNING = "";
 				GCC_PREPROCESSOR_DEFINITIONS = "DEFAULT_MODELFILE=\"$(SOURCE_ROOT)/../dat/balls.dat\"";
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
+				IBC_STRIP_NIBS = NO;
+				MACOSX_DEPLOYMENT_TARGET = 10.6;
+				SDKROOT = macosx10.6;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
 			name = Debug;
@@ -872,11 +886,13 @@
 				GCC_ENABLE_SSE3_EXTENSIONS = YES;
 				GCC_MODEL_TUNING = "";
 				GCC_PREPROCESSOR_DEFINITIONS = "DEFAULT_MODELFILE=\"$(SOURCE_ROOT)/../dat/balls.dat\"";
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
+				IBC_STRIP_NIBS = NO;
+				MACOSX_DEPLOYMENT_TARGET = 10.6;
+				SDKROOT = macosx10.6;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
 			name = Release;
diff --git a/examples/parallel_reduce/convex_hull/Makefile b/examples/parallel_reduce/convex_hull/Makefile
index 7ea2ca5..5ac16c2 100644
--- a/examples/parallel_reduce/convex_hull/Makefile
+++ b/examples/parallel_reduce/convex_hull/Makefile
@@ -27,12 +27,18 @@
 # GNU Makefile that builds and runs example.
 PROG=convex_hull_bench
 ARGS=
+PERF_RUN_ARGS = silent auto 40000000
+LIGHT_ARGS = 4 400
 
 # The C++ compiler
 ifneq (,$(shell which icc 2>/dev/null))
 CXX=icc
 endif # icc
 
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
 all:	release test
 
 release: *.cpp
@@ -46,5 +52,13 @@ debug: *.cpp
 clean:
 	$(RM) convex_hull_bench convex_hull_sample *.o *.d
 
+perf_build: release
+
+perf_run:
+	./convex_hull_sample $(PERF_RUN_ARGS)
+	
 test:
 	./$(PROG) $(ARGS)
+
+light_test:
+	./$(PROG) $(LIGHT_ARGS)
diff --git a/examples/parallel_reduce/convex_hull/Makefile.windows b/examples/parallel_reduce/convex_hull/Makefile.windows
index 586e946..9abcb07 100644
--- a/examples/parallel_reduce/convex_hull/Makefile.windows
+++ b/examples/parallel_reduce/convex_hull/Makefile.windows
@@ -27,6 +27,8 @@
 # Common Makefile that builds and runs example.
 PROG=convex_hull_bench
 ARGS=
+PERF_RUN_ARGS = silent auto 40000000
+LIGHT_ARGS = 4 400
 
 # Trying to find if icl.exe is set
 CXX1 = $(TBB_CXX)-
@@ -34,7 +36,7 @@ CXX2 = $(CXX1:icl.exe-=icl.exe)
 CXX  = $(CXX2:-=cl.exe)
 
 # The C++ compiler options
-MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 /D _SCL_SECURE_NO_DEPRECATE $(CXXFLAGS)
+MYCXXFLAGS = /TP /EHsc /W3 /nologo $(TBB_SECURITY_SWITCH) /D _CONSOLE /D _MBCS /D WIN32 /D _SCL_SECURE_NO_DEPRECATE /D _SECURE_SCL=0 $(CXXFLAGS)
 MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
 
 all: release test
@@ -48,6 +50,14 @@ clean:
 	@cmd.exe /C del convex_hull*.exe *.obj *.?db *.manifest
 test:
 	$(PROG) $(ARGS)
+perf_build: release
+
+perf_run:
+	./convex_hull_sample $(PERF_RUN_ARGS)
+
+light_test:
+	./$(PROG) $(LIGHT_ARGS)
+
 compiler_check:
 	@echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1  || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
 	@cmd.exe /C del compiler_test
diff --git a/examples/parallel_reduce/convex_hull/convex_hull.h b/examples/parallel_reduce/convex_hull/convex_hull.h
index b58f2c9..cd49cba 100644
--- a/examples/parallel_reduce/convex_hull/convex_hull.h
+++ b/examples/parallel_reduce/convex_hull/convex_hull.h
@@ -38,128 +38,87 @@
 #include <cstring>
 #include <algorithm>
 #include <functional>
-#include <assert.h>
+#include <cassert>
+#include <climits>
 #include "tbb/tick_count.h"
+#include "tbb/task_scheduler_init.h"
+#include "../../common/utility/utility.h"
+#include "../../common/utility/fast_random.h"
+#include "tbb/blocked_range.h"
 
 using namespace std;
 
 namespace cfg {
-    // convex hull problem parameter defaults
-    const long    NP  = 5000000;  // problem size
-    const int     SNT = 1;        // minimal number of threads
-    const int     ENT = 8;        // maximal number of threads
-
     // convex hull problem user set parameters
-    long   MAXPOINTS         = NP;
-    int    NUM_THREADS_START = SNT;
-    int    NUM_THREADS_END   = ENT;
+    long   numberOfPoints  = 5000000; // problem size
+    utility::thread_number_range threads(tbb::task_scheduler_init::default_num_threads);
 
     // convex hull grain sizes for 3 subproblems. Be sure 16*GS < 512Kb
-    const size_t GENERATE_GS = 25000;
-    const size_t FINDEXT_GS  = 25000;
-    const size_t DIVIDE_GS   = 25000;
+    const size_t generateGrainSize = 25000;
+    const size_t findExtremumGrainSize  = 25000;
+    const size_t divideGrainSize   = 25000;
 };
 
 namespace util {
-    bool                     VERBOSE = false;
+    bool                     silent = false;
+    bool                     verbose = false;
     vector<string> OUTPUT;
 
     // utility functionality
     void ParseInputArgs(int argc, char* argv[]) {
-        int numArgs = 1;
-        if(argc>numArgs) {
-            char delim = ':';
-            if(!strcmp(argv[numArgs], "-h")) {
-                cout << " Program usage is:" << endl
-                    << " " << argv[0] << " [NP] [SNT" << delim << "ENT] [-v]"
-                    << endl << endl
-                    << " where:" << endl
-                    << " NP  - number of points" << endl
-                    << " SNT - start with this number of threads" << endl
-                    << " ENT - end with this number of threads" << endl
-                    << "  -v - turns verbose ON" << endl;
-                exit(0);
-            } else {
-                while(argc>numArgs) {
-                    char* endptr;
-                    if(!strcmp(argv[numArgs], "-v")) {
-                        VERBOSE = true;
-                    } else if(!strchr(argv[numArgs], delim)) {
-                        cfg::MAXPOINTS = strtol(argv[numArgs], &endptr, 0);
-                        if(*endptr!='\0') {
-                            cout << " wrong parameter format for Number of Points" << endl;
-                            exit(1);
-                        }
-                        if(cfg::MAXPOINTS<=0) {
-                            cout
-                                << "  wrong value set for Number of Points" << endl
-                                << "  using default value: " << endl
-                                << "  Number of Points = " << cfg::NP << endl;
-                            cfg::MAXPOINTS = cfg::NP;
-                        }
-                    } else {
-                        cfg::NUM_THREADS_START=(int)strtol(argv[numArgs], &endptr, 0);
-                        if(*endptr==delim) {
-                            cfg::NUM_THREADS_END = (int)strtol(endptr+1, &endptr, 0);
-                        } else {
-                            cout << " wrong parameter format for Number of Threads" << endl;
-                            exit(1);
-                        }
-                        if(*endptr!='\0') {
-                            cout << " wrong parameter format for Number of Threads" << endl;
-                            exit(1);
-                        }    
-                        if((cfg::NUM_THREADS_START<=0)
-                            || (cfg::NUM_THREADS_END<cfg::NUM_THREADS_START)) {
-                                cout
-                                    << "  wrong values set for Number of Threads" << endl
-                                    << "  using default values: " << endl
-                                    << "  start NT = " << cfg::SNT << endl
-                                    << "  end   NT = " << cfg::ENT << endl;
-                                cfg::NUM_THREADS_START=cfg::SNT;
-                                cfg::NUM_THREADS_END  =cfg::ENT;
-                        }
-                    }
-                    ++numArgs;
-                }
-            }
-        }
+        utility::parse_cli_arguments(
+                argc,argv,
+                utility::cli_argument_pack()
+                    //"-h" option for for displaying help is present implicitly
+                    .positional_arg(cfg::threads,"n-of-threads","number of threads to run on; a non-negative integer, or 'auto' to use HW number of threads, or range of the form low:high")
+                    .positional_arg(cfg::numberOfPoints,"n-of-points","number of points")
+                    .arg(silent,"silent","no output except elapsed time")
+                    .arg(verbose,"verbose","turns verbose ON")
+        );
+        //disabling verbose if silent is specified
+        if (silent) verbose = false;;
     }
 
     template <typename T>
     struct point {
         T x;
         T y;
-        point() : x(T()), y(T()) {}
+        //According to subparagraph 4 of paragraph 12.6.2 "Initializing bases and members" [class.base.init]
+        //of ANSI-ISO-IEC C++ 2003 standard, POD members will _not_ be initialized if they are not mentioned
+        //in the base-member initializer list.
+
+        //For more details why this needed please see comment in FillRNDPointsVector_buf
+        point() {}
         point(T _x, T _y) : x(_x), y(_y) {}
-        //why do we need below line? it fails to compile with suncc
-        //point(const point<T>& _P) : x(_P.x), y(_P.y) {} 
     };
 
-    int random(unsigned int& rseed) {
-#if __linux__ || __APPLE__ || __FreeBSD__ || __NetBSD__
-            return rand_r(&rseed);
-#elif _WIN32 || __sun
-            return rand();
-#else
-#error Unknown/unsupported OS?
-#endif // OS selection
+    std::ostream& operator<< (std::ostream& o, point<double> const& p) {
+        return o << "(" << p.x << "," << p.y << ")";
     }
 
-    template < typename T >
-    point<T> GenerateRNDPoint(size_t& count, unsigned int& rseed) {
+    struct rng {
+        static const size_t max_rand = USHRT_MAX;
+        utility::FastRandom my_fast_random;
+        rng (size_t seed):my_fast_random(seed) {}
+        unsigned short operator()(){return my_fast_random.get();}
+        unsigned short operator()(size_t& seed){return my_fast_random.get(seed);}
+    };
+
+
+    template < typename T ,typename rng_functor_type>
+    point<T> GenerateRNDPoint(size_t& count, rng_functor_type random, size_t rand_max) {
         /* generates random points on 2D plane so that the cluster
         is somewhat circle shaped */
         const size_t maxsize=500;
-        T x = random(rseed)*2.0/(double)RAND_MAX - 1;
-        T y = random(rseed)*2.0/(double)RAND_MAX - 1;
+        T x = random()*2.0/(double)rand_max - 1;
+        T y = random()*2.0/(double)rand_max - 1;
         T r = (x*x + y*y);
         if(r>1) {
             count++;
             if(count>10) {
-                if (random(rseed)/(double)RAND_MAX > 0.5)
+                if (random()/(double)rand_max > 0.5)
                     x /= r;
-                if (random(rseed)/(double)RAND_MAX > 0.5)
+                if (random()/(double)rand_max > 0.5)
                     y /= r;
                 count = 0;
             }
@@ -219,18 +178,19 @@ namespace util {
     }
 
     void WriteResults(int nthreads, double initTime, double calcTime) {
-        if(VERBOSE) {
+        if(verbose) {
             cout << " Step by step hull construction:" << endl;
             for(size_t i = 0; i < OUTPUT.size(); ++i)
                 cout << OUTPUT[i] << endl;
         }
-
-        cout
-            << "  Number of nodes:" << cfg::MAXPOINTS
-            << "  Number of threads:" << nthreads 
-            << "  Initialization time:" << setw(10) << setprecision(3) << initTime 
-            << "  Calculation time:" << setw(10) << setprecision(3) << calcTime
-            << endl;
+        if (!silent){
+            cout
+                << "  Number of nodes:" << cfg::numberOfPoints
+                << "  Number of threads:" << nthreads
+                << "  Initialization time:" << setw(10) << setprecision(3) << initTime
+                << "  Calculation time:" << setw(10) << setprecision(3) << calcTime
+                << endl;
+        }
     }
 };
 
diff --git a/examples/parallel_reduce/convex_hull/convex_hull_bench.cpp b/examples/parallel_reduce/convex_hull/convex_hull_bench.cpp
index 118a5ad..d8a8959 100644
--- a/examples/parallel_reduce/convex_hull/convex_hull_bench.cpp
+++ b/examples/parallel_reduce/convex_hull/convex_hull_bench.cpp
@@ -35,9 +35,12 @@
 
 typedef util::point<double> point_t;
 
-#define USETBB      1
-#define USECONCVEC  1
-#define INIT_ONCE   1
+#ifndef USETBB
+    #define USETBB      1
+#endif
+#ifndef USECONCVEC
+    #define USECONCVEC   1
+#endif
 
 #if !USETBB // Serial implementation of Quick Hull algorithm
 
@@ -119,7 +122,7 @@ point_t divide(const pointVec_t &P, pointVec_t &P_reduced, const point_t &p1, co
     SplitByCP splitByCP(p1, p2, P_reduced);
     point_t farPoint = std::for_each(P.begin(), P.end(), splitByCP);
 
-    if(util::VERBOSE) {
+    if(util::verbose) {
         std::stringstream ss;
         ss << P.size() << " nodes in bucket"<< ", "
             << "dividing by: [ " << p1 << ", " << p2 << " ], "
@@ -205,6 +208,9 @@ void appendVector(const pointVec_t& src, pointVec_t& dest) {
     std::copy(src.begin(), src.end(), dest.grow_by(src.size()));
 }
 
+void grow_vector_to_at_least(pointVec_t& vect, size_t size) {
+    vect.grow_to_at_least(size);
+}
 #else // USE STD::VECTOR - include spin_mutex.h and lock vector operations
 #include "tbb/spin_mutex.h"
 
@@ -222,67 +228,67 @@ void appendVector(mutex_t& insertMutex, const point_t* src, size_t srcSize,
     dest.insert(dest.end(), src, src + srcSize);
 }
 
+void grow_vector_to_at_least(mutex_t& mutex, pointVec_t& vect, size_t size) {
+    mutex_t::scoped_lock lock(mutex);
+    if (vect.size()< size){
+        vect.resize(size);
+    }
+}
 #endif // USECONCVEC
 
-void serial_initialize(pointVec_t &points);
-
 class FillRNDPointsVector {
     pointVec_t          &points;
-    mutable unsigned int rseed;
 public:
-    static const size_t  grainSize = cfg::GENERATE_GS;
+    static const size_t  grainSize = cfg::generateGrainSize;
 #if !USECONCVEC
     static mutex_t       pushBackMutex;
 #endif // USECONCVEC
-    FillRNDPointsVector(pointVec_t& _points)
-        : points(_points), rseed(1) {}
 
-    FillRNDPointsVector(const FillRNDPointsVector& other)
-        : points(other.points), rseed(other.rseed+1) {}
+    explicit FillRNDPointsVector(pointVec_t& _points)
+        : points(_points){}
 
     void operator()(const range_t& range) const {
+        util::rng the_rng(range.begin());
         const size_t i_end = range.end();
         size_t count = 0;
-        for(size_t i = range.begin(); i != i_end; ++i) {
 #if USECONCVEC
-            points.push_back(util::GenerateRNDPoint<double>(count, rseed));
-#else // Locked push_back to a not thread-safe STD::VECTOR
-            {
-                mutex_t::scoped_lock lock(pushBackMutex);
-                points.push_back(util::GenerateRNDPoint<double>(count, rseed));
-            }
+            points.grow_to_at_least(i_end);
+#else // Locked enlarge to a not thread-safe STD::VECTOR
+            grow_vector_to_at_least(pushBackMutex,points,i_end);
 #endif // USECONCVEC
+
+        for(size_t i = range.begin(); i != i_end; ++i) {
+            points[i]=util::GenerateRNDPoint<double>(count,the_rng,util::rng::max_rand);
         }
     }
 };
 
 class FillRNDPointsVector_buf {
     pointVec_t          &points;
-    mutable unsigned int rseed;
 public:
-    static const size_t  grainSize = cfg::GENERATE_GS;
+    static const size_t  grainSize = cfg::generateGrainSize;
 #if !USECONCVEC
     static mutex_t       insertMutex;
 #endif // USECONCVEC
 
-    FillRNDPointsVector_buf(pointVec_t& _points)
-        : points(_points), rseed(1) {}
-
-    FillRNDPointsVector_buf(const FillRNDPointsVector_buf& other)
-        : points(other.points), rseed(other.rseed+1) {}
+    explicit FillRNDPointsVector_buf(pointVec_t& _points)
+        : points(_points){}
 
     void operator()(const range_t& range) const {
+        util::rng the_rng(range.begin());
         const size_t i_end = range.end();
         size_t count = 0, j = 0;
         point_t tmp_vec[grainSize];
+
         for(size_t i=range.begin(); i!=i_end; ++i) {
-            tmp_vec[j++] = util::GenerateRNDPoint<double>(count, rseed);
+            tmp_vec[j++] = util::GenerateRNDPoint<double>(count,the_rng,util::rng::max_rand);
         }
 #if USECONCVEC
-        appendVector(tmp_vec, j, points);
+        grow_vector_to_at_least(points,range.end());
 #else // USE STD::VECTOR
-        appendVector(insertMutex, tmp_vec, j, points);
+        grow_vector_to_at_least(insertMutex,points,range.end());
 #endif // USECONCVEC
+        std::copy(tmp_vec, tmp_vec+j,points.begin()+range.begin());
     }   
 };
 
@@ -293,11 +299,22 @@ mutex_t FillRNDPointsVector_buf::insertMutex = mutex_t();
 
 template<typename BodyType>
 void initialize(pointVec_t &points) {
+    //This function generate the same series of point on every call.
+    //Reproducibility is needed for benchmarking to produce reliable results.
+    //It is achieved through the following points:
+    //      - FillRNDPointsVector_buf instance has its own local instance
+    //        of random number generator, which in turn does not use any global data
+    //      - tbb::simple_partitioner produce the same set of ranges on every call to
+    //        tbb::parallel_for
+    //      - local RNG instances are seeded by the starting indexes of corresponding ranges
+    //      - grow_to_at_least() enables putting points into the resulting vector in deterministic order
+    //        (unlike concurrent push_back or grow_by).
+
     // In the buffered version, a temporary storage for as much as grainSize elements 
     // is allocated inside the body. Since auto_partitioner may increase effective
     // range size which would cause a crash, simple partitioner has to be used.
 
-    tbb::parallel_for(range_t(0, cfg::MAXPOINTS, BodyType::grainSize),
+    tbb::parallel_for(range_t(0, cfg::numberOfPoints, BodyType::grainSize),
     BodyType(points), tbb::simple_partitioner());
 }
 
@@ -307,7 +324,7 @@ public:
         minX, maxX
     } extremumType;
 
-    static const size_t  grainSize = cfg::FINDEXT_GS;
+    static const size_t  grainSize = cfg::findExtremumGrainSize;
 
     FindXExtremum(const pointVec_t& points_, extremumType exType_)
         : points(points_), exType(exType_), extrXPoint(points[0]) {}
@@ -365,7 +382,7 @@ class SplitByCP {
     point_t              farPoint;
     double               howFar;
 public:
-    static const size_t grainSize = cfg::DIVIDE_GS;
+    static const size_t grainSize = cfg::divideGrainSize;
 #if !USECONCVEC
     static mutex_t      pushBackMutex;
 #endif // USECONCVEC
@@ -425,7 +442,7 @@ class SplitByCP_buf {
     point_t              farPoint;
     double               howFar;
 public:
-    static const size_t  grainSize = cfg::DIVIDE_GS;
+    static const size_t  grainSize = cfg::divideGrainSize;
 #if !USECONCVEC
     static mutex_t       insertMutex;
 #endif // USECONCVEC
@@ -491,7 +508,7 @@ point_t divide(const pointVec_t &P, pointVec_t &P_reduced,
     tbb::parallel_reduce(range_t(0, P.size(), BodyType::grainSize),
                          body, tbb::simple_partitioner() );
 
-    if(util::VERBOSE) {
+    if(util::verbose) {
         std::stringstream ss;
         ss << P.size() << " nodes in bucket"<< ", "
             << "dividing by: [ " << p1 << ", " << p2 << " ], "
@@ -564,8 +581,6 @@ void quickhull(const pointVec_t &points, pointVec_t &hull, bool buffered) {
 int main(int argc, char* argv[]) {
     util::ParseInputArgs(argc, argv);
 
-    pointVec_t      points;
-    pointVec_t      hull;
     int             nthreads;
     util::my_time_t tm_init, tm_start, tm_end;
 
@@ -575,29 +590,21 @@ int main(int argc, char* argv[]) {
     std::cout << "Starting STL locked unbuffered push_back version of QUICK HULL algorithm" << std::endl;
 #endif // USECONCVEC
 
-#if INIT_ONCE
-    tm_init = util::gettime();
-    serial_initialize(points);
-    tm_start = util::gettime();
-    std::cout << "Serial init time: " << util::time_diff(tm_init, tm_start) << "  Points in input: " << points.size() << "\n";
-
-#endif
-
-    for(nthreads=cfg::NUM_THREADS_START; nthreads<=cfg::NUM_THREADS_END;
+    for(nthreads=cfg::threads.first; nthreads<=cfg::threads.last;
         ++nthreads) {
+        pointVec_t      points;
+        pointVec_t      hull;
+
         tbb::task_scheduler_init init(nthreads);
-#if !INIT_ONCE
-        points.clear();
         tm_init = util::gettime();
         initialize<FillRNDPointsVector>(points);
         tm_start = util::gettime();
         std::cout << "Parallel init time on " << nthreads << " threads: " << util::time_diff(tm_init, tm_start) << "  Points in input: " << points.size() << "\n";
-#endif // !INIT_ONCE
+
         tm_start = util::gettime();
         quickhull(points, hull, false);
         tm_end = util::gettime();
         std::cout << "Time on " << nthreads << " threads: " << util::time_diff(tm_start, tm_end) << "  Points in hull: " << hull.size() << "\n";
-        hull.clear();
     }
 
 #if USECONCVEC 
@@ -606,21 +613,22 @@ int main(int argc, char* argv[]) {
     std::cout << "Starting STL locked buffered version of QUICK HULL algorithm" << std::endl;
 #endif
 
-    for(nthreads=cfg::NUM_THREADS_START; nthreads<=cfg::NUM_THREADS_END;
+    for(nthreads=cfg::threads.first; nthreads<=cfg::threads.last;
         ++nthreads) {
+        pointVec_t      points;
+        pointVec_t      hull;
+
         tbb::task_scheduler_init init(nthreads);
-#if !INIT_ONCE
-        points.clear();
+
         tm_init = util::gettime();
         initialize<FillRNDPointsVector_buf>(points);
         tm_start = util::gettime();
         std::cout << "Init time on " << nthreads << " threads: " << util::time_diff(tm_init, tm_start) << "  Points in input: " << points.size() << "\n";
-#endif // !INIT_ONCE
+
         tm_start = util::gettime();
         quickhull(points, hull, true);
         tm_end = util::gettime();
         std::cout << "Time on " << nthreads << " threads: " << util::time_diff(tm_start, tm_end) << "  Points in hull: " << hull.size() << "\n";
-        hull.clear();
     }    
 
     return 0;
@@ -629,10 +637,10 @@ int main(int argc, char* argv[]) {
 #endif // USETBB
 
 void serial_initialize(pointVec_t &points) {
-    points.resize(cfg::MAXPOINTS);
+    points.reserve(cfg::numberOfPoints);
 
     unsigned int rseed=1;
-    for(size_t i=0, count=0; long(i)<cfg::MAXPOINTS; ++i) {
-        points[i] = util::GenerateRNDPoint<double>(count, rseed);
+    for(size_t i=0, count=0; long(i)<cfg::numberOfPoints; ++i) {
+        points.push_back(util::GenerateRNDPoint<double>(count,&std::rand,RAND_MAX ));
     }
 }
diff --git a/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp b/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp
index 44e2774..ec46c44 100644
--- a/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp
+++ b/examples/parallel_reduce/convex_hull/convex_hull_sample.cpp
@@ -35,6 +35,7 @@
     - only buffered version is used
 */
 #include <cassert>
+#include <algorithm>
 #include "convex_hull.h"
 
 #include "tbb/task_scheduler_init.h"
@@ -44,8 +45,6 @@
 #include "tbb/tick_count.h"
 #include "tbb/concurrent_vector.h"
 
-#define INIT_ONCE 1
-
 typedef util::point<double>               point_t;
 typedef tbb::concurrent_vector< point_t > pointVec_t;
 typedef tbb::blocked_range<size_t>        range_t;
@@ -57,44 +56,49 @@ void appendVector(const point_t* src, size_t srcSize, pointVec_t& dest) {
 void appendVector(const pointVec_t& src, pointVec_t& dest) {
     std::copy(src.begin(), src.end(), dest.grow_by(src.size()));
 }
-
 class FillRNDPointsVector_buf {
     pointVec_t          &points;
-    mutable unsigned int rseed;
 public:
-    static const size_t  grainSize = cfg::GENERATE_GS;
-
-    FillRNDPointsVector_buf(pointVec_t& _points)
-        : points(_points), rseed(1) {}
+    static const size_t  grainSize = cfg::generateGrainSize;
 
-    FillRNDPointsVector_buf(const FillRNDPointsVector_buf& other)
-        : points(other.points), rseed(other.rseed+1) {}
+    explicit FillRNDPointsVector_buf(pointVec_t& _points)
+        : points(_points) {}
 
     void operator()(const range_t& range) const {
+        util::rng the_rng(range.begin());
         const size_t i_end = range.end();
         size_t count = 0, j = 0;
         point_t tmp_vec[grainSize];
+
         for(size_t i=range.begin(); i!=i_end; ++i) {
-            tmp_vec[j++] = util::GenerateRNDPoint<double>(count, rseed);
+            tmp_vec[j++] = util::GenerateRNDPoint<double>(count, the_rng, util::rng::max_rand);
         }
-        appendVector(tmp_vec, j, points);
+        //Here we have race condition. Elements being written to may be still under construction.
+        //For C++ 2003 it is workarounded by vector element type which default constructor does not touch memory,
+        //it being constructed on. See comments near default ctor of point class for more details.
+        //Strictly speaking it is UB.
+        //TODO: need to find more reliable/correct way
+        points.grow_to_at_least(range.end());
+        std::copy(tmp_vec, tmp_vec+j,points.begin()+range.begin());
     }
 };
 
-void serial_initialize(pointVec_t &points) {
-    points.resize(cfg::MAXPOINTS);
-
-    unsigned int rseed=1;
-    for(size_t i=0, count=0; long(i)<cfg::MAXPOINTS; ++i) {
-        points[i] = util::GenerateRNDPoint<double>(count, rseed);
-    }
-}
-
 void initialize(pointVec_t &points) {
+    //This function generate the same series of point on every call.
+    //Reproducibility is needed for benchmarking to produce reliable results.
+    //It is achieved through the following points:
+    //      - FillRNDPointsVector_buf instance has its own local instance
+    //        of random number generator, which in turn does not use any global data
+    //      - tbb::simple_partitioner produce the same set of ranges on every call to
+    //        tbb::parallel_for
+    //      - local RNG instances are seeded by the starting indexes of corresponding ranges
+    //      - grow_to_at_least() enables putting points into the resulting vector in deterministic order
+    //        (unlike concurrent push_back or grow_by).
+
     // In the buffered version, a temporary storage for as much as grainSize elements 
     // is allocated inside the body. Since auto_partitioner may increase effective
     // range size which would cause a crash, simple partitioner has to be used.
-    tbb::parallel_for(range_t(0, cfg::MAXPOINTS, FillRNDPointsVector_buf::grainSize),
+    tbb::parallel_for(range_t(0, cfg::numberOfPoints, FillRNDPointsVector_buf::grainSize),
                       FillRNDPointsVector_buf(points), tbb::simple_partitioner());
 }
 
@@ -104,7 +108,7 @@ public:
         minX, maxX
     } extremumType;
 
-    static const size_t  grainSize = cfg::FINDEXT_GS;
+    static const size_t  grainSize = cfg::findExtremumGrainSize;
 
     FindXExtremum(const pointVec_t& points_, extremumType exType_)
         : points(points_), exType(exType_), extrXPoint(points[0]) {}
@@ -164,7 +168,7 @@ class SplitByCP_buf {
     point_t              farPoint;
     double               howFar;
 public:
-    static const size_t  grainSize = cfg::DIVIDE_GS;
+    static const size_t  grainSize = cfg::divideGrainSize;
 
     SplitByCP_buf( point_t _p1, point_t _p2,
         const pointVec_t &_initialSet, pointVec_t &_reducedSet)
@@ -217,7 +221,7 @@ point_t divide(const pointVec_t &P, pointVec_t &P_reduced,
     tbb::parallel_reduce(range_t(0, P.size(), SplitByCP_buf::grainSize),
                          sbcpb, tbb::simple_partitioner());
 
-    if(util::VERBOSE) {
+    if(util::verbose) {
         std::stringstream ss;
         ss << P.size() << " nodes in bucket"<< ", "
             << "dividing by: [ " << p1 << ", " << p2 << " ], "
@@ -265,36 +269,41 @@ void quickhull(const pointVec_t &points, pointVec_t &hull) {
 }
 
 int main(int argc, char* argv[]) {
+    util::my_time_t tm_main_begin = util::gettime();
+
     util::ParseInputArgs(argc, argv);
 
-    pointVec_t      points, tmp_points;
+    pointVec_t      points;
     pointVec_t      hull;
     int             nthreads;
-    util::my_time_t tm_init, tm_start, tm_end;
 
-    std::cout << "Starting TBB-buffered version of QUICK HULL algorithm" << std::endl;
+    points.reserve(cfg::numberOfPoints);
+
+    if(!util::silent) {
+        std::cout << "Starting TBB-buffered version of QUICK HULL algorithm" << std::endl;
+    }
 
-    tm_init = util::gettime();
-    serial_initialize(points);
-    tm_start = util::gettime();
-    std::cout << "Serial init time: " << util::time_diff(tm_init, tm_start) << "  Points in input: " << points.size() << "\n";
 
-    for(nthreads=cfg::NUM_THREADS_START; nthreads<=cfg::NUM_THREADS_END;
+    for(nthreads=cfg::threads.first; nthreads<=cfg::threads.last;
         ++nthreads) {
         tbb::task_scheduler_init init(nthreads);
-#if !INIT_ONCE
-        tmp_points.clear();
-        tm_init = util::gettime();
-        initialize(tmp_points);
-        tm_start = util::gettime();
-        std::cout << "Init time on " << nthreads << " threads: " << util::time_diff(tm_init, tm_start) << " Points in input: " << points.size() << "\n";
-#endif
+
+        points.clear();
+        util::my_time_t tm_init = util::gettime();
+        initialize(points);
+        util::my_time_t tm_start = util::gettime();
+        if(!util::silent) {
+            std::cout <<"Init time on "<<nthreads<<" threads: "<<util::time_diff(tm_init, tm_start)<<"  Points in input: "<<points.size()<<std::endl;
+        }
+
         tm_start = util::gettime();
         quickhull(points, hull);
-        tm_end = util::gettime();
-        std::cout << "Time on " << nthreads << " threads: " << util::time_diff(tm_start, tm_end) << " Points in hull: " << hull.size() << "\n";
+        util::my_time_t tm_end = util::gettime();
+        if(!util::silent) {
+            std::cout <<"Time on "<<nthreads<<" threads: "<<util::time_diff(tm_start, tm_end)<<"  Points in hull: "<<hull.size()<<std::endl;
+        }
         hull.clear();
     }
-
+    utility::report_elapsed_time(util::time_diff(tm_main_begin, util::gettime()));
     return 0;
 }
diff --git a/examples/parallel_reduce/convex_hull/index.html b/examples/parallel_reduce/convex_hull/index.html
index 10e9a5e..eb39b12 100644
--- a/examples/parallel_reduce/convex_hull/index.html
+++ b/examples/parallel_reduce/convex_hull/index.html
@@ -43,10 +43,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj b/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj
index 3f43cd2..f6b9c06 100644
--- a/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj
+++ b/examples/parallel_reduce/convex_hull/msvs/convex_hull_benchmark.vcproj
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -199,7 +199,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="3"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -219,7 +219,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -251,7 +251,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -280,7 +280,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="3"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -299,7 +299,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -331,7 +331,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.vcproj b/examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.vcproj
index 160cece..10f0eae 100644
--- a/examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.vcproj
+++ b/examples/parallel_reduce/convex_hull/msvs/convex_hull_sample.vcproj
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -199,7 +199,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="3"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -219,7 +219,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -251,7 +251,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -280,7 +280,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="3"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -299,7 +299,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -331,7 +331,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/parallel_reduce/convex_hull/xcode/convex_hull.xcodeproj/project.pbxproj b/examples/parallel_reduce/convex_hull/xcode/convex_hull.xcodeproj/project.pbxproj
index 2f168e9..6b35ba1 100644
--- a/examples/parallel_reduce/convex_hull/xcode/convex_hull.xcodeproj/project.pbxproj
+++ b/examples/parallel_reduce/convex_hull/xcode/convex_hull.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -147,9 +147,16 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
 			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "convex_hull" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 08FB7794FE84155DC02AAC07 /* convex_hull */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -185,14 +192,13 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = convex_hull_sample;
 				ZERO_LINK = NO;
@@ -203,12 +209,12 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = convex_hull_sample;
 				ZERO_LINK = NO;
@@ -225,7 +231,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -241,7 +246,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -250,18 +254,16 @@
 		A1F593C60B8F0E6E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = convex_hull_sample;
 				ZERO_LINK = NO;
@@ -271,15 +273,14 @@
 		A1F593C70B8F0E6E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = convex_hull_sample;
 				ZERO_LINK = NO;
@@ -301,7 +302,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -322,7 +322,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -333,17 +332,15 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = convex_hull_bench;
 				ZERO_LINK = NO;
 			};
@@ -352,20 +349,17 @@
 		A1F594F00B8F4B8200073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = convex_hull_bench;
 				ZERO_LINK = NO;
 			};
@@ -375,16 +369,14 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				COPY_PHASE_STRIP = YES;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = convex_hull_bench;
 				ZERO_LINK = NO;
 			};
@@ -393,18 +385,15 @@
 		A1F594F20B8F4B8200073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
-				PREBINDING = NO;
 				PRODUCT_NAME = convex_hull_bench;
 				ZERO_LINK = NO;
 			};
diff --git a/examples/parallel_reduce/index.html b/examples/parallel_reduce/index.html
index 0104b53..f484c4e 100644
--- a/examples/parallel_reduce/index.html
+++ b/examples/parallel_reduce/index.html
@@ -16,10 +16,9 @@ This directory has examples of the template <code>parallel_reduce</code>.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/parallel_reduce/primes/Makefile b/examples/parallel_reduce/primes/Makefile
index f0a0eca..5d7730f 100644
--- a/examples/parallel_reduce/primes/Makefile
+++ b/examples/parallel_reduce/primes/Makefile
@@ -34,6 +34,10 @@ ifneq (,$(shell which icc 2>/dev/null))
 CXX=icc
 endif # icc
 
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
 all:	release test
 
 release: main.cpp primes.cpp 
diff --git a/examples/parallel_reduce/primes/index.html b/examples/parallel_reduce/primes/index.html
index b346129..2967b0d 100644
--- a/examples/parallel_reduce/primes/index.html
+++ b/examples/parallel_reduce/primes/index.html
@@ -49,10 +49,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/parallel_reduce/primes/msvs/primes.vcproj b/examples/parallel_reduce/primes/msvs/primes.vcproj
index 9fa0671..74d2ef2 100644
--- a/examples/parallel_reduce/primes/msvs/primes.vcproj
+++ b/examples/parallel_reduce/primes/msvs/primes.vcproj
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -198,7 +198,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -250,7 +250,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -278,7 +278,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -329,7 +329,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/parallel_reduce/primes/xcode/primes.xcodeproj/project.pbxproj b/examples/parallel_reduce/primes/xcode/primes.xcodeproj/project.pbxproj
index b0e86a9..2202d31 100644
--- a/examples/parallel_reduce/primes/xcode/primes.xcodeproj/project.pbxproj
+++ b/examples/parallel_reduce/primes/xcode/primes.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -108,9 +108,16 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
 			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "primes" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 08FB7794FE84155DC02AAC07 /* primes */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -138,14 +145,13 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = primes;
 				ZERO_LINK = NO;
@@ -156,12 +162,12 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = primes;
 				ZERO_LINK = NO;
@@ -178,7 +184,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -194,7 +199,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -203,18 +207,16 @@
 		A1F593C60B8F0E6E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = primes;
 				ZERO_LINK = NO;
@@ -224,15 +226,14 @@
 		A1F593C70B8F0E6E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = primes;
 				ZERO_LINK = NO;
@@ -254,7 +255,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -275,7 +275,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
diff --git a/examples/pipeline/index.html b/examples/pipeline/index.html
index c268b91..d5079c9 100644
--- a/examples/pipeline/index.html
+++ b/examples/pipeline/index.html
@@ -14,10 +14,9 @@ This directory has examples of the template <code>pipeline</code>.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/pipeline/square/Makefile b/examples/pipeline/square/Makefile
index fde2bb6..67f2fe5 100644
--- a/examples/pipeline/square/Makefile
+++ b/examples/pipeline/square/Makefile
@@ -26,7 +26,8 @@
 
 # GNU Makefile that builds and runs example.
 PROG=square
-ARGS=input.txt output.txt
+ARGS=0 input.txt output.txt
+PERF_RUN_ARGS=auto input.txt output.txt silent
 GEN=gen_input
 
 # The C++ compiler
@@ -36,6 +37,10 @@ endif # icc
 
 SQUARE = square.cpp
 
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
 all:	release test
 
 release: $(SQUARE) input.txt
@@ -55,3 +60,9 @@ input.txt: $(GEN)
 
 test: input.txt
 	./$(PROG) $(ARGS)
+	
+perf_build: $(SQUARE) input.txt
+	$(CXX) -O2 -msse2 -DNDEBUG $(CXXFLAGS) -o $(PROG) $(SQUARE) -ltbb $(LIBS)
+	
+perf_run: input.txt
+	./$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/pipeline/square/Makefile.windows b/examples/pipeline/square/Makefile.windows
index 0f804ad..5a11a82 100644
--- a/examples/pipeline/square/Makefile.windows
+++ b/examples/pipeline/square/Makefile.windows
@@ -28,7 +28,8 @@
 
 # Just specify your program basename
 PROG=square
-ARGS=input.txt output.txt
+ARGS=0 input.txt output.txt
+PERF_RUN_ARGS=auto input.txt output.txt silent
 
 # Trying to find if icl.exe is set
 CXX1 = $(TBB_CXX)-
@@ -36,7 +37,7 @@ CXX2 = $(CXX1:icl.exe-=icl.exe)
 CXX  = $(CXX2:-=cl.exe)
 
 # The C++ compiler options
-MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 $(CXXFLAGS) /D _CRT_SECURE_NO_DEPRECATE
+MYCXXFLAGS = /TP /EHsc /W3 /nologo /D _CONSOLE /D _MBCS /D WIN32 $(CXXFLAGS) /D _CRT_SECURE_NO_DEPRECATE /D _SECURE_SCL=0 /arch:sse2
 MYLDFLAGS =/INCREMENTAL:NO /NOLOGO /DEBUG /FIXED:NO $(LDFLAGS)
 SQUARE = square.cpp
 
@@ -56,3 +57,6 @@ test: input.txt
 compiler_check:
 	@echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1  || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
 	@cmd.exe /C del compiler_test
+perf_build: release
+perf_run: input.txt
+	$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/pipeline/square/index.html b/examples/pipeline/square/index.html
index 8f3d5bc..32ce6ab 100644
--- a/examples/pipeline/square/index.html
+++ b/examples/pipeline/square/index.html
@@ -37,32 +37,35 @@ Two additional targets for this example:
 
 <H2>Usage</H2>
 <DL>
-<DT><TT>square <I>inputfile</I> <I>outputfile</I> <I>N</I></TT>
-<DD>Run the example on the named <I>inputfile</I> (optional, default value is "input.txt") and produce the named <I>outputfile</I> (optional, default value is "output.txt").
-    <I>N</I> is the number of threads to be used (optional).
-    
+<DT><TT>square <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>square [<I>n-of-threads</I>=value] [<I>input-file</I>=value] [<I>output-file</I>=value] [<I>max-slice-size</I>=value] [<I>silent</I>]</TT>
+<DT><TT>square [<I>n-of-threads</I> [<I>input-file</I> [<I>output-file</I> [<I>max-slice-size</I>]]]] [<I>silent</I>]</TT> 
+<DD><I>n-of-threads</I> is the number of threads to use; a range of the form <I>low</I>[:<I>high</I>], where low and optional high are non-negative integers or 'auto' for the TBB default.<BR>
+    <I>input-file</I> is an input file name.<BR>
+    <I>output-file</I> is an output file name. <BR>
+    <I>max-slice-size</I> is the maximum number of characters in one slice.<BR>
+    <I>silent</I> - no output except elapsed time.<BR>
 <DT><TT>gen_input [<I>LN</I>] > <I>inputfile</I></TT>
 <DD>Generate a file named <I>inputfile</I> consisting of <I>LN</I> lines each containing one integer.
     If not specified, <I>LN</I> is assumed to be 1000000.
-    
-<DT>To run a short version of this example, e.g., for use with Intel® Threading Tools:
+
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector:
 <DD>Build a <I>debug</I> version of the example
     (see the <A HREF=../../index.html#build>build directions</A>).
     <BR>Prepare an <I>inputfile</I> with about 5,000 lines of text (see the instruction above).
     <BR>Run it with this <I>inputfile</I> and the desired number of threads,
-	e.g., <TT>square <I>inputfile</I> <I>outputfile</I> 4</TT>.
+    e.g., <TT>square 4 <I>inputfile</I> <I>outputfile</I></TT>.
 </DL>
 
 <HR>
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
 </HTML>
-
diff --git a/examples/pipeline/square/msvs/square.vcproj b/examples/pipeline/square/msvs/square.vcproj
index 1311ee6..3632731 100644
--- a/examples/pipeline/square/msvs/square.vcproj
+++ b/examples/pipeline/square/msvs/square.vcproj
@@ -47,7 +47,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -67,7 +67,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -97,7 +97,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -130,7 +130,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG;_CRT_SECURE_NO_DEPRECATE"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -149,7 +149,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -179,7 +179,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -210,7 +210,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -230,7 +230,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -262,7 +262,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -294,7 +294,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -313,7 +313,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -345,7 +345,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
@@ -374,6 +374,10 @@
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
 		</Filter>
+		<File
+			RelativePath="..\index.html"
+			>
+		</File>
 	</Files>
 	<Globals>
 	</Globals>
diff --git a/examples/pipeline/square/square.cpp b/examples/pipeline/square/square.cpp
index fe7f48c..176b80d 100644
--- a/examples/pipeline/square/square.cpp
+++ b/examples/pipeline/square/square.cpp
@@ -38,6 +38,7 @@
 #include <cstdlib>
 #include <cstdio>
 #include <cctype>
+#include "../../common/utility/utility.h"
 
 using namespace std;
 
@@ -79,9 +80,9 @@ public:
     void set_end( char* p ) {logical_end=p;}
 };
 
-const size_t MAX_CHAR_PER_INPUT_SLICE = 4000;
-static const char* InputFileName = "input.txt";
-static const char* OutputFileName = "output.txt";
+size_t MAX_CHAR_PER_INPUT_SLICE = 4000;
+string InputFileName = "input.txt";
+string OutputFileName = "output.txt";
 
 class MyInputFilter: public tbb::filter {
 public:
@@ -181,51 +182,25 @@ void* MyOutputFilter::operator()( void* item ) {
     TextSlice& out = *static_cast<TextSlice*>(item);
     size_t n = fwrite( out.begin(), 1, out.size(), my_output_file );
     if( n!=out.size() ) {
-        fprintf(stderr,"Can't write into file '%s'\n", OutputFileName);
+        fprintf(stderr,"Can't write into file '%s'\n", OutputFileName.c_str());
         exit(1);
     }
     out.free();
     return NULL;
 }
 
-static int NThread = tbb::task_scheduler_init::automatic;
-static bool is_number_of_threads_set = false;
-
-void Usage()
-{
-    fprintf( stderr, "Usage:\tsquare [input-file [output-file [nthread]]]\n");
-}
-
-int ParseCommandLine(  int argc, char* argv[] ) {
-    // Parse command line
-    if( argc> 4 ){
-        Usage();
-        return 0;
-    }
-    if( argc>=2 ) InputFileName = argv[1];
-    if( argc>=3 ) OutputFileName = argv[2];
-    if( argc>=4 ) {
-        NThread = strtol(argv[3],0,0);
-        if( NThread<1 ) {
-            fprintf(stderr,"nthread set to %d, but must be at least 1\n",NThread);
-            return 0;
-        }
-        is_number_of_threads_set = true; //Number of threads is set explicitly
-    }
-    return 1;
-}
+bool silent = false;
 
 int run_pipeline( int nthreads )
 {
-    FILE* input_file = fopen(InputFileName,"r");
+    FILE* input_file = fopen( InputFileName.c_str(), "r" );
     if( !input_file ) {
-        perror( InputFileName );
-        Usage();
+        throw std::invalid_argument( ("Invalid input file name: "+InputFileName).c_str() );
         return 0;
     }
-    FILE* output_file = fopen(OutputFileName,"w");
+    FILE* output_file = fopen( OutputFileName.c_str(), "w" );
     if( !output_file ) {
-        perror( OutputFileName );
+        throw std::invalid_argument( ("Invalid output file name: "+OutputFileName).c_str() );
         return 0;
     }
 
@@ -254,37 +229,56 @@ int run_pipeline( int nthreads )
     fclose( output_file );
     fclose( input_file );
 
-    if (is_number_of_threads_set) {
-        printf("threads = %d time = %g\n", nthreads, (t1-t0).seconds());
-    } else {
-        if ( nthreads == 1 ){
-            printf("serial run   time = %g\n", (t1-t0).seconds());
-        } else {
-            printf("parallel run time = %g\n", (t1-t0).seconds());
-        }
-    }
+    if ( !silent ) printf("time = %g\n", (t1-t0).seconds());
+
     return 1;
 }
 
 int main( int argc, char* argv[] ) {
-    if(!ParseCommandLine( argc, argv ))
-        return 1;
-    if (is_number_of_threads_set) {
-        // Start task scheduler
-        tbb::task_scheduler_init init( NThread );
-        if(!run_pipeline (NThread))
-            return 1;
-    } else { // Number of threads wasn't set explicitly. Run serial and parallel version
-        { // serial run
-            tbb::task_scheduler_init init_serial(1);
-            if(!run_pipeline (1))
-                return 1;
-        }
-        { // parallel run (number of threads is selected automatically)
-            tbb::task_scheduler_init init_parallel;
-            if(!run_pipeline (init_parallel.default_num_threads()))
-                return 1;
+    try {
+        tbb::tick_count mainStartTime = tbb::tick_count::now();
+
+        // The 1st argument is the function to obtain 'auto' value; the 2nd is the default value
+        // The example interprets 0 threads as "run serially, then fully subscribed"
+        utility::thread_number_range threads( tbb::task_scheduler_init::default_num_threads, 0 );
+
+        utility::parse_cli_arguments(argc,argv,
+            utility::cli_argument_pack()
+            //"-h" option for for displaying help is present implicitly
+            .positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default.")
+            .positional_arg(InputFileName,"input-file","input file name")
+            .positional_arg(OutputFileName,"output-file","output file name")
+            .positional_arg(MAX_CHAR_PER_INPUT_SLICE, "max-slice-size","the maximum number of characters in one slice")
+            .arg(silent,"silent","no output except elapsed time")
+            );
+
+        if ( threads.first ) {
+            for(int p = threads.first;  p <= threads.last; ++p ) {
+                if ( !silent ) printf("threads = %d ", p);
+                tbb::task_scheduler_init init(p);
+                if(!run_pipeline (p))
+                    return 1;
+            }
+        } else { // Number of threads wasn't set explicitly. Run serial and parallel version
+            { // serial run
+                if ( !silent ) printf("serial run   ");
+                tbb::task_scheduler_init init_serial(1);
+                if(!run_pipeline (1))
+                    return 1;
+            }
+            { // parallel run (number of threads is selected automatically)
+                if ( !silent ) printf("parallel run ");
+                tbb::task_scheduler_init init_parallel;
+                if(!run_pipeline (init_parallel.default_num_threads()))
+                    return 1;
+            }
         }
+
+        utility::report_elapsed_time((tbb::tick_count::now() - mainStartTime).seconds());
+
+        return 0;
+    } catch(std::exception& e) {
+        std::cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+        return 1;
     }
-    return 0;
 }
diff --git a/examples/pipeline/square/xcode/square.xcodeproj/project.pbxproj b/examples/pipeline/square/xcode/square.xcodeproj/project.pbxproj
index fe4eff4..6ef82ba 100644
--- a/examples/pipeline/square/xcode/square.xcodeproj/project.pbxproj
+++ b/examples/pipeline/square/xcode/square.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -143,9 +143,16 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
 			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "square" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 08FB7794FE84155DC02AAC07 /* square */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -206,14 +213,13 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = square;
 				ZERO_LINK = NO;
@@ -224,12 +230,12 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = square;
 				ZERO_LINK = NO;
@@ -246,7 +252,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -262,7 +267,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -273,13 +277,11 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
 				GCC_MODEL_TUNING = G5;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				INSTALL_PATH = "$(HOME)/bin";
-				PREBINDING = NO;
 				PRODUCT_NAME = "gen-input";
 				ZERO_LINK = YES;
 			};
@@ -288,13 +290,10 @@
 		6DA3F3E60DE5D36B0039CADE /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_MODEL_TUNING = G5;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				INSTALL_PATH = "$(HOME)/bin";
-				PREBINDING = NO;
 				PRODUCT_NAME = "gen-input";
 				ZERO_LINK = YES;
 			};
@@ -304,12 +303,10 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				COPY_PHASE_STRIP = YES;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
 				GCC_MODEL_TUNING = G5;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				INSTALL_PATH = "$(HOME)/bin";
-				PREBINDING = NO;
 				PRODUCT_NAME = "gen-input";
 				ZERO_LINK = NO;
 			};
@@ -318,13 +315,10 @@
 		6DA3F3E80DE5D36B0039CADE /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_MODEL_TUNING = G5;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				INSTALL_PATH = "$(HOME)/bin";
-				PREBINDING = NO;
 				PRODUCT_NAME = "gen-input";
 				ZERO_LINK = YES;
 			};
@@ -333,18 +327,16 @@
 		A1F593C60B8F0E6E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = square;
 				ZERO_LINK = NO;
@@ -354,15 +346,14 @@
 		A1F593C70B8F0E6E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = square;
 				ZERO_LINK = NO;
@@ -384,7 +375,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -405,7 +395,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
diff --git a/examples/task/index.html b/examples/task/index.html
index 6e10299..3acdd99 100644
--- a/examples/task/index.html
+++ b/examples/task/index.html
@@ -14,10 +14,9 @@ This directory has examples of how to use the raw task scheduler.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/task/tree_sum/Makefile b/examples/task/tree_sum/Makefile
index 5ad6b80..18fcb50 100644
--- a/examples/task/tree_sum/Makefile
+++ b/examples/task/tree_sum/Makefile
@@ -27,12 +27,17 @@
 # GNU Makefile that builds and runs example.
 PROG=tree_sum
 ARGS=
+PERF_RUN_ARGS=auto 100000000 silent
 
 # The C++ compiler
 ifneq (,$(shell which icc 2>/dev/null))
 CXX=icc
 endif # icc
 
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
 all:	release test
 
 release: *.cpp
@@ -46,4 +51,9 @@ clean:
 
 test:
 	./$(PROG) $(ARGS)
-	./$(PROG) -stdmalloc $(ARGS)
+	./$(PROG) stdmalloc $(ARGS)
+	
+perf_build: release
+
+perf_run:
+	./$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/task/tree_sum/Makefile.windows b/examples/task/tree_sum/Makefile.windows
index fd3b482..f9f97be 100644
--- a/examples/task/tree_sum/Makefile.windows
+++ b/examples/task/tree_sum/Makefile.windows
@@ -29,6 +29,7 @@
 # Just specify your program basename
 PROG=Tree_sum
 ARGS=
+PERF_RUN_ARGS=auto 100000000 silent
 
 # Trying to find if icl.exe is set
 CXX1 = $(TBB_CXX)-
@@ -48,7 +49,12 @@ clean:
 	@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest
 test:
 	$(PROG) $(ARGS)
-	$(PROG) -stdmalloc $(ARGS)
+	$(PROG) stdmalloc $(ARGS)
+perf_build: release
+
+perf_run:
+	$(PROG) $(PERF_RUN_ARGS)
+
 compiler_check:
 	@echo compiler_test>compiler_test && @$(CXX) /E compiler_test >nul 2>&1  || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
 	@cmd.exe /C del compiler_test
diff --git a/examples/task/tree_sum/main.cpp b/examples/task/tree_sum/TreeMaker.h
similarity index 60%
copy from examples/task/tree_sum/main.cpp
copy to examples/task/tree_sum/TreeMaker.h
index ac9b06a..64fc448 100644
--- a/examples/task/tree_sum/main.cpp
+++ b/examples/task/tree_sum/TreeMaker.h
@@ -26,28 +26,11 @@
     the GNU General Public License.
 */
 
-#include "common.h"
+#ifndef TREE_MAKER_H_
+#define TREE_MAKER_H_
+
 #include "tbb/tick_count.h"
 #include "tbb/task.h"
-#include "tbb/task_scheduler_init.h"
-#include <cstdlib>
-#include <cstdio>
-#include <cstring>
-
-// The performance of this example can be significantly better when
-// the objects are allocated by the scalable_allocator instead of the
-// default "operator new".  The reason is that the scalable_allocator
-// typically packs small objects more tightly than the default "operator new",
-// resulting in a smaller memory footprint, and thus more efficient use of
-// cache and virtual memory.  Also the scalable_allocator works faster for
-// multi-threaded allocations.
-//
-// Pass -stdmalloc as the 1st command line parameter to use the default "operator new"
-// and see the performance difference.
-
-#include "tbb/scalable_allocator.h"
-
-using namespace std;
 
 static double Pi = 3.14159265358979;
 
@@ -117,7 +100,7 @@ public:
         return root_node;
     }
 
-    static TreeNode* create_and_time( long number_of_nodes ) {
+    static TreeNode* create_and_time( long number_of_nodes, bool silent=false ) {
         tbb::tick_count t0, t1;
         TreeNode* root = allocate_node();
         root->node_count = number_of_nodes;
@@ -127,67 +110,15 @@ public:
         t0 = tbb::tick_count::now();
         root->left  = do_in_one_thread( number_of_nodes/2 );
         t1 = tbb::tick_count::now();
-        printf ("%24s: time = %.1f msec\n", "half created serially", (t1-t0).seconds()*1000);
+        if ( !silent ) printf ("%24s: time = %.1f msec\n", "half created serially", (t1-t0).seconds()*1000);
 
         t0 = tbb::tick_count::now();
         root->right = do_in_parallel( number_of_nodes - number_of_nodes/2 );
         t1 = tbb::tick_count::now();
-        printf ("%24s: time = %.1f msec\n", "half done in parallel", (t1-t0).seconds()*1000);
+        if ( !silent ) printf ("%24s: time = %.1f msec\n", "half done in parallel", (t1-t0).seconds()*1000);
 
         return root;
     }
 };
 
-int main( int argc, char *argv[] ) {
-    // Parse command line parameters
-    // The format is: <exe_name> [-stdmalloc] [num_of_nodes [num_of_threads]]
-    bool use_tbbmalloc = true;
-    int arg_idx = 1;
-    if( argc>1 && strcmp(argv[1], "-stdmalloc")==0 ) {
-        use_tbbmalloc = false;
-        arg_idx = 2;
-    }
-    long number_of_nodes = argc>arg_idx ? strtol(argv[arg_idx],0,0) : 10000000;
-    ++arg_idx;
-    int nthread = argc>arg_idx ? strtol(argv[arg_idx],0,0) : tbb::task_scheduler_init::automatic;
-
-    // Start up scheduler
-    // For production, no argument should be provided to the constructor, so that
-    // the application gets the number of threads that are physically available.
-    tbb::task_scheduler_init init(nthread);
-
-    TreeNode* root;
-    if( use_tbbmalloc ) {
-        printf("Tree creation using TBB scalable allocator\n");
-        root = TreeMaker<tbbmalloc>::create_and_time( number_of_nodes );
-    } else {
-        printf("Tree creation using standard operator new\n");
-        root = TreeMaker<stdmalloc>::create_and_time( number_of_nodes );
-    }
-
-    // Warm up caches
-    SerialSumTree(root);
-    printf("Calculations:\n");
-    const char* which;
-    for( int i=0; i<3; ++i ) {
-        tbb::tick_count t0 = tbb::tick_count::now();
-        Value result;
-        switch( i ) {
-            case 0: 
-                which = "SerialSumTree";
-                result = SerialSumTree(root); 
-                break;
-            case 1: 
-                which = "SimpleParallelSumTree";
-                result = SimpleParallelSumTree(root); 
-                break;
-            case 2: 
-                which = "OptimizedParallelSumTree";
-                result = OptimizedParallelSumTree(root); 
-                break;
-        }
-        tbb::tick_count t1 = tbb::tick_count::now();
-        printf ("%24s: time = %.1f msec, sum=%g\n", which, (t1-t0).seconds()*1000, result);
-    }
-    return 0;
-}
+#endif // TREE_MAKER_H_
diff --git a/examples/task/tree_sum/index.html b/examples/task/tree_sum/index.html
index 52eb389..0c7d5ff 100644
--- a/examples/task/tree_sum/index.html
+++ b/examples/task/tree_sum/index.html
@@ -24,11 +24,11 @@ In addition, the scalable_allocator performs better for multi-threaded allocatio
 <DD>Sums in parallel without any fancy tricks.
 <DT><A HREF="OptimizedParallelSumTree.cpp">OptimizedParallelSumTree.cpp</A><DT>
 <DD>Sums in parallel, using "recycling" and "continuation-passing" tricks. 
-    In this case, it is only slightly faster than the simple version.  
+    In this case, it is only slightly faster than the simple version.
 <DT><A HREF="common.h">common.h</A>
 <DD>Shared declarations.
 <DT><A HREF="main.cpp">main.cpp</A>
-<DD>Driver.
+<DD>Main program which parses command line options and runs the algorithm.
 <DT><A HREF="Makefile">Makefile</A>
 <DD>Makefile for building example.
 </DL>
@@ -47,27 +47,28 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
 
 <H2>Usage</H2>
 <DL>
-<DT><TT>tree_sum [-stdmalloc] <I>S</I> <I>N</I></TT>
-<DD><I>S</I> is the problem size (the number of nodes in the tree).
-    <I>N</I> is the number of threads to be used.
-    <BR>
-    Passing "-stdmalloc" as the 1st parameter causes the default "operator new"
-    to be used for memory allocations instead of the TBB scalable_allocator.
+<DT><TT>tree_sum <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>tree_sum [<I>n-of-threads</I>=value] [<I>number-of-nodes</I>=value] [<I>silent</I>] [<I>stdmalloc</I>]</TT>
+<DT><TT>tree_sum [<I>n-of-threads</I> [<I>number-of-nodes</I>]] [<I>silent</I>] [<I>stdmalloc</I>]</TT> 
+<DD><I>n-of-threads</I> is the number of threads to use; a range of the form <I>low</I>[:<I>high</I>], where low and optional high are non-negative integers or 'auto' for the TBB default.<BR>
+    <I>number-of-nodes</I> is the number of nodes in the tree.<BR>
+    <I>silent</I> - no output except elapsed time.<BR>
+    <I>stdmalloc</I> - causes the default "operator new" to be used for memory allocations instead of the TBB scalable_allocator.<BR>
 
-<DT>To run a short version of this example, e.g., for use with Intel® Threading Tools:
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector:
 <DD>Build a <I>debug</I> version of the example
     (see the <A HREF=../../index.html#build>build directions</A>).
-    <BR>Run it with a small problem size and the desired number of threads, e.g., <TT>tree_sum 100000 4</TT>.
+    <BR>Run it with a small problem size and the desired number of threads, e.g., <TT>tree_sum 4 100000</TT>.
 </DL>
 
 <HR>
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/task/tree_sum/main.cpp b/examples/task/tree_sum/main.cpp
index ac9b06a..f7c4d5d 100644
--- a/examples/task/tree_sum/main.cpp
+++ b/examples/task/tree_sum/main.cpp
@@ -27,9 +27,7 @@
 */
 
 #include "common.h"
-#include "tbb/tick_count.h"
-#include "tbb/task.h"
-#include "tbb/task_scheduler_init.h"
+
 #include <cstdlib>
 #include <cstdio>
 #include <cstring>
@@ -42,152 +40,77 @@
 // cache and virtual memory.  Also the scalable_allocator works faster for
 // multi-threaded allocations.
 //
-// Pass -stdmalloc as the 1st command line parameter to use the default "operator new"
+// Pass stdmalloc as the 1st command line parameter to use the default "operator new"
 // and see the performance difference.
-
 #include "tbb/scalable_allocator.h"
+#include "TreeMaker.h"
+#include "tbb/tick_count.h"
+#include "tbb/task_scheduler_init.h"
 
-using namespace std;
-
-static double Pi = 3.14159265358979;
-
-const bool tbbmalloc = true;
-const bool stdmalloc = false;
-
-template<bool use_tbbmalloc>
-class TreeMaker {
-
-    class SubTreeCreationTask: public tbb::task {
-        TreeNode*& my_root;
-        bool is_continuation;
-        typedef TreeMaker<use_tbbmalloc> MyTreeMaker;
-
-    public:
-        SubTreeCreationTask( TreeNode*& root, long number_of_nodes ) : my_root(root), is_continuation(false) {
-            my_root = MyTreeMaker::allocate_node();
-            my_root->node_count = number_of_nodes;
-            my_root->value = Value(Pi*number_of_nodes);
-        }
+#include "../../common/utility/utility.h"
 
-        tbb::task* execute() {
-            tbb::task* next = NULL;
-            if( !is_continuation ) {
-                long subtree_size = my_root->node_count - 1;
-                if( subtree_size<1000 ) { /* grainsize */
-                    my_root->left  = MyTreeMaker::do_in_one_thread(subtree_size/2);
-                    my_root->right = MyTreeMaker::do_in_one_thread(subtree_size - subtree_size/2);
-                } else {
-                    // Create tasks before spawning any of them.
-                    tbb::task* a = new( allocate_child() ) SubTreeCreationTask(my_root->left,subtree_size/2);
-                    tbb::task* b = new( allocate_child() ) SubTreeCreationTask(my_root->right,subtree_size - subtree_size/2);
-                    recycle_as_continuation();
-                    is_continuation = true;
-                    set_ref_count(2);
-                    spawn(*b);
-                    next = a;
-                }
-            } 
-            return next;
-        }
-    };
+using namespace std;
 
-public:
-    static TreeNode* allocate_node() {
-        return use_tbbmalloc? tbb::scalable_allocator<TreeNode>().allocate(1) : new TreeNode;
-    }
+void Run( const char* which, Value(*SumTree)(TreeNode*), TreeNode* root, bool silent) {
+    tbb::tick_count t0;
+    if ( !silent ) t0 = tbb::tick_count::now();
+    Value result = SumTree(root);
+    if ( !silent ) printf ("%24s: time = %.1f msec, sum=%g\n", which, (tbb::tick_count::now()-t0).seconds()*1000, result);
+}
 
-    static TreeNode* do_in_one_thread( long number_of_nodes ) {
-        if( number_of_nodes==0 ) {
-            return NULL;
-        } else {
-            TreeNode* n = allocate_node();
-            n->node_count = number_of_nodes;
-            n->value = Value(Pi*number_of_nodes);
-            --number_of_nodes;
-            n->left  = do_in_one_thread( number_of_nodes/2 ); 
-            n->right = do_in_one_thread( number_of_nodes - number_of_nodes/2 );
-            return n;
+int main( int argc, const char *argv[] ) {
+    try{
+        tbb::tick_count mainStartTime = tbb::tick_count::now();
+
+        // The 1st argument is the function to obtain 'auto' value; the 2nd is the default value
+        // The example interprets 0 threads as "run serially, then fully subscribed"
+        utility::thread_number_range threads( tbb::task_scheduler_init::default_num_threads, 0 );
+        long number_of_nodes = 10000000;
+        bool silent = false;
+        bool use_stdmalloc = false;
+
+        utility::parse_cli_arguments(argc,argv,
+            utility::cli_argument_pack()
+            //"-h" option for for displaying help is present implicitly
+            .positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default")
+            .positional_arg(number_of_nodes,"number-of-nodes","the number of nodes")
+            .arg(silent,"silent","no output except elapsed time")
+            .arg(use_stdmalloc,"stdmalloc","use standard allocator")
+        );
+
+        TreeNode* root;
+        { // In this scope, TBB will use default number of threads for tree creation
+            tbb::task_scheduler_init init;
+
+            if( use_stdmalloc ) {
+                if ( !silent ) printf("Tree creation using standard operator new\n");
+                root = TreeMaker<stdmalloc>::create_and_time( number_of_nodes, silent );
+            } else {
+                if ( !silent ) printf("Tree creation using TBB scalable allocator\n");
+                root = TreeMaker<tbbmalloc>::create_and_time( number_of_nodes, silent );
+            }
         }
-    }
-
-    static TreeNode* do_in_parallel( long number_of_nodes ) {
-        TreeNode* root_node;
-        SubTreeCreationTask& a = *new(tbb::task::allocate_root()) SubTreeCreationTask(root_node, number_of_nodes);
-        tbb::task::spawn_root_and_wait(a);
-        return root_node;
-    }
-
-    static TreeNode* create_and_time( long number_of_nodes ) {
-        tbb::tick_count t0, t1;
-        TreeNode* root = allocate_node();
-        root->node_count = number_of_nodes;
-        root->value = Value(Pi*number_of_nodes);
-        --number_of_nodes;
-
-        t0 = tbb::tick_count::now();
-        root->left  = do_in_one_thread( number_of_nodes/2 );
-        t1 = tbb::tick_count::now();
-        printf ("%24s: time = %.1f msec\n", "half created serially", (t1-t0).seconds()*1000);
-
-        t0 = tbb::tick_count::now();
-        root->right = do_in_parallel( number_of_nodes - number_of_nodes/2 );
-        t1 = tbb::tick_count::now();
-        printf ("%24s: time = %.1f msec\n", "half done in parallel", (t1-t0).seconds()*1000);
-
-        return root;
-    }
-};
-
-int main( int argc, char *argv[] ) {
-    // Parse command line parameters
-    // The format is: <exe_name> [-stdmalloc] [num_of_nodes [num_of_threads]]
-    bool use_tbbmalloc = true;
-    int arg_idx = 1;
-    if( argc>1 && strcmp(argv[1], "-stdmalloc")==0 ) {
-        use_tbbmalloc = false;
-        arg_idx = 2;
-    }
-    long number_of_nodes = argc>arg_idx ? strtol(argv[arg_idx],0,0) : 10000000;
-    ++arg_idx;
-    int nthread = argc>arg_idx ? strtol(argv[arg_idx],0,0) : tbb::task_scheduler_init::automatic;
-
-    // Start up scheduler
-    // For production, no argument should be provided to the constructor, so that
-    // the application gets the number of threads that are physically available.
-    tbb::task_scheduler_init init(nthread);
-
-    TreeNode* root;
-    if( use_tbbmalloc ) {
-        printf("Tree creation using TBB scalable allocator\n");
-        root = TreeMaker<tbbmalloc>::create_and_time( number_of_nodes );
-    } else {
-        printf("Tree creation using standard operator new\n");
-        root = TreeMaker<stdmalloc>::create_and_time( number_of_nodes );
-    }
 
-    // Warm up caches
-    SerialSumTree(root);
-    printf("Calculations:\n");
-    const char* which;
-    for( int i=0; i<3; ++i ) {
-        tbb::tick_count t0 = tbb::tick_count::now();
-        Value result;
-        switch( i ) {
-            case 0: 
-                which = "SerialSumTree";
-                result = SerialSumTree(root); 
-                break;
-            case 1: 
-                which = "SimpleParallelSumTree";
-                result = SimpleParallelSumTree(root); 
-                break;
-            case 2: 
-                which = "OptimizedParallelSumTree";
-                result = OptimizedParallelSumTree(root); 
-                break;
+        // Warm up caches
+        SerialSumTree(root);
+        if ( !silent ) printf("Calculations:\n");
+        if ( threads.first ) {
+            for(int p = threads.first;  p <= threads.last; ++p ) {
+                if ( !silent ) printf("threads = %d\n", p );
+                tbb::task_scheduler_init init( p );
+                Run ( "SimpleParallelSumTree", SimpleParallelSumTree, root, silent );
+                Run ( "OptimizedParallelSumTree", OptimizedParallelSumTree, root, silent );
+            }
+        } else { // Number of threads wasn't set explicitly. Run serial and two parallel versions
+            Run ( "SerialSumTree", SerialSumTree, root, silent );
+            tbb::task_scheduler_init init;
+            Run ( "SimpleParallelSumTree", SimpleParallelSumTree, root, silent );
+            Run ( "OptimizedParallelSumTree", OptimizedParallelSumTree, root, silent );
         }
-        tbb::tick_count t1 = tbb::tick_count::now();
-        printf ("%24s: time = %.1f msec, sum=%g\n", which, (t1-t0).seconds()*1000, result);
+        utility::report_elapsed_time((tbb::tick_count::now() - mainStartTime).seconds());
+        return 0;
+    }catch(std::exception& e){
+        std::cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+        return 1;
     }
-    return 0;
 }
diff --git a/examples/task/tree_sum/msvs/tree_sum.vcproj b/examples/task/tree_sum/msvs/tree_sum.vcproj
index 4f85ec3..ffe61c6 100644
--- a/examples/task/tree_sum/msvs/tree_sum.vcproj
+++ b/examples/task/tree_sum/msvs/tree_sum.vcproj
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -198,7 +198,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib tbbmalloc.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -250,7 +250,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -278,7 +278,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib tbbmalloc.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -329,7 +329,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
@@ -361,6 +361,10 @@
 				RelativePath="..\SimpleParallelSumTree.cpp"
 				>
 			</File>
+			<File
+				RelativePath="..\TreeMaker.h"
+				>
+			</File>
 		</Filter>
 		<File
 			RelativePath="..\index.html"
diff --git a/examples/task/tree_sum/xcode/tree_sum.xcodeproj/project.pbxproj b/examples/task/tree_sum/xcode/tree_sum.xcodeproj/project.pbxproj
index e2600b9..02843a4 100644
--- a/examples/task/tree_sum/xcode/tree_sum.xcodeproj/project.pbxproj
+++ b/examples/task/tree_sum/xcode/tree_sum.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -120,9 +120,16 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
 			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "tree_sum" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 08FB7794FE84155DC02AAC07 /* tree_sum */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -152,14 +159,13 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = tree_sum;
 				ZERO_LINK = NO;
@@ -170,12 +176,12 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = tree_sum;
 				ZERO_LINK = NO;
@@ -192,7 +198,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -208,7 +213,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -217,18 +221,16 @@
 		A1F593C60B8F0E6E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = tree_sum;
 				ZERO_LINK = NO;
@@ -238,15 +240,14 @@
 		A1F593C70B8F0E6E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = tree_sum;
 				ZERO_LINK = NO;
@@ -268,7 +269,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -289,7 +289,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
diff --git a/examples/task_group/index.html b/examples/task_group/index.html
index 7656b53..7f3ec4e 100644
--- a/examples/task_group/index.html
+++ b/examples/task_group/index.html
@@ -14,10 +14,9 @@ This directory has examples of how to use task_groups.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/task_group/sudoku/Makefile b/examples/task_group/sudoku/Makefile
index 180d19f..5c45df4 100644
--- a/examples/task_group/sudoku/Makefile
+++ b/examples/task_group/sudoku/Makefile
@@ -26,7 +26,8 @@
 
 # GNU Makefile that builds and runs example.
 PROG=sudoku
-ARGS=input1 4 0 -p
+ARGS=4 input1 verbose
+PERF_RUN_ARGS=auto input1 silent
 
 # The C++ compiler
 ifneq (,$(shell which icc 2>/dev/null))
@@ -36,6 +37,10 @@ ifeq ($(CXX),icc)
 CXX0XFLAGS=-std=c++0x -D_TBB_CPP0X
 endif # icc
 
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
 all:	release test
 
 release: *.cpp
@@ -49,3 +54,9 @@ clean:
 
 test:
 	./$(PROG) $(ARGS)
+
+perf_build: release
+
+perf_run:
+	./$(PROG) $(PERF_RUN_ARGS)
+
diff --git a/examples/task_group/sudoku/Makefile.windows b/examples/task_group/sudoku/Makefile.windows
index 246377f..0a2d2c6 100644
--- a/examples/task_group/sudoku/Makefile.windows
+++ b/examples/task_group/sudoku/Makefile.windows
@@ -28,7 +28,8 @@
 
 # Just specify your program basename
 PROG=sudoku
-ARGS=input1 4 2 -p
+ARGS= 4 input1 verbose
+PERF_RUN_ARGS=auto input1 silent
 
 # Trying to find if icl.exe is set
 CXX1 = $(TBB_CXX)-
@@ -50,3 +51,8 @@ test:
 	$(PROG) $(ARGS)
 compiler_check:
 	@$(CXX) >nul 2>&1 || echo "$(CXX) command not found. Check if CXX=$(CXX) is set properly"
+
+perf_build: release
+
+perf_run:
+	$(PROG) $(PERF_RUN_ARGS)
diff --git a/examples/task_group/sudoku/index.html b/examples/task_group/sudoku/index.html
index 4067e3c..4967344 100644
--- a/examples/task_group/sudoku/index.html
+++ b/examples/task_group/sudoku/index.html
@@ -43,26 +43,30 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
 
 <H2>Usage</H2>
 <DL>
-<DT><TT>sudoku [<I>N</I>]</TT>
-<DT><TT>sudoku <I>inputfile</I> <I>N</I> <I>S</I> [<I>-p</I>]</TT>
-<DD><I>N</I> is the number of threads to be used.
-    <I>S</I> is the number of solutions to find: 1 finds the first, any other number will find all solutions.
-    <I>-p</I> prints the first solution (optional argument)
 
-<DT>To run a short version of this example, e.g., for use with Intel® Threading Tools:
+<DT><TT>sudoku <I>-h</I></TT>
+<DD>Prints the help for command line options
+<DT><TT>sudoku [<I>n-of-threads</I>=value] [<I>filename</I>=value] [<I>verbose</I>] [<I>silent</I>] [<I>find-one</I>]</TT>
+<DT><TT>sudoku [n-of-threads [filename]] [<I>verbose</I>] [<I>silent</I>] [<I>find-one</I>]</TT> 
+<DD><I>n-of-threads</I> is the number of threads to use; a range of the form <I>low</I>[:<I>high</I>], where low and optional high are non-negative integers or 'auto' for the TBB default.<BR>
+    <I>filename</I> is an input filename.<BR>
+    <I>verbose</I> - prints the first solution.<BR>
+    <I>silent</I> - no output except elapsed time.<BR>
+    <I>find-one</I> - stops after finding first solution.<BR>
+
+<DT>To run a short version of this example, e.g., for use with Intel® Parallel Inspector:
 <DD>Build a <I>debug</I> version of the example
     (see the <A HREF=../../index.html#build>build directions</A>).
-    <BR>Run it with a small problem size and the desired number of threads, e.g., <TT>sudoku input2 4</TT>.
+    <BR>Run it with a small problem size and the desired number of threads, e.g., <TT>sudoku 4 input2</TT>.
 </DL>
 
 <HR>
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
-registered trademarks or trademarks of Intel Corporation or its
-subsidiaries in the United States and other countries.
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/task_group/sudoku/msvs/sudoku.vcproj b/examples/task_group/sudoku/msvs/sudoku.vcproj
index 9aa1f53..a84ca15 100644
--- a/examples/task_group/sudoku/msvs/sudoku.vcproj
+++ b/examples/task_group/sudoku/msvs/sudoku.vcproj
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib tbbmalloc_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -198,7 +198,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib tbbmalloc.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -250,7 +250,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -278,7 +278,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib tbbmalloc.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -329,7 +329,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/task_group/sudoku/sudoku.cpp b/examples/task_group/sudoku/sudoku.cpp
index 4640c4e..5e71923 100644
--- a/examples/task_group/sudoku/sudoku.cpp
+++ b/examples/task_group/sudoku/sudoku.cpp
@@ -26,12 +26,15 @@
     the GNU General Public License.
 */
 
+
 #include <cstdio>
 #include <cstdlib>
+#include <string>
 #include "tbb/atomic.h"
 #include "tbb/tick_count.h"
 #include "tbb/task_scheduler_init.h"
 #include "tbb/task_group.h"
+#include "../../common/utility/utility.h"
 
 #pragma warning(disable: 4996)
 
@@ -44,17 +47,18 @@ using namespace tbb;
 using namespace std;
 
 atomic<unsigned> nSols;
-unsigned NThreads, NSolutions;
-bool Verbose=false;
+bool find_one = false;
+bool verbose = false;
 unsigned short init_values[BOARD_SIZE] = {1,0,0,9,0,0,0,8,0,0,8,0,2,0,0,0,0,0,0,0,5,0,0,0,7,0,0,0,5,2,1,0,0,4,0,0,0,0,0,0,0,5,0,0,7,4,0,0,7,0,0,0,3,0,0,3,0,0,0,2,0,0,5,0,0,0,0,0,0,1,0,0,5,0,0,0,1,0,0,0,0};
 task_group *g;
+double solve_time;
 
 typedef struct {
     unsigned short solved_element;
     unsigned potential_set;
 } board_element;
 
-void read_board(char *filename) {
+void read_board(const char *filename) {
     FILE *fp;
     int input;
     fp = fopen(filename, "r");
@@ -211,9 +215,9 @@ public:
 
 void partial_solve(board_element *b, unsigned first_potential_set) {
     if (fixed_board(b)) {
-        if (NSolutions == 1)
+        if ( find_one )
             g->cancel();
-        if (++nSols==1 && Verbose) {
+        if (++nSols==1 && verbose) {
             print_board(b);
         }
         free(b);
@@ -246,50 +250,72 @@ void partial_solve(board_element *b, unsigned first_potential_set) {
     }
 }
 
-void ParseCommandLine(int argc, char *argv[]) {
-    NThreads = 4;
-    Verbose = true;
-    NSolutions = 2;
-    if (argc != 4 && argc != 5 && argc != 2 && argc != 1) {
-        fprintf(stderr, 
-                "Usage: sudoku [<nthreads>]\n"
-                "       sudoku <inputfilename> <nthreads> <nSolutions> [-p]\n"
-                "  where: nSolutions=1 stops after finding first solution\n"
-                "           and any other value finds all solutions; \n"
-                "         -p prints the first solution.\n");
-        exit(1);
-    }
-    if (argc == 2) {
-        sscanf(argv[1], "%d", &NThreads);
-    }
-    else if (argc > 3) {
-        sscanf(argv[2], "%d", &NThreads);
-        sscanf(argv[3], "%d", &NSolutions);
-        if (argc!=5) Verbose = false;
-        read_board(argv[1]);
-    }
-}
-
-int main(int argc, char *argv[]) {
-    board_element *start_board;
-    start_board = (board_element *)malloc(BOARD_SIZE*sizeof(board_element));
-    NThreads = 1;
+unsigned solve(int p) {
+    task_scheduler_init init(p);
     nSols = 0;
-    ParseCommandLine(argc, argv);
+    board_element *start_board = (board_element *)malloc(BOARD_SIZE*sizeof(board_element));
     init_board(start_board, init_values);
-    task_scheduler_init init(NThreads);
     g = new task_group;
     tick_count t0 = tick_count::now();
     partial_solve(start_board, 0);
     g->wait();
-    tick_count t1 = tick_count::now();
+    solve_time = (tick_count::now() - t0).seconds();
     delete g;
+    return nSols;
+}
 
-    if (NSolutions == 1) {
-        printf("Sudoku: Time to find first solution on %d threads: %6.6f seconds.\n", NThreads, (t1 - t0).seconds());
+
+int get_default_num_threads() {
+    static int threads = 0;
+    if ( threads == 0 )
+        threads = tbb::task_scheduler_init::default_num_threads();
+    return threads;
+}
+
+int main(int argc, char *argv[]) {
+    try {
+        tbb::tick_count mainStartTime = tbb::tick_count::now();
+
+        utility::thread_number_range threads(get_default_num_threads);
+        string filename = "";
+        bool silent = false;
+
+        utility::parse_cli_arguments(argc,argv,
+            utility::cli_argument_pack()
+            //"-h" option for for displaying help is present implicitly
+            .positional_arg(threads,"n-of-threads","number of threads to use; a range of the form low[:high], where low and optional high are non-negative integers or 'auto' for the TBB default.")
+            .positional_arg(filename,"filename","input filename")
+
+            .arg(verbose,"verbose","prints the first solution")
+            .arg(silent,"silent","no output except elapsed time")
+            .arg(find_one,"find-one","stops after finding first solution\n")
+        );
+
+        if ( silent ) verbose = false;
+
+        if ( !filename.empty() )
+            read_board( filename.c_str() );
+        // otherwise (if file name not specified), the default statically initialized board will be used.
+        for(int p = threads.first; p <= threads.last; ++p ) {
+            unsigned number;
+            number = solve(p);
+
+            if ( !silent ) {
+                if ( find_one ) {
+                    printf("Sudoku: Time to find first solution on %d threads: %6.6f seconds.\n", p, solve_time);
+                }
+                else {
+                    printf("Sudoku: Time to find all %u solutions on %d threads: %6.6f seconds.\n", number, p, solve_time);
+                }
+            }
+        }
+
+        utility::report_elapsed_time((tbb::tick_count::now() - mainStartTime).seconds());
+
+        return 0;
+    } catch(std::exception& e) {
+        std::cerr<<"error occurred. error text is :\"" <<e.what()<<"\"\n";
+        return 1;
     }
-    else {
-        printf("Sudoku: Time to find all %d solutions on %d threads: %6.6f seconds.\n", (int)nSols, NThreads, (t1 - t0).seconds());
-  }
 };
 
diff --git a/examples/task_group/sudoku/xcode/sudoku.xcodeproj/project.pbxproj b/examples/task_group/sudoku/xcode/sudoku.xcodeproj/project.pbxproj
index a333167..1139c62 100644
--- a/examples/task_group/sudoku/xcode/sudoku.xcodeproj/project.pbxproj
+++ b/examples/task_group/sudoku/xcode/sudoku.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -103,9 +103,16 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
-			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "Sudoku" */;
-			compatibilityVersion = "Xcode 2.4";
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
+			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "sudoku" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 08FB7794FE84155DC02AAC07 /* Sudoku */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -132,14 +139,13 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = Sudoku;
 				ZERO_LINK = NO;
@@ -150,12 +156,12 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = Sudoku;
 				ZERO_LINK = NO;
@@ -172,7 +178,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -188,7 +193,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -197,18 +201,16 @@
 		A1F593C60B8F0E6E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = Sudoku;
 				ZERO_LINK = NO;
@@ -218,15 +220,14 @@
 		A1F593C70B8F0E6E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = Sudoku;
 				ZERO_LINK = NO;
@@ -248,7 +249,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -269,7 +269,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -289,7 +288,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "Sudoku" */ = {
+		1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "sudoku" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				1DEB923608733DC60010E9CD /* Debug */,
diff --git a/examples/task_priority/fractal/Makefile b/examples/task_priority/fractal/Makefile
index 227ee71..a3fa126 100644
--- a/examples/task_priority/fractal/Makefile
+++ b/examples/task_priority/fractal/Makefile
@@ -28,17 +28,22 @@
 NAME=Fractal
 ARGS=auto
 PERF_RUN_ARGS=auto 1 1000000 silent
+LIGHT_ARGS=auto 1 1000
 
 # The C++ compiler
 ifneq (,$(shell which icc 2>/dev/null))
 CXX=icc
 endif # icc
 
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
 include ../../common/gui/Makefile.gmake
 
 SOURCES= ../../common/gui/$(UI)video.cpp fractal.cpp main.cpp
 
-CXXFLAGS += -DTBB_PREVIEW_TASK_PRIORITY
+override CXXFLAGS += $(UI_CXXFLAGS)
 
 all:	release test
 
@@ -50,10 +55,10 @@ ifeq ($(UI),mac)
 endif
 
 release: $(SOURCES) resources
-	$(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb_preview $(LIBS)
+	$(CXX) -O2 -DNDEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb $(LIBS)
 
 debug: resources
-	$(CXX) -g -O0 -DTBB_USE_DEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb_preview_debug $(LIBS)
+	$(CXX) -g -O0 -DTBB_USE_DEBUG $(CXXFLAGS) -o $(EXE) $(SOURCES) -ltbb_debug $(LIBS)
 
 clean:
 	$(RM) $(EXE) *.o *.d
@@ -68,6 +73,14 @@ else
 	./$(EXE) $(ARGS)
 endif
 
+light_test:
+ifeq ($(UI),mac)
+	export DYLD_LIBRARY_PATH="$(DYLD_LIBRARY_PATH):$(TBBLIBSPATH)"; ./$(EXE) $(LIGHT_ARGS)
+else
+	./$(EXE) $(LIGHT_ARGS)
+endif
+
 perf_build: release
 
 perf_run:
+	./$(EXE) $(PERF_RUN_ARGS)
diff --git a/examples/task_priority/fractal/Makefile.windows b/examples/task_priority/fractal/Makefile.windows
index 88764a7..335036a 100644
--- a/examples/task_priority/fractal/Makefile.windows
+++ b/examples/task_priority/fractal/Makefile.windows
@@ -30,6 +30,7 @@
 PROG=Fractal
 ARGS=auto
 PERF_RUN_ARGS=auto 1 1000000 silent
+LIGHT_ARGS=auto 1 1000
 
 # Trying to find if icl.exe is set
 CXX1 = $(TBB_CXX)-
@@ -50,20 +51,20 @@ XARCH = $(ARCH2:-=x86)
 MAKEINC = ../../common/gui/Makefile.win
 SOURCES = fractal.cpp main.cpp 
 
-CXXFLAGS += /DTBB_PREVIEW_TASK_PRIORITY
- 
 all: release test
 release: compiler_check
-	@$(MAKE) -f $(MAKEINC) UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb_preview.lib $(LIBS)" XARCH=$(XARCH) RCNAME=gui SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one
+	@$(MAKE) -f $(MAKEINC) UI=$(UI) CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib $(LIBS)" XARCH=$(XARCH) RCNAME=gui SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one
 debug: compiler_check
-	@$(MAKE) -f $(MAKEINC) UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS) /D TBB_USE_DEBUG" LFLAGS="$(LDFLAGS) tbb_preview_debug.lib $(LIBS)" XARCH=$(XARCH) RCNAME=gui SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one
+	@$(MAKE) -f $(MAKEINC) UI=$(UI) DEBUG=_debug CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS) /D TBB_USE_DEBUG" LFLAGS="$(LDFLAGS) tbb_debug.lib $(LIBS)" XARCH=$(XARCH) RCNAME=gui SOURCE="$(SOURCES)" EXE=$(PROG).exe build_one
 clean:
 	@cmd.exe /C del $(PROG).exe *.obj *.?db *.manifest msvs\gui.res
 test:
 	$(PROG) $(ARGS)
+light_test:
+	$(PROG) $(LIGHT_ARGS)
 
 perf_build: compiler_check
-	@$(MAKE) -f $(MAKEINC) UI=con CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb_preview.lib $(LIBS)" XARCH=$(XARCH) RCNAME=gui SOURCE="$(SOURCES) " EXE=$(PROG).exe build_one
+	@$(MAKE) -f $(MAKEINC) UI=con CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" LFLAGS="$(LDFLAGS) tbb.lib $(LIBS)" XARCH=$(XARCH) RCNAME=gui SOURCE="$(SOURCES) " EXE=$(PROG).exe build_one
 perf_run:
 	$(PROG) $(PERF_RUN_ARGS)
 
diff --git a/examples/task_priority/fractal/fractal.cpp b/examples/task_priority/fractal/fractal.cpp
index 36c0dd8..33a4a86 100644
--- a/examples/task_priority/fractal/fractal.cpp
+++ b/examples/task_priority/fractal/fractal.cpp
@@ -79,7 +79,7 @@ color_t fractal::calc_one_pixel(int x0, int y0) {
         iter++;
     }
 
-    int b = 256*mu;
+    int b = (int)(256*mu);
     int g = (b/8);
     int r = (g/16);
 
@@ -193,6 +193,18 @@ void fractal_group::set_priorities() {
     context[active^1].set_priority( tbb::priority_normal );
 }
 
+void fractal_group::switch_priorities( int new_active ) {
+    if( new_active!=-1 ) active = new_active;
+    else                 active = 1-active; // assumes 'active' is only 0 or 1
+    set_priorities();
+    draw_borders();
+}
+
+void fractal_group::set_num_frames_at_least(int n) {
+    if ( num_frames[0]<n ) num_frames[0] = n;
+    if ( num_frames[1]<n ) num_frames[1] = n;
+}
+
 void fractal_group::run( bool create_second_fractal ) {
     // initialize task scheduler
     tbb::task_scheduler_init init( num_threads );
@@ -243,23 +255,18 @@ fractal_group::fractal_group( const drawing_memory &_dm, int _num_threads, int _
 }
 
 void fractal_group::mouse_click(int x, int y) {
-    // assumption that the point is not inside any fratal area
+    // assumption that the point is not inside any fractal area
     int new_active = -1;
 
-    // check if the point is inside the first fractal area
     if ( f0.check_point( x, y ) ) {
+        // the point is inside the first fractal area
         new_active = 0;
-    } else {
-        // check if the point is inside the second fractal area
-        if ( f1.check_point( x, y ) ) {
-            new_active = 1;
-        }
+    } else if ( f1.check_point( x, y ) ) {
+        // the point is inside the second fractal area
+        new_active = 1;
     }
 
     if ( new_active != -1 && new_active != active ) {
-        // change the priorities
-        active = new_active;
-        set_priorities();
-        draw_borders();
+        switch_priorities( new_active );
     }
 }
diff --git a/examples/task_priority/fractal/fractal.h b/examples/task_priority/fractal/fractal.h
index e3ea789..de81875 100644
--- a/examples/task_priority/fractal/fractal.h
+++ b/examples/task_priority/fractal/fractal.h
@@ -33,6 +33,7 @@
 
 #include "tbb/task.h"
 #include "tbb/task_scheduler_init.h"
+#include "tbb/atomic.h"
 
 //! Fractal class
 class fractal {
@@ -62,7 +63,12 @@ class fractal {
 
 public:
     //! Constructor
-    fractal( const drawing_memory &dm ) : dm(dm) {}
+    fractal( const drawing_memory &dm ) : dm(dm) {
+#if _MSC_VER && _WIN64 && !__INTEL_COMPILER
+        // Workaround for MSVC x64 compiler issue
+        volatile int i=0;
+#endif
+    }
     //! Runs the fractal calculation
     void run( tbb::task_group_context &context );
     //! Renders the fractal rectangular area
@@ -76,7 +82,7 @@ class fractal_group {
     //! Fractals defenition
     fractal f0, f1;
     //! Number of frames to calculate
-    int num_frames[2];
+    tbb::atomic<int> num_frames[2];
     //! Task group contexts to manage prioroties
     tbb::task_group_context *context;
 
@@ -105,8 +111,12 @@ public:
     void mouse_click(int x, int y);
     //! Fractal calculation routine
     void calc_fractal( int num );
-     //! Get number of threads
+    //! Get number of threads
     int get_num_threads() const { return num_threads; }
+    //! Reset the number of frames to be not less than the given value
+    void set_num_frames_at_least(int n);
+    //! Switches the priorities of two fractals
+    void switch_priorities( int new_active=-1 );
 };
 
 #endif /* FRACTAL_H_ */
diff --git a/examples/task_priority/fractal/fractal_video.h b/examples/task_priority/fractal/fractal_video.h
index 6608ba9..2815afb 100644
--- a/examples/task_priority/fractal/fractal_video.h
+++ b/examples/task_priority/fractal/fractal_video.h
@@ -43,6 +43,7 @@ private:
     void on_mouse( int x, int y, int key ) {
         if( key == 1 ) {
             if ( fg ) {
+                fg->set_num_frames_at_least(20);
                 fg->mouse_click( x, y );
             }
         }
@@ -50,7 +51,12 @@ private:
 
     void on_key( int key ) {
         switch ( key&0xff ) {
-        case 27: running = false;
+        case 27:
+            running = false; break;
+        case ' ': // space
+            if( fg ) fg->switch_priorities();
+        default:
+            if( fg ) fg->set_num_frames_at_least(20);
         }
     }
 
@@ -62,7 +68,7 @@ private:
 
 public:
     fractal_video() :fg(0) {
-        title = "Fractal Example";
+        title = "Dynamic Priorities in TBB: Fractal Example";
         v = this;
     }
 
diff --git a/examples/task_priority/fractal/index.html b/examples/task_priority/fractal/index.html
index ed194c1..10bd955 100644
--- a/examples/task_priority/fractal/index.html
+++ b/examples/task_priority/fractal/index.html
@@ -55,10 +55,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/task_priority/fractal/msvs/fractal.icproj b/examples/task_priority/fractal/msvs/fractal.icproj
index 00085e0..37993ba 100644
--- a/examples/task_priority/fractal/msvs/fractal.icproj
+++ b/examples/task_priority/fractal/msvs/fractal.icproj
@@ -3,7 +3,7 @@
 	ProjectType="Intel C++ Project"
 	Version="11.1"
 	Name="fractal"
-	ProjectGUID="{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}"
+	ProjectGUID="{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}"
 	VCNestedProjectGUID="{3AA40693-F93D-4D4B-B32E-068F511A2527}"
 	VCNestedProjectFileName="fractal.vcproj">
 	<Configurations/>
diff --git a/examples/task_priority/fractal/msvs/fractal.vcproj b/examples/task_priority/fractal/msvs/fractal.vcproj
index ad51ac6..2c10b70 100644
--- a/examples/task_priority/fractal/msvs/fractal.vcproj
+++ b/examples/task_priority/fractal/msvs/fractal.vcproj
@@ -19,7 +19,7 @@
 	</ToolFiles>
 	<Configurations>
 		<Configuration
-			Name="Debug|Win32"
+			Name="GDIDebug|Win32"
 			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
 			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
 			ConfigurationType="1"
@@ -46,8 +46,8 @@
 				Optimization="0"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG;TBB_PREVIEW_TASK_PRIORITY"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				EnableFunctionLevelLinking="true"
 				UsePrecompiledHeader="0"
@@ -65,9 +65,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_preview_debug.lib"
+				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="1"
@@ -97,11 +97,11 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="Debug|x64"
+			Name="GDIDebug|x64"
 			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
 			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
 			ConfigurationType="1"
@@ -129,8 +129,8 @@
 				Optimization="0"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
-				PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG;TBB_PREVIEW_TASK_PRIORITY"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
+				PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				EnableFunctionLevelLinking="true"
 				UsePrecompiledHeader="0"
@@ -147,9 +147,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_preview_debug.lib"
+				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="17"
@@ -179,11 +179,11 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="Release|Win32"
+			Name="GDIRelease|Win32"
 			OutputDirectory="$(TEMP)\tbb_examples\$(ConfigurationName)"
 			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(ConfigurationName)"
 			ConfigurationType="1"
@@ -211,8 +211,8 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
-				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;TBB_PREVIEW_TASK_PRIORITY"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
 				UsePrecompiledHeader="0"
@@ -230,9 +230,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_preview.lib"
+				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -264,11 +264,11 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
-			Name="Release|x64"
+			Name="GDIRelease|x64"
 			OutputDirectory="$(TEMP)\tbb_examples\$(PlatformName)\$(ConfigurationName)"
 			IntermediateDirectory="$(TEMP)\tbb_examples\$(SolutionName)\$(PlatformName)\$(ConfigurationName)"
 			ConfigurationType="1"
@@ -297,8 +297,8 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include""
-				PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS;TBB_PREVIEW_TASK_PRIORITY"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
+				PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
 				UsePrecompiledHeader="0"
@@ -315,9 +315,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_preview.lib"
+				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -349,7 +349,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -382,8 +382,8 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
-				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;TBB_PREVIEW_TASK_PRIORITY"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
 				UsePrecompiledHeader="0"
@@ -401,9 +401,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_preview.lib"
+				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -435,7 +435,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -469,8 +469,8 @@
 				FavorSizeOrSpeed="1"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
-				PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS;TBB_PREVIEW_TASK_PRIORITY"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
+				PreprocessorDefinitions="WIN64;NDEBUG;_WINDOWS"
 				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="true"
 				UsePrecompiledHeader="0"
@@ -487,9 +487,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_preview.lib"
+				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"
@@ -521,7 +521,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -553,8 +553,8 @@
 				Optimization="0"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG;TBB_PREVIEW_TASK_PRIORITY"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				EnableFunctionLevelLinking="true"
 				UsePrecompiledHeader="0"
@@ -572,9 +572,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_preview_debug.lib"
+				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8;$(DXSDK_DIR)\lib\x86"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="1"
@@ -604,7 +604,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -637,8 +637,8 @@
 				Optimization="0"
 				OmitFramePointers="true"
 				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=""$(TBB30_INSTALL_DIR)\include";"$(DXSDK_DIR)\include""
-				PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG;TBB_PREVIEW_TASK_PRIORITY"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(DXSDK_DIR)\include""
+				PreprocessorDefinitions="WIN64;_DEBUG;_WINDOWS;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				EnableFunctionLevelLinking="true"
 				UsePrecompiledHeader="0"
@@ -655,9 +655,9 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="tbb_preview_debug.lib"
+				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8;$(DXSDK_DIR)\lib\x64"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="17"
@@ -687,7 +687,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
@@ -745,7 +745,7 @@
 				RelativePath="..\..\..\common\gui\ddvideo.cpp"
 				>
 				<FileConfiguration
-					Name="Debug|Win32"
+					Name="GDIDebug|Win32"
 					ExcludedFromBuild="true"
 					>
 					<Tool
@@ -753,7 +753,7 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="Debug|x64"
+					Name="GDIDebug|x64"
 					ExcludedFromBuild="true"
 					>
 					<Tool
@@ -761,7 +761,7 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="Release|Win32"
+					Name="GDIRelease|Win32"
 					ExcludedFromBuild="true"
 					>
 					<Tool
@@ -769,18 +769,39 @@
 					/>
 				</FileConfiguration>
 				<FileConfiguration
-					Name="Release|x64"
+					Name="GDIRelease|x64"
 					ExcludedFromBuild="true"
 					>
 					<Tool
 						Name="VCCLCompilerTool"
 					/>
 				</FileConfiguration>
+				<FileConfiguration
+					Name="DDDebug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
 			</File>
 			<File
 				RelativePath="..\..\..\common\gui\gdivideo.cpp"
 				>
 				<FileConfiguration
+					Name="GDIDebug|x64"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="GDIRelease|x64"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
 					Name="DDRelease|Win32"
 					ExcludedFromBuild="true"
 					>
diff --git a/examples/task_priority/fractal/msvs/fractal_cl.sln b/examples/task_priority/fractal/msvs/fractal_cl.sln
index f63faf4..7ded9c9 100644
--- a/examples/task_priority/fractal/msvs/fractal_cl.sln
+++ b/examples/task_priority/fractal/msvs/fractal_cl.sln
@@ -10,26 +10,24 @@ Global
 		DD Release|x64 = DD Release|x64
 		GDI Debug|Win32 = GDI Debug|Win32
 		GDI Debug|x64 = GDI Debug|x64
-		GDI Release|Win32 = GDI Release|Win32
-		GDI Release|x64 = GDI Release|x64
+		_GDI Release|Win32 = _GDI Release|Win32
+		_GDI Release|x64 = _GDI Release|x64
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
 		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.Build.0 = DDDebug|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = Debug|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = Debug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = DDDebug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = DDDebug|x64
 		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = DDRelease|Win32
 		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.Build.0 = DDRelease|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = Release|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = Release|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.ActiveCfg = Debug|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.Build.0 = Debug|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.ActiveCfg = Debug|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.Build.0 = Debug|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.Build.0 = Release|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.ActiveCfg = Release|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.Build.0 = Release|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = DDRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = DDRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.ActiveCfg = GDIDebug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.ActiveCfg = GDIRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.Build.0 = GDIRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|Win32.ActiveCfg = GDIRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.ActiveCfg = GDIRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.Build.0 = GDIRelease|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/examples/task_priority/fractal/msvs/fractal_icl.sln b/examples/task_priority/fractal/msvs/fractal_icl.sln
index 100bb4e..600a1da 100644
--- a/examples/task_priority/fractal/msvs/fractal_icl.sln
+++ b/examples/task_priority/fractal/msvs/fractal_icl.sln
@@ -1,6 +1,6 @@
 Microsoft Visual Studio Solution File, Format Version 9.00
 # Visual Studio 2005
-Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "fractal", "fractal.icproj", "{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}"
+Project("{EAF909A5-FA59-4C3D-9431-0FCC20D5BCF9}") = "fractal", "fractal.icproj", "{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -10,34 +10,38 @@ Global
 		DD Release|x64 = DD Release|x64
 		GDI Debug|Win32 = GDI Debug|Win32
 		GDI Debug|x64 = GDI Debug|x64
-		GDI Release|Win32 = GDI Release|Win32
-		GDI Release|x64 = GDI Release|x64
+		_GDI Release|Win32 = _GDI Release|Win32
+		_GDI Release|x64 = _GDI Release|x64
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|Win32.Build.0 = DDDebug|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|x64.ActiveCfg = DDDebug|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Debug|x64.Build.0 = DDDebug|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|Win32.ActiveCfg = DDRelease|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|Win32.Build.0 = DDRelease|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|x64.ActiveCfg = DDRelease|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.DD Release|x64.Build.0 = DDRelease|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|Win32.ActiveCfg = Debug|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|Win32.Build.0 = Debug|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|x64.ActiveCfg = Debug|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Debug|x64.Build.0 = Debug|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|Win32.Build.0 = Release|Win32
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|x64.ActiveCfg = Release|x64
-		{5C4ACAE3-8686-4046-A5FD-D0DC8755D263}.GDI Release|x64.Build.0 = Release|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = Debug|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = Debug|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = Release|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = Release|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.ActiveCfg = Debug|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.ActiveCfg = Debug|x64
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|Win32.ActiveCfg = Release|Win32
-		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Release|x64.ActiveCfg = Release|x64
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Debug|Win32.Build.0 = DDDebug|Win32
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Debug|x64.ActiveCfg = DDDebug|x64
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Debug|x64.Build.0 = DDDebug|x64
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Release|Win32.Build.0 = DDRelease|Win32
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Release|x64.ActiveCfg = DDRelease|x64
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.DD Release|x64.Build.0 = DDRelease|x64
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.GDI Debug|Win32.ActiveCfg = GDIDebug|x64
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.GDI Debug|x64.ActiveCfg = GDIRelease|x64
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}.GDI Debug|x64.Build.0 = GDIRelease|x64
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}._GDI Release|Win32.ActiveCfg = GDIRelease|x64
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}._GDI Release|x64.ActiveCfg = GDIRelease|x64
+		{BF088DF5-BAEA-4EB2-8EA5-1E8DFBC75E5C}._GDI Release|x64.Build.0 = GDIRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.Build.0 = GDIRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|x64.ActiveCfg = GDIRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}._GDI Release|Win32.ActiveCfg = GDIRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.Build.0 = GDIRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|x64.ActiveCfg = GDIRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.GDI Debug|Win32.ActiveCfg = GDIDebug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.Build.0 = DDRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|x64.ActiveCfg = DDRelease|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.Build.0 = DDRelease|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Release|Win32.ActiveCfg = DDRelease|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.Build.0 = DDDebug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|x64.ActiveCfg = DDDebug|x64
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.Build.0 = DDDebug|Win32
+		{3AA40693-F93D-4D4B-B32E-068F511A2527}.DD Debug|Win32.ActiveCfg = DDDebug|Win32
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/examples/task_priority/fractal/xcode/fractal.xcodeproj/project.pbxproj b/examples/task_priority/fractal/xcode/fractal.xcodeproj/project.pbxproj
index a2cccaf..a3ed810 100644
--- a/examples/task_priority/fractal/xcode/fractal.xcodeproj/project.pbxproj
+++ b/examples/task_priority/fractal/xcode/fractal.xcodeproj/project.pbxproj
@@ -3,16 +3,15 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
-		A12649490B8392750091D5AD /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */; };
 		A126495E0B83936D0091D5AD /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8D0C4E960486CD37000505A6 /* Info.plist */; };
-		A18D2A340B861B99007D8D2C /* libtbb_preview.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb_preview.dylib */; };
+		A18D2A340B861B99007D8D2C /* libtbb.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb.dylib */; };
 		A1A8F41E0B8B4DBE001C55B1 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A8F41D0B8B4DBE001C55B1 /* AGL.framework */; };
 		A1A8F4310B8B4EA8001C55B1 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A8F4300B8B4EA8001C55B1 /* Carbon.framework */; };
-		A1D44D9A0B861E8A0006E401 /* libtbb_preview.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb_preview.dylib */; };
+		A1D44D9A0B861E8A0006E401 /* libtbb.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A18D2A330B861B99007D8D2C /* libtbb.dylib */; };
 		A1E3E7BD0B3AD4EC007C3AB5 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */; };
 		A1F591AC0B8DFC9600073279 /* macvideo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A1F591AA0B8DFC9600073279 /* macvideo.cpp */; };
 		EA135CEA130D076D00807847 /* fractal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EA135CE6130D076D00807847 /* fractal.cpp */; };
@@ -27,7 +26,7 @@
 			dstPath = "";
 			dstSubfolderSpec = 16;
 			files = (
-				A1D44D9A0B861E8A0006E401 /* libtbb_preview.dylib in CopyFiles */,
+				A1D44D9A0B861E8A0006E401 /* libtbb.dylib in CopyFiles */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -36,7 +35,7 @@
 /* Begin PBXFileReference section */
 		8D0C4E960486CD37000505A6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
 		8D0C4E970486CD37000505A6 /* fractal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = fractal.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		A18D2A330B861B99007D8D2C /* libtbb_preview.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb_preview.dylib; path = ../../../../lib/libtbb_preview.dylib; sourceTree = SOURCE_ROOT; };
+		A18D2A330B861B99007D8D2C /* libtbb.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libtbb.dylib; path = ../../../../lib/libtbb.dylib; sourceTree = SOURCE_ROOT; };
 		A1A8F41D0B8B4DBE001C55B1 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; };
 		A1A8F4300B8B4EA8001C55B1 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
 		A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
@@ -56,8 +55,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				A1E3E7BD0B3AD4EC007C3AB5 /* OpenGL.framework in Frameworks */,
-				A12649490B8392750091D5AD /* OpenGL.framework in Frameworks */,
-				A18D2A340B861B99007D8D2C /* libtbb_preview.dylib in Frameworks */,
+				A18D2A340B861B99007D8D2C /* libtbb.dylib in Frameworks */,
 				A1A8F41E0B8B4DBE001C55B1 /* AGL.framework in Frameworks */,
 				A1A8F4310B8B4EA8001C55B1 /* Carbon.framework in Frameworks */,
 			);
@@ -111,7 +109,7 @@
 		20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */ = {
 			isa = PBXGroup;
 			children = (
-				A18D2A330B861B99007D8D2C /* libtbb_preview.dylib */,
+				A18D2A330B861B99007D8D2C /* libtbb.dylib */,
 				A1A8F4300B8B4EA8001C55B1 /* Carbon.framework */,
 				A1A8F41D0B8B4DBE001C55B1 /* AGL.framework */,
 				A1E3E7BC0B3AD4EC007C3AB5 /* OpenGL.framework */,
@@ -146,9 +144,16 @@
 /* Begin PBXProject section */
 		20286C28FDCF999611CA2CEA /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
 			buildConfigurationList = C0E91AC908A95435008D54AB /* Build configuration list for PBXProject "fractal" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 20286C29FDCF999611CA2CEA /* fractal */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -200,20 +205,20 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_MODEL_TUNING = "";
 				GCC_OPTIMIZATION_LEVEL = 0;
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = fractal.pch;
-				GCC_PREPROCESSOR_DEFINITIONS = TBB_PREVIEW_TASK_PRIORITY;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
+				IBC_STRIP_NIBS = NO;
 				INSTALL_PATH = "$(HOME)/Applications";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					../../../../lib,
 				);
 				PRODUCT_NAME = fractal;
+				SDKROOT = macosx10.6;
 			};
 			name = Debug;
 		};
@@ -224,9 +229,9 @@
 				GCC_MODEL_TUNING = "";
 				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = fractal.pch;
-				GCC_PREPROCESSOR_DEFINITIONS = TBB_PREVIEW_TASK_PRIORITY;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
+				IBC_STRIP_NIBS = NO;
 				INSTALL_PATH = "$(HOME)/Applications";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
@@ -235,6 +240,7 @@
 				OTHER_CPLUSPLUSFLAGS = "";
 				PRODUCT_NAME = fractal;
 				PUBLIC_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Headers";
+				SDKROOT = macosx10.6;
 				STRIPFLAGS = "";
 			};
 			name = Release;
@@ -248,11 +254,13 @@
 				GCC_ENABLE_SSE3_EXTENSIONS = YES;
 				GCC_MODEL_TUNING = "";
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+				IBC_STRIP_NIBS = NO;
 				MACH_O_TYPE = mh_execute;
-				PREBINDING = NO;
+				MACOSX_DEPLOYMENT_TARGET = 10.6;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+				SDKROOT = macosx10.6;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
 			name = Debug;
@@ -266,11 +274,13 @@
 				GCC_ENABLE_SSE3_EXTENSIONS = YES;
 				GCC_MODEL_TUNING = "";
 				GCC_OPTIMIZATION_LEVEL = 3;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
+				IBC_STRIP_NIBS = NO;
 				MACH_O_TYPE = mh_execute;
-				PREBINDING = NO;
+				MACOSX_DEPLOYMENT_TARGET = 10.6;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
+				SDKROOT = macosx10.6;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
 			name = Release;
diff --git a/examples/task_priority/index.html b/examples/task_priority/index.html
index 69277bf..922f443 100644
--- a/examples/task_priority/index.html
+++ b/examples/task_priority/index.html
@@ -14,10 +14,9 @@ This directory has examples of how to use the task priority feature.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/test_all/fibonacci/Makefile b/examples/test_all/fibonacci/Makefile
index 63e90bc..ce27a70 100644
--- a/examples/test_all/fibonacci/Makefile
+++ b/examples/test_all/fibonacci/Makefile
@@ -33,6 +33,10 @@ ifneq (,$(shell which icc 2>/dev/null))
 CXX=icc
 endif # icc
 
+ifeq ($(shell uname), Linux)
+LIBS+= -lrt 
+endif
+
 all:	release test
 
 release: *.cpp
diff --git a/examples/test_all/fibonacci/index.html b/examples/test_all/fibonacci/index.html
index 8c0ead6..af931c0 100644
--- a/examples/test_all/fibonacci/index.html
+++ b/examples/test_all/fibonacci/index.html
@@ -42,10 +42,9 @@ General build directions can be found <A HREF=../../index.html#build>here</A>.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/examples/test_all/fibonacci/msvs/fibonacci.vcproj b/examples/test_all/fibonacci/msvs/fibonacci.vcproj
index b9955ca..7d38fd0 100644
--- a/examples/test_all/fibonacci/msvs/fibonacci.vcproj
+++ b/examples/test_all/fibonacci/msvs/fibonacci.vcproj
@@ -43,7 +43,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -63,7 +63,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="1"
@@ -93,7 +93,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -122,7 +122,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;_DEBUG;_CONSOLE;TBB_USE_DEBUG"
 				RuntimeLibrary="3"
 				UsePrecompiledHeader="0"
@@ -141,7 +141,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb_debug.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				TargetMachine="17"
@@ -171,7 +171,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 debug "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -198,7 +198,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -218,7 +218,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\ia32\vc_mt;$(TBB30_INSTALL_DIR)\lib\ia32\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\ia32\vc_mt;$(TBBROOT)\lib\ia32\vc8;$(SolutionDir)\..\..\..\..\lib\ia32\vc_mt;$(SolutionDir)\..\..\..\..\lib\ia32\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -250,7 +250,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  ia32 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  ia32 release "$(OutDir)""
 			/>
 		</Configuration>
 		<Configuration
@@ -278,7 +278,7 @@
 			/>
 			<Tool
 				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="$(TBB30_INSTALL_DIR)\include"
+				AdditionalIncludeDirectories=""$(TBBROOT)\include";"$(SolutionDir)\..\..\..\..\include";"
 				PreprocessorDefinitions="WIN64;NDEBUG;_CONSOLE"
 				RuntimeLibrary="2"
 				UsePrecompiledHeader="0"
@@ -297,7 +297,7 @@
 				Name="VCLinkerTool"
 				AdditionalDependencies="tbb.lib"
 				LinkIncremental="1"
-				AdditionalLibraryDirectories="$(TBB30_INSTALL_DIR)\lib\intel64\vc_mt;$(TBB30_INSTALL_DIR)\lib\intel64\vc8"
+				AdditionalLibraryDirectories="$(TBBROOT)\lib\intel64\vc_mt;$(TBBROOT)\lib\intel64\vc8;$(SolutionDir)\..\..\..\..\lib\intel64\vc_mt;$(SolutionDir)\..\..\..\..\lib\intel64\vc8"
 				GenerateDebugInformation="true"
 				SubSystem="1"
 				OptimizeReferences="2"
@@ -329,7 +329,7 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 				Description="Copying DLLs and PDBs"
-				CommandLine="call "$(TBB30_INSTALL_DIR)\examples\common\copy_libraries.bat"  intel64 release "$(OutDir)""
+				CommandLine="call "$(SolutionDir)\..\..\..\common\copy_libraries.bat"  intel64 release "$(OutDir)""
 			/>
 		</Configuration>
 	</Configurations>
diff --git a/examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj b/examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj
index f6957d7..0a08617 100644
--- a/examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj
+++ b/examples/test_all/fibonacci/xcode/fibonacci.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 42;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -103,9 +103,16 @@
 /* Begin PBXProject section */
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0410;
+			};
 			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "fibonacci" */;
-			compatibilityVersion = "Xcode 2.4";
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
 			hasScannedForEncodings = 1;
+			knownRegions = (
+				en,
+			);
 			mainGroup = 08FB7794FE84155DC02AAC07 /* Fibonacci */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -132,14 +139,13 @@
 			buildSettings = {
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = Fibonacci;
 				ZERO_LINK = NO;
@@ -150,12 +156,12 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = Fibonacci;
 				ZERO_LINK = NO;
@@ -172,7 +178,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -188,7 +193,6 @@
 				GCC_VERSION = 4.0;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -197,18 +201,16 @@
 		A1F593C60B8F0E6E00073279 /* Debug64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				COPY_PHASE_STRIP = NO;
 				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = Fibonacci;
 				ZERO_LINK = NO;
@@ -218,15 +220,14 @@
 		A1F593C70B8F0E6E00073279 /* Release64 */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
-				ARCHS = "$(ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1)";
-				ARCHS_STANDARD_64_BIT_PRE_XCODE_3_1 = x86_64;
+				ARCHS = "$(ARCHS_STANDARD_64_BIT)";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
-				GCC_VERSION = 4.0;
+				GCC_VERSION = "";
 				HEADER_SEARCH_PATHS = ../../../../include;
 				INSTALL_PATH = "$(HOME)/bin";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"../../../../lib",
+					../../../../lib,
 				);
 				PRODUCT_NAME = Fibonacci;
 				ZERO_LINK = NO;
@@ -248,7 +249,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
@@ -269,7 +269,6 @@
 					"-m64",
 				);
 				OTHER_LDFLAGS = "-m64";
-				PREBINDING = NO;
 				PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
 				SYMROOT = "/tmp/tbb-$(USER)";
 			};
diff --git a/examples/test_all/index.html b/examples/test_all/index.html
index 527650c..86c1e27 100644
--- a/examples/test_all/index.html
+++ b/examples/test_all/index.html
@@ -14,10 +14,9 @@ This directory contains programs that exercise all the components of Threading B
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/include/index.html b/include/index.html
index 98353f0..ee08489 100644
--- a/include/index.html
+++ b/include/index.html
@@ -14,10 +14,9 @@ Include files for Threading Building Blocks.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/include/serial/tbb/parallel_for.h b/include/serial/tbb/parallel_for.h
new file mode 100644
index 0000000..e953cf0
--- /dev/null
+++ b/include/serial/tbb/parallel_for.h
@@ -0,0 +1,173 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_SERIAL_parallel_for_H
+#define __TBB_SERIAL_parallel_for_H
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+    #pragma warning (push)
+    #pragma warning (disable: 4530)
+#endif
+
+#include <stdexcept>
+#include <string> // required to construct std exception classes
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    #pragma warning (pop)
+#endif
+
+#include "tbb_annotate.h"
+
+#ifndef __TBB_NORMAL_EXECUTION
+#include "tbb/blocked_range.h"
+#include "tbb/partitioner.h"
+#endif
+
+namespace tbb {
+namespace serial {
+namespace interface6 {
+
+// parallel_for serial annotated implementation
+
+template< typename Range, typename Body, typename Partitioner >
+class start_for : tbb::internal::no_copy {
+    Range my_range;
+    const Body my_body;
+    typename Partitioner::task_partition_type my_partition;
+    void execute();
+
+    //! Constructor for root task.
+    start_for( const Range& range, const Body& body, Partitioner& partitioner ) :
+        my_range( range ),
+        my_body( body ),
+        my_partition( partitioner )
+    {
+    }
+
+    //! Splitting constructor used to generate children.
+    /** this becomes left child.  Newly constructed object is right child. */
+    start_for( start_for& parent_, split ) :
+        my_range( parent_.my_range, split() ),
+        my_body( parent_.my_body ),
+        my_partition( parent_.my_partition, split() )
+    {
+    }
+
+public:
+    static void run(  const Range& range, const Body& body, const Partitioner& partitioner ) {
+        if( !range.empty() ) {
+            ANNOTATE_SITE_BEGIN( tbb_parallel_for );
+            {
+                start_for a( range, body, const_cast< Partitioner& >( partitioner ) );
+                a.execute();
+            }
+            ANNOTATE_SITE_END( tbb_parallel_for );
+        }
+    }
+};
+
+template< typename Range, typename Body, typename Partitioner >
+void start_for< Range, Body, Partitioner >::execute() {
+    if( !my_range.is_divisible() || !my_partition.divisions_left() ) {
+        ANNOTATE_TASK_BEGIN( tbb_parallel_for_range );
+        {
+            my_body( my_range );
+        }
+        ANNOTATE_TASK_END( tbb_parallel_for_range );
+    } else {
+        start_for b( *this, split() );
+        this->execute(); // Execute the left interval first to keep the serial order.
+        b.execute();     // Execute the right interval then.
+    }
+}
+
+//! Parallel iteration over range with default partitioner..
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_for( const Range& range, const Body& body ) {
+    serial::interface6::start_for<Range,Body,auto_partitioner>::run(range,body,auto_partitioner());
+}
+
+//! Parallel iteration over range with simple partitioner.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_for( const Range& range, const Body& body, const simple_partitioner& partitioner ) {
+    serial::interface6::start_for<Range,Body,simple_partitioner>::run(range,body,partitioner);
+}
+
+//! Parallel iteration over range with auto_partitioner.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_for( const Range& range, const Body& body, const auto_partitioner& partitioner ) {
+    serial::interface6::start_for<Range,Body,auto_partitioner>::run(range,body,partitioner);
+}
+
+//! Parallel iteration over range with affinity_partitioner.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_for( const Range& range, const Body& body, affinity_partitioner& partitioner ) {
+    serial::interface6::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner);
+}
+
+//! Parallel iteration over a range of integers with a step value
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f) {
+    if (step <= 0 )
+        throw std::invalid_argument( "nonpositive_step" );
+    else if (last > first) {
+        // Above "else" avoids "potential divide by zero" warning on some platforms
+        ANNOTATE_SITE_BEGIN( tbb_parallel_for );
+        for( Index i = first; i < last; i = i + step ) {
+            ANNOTATE_TASK_BEGIN( tbb_parallel_for_iteration );
+            { f( i ); }
+            ANNOTATE_TASK_END( tbb_parallel_for_iteration );
+        }
+        ANNOTATE_SITE_END( tbb_parallel_for );
+    }
+}
+
+//! Parallel iteration over a range of integers with a default step value
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, const Function& f) {
+    parallel_for(first, last, static_cast<Index>(1), f);
+}
+
+} // namespace interface6
+
+using interface6::parallel_for;
+
+} // namespace serial
+
+#ifndef __TBB_NORMAL_EXECUTION
+using serial::interface6::parallel_for;
+#endif
+
+} // namespace tbb
+
+#endif /* __TBB_SERIAL_parallel_for_H */
diff --git a/src/test/test_ScalableAllocator_STL.cpp b/include/serial/tbb/tbb_annotate.h
similarity index 75%
copy from src/test/test_ScalableAllocator_STL.cpp
copy to include/serial/tbb/tbb_annotate.h
index 3d89a3e..5aeb6ea 100644
--- a/src/test/test_ScalableAllocator_STL.cpp
+++ b/include/serial/tbb/tbb_annotate.h
@@ -26,15 +26,19 @@
     the GNU General Public License.
 */
 
-// Test whether scalable_allocator works with some of the host's STL containers.
-
-#define HARNESS_NO_PARSE_COMMAND_LINE 1
-#include "tbb/scalable_allocator.h"
-
-// The actual body of the test is there:
-#include "test_allocator_STL.h"
-
-int TestMain () {
-    TestAllocatorWithSTL<tbb::scalable_allocator<void> >();
-    return Harness::Done;
-}
+#ifndef __TBB_annotate_H
+#define __TBB_annotate_H
+
+// Macros used by the Intel(R) Parallel Advisor.
+#ifdef __TBB_NORMAL_EXECUTION
+    #define ANNOTATE_SITE_BEGIN( site )
+    #define ANNOTATE_SITE_END( site )
+    #define ANNOTATE_TASK_BEGIN( task )
+    #define ANNOTATE_TASK_END( task )
+    #define ANNOTATE_LOCK_ACQUIRE( lock )
+    #define ANNOTATE_LOCK_RELEASE( lock )
+#else
+    #include <advisor-annotate.h>
+#endif
+
+#endif /* __TBB_annotate_H */
diff --git a/include/tbb/atomic.h b/include/tbb/atomic.h
index d360089..5257ff5 100644
--- a/include/tbb/atomic.h
+++ b/include/tbb/atomic.h
@@ -50,24 +50,26 @@ namespace tbb {
 
 //! Specifies memory fencing.
 enum memory_semantics {
-    //! For internal use only.
-    __TBB_full_fence,
+    //! Sequentially consistent fence.
+    full_fence,
     //! Acquire fence
     acquire,
     //! Release fence
-    release
+    release,
+    //! No ordering
+    relaxed
 };
 
 //! @cond INTERNAL
 namespace internal {
 
-#if __GNUC__ || __SUNPRO_CC || __IBMCPP__
-#define __TBB_DECL_ATOMIC_FIELD(t,f,a) t f  __attribute__ ((aligned(a)));
-#elif defined(__INTEL_COMPILER)||_MSC_VER >= 1300
-#define __TBB_DECL_ATOMIC_FIELD(t,f,a) __declspec(align(a)) t f;
+#if __TBB_ATTRIBUTE_ALIGNED_PRESENT
+    #define __TBB_DECL_ATOMIC_FIELD(t,f,a) t f  __attribute__ ((aligned(a)));
+#elif __TBB_DECLSPEC_ALIGN_PRESENT
+    #define __TBB_DECL_ATOMIC_FIELD(t,f,a) __declspec(align(a)) t f;
 #else 
-#error Do not know syntax for forcing alignment.
-#endif /* __GNUC__ */
+    #error Do not know syntax for forcing alignment.
+#endif
 
 template<size_t S>
 struct atomic_rep;           // Primary template declared, but never defined.
@@ -103,58 +105,82 @@ struct atomic_rep<8> {       // Specialization
 template<size_t Size, memory_semantics M>
 struct atomic_traits;        // Primary template declared, but not defined.
 
-#define __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(S,M)                         \
-    template<> struct atomic_traits<S,M> {                               \
-        typedef atomic_rep<S>::word word;                               \
-        inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) {\
-            return __TBB_CompareAndSwap##S##M(location,new_value,comparand);    \
-        }                                                                       \
-        inline static word fetch_and_add( volatile void* location, word addend ) { \
-            return __TBB_FetchAndAdd##S##M(location,addend);                    \
-        }                                                                       \
-        inline static word fetch_and_store( volatile void* location, word value ) {\
-            return __TBB_FetchAndStore##S##M(location,value);                   \
-        }                                                                       \
+#define __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(S,M)                                                         \
+    template<> struct atomic_traits<S,M> {                                                               \
+        typedef atomic_rep<S>::word word;                                                                \
+        inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) { \
+            return __TBB_machine_cmpswp##S##M(location,new_value,comparand);                             \
+        }                                                                                                \
+        inline static word fetch_and_add( volatile void* location, word addend ) {                       \
+            return __TBB_machine_fetchadd##S##M(location,addend);                                        \
+        }                                                                                                \
+        inline static word fetch_and_store( volatile void* location, word value ) {                      \
+            return __TBB_machine_fetchstore##S##M(location,value);                                       \
+        }                                                                                                \
     };
 
-#define __TBB_DECL_ATOMIC_PRIMITIVES(S)                                  \
-    template<memory_semantics M>                                         \
-    struct atomic_traits<S,M> {                                          \
-        typedef atomic_rep<S>::word word;                               \
-        inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) {\
-            return __TBB_CompareAndSwap##S(location,new_value,comparand);       \
-        }                                                                       \
-        inline static word fetch_and_add( volatile void* location, word addend ) { \
-            return __TBB_FetchAndAdd##S(location,addend);                       \
-        }                                                                       \
-        inline static word fetch_and_store( volatile void* location, word value ) {\
-            return __TBB_FetchAndStore##S(location,value);                      \
-        }                                                                       \
+#define __TBB_DECL_ATOMIC_PRIMITIVES(S)                                                                  \
+    template<memory_semantics M>                                                                         \
+    struct atomic_traits<S,M> {                                                                          \
+        typedef atomic_rep<S>::word word;                                                                \
+        inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) { \
+            return __TBB_machine_cmpswp##S(location,new_value,comparand);                                \
+        }                                                                                                \
+        inline static word fetch_and_add( volatile void* location, word addend ) {                       \
+            return __TBB_machine_fetchadd##S(location,addend);                                           \
+        }                                                                                                \
+        inline static word fetch_and_store( volatile void* location, word value ) {                      \
+            return __TBB_machine_fetchstore##S(location,value);                                          \
+        }                                                                                                \
     };
 
-#if __TBB_DECL_FENCED_ATOMICS
-__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,__TBB_full_fence)
-__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,__TBB_full_fence)
-__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,__TBB_full_fence)
-__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,__TBB_full_fence)
+template<memory_semantics M>
+struct atomic_load_store_traits;    // Primary template declaration
+
+#define __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(M)                      \
+    template<> struct atomic_load_store_traits<M> {                     \
+        template <typename T>                                           \
+        inline static T load( const volatile T& location ) {            \
+            return __TBB_load_##M( location );                          \
+        }                                                               \
+        template <typename T>                                           \
+        inline static void store( volatile T& location, T value ) {     \
+            __TBB_store_##M( location, value );                         \
+        }                                                               \
+    }
+
+#if __TBB_USE_FENCED_ATOMICS
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,full_fence)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,full_fence)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,full_fence)
 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,acquire)
 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,acquire)
 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,acquire)
 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,release)
 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,release)
 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,release)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,relaxed)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,relaxed)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,relaxed)
 #if __TBB_64BIT_ATOMICS
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,full_fence)
 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,acquire)
 __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,release)
+__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,relaxed)
 #endif
-#else
+#else /* !__TBB_USE_FENCED_ATOMICS */
 __TBB_DECL_ATOMIC_PRIMITIVES(1)
 __TBB_DECL_ATOMIC_PRIMITIVES(2)
 __TBB_DECL_ATOMIC_PRIMITIVES(4)
 #if __TBB_64BIT_ATOMICS
 __TBB_DECL_ATOMIC_PRIMITIVES(8)
 #endif
-#endif
+#endif /* !__TBB_USE_FENCED_ATOMICS */
+
+__TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(full_fence);
+__TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(acquire);
+__TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(release);
+__TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(relaxed);
 
 //! Additive inverse of 1 for type T.
 /** Various compilers issue various warnings if -1 is used with various integer types.
@@ -186,7 +212,7 @@ public:
     }
 
     value_type fetch_and_store( value_type value ) {
-        return fetch_and_store<__TBB_full_fence>(value);
+        return fetch_and_store<full_fence>(value);
     }
 
     template<memory_semantics M>
@@ -199,7 +225,7 @@ public:
     }
 
     value_type compare_and_swap( value_type value, value_type comparand ) {
-        return compare_and_swap<__TBB_full_fence>(value,comparand);
+        return compare_and_swap<full_fence>(value,comparand);
     }
 
     operator value_type() const volatile {                // volatile qualifier here for backwards compatibility 
@@ -208,6 +234,28 @@ public:
         return w.value;
     }
 
+    template<memory_semantics M>
+    value_type load () const {
+        converter u;
+        u.bits = internal::atomic_load_store_traits<M>::load( rep.value );
+        return u.value;
+    }
+
+    value_type load () const {
+        return load<acquire>();
+    }
+
+    template<memory_semantics M>
+    void store ( value_type value ) {
+        converter u;
+        u.value = value;
+        internal::atomic_load_store_traits<M>::store( rep.value, u.bits );
+    }
+
+    void store ( value_type value ) {
+        store<release>( value );
+    }
+
 protected:
     value_type store_with_release( value_type rhs ) {
         converter u;
@@ -232,7 +280,7 @@ public:
     }
 
     value_type fetch_and_add( D addend ) {
-        return fetch_and_add<__TBB_full_fence>(addend);
+        return fetch_and_add<full_fence>(addend);
     }
 
     template<memory_semantics M>
@@ -303,9 +351,10 @@ struct atomic: internal::atomic_impl<T> {
     };
 
 #if __TBB_64BIT_ATOMICS
-// otherwise size is verified by test_atomic
 __TBB_DECL_ATOMIC(__TBB_LONG_LONG)
 __TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)
+#else
+// test_atomic will verify that sizeof(long long)==8
 #endif
 __TBB_DECL_ATOMIC(long)
 __TBB_DECL_ATOMIC(unsigned long)
@@ -363,6 +412,15 @@ template<> struct atomic<void*>: internal::atomic_impl<void*> {
     }
 };
 
+// Helpers to workaround ugly syntax of calling template member function of a
+// template class with template argument dependent on template parameters.
+
+template <memory_semantics M, typename T>
+T load ( const atomic<T>& a ) { return a.template load<M>(); }
+
+template <memory_semantics M, typename T>
+void store ( atomic<T>& a, T value ) { return a.template store<M>(value); }
+
 } // namespace tbb
 
 #if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
diff --git a/include/tbb/blocked_range2d.h b/include/tbb/blocked_range2d.h
index 9bd0509..5fb182f 100644
--- a/include/tbb/blocked_range2d.h
+++ b/include/tbb/blocked_range2d.h
@@ -39,7 +39,7 @@ namespace tbb {
 template<typename RowValue, typename ColValue=RowValue>
 class blocked_range2d {
 public:
-    //! Type for size of an iteation range
+    //! Type for size of an iteration range
     typedef blocked_range<RowValue> row_range_type;
     typedef blocked_range<ColValue> col_range_type;
  
diff --git a/include/tbb/blocked_range3d.h b/include/tbb/blocked_range3d.h
index 85a66f1..f6f58de 100644
--- a/include/tbb/blocked_range3d.h
+++ b/include/tbb/blocked_range3d.h
@@ -39,7 +39,7 @@ namespace tbb {
 template<typename PageValue, typename RowValue=PageValue, typename ColValue=RowValue>
 class blocked_range3d {
 public:
-    //! Type for size of an iteation range
+    //! Type for size of an iteration range
     typedef blocked_range<PageValue> page_range_type;
     typedef blocked_range<RowValue>  row_range_type;
     typedef blocked_range<ColValue>  col_range_type;
diff --git a/include/tbb/compat/ppl.h b/include/tbb/compat/ppl.h
index a474b73..6f93148 100644
--- a/include/tbb/compat/ppl.h
+++ b/include/tbb/compat/ppl.h
@@ -40,6 +40,7 @@
 
 namespace Concurrency {
 
+#if __TBB_TASK_GROUP_CONTEXT
     using tbb::task_handle;
     using tbb::task_group_status;
     using tbb::task_group;
@@ -53,6 +54,7 @@ namespace Concurrency {
     using tbb::canceled;
 
     using tbb::is_current_task_group_canceling;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
     using tbb::parallel_invoke;
     using tbb::strict_ppl::parallel_for;
diff --git a/include/tbb/compat/tuple b/include/tbb/compat/tuple
index 4a4f5f2..3177a14 100644
--- a/include/tbb/compat/tuple
+++ b/include/tbb/compat/tuple
@@ -386,6 +386,11 @@ struct tuple_element {
 template<int N, class T>
 inline static typename tuple_element<N,T>::type& get(T &t) { return t.get<N>(); }
 
+template<int N, class T>
+inline static typename tuple_element<N,T>::type const& get(T const &t) { return 
+    const_cast<typename tuple_element<N,T>::type const &>
+        (const_cast<T &>(t).get<N>()); }
+
 }  // interface5
 } // tbb
 
diff --git a/include/tbb/concurrent_hash_map.h b/include/tbb/concurrent_hash_map.h
index 39cc308..ce589c9 100644
--- a/include/tbb/concurrent_hash_map.h
+++ b/include/tbb/concurrent_hash_map.h
@@ -52,7 +52,7 @@
 #include "aligned_space.h"
 #include "tbb_exception.h"
 #include "tbb_profiling.h"
-#include "_concurrent_unordered_internal.h" // Need tbb_hasher
+#include "internal/_concurrent_unordered_impl.h" // Need tbb_hasher
 #if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS
 #include <typeinfo>
 #endif
diff --git a/include/tbb/concurrent_priority_queue.h b/include/tbb/concurrent_priority_queue.h
index 6c06831..b5601f1 100644
--- a/include/tbb/concurrent_priority_queue.h
+++ b/include/tbb/concurrent_priority_queue.h
@@ -29,16 +29,12 @@
 #ifndef __TBB_concurrent_priority_queue_H
 #define __TBB_concurrent_priority_queue_H
 
-#if !TBB_PREVIEW_CONCURRENT_PRIORITY_QUEUE
-#error Set TBB_PREVIEW_CONCURRENT_PRIORITY_QUEUE to include concurrent_priority_queue.h
-#endif
-
 #include "atomic.h"
 #include "cache_aligned_allocator.h"
 #include "tbb_exception.h"
 #include "tbb_stddef.h"
 #include "tbb_profiling.h"
-#include "_aggregator_internal.h"
+#include "internal/_aggregator_impl.h"
 #include <vector>
 #include <iterator>
 #include <functional>
@@ -71,64 +67,71 @@ class concurrent_priority_queue {
     typedef A allocator_type;
 
     //! Constructs a new concurrent_priority_queue with default capacity
-    explicit concurrent_priority_queue(const allocator_type& a = allocator_type()) : mark(0), data(a) {
+    explicit concurrent_priority_queue(const allocator_type& a = allocator_type()) : mark(0), my_size(0), data(a)
+    {
         my_aggregator.initialize_handler(my_functor_t(this));
     }
 
     //! Constructs a new concurrent_priority_queue with init_sz capacity
-    explicit concurrent_priority_queue(size_type init_capacity, const allocator_type& a = allocator_type()) : mark(0), data(a) {
+    explicit concurrent_priority_queue(size_type init_capacity, const allocator_type& a = allocator_type()) :
+        mark(0), my_size(0), data(a)
+    {
         data.reserve(init_capacity);
         my_aggregator.initialize_handler(my_functor_t(this));
     }
 
     //! [begin,end) constructor
     template<typename InputIterator>
-    concurrent_priority_queue(InputIterator begin, InputIterator end, const allocator_type& a = allocator_type()) : data(begin, end, a)
+    concurrent_priority_queue(InputIterator begin, InputIterator end, const allocator_type& a = allocator_type()) :
+        data(begin, end, a)
     {
-        mark = data.size();
+        mark = 0;
         my_aggregator.initialize_handler(my_functor_t(this));
         heapify();
+        my_size = data.size();
     }
 
     //! Copy constructor
-    /** State of this queue may not reflect results of pending
-	operations on the copied queue. */
-    explicit concurrent_priority_queue(const concurrent_priority_queue& src) : mark(src.mark), data(src.data.begin(), src.data.end(), src.data.get_allocator())
+    /** This operation is unsafe if there are pending concurrent operations on the src queue. */
+    explicit concurrent_priority_queue(const concurrent_priority_queue& src) : mark(src.mark),
+        my_size(src.my_size), data(src.data.begin(), src.data.end(), src.data.get_allocator())
     {
         my_aggregator.initialize_handler(my_functor_t(this));
         heapify();
     }
 
-    concurrent_priority_queue(const concurrent_priority_queue& src, const allocator_type& a) : mark(src.mark), data(src.data.begin(), src.data.end(), a)
+    //! Copy constructor with specific allocator
+    /** This operation is unsafe if there are pending concurrent operations on the src queue. */
+    concurrent_priority_queue(const concurrent_priority_queue& src, const allocator_type& a) : mark(src.mark),
+        my_size(src.my_size), data(src.data.begin(), src.data.end(), a)
     {
         my_aggregator.initialize_handler(my_functor_t(this));
         heapify();
     }
 
     //! Assignment operator
-    /** State of this queue may not reflect results of pending
-	operations on the copied queue. */
+    /** This operation is unsafe if there are pending concurrent operations on the src queue. */
     concurrent_priority_queue& operator=(const concurrent_priority_queue& src) {
         if (this != &src) {
             std::vector<value_type, allocator_type>(src.data.begin(), src.data.end(), src.data.get_allocator()).swap(data);
             mark = src.mark;
+            my_size = src.my_size;
         }
         return *this;
     }
 
     //! Returns true if empty, false otherwise
-    /** Returned value may not reflect results of pending operations. */
-    bool empty() const { return data.empty(); }
+    /** Returned value may not reflect results of pending operations.
+        This operation reads shared data and will trigger a race condition. */
+    bool empty() const { return size()==0; }
 
     //! Returns the current number of elements contained in the queue
-    /** Returned value may not reflect results of pending operations. */
-    size_type size() const { return data.size(); }
-
-    //! Returns the current capacity (i.e. allocated storage) of the queue
-    /** Returned value may not reflect results of pending operations. */
-    size_type capacity() const { return data.capacity(); }
+    /** Returned value may not reflect results of pending operations.
+        This operation reads shared data and will trigger a race condition. */
+    size_type size() const { return __TBB_load_with_acquire(my_size); }
 
     //! Pushes elem onto the queue, increasing capacity of queue if necessary
+    /** This operation can be safely used concurrently with other push, try_pop or reserve operations. */
     void push(const_reference elem) {
         cpq_operation op_data(elem, PUSH_OP);
         my_aggregator.execute(&op_data);
@@ -138,7 +141,8 @@ class concurrent_priority_queue {
 
     //! Gets a reference to and removes highest priority element
     /** If a highest priority element was found, sets elem and returns true,
-        otherwise returns false. */
+        otherwise returns false.
+        This operation can be safely used concurrently with other push, try_pop or reserve operations. */
     bool try_pop(reference elem) {
         cpq_operation op_data(POP_OP);
         op_data.elem = &elem;
@@ -146,39 +150,29 @@ class concurrent_priority_queue {
         return op_data.status==SUCCEEDED;
     }
 
-    //! If current capacity is less than new_cap, increases capacity to new_cap
-    void reserve(size_type new_cap) {
-        cpq_operation op_data(RESERVE_OP);
-        op_data.sz = new_cap;
-        my_aggregator.execute(&op_data);
-        if (op_data.status == FAILED) // exception thrown
-            throw_exception(eid_bad_alloc);
-    }
-
     //! Clear the queue; not thread-safe
-    /** Resets size, effectively emptying queue; does not free space.
+    /** This operation is unsafe if there are pending concurrent operations on the queue.
+        Resets size, effectively emptying queue; does not free space.
         May not clear elements added in pending operations. */
     void clear() {
         data.clear();
         mark = 0;
-    }
-
-    //! Shrink queue capacity to current contents; not thread-safe
-    void shrink_to_fit() {
-        std::vector<value_type, allocator_type>(data.begin(), data.end(), data.get_allocator()).swap(data);
+        my_size = 0;
     }
 
     //! Swap this queue with another; not thread-safe
+    /** This operation is unsafe if there are pending concurrent operations on the queue. */
     void swap(concurrent_priority_queue& q) {
         data.swap(q.data);
         std::swap(mark, q.mark);
+        std::swap(my_size, q.my_size);
     }
 
     //! Return allocator object
     allocator_type get_allocator() const { return data.get_allocator(); }
 
  private:
-    enum operation_type {INVALID_OP, PUSH_OP, POP_OP, RESERVE_OP};
+    enum operation_type {INVALID_OP, PUSH_OP, POP_OP};
     enum operation_status { WAIT=0, SUCCEEDED, FAILED };
 
     class cpq_operation : public aggregated_operation<cpq_operation> {
@@ -208,9 +202,10 @@ class concurrent_priority_queue {
     char padding1[NFS_MaxLineSize - sizeof(aggregator< my_functor_t, cpq_operation >)];
     //! The point at which unsorted elements begin
     size_type mark;
+    __TBB_atomic size_type my_size;
     Compare compare;
     //! Padding added to avoid false sharing
-    char padding2[NFS_MaxLineSize - sizeof(size_type) - sizeof(Compare)];
+    char padding2[NFS_MaxLineSize - (2*sizeof(size_type)) - sizeof(Compare)];
     //! Storage for the heap of elements in queue, plus unheapified elements
     /** data has the following structure:
 
@@ -222,14 +217,13 @@ class concurrent_priority_queue {
         [_|...|_|_|...|_| |...| ]
          0       ^       ^       ^
                  |       |       |__capacity
-                 |       |__size
+                 |       |__my_size
                  |__mark
-                 
 
         Thus, data stores the binary heap starting at position 0 through
-        mark-1 (it may be empty).  Then there are 0 or more elements 
-        that have not yet been inserted into the heap, in positions 
-        mark through size-1. */
+        mark-1 (it may be empty).  Then there are 0 or more elements
+        that have not yet been inserted into the heap, in positions
+        mark through my_size-1. */
     std::vector<value_type, allocator_type> data;
 
     void handle_operations(cpq_operation *op_list) {
@@ -254,17 +248,20 @@ class concurrent_priority_queue {
             if (tmp->type == PUSH_OP) {
                 __TBB_TRY {
                     data.push_back(*(tmp->elem));
+                    __TBB_store_with_release(my_size, my_size+1);
                     itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
                 } __TBB_CATCH(...) {
                     itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
                 }
             }
-            else if (tmp->type == POP_OP) {
+            else { // tmp->type == POP_OP
+                __TBB_ASSERT(tmp->type == POP_OP, NULL);
                 if (mark < data.size() &&
                     compare(data[0], data[data.size()-1])) {
                     // there are newly pushed elems and the last one
                     // is higher than top
                     *(tmp->elem) = data[data.size()-1]; // copy the data
+                    __TBB_store_with_release(my_size, my_size-1);
                     itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
                     data.pop_back();
                     __TBB_ASSERT(mark<=data.size(), NULL);
@@ -274,15 +271,6 @@ class concurrent_priority_queue {
                     pop_list = tmp;
                 }
             }
-            else {
-                __TBB_ASSERT(tmp->type == RESERVE_OP, NULL);
-                __TBB_TRY {
-                    data.reserve(tmp->sz);
-                    itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
-                } __TBB_CATCH(...) {
-                    itt_store_word_with_release(tmp->status, uintptr_t(FAILED));
-                }
-            }
         }
 
         // second pass processes pop operations
@@ -300,11 +288,13 @@ class concurrent_priority_queue {
                     // there are newly pushed elems and the last one is
                     // higher than top
                     *(tmp->elem) = data[data.size()-1]; // copy the data
+                    __TBB_store_with_release(my_size, my_size-1);
                     itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
                     data.pop_back();
                 }
                 else { // extract top and push last element down heap
                     *(tmp->elem) = data[0]; // copy the data
+                    __TBB_store_with_release(my_size, my_size-1);
                     itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));
                     reheap();
                 }
@@ -319,7 +309,7 @@ class concurrent_priority_queue {
 
     //! Merge unsorted elements into heap
     void heapify() {
-        if (!mark) mark = 1;
+        if (!mark && data.size()>0) mark = 1;
         for (; mark<data.size(); ++mark) {
             // for each unheapified element under size
             size_type cur_pos = mark;
diff --git a/include/tbb/concurrent_queue.h b/include/tbb/concurrent_queue.h
index 5ea6909..cc7ac33 100644
--- a/include/tbb/concurrent_queue.h
+++ b/include/tbb/concurrent_queue.h
@@ -29,7 +29,7 @@
 #ifndef __TBB_concurrent_queue_H
 #define __TBB_concurrent_queue_H
 
-#include "_concurrent_queue_internal.h"
+#include "internal/_concurrent_queue_impl.h"
 
 namespace tbb {
 
@@ -48,7 +48,7 @@ class concurrent_queue: public internal::concurrent_queue_base_v3<T> {
     page_allocator_type my_allocator;
 
     //! Allocates a block of size n (bytes)
-    /*overide*/ virtual void *allocate_block( size_t n ) {
+    /*override*/ virtual void *allocate_block( size_t n ) {
         void *b = reinterpret_cast<void*>(my_allocator.allocate( n ));
         if( !b )
             internal::throw_exception(internal::eid_bad_alloc); 
@@ -199,7 +199,7 @@ class concurrent_bounded_queue: public internal::concurrent_queue_base_v3 {
         *static_cast<T*>(dst) = from;
     }
 
-    /*overide*/ virtual page *allocate_page() {
+    /*override*/ virtual page *allocate_page() {
         size_t n = sizeof(padded_page) + (items_per_page-1)*sizeof(T);
         page *p = reinterpret_cast<page*>(my_allocator.allocate( n ));
         if( !p )
@@ -208,7 +208,7 @@ class concurrent_bounded_queue: public internal::concurrent_queue_base_v3 {
     }
 
     /*override*/ virtual void deallocate_page( page *p ) {
-        size_t n = sizeof(padded_page) + items_per_page*sizeof(T);
+        size_t n = sizeof(padded_page) + (items_per_page-1)*sizeof(T);
         my_allocator.deallocate( reinterpret_cast<char*>(p), n );
     }
 
diff --git a/include/tbb/concurrent_unordered_map.h b/include/tbb/concurrent_unordered_map.h
index ff13c2a..e14fad0 100644
--- a/include/tbb/concurrent_unordered_map.h
+++ b/include/tbb/concurrent_unordered_map.h
@@ -32,24 +32,11 @@
 #ifndef __TBB_concurrent_unordered_map_H
 #define __TBB_concurrent_unordered_map_H
 
-#include "_concurrent_unordered_internal.h"
+#include "internal/_concurrent_unordered_impl.h"
 
 namespace tbb
 {
 
-// Template class for hash compare
-template<typename Key>
-class tbb_hash
-{
-public:
-    tbb_hash() {}
-
-    size_t operator()(const Key& key) const
-    {
-        return tbb_hasher(key);
-    }
-};
-
 namespace interface5 {
 
 // Template class for hash map traits
@@ -90,7 +77,7 @@ protected:
     hash_compare my_hash_compare; // the comparator predicate for keys
 };
 
-template <typename Key, typename T, typename Hasher = tbb_hash<Key>, typename Key_equality = std::equal_to<Key>, typename Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >
+template <typename Key, typename T, typename Hasher = tbb::tbb_hash<Key>, typename Key_equality = std::equal_to<Key>, typename Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >
 class concurrent_unordered_map : public internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >
 {
     // Base type definitions
diff --git a/include/tbb/concurrent_unordered_map.h b/include/tbb/concurrent_unordered_set.h
similarity index 58%
copy from include/tbb/concurrent_unordered_map.h
copy to include/tbb/concurrent_unordered_set.h
index ff13c2a..45b550e 100644
--- a/include/tbb/concurrent_unordered_map.h
+++ b/include/tbb/concurrent_unordered_set.h
@@ -29,74 +29,46 @@
 /* Container implementations in this header are based on PPL implementations
    provided by Microsoft. */
 
-#ifndef __TBB_concurrent_unordered_map_H
-#define __TBB_concurrent_unordered_map_H
+#ifndef __TBB_concurrent_unordered_set_H
+#define __TBB_concurrent_unordered_set_H
 
-#include "_concurrent_unordered_internal.h"
+#include "internal/_concurrent_unordered_impl.h"
 
 namespace tbb
 {
 
-// Template class for hash compare
-template<typename Key>
-class tbb_hash
-{
-public:
-    tbb_hash() {}
-
-    size_t operator()(const Key& key) const
-    {
-        return tbb_hasher(key);
-    }
-};
-
 namespace interface5 {
 
-// Template class for hash map traits
-template<typename Key, typename T, typename Hash_compare, typename Allocator, bool Allow_multimapping>
-class concurrent_unordered_map_traits
+// Template class for hash set traits
+template<typename Key, typename Hash_compare, typename Allocator, bool Allow_multimapping>
+class concurrent_unordered_set_traits
 {
 protected:
-    typedef std::pair<const Key, T> value_type;
+    typedef Key value_type;
     typedef Key key_type;
     typedef Hash_compare hash_compare;
     typedef typename Allocator::template rebind<value_type>::other allocator_type;
     enum { allow_multimapping = Allow_multimapping };
 
-    concurrent_unordered_map_traits() : my_hash_compare() {}
-    concurrent_unordered_map_traits(const hash_compare& hc) : my_hash_compare(hc) {}
+    concurrent_unordered_set_traits() : my_hash_compare() {}
+    concurrent_unordered_set_traits(const hash_compare& hc) : my_hash_compare(hc) {}
 
-    class value_compare : public std::binary_function<value_type, value_type, bool>
-    {
-        friend class concurrent_unordered_map_traits<Key, T, Hash_compare, Allocator, Allow_multimapping>;
-
-    public:
-        bool operator()(const value_type& left, const value_type& right) const
-        {
-            return (my_hash_compare(left.first, right.first));
-        }
-
-        value_compare(const hash_compare& comparator) : my_hash_compare(comparator) {}
+    typedef hash_compare value_compare;
 
-    protected:
-        hash_compare my_hash_compare;    // the comparator predicate for keys
-    };
-
-    template<class Type1, class Type2>
-    static const Key& get_key(const std::pair<Type1, Type2>& value) {
-        return (value.first);
+    static const Key& get_key(const value_type& value) {
+        return value;
     }
 
     hash_compare my_hash_compare; // the comparator predicate for keys
 };
 
-template <typename Key, typename T, typename Hasher = tbb_hash<Key>, typename Key_equality = std::equal_to<Key>, typename Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >
-class concurrent_unordered_map : public internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >
+template <typename Key, typename Hasher = tbb::tbb_hash<Key>, typename Key_equality = std::equal_to<Key>, typename Allocator = tbb::tbb_allocator<Key> >
+class concurrent_unordered_set : public internal::concurrent_unordered_base< concurrent_unordered_set_traits<Key, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >
 {
     // Base type definitions
     typedef internal::hash_compare<Key, Hasher, Key_equality> hash_compare;
-    typedef internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T, hash_compare, Allocator, false> > base_type;
-    typedef concurrent_unordered_map_traits<Key, T, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> traits_type;
+    typedef internal::concurrent_unordered_base< concurrent_unordered_set_traits<Key, hash_compare, Allocator, false> > base_type;
+    typedef concurrent_unordered_set_traits<Key, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> traits_type;
     using traits_type::my_hash_compare;
 #if __TBB_EXTRA_DEBUG
 public:
@@ -110,7 +82,7 @@ public:
     // Type definitions
     typedef Key key_type;
     typedef typename base_type::value_type value_type;
-    typedef T mapped_type;
+    typedef Key mapped_type;
     typedef Hasher hasher;
     typedef Key_equality key_equal;
     typedef hash_compare key_compare;
@@ -130,18 +102,18 @@ public:
     typedef typename base_type::const_iterator const_local_iterator;
 
     // Construction/destruction/copying
-    explicit concurrent_unordered_map(size_type n_of_buckets = 8, const hasher& a_hasher = hasher(),
+    explicit concurrent_unordered_set(size_type n_of_buckets = 8, const hasher& a_hasher = hasher(),
         const key_equal& a_keyeq = key_equal(), const allocator_type& a = allocator_type())
         : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
     {
     }
 
-    concurrent_unordered_map(const Allocator& a) : base_type(8, key_compare(), a)
+    concurrent_unordered_set(const Allocator& a) : base_type(8, key_compare(), a)
     {
     }
 
     template <typename Iterator>
-    concurrent_unordered_map(Iterator first, Iterator last, size_type n_of_buckets = 8, const hasher& a_hasher = hasher(),
+    concurrent_unordered_set(Iterator first, Iterator last, size_type n_of_buckets = 8, const hasher& a_hasher = hasher(),
         const key_equal& a_keyeq = key_equal(), const allocator_type& a = allocator_type())
         : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)
     {
@@ -149,16 +121,16 @@ public:
             base_type::insert(*first);
     }
 
-    concurrent_unordered_map(const concurrent_unordered_map& table) : base_type(table)
+    concurrent_unordered_set(const concurrent_unordered_set& table) : base_type(table)
     {
     }
 
-    concurrent_unordered_map(const concurrent_unordered_map& table, const Allocator& a)
+    concurrent_unordered_set(const concurrent_unordered_set& table, const Allocator& a)
         : base_type(table, a)
     {
     }
 
-    concurrent_unordered_map& operator=(const concurrent_unordered_map& table)
+    concurrent_unordered_set& operator=(const concurrent_unordered_set& table)
     {
         base_type::operator=(table);
         return (*this);
@@ -179,7 +151,7 @@ public:
         return base_type::unsafe_erase(first, last);
     }
 
-    void swap(concurrent_unordered_map& table)
+    void swap(concurrent_unordered_set& table)
     {
         base_type::swap(table);
     }
@@ -194,48 +166,12 @@ public:
     {
         return my_hash_compare.my_key_compare_object;
     }
-
-    mapped_type& operator[](const key_type& key)
-    {
-        iterator where = find(key);
-
-        if (where == end())
-        {
-            where = insert(std::pair<key_type, mapped_type>(key, mapped_type())).first;
-        }
-
-        return ((*where).second);
-    }
-
-    mapped_type& at(const key_type& key)
-    {
-        iterator where = find(key);
-
-        if (where == end())
-        {
-            tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
-        }
-
-        return ((*where).second);
-    }
-
-    const mapped_type& at(const key_type& key) const
-    {
-        const_iterator where = find(key);
-
-        if (where == end())
-        {
-            tbb::internal::throw_exception(tbb::internal::eid_invalid_key);
-        }
-
-        return ((*where).second);
-    }
 };
 
 } // namespace interface5
 
-using interface5::concurrent_unordered_map;
+using interface5::concurrent_unordered_set;
 
 } // namespace tbb
 
-#endif// __TBB_concurrent_unordered_map_H
+#endif// __TBB_concurrent_unordered_set_H
diff --git a/include/tbb/concurrent_vector.h b/include/tbb/concurrent_vector.h
index abcc645..2a38ff4 100644
--- a/include/tbb/concurrent_vector.h
+++ b/include/tbb/concurrent_vector.h
@@ -37,6 +37,7 @@
 #include "tbb_machine.h"
 #include "tbb_profiling.h"
 #include <new>
+#include <cstring>   // for memset()
 
 #if !TBB_USE_EXCEPTIONS && _MSC_VER
     // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
diff --git a/include/tbb/enumerable_thread_specific.h b/include/tbb/enumerable_thread_specific.h
index c45a428..f0a2b57 100644
--- a/include/tbb/enumerable_thread_specific.h
+++ b/include/tbb/enumerable_thread_specific.h
@@ -31,6 +31,7 @@
 
 #include "concurrent_vector.h"
 #include "tbb_thread.h"
+#include "tbb_allocator.h"
 #include "cache_aligned_allocator.h"
 #include "aligned_space.h"
 #include <string.h>  // for memcpy
diff --git a/include/tbb/flow_graph.h b/include/tbb/flow_graph.h
new file mode 100644
index 0000000..98da0f5
--- /dev/null
+++ b/include/tbb/flow_graph.h
@@ -0,0 +1,1589 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_flow_graph_H
+#define __TBB_flow_graph_H
+
+#include "tbb_stddef.h"
+#include "atomic.h"
+#include "spin_mutex.h"
+#include "null_mutex.h"
+#include "spin_rw_mutex.h"
+#include "null_rw_mutex.h"
+#include "task.h"
+#include "concurrent_vector.h"
+#include "internal/_aggregator_impl.h"
+
+// use the VC10 or gcc version of tuple if it is available.
+#if TBB_IMPLEMENT_CPP0X && (!defined(_MSC_VER) || _MSC_VER < 1600)
+#define TBB_PREVIEW_TUPLE 1
+#include "compat/tuple"
+#else
+#include <tuple>
+#endif
+
+#include<list>
+#include<queue>
+
+/** @file
+  \brief The graph related classes and functions
+
+  There are some applications that best express dependencies as messages
+  passed between nodes in a graph.  These messages may contain data or
+  simply act as signals that a predecessors has completed. The graph
+  class and its associated node classes can be used to express such
+  applcations.
+*/
+
+namespace tbb {
+namespace flow {
+
+//! An enumeration the provides the two most common concurrency levels: unlimited and serial
+enum concurrency { unlimited = 0, serial = 1 };
+
+namespace interface6 {
+
+//! The base of all graph nodes.  Allows them to be stored in a collection for deletion.
+class graph_node {
+public:
+    virtual ~graph_node() {} 
+}; 
+
+//! An empty class used for messages that mean "I'm done" 
+class continue_msg {};
+        
+template< typename T > class sender;
+template< typename T > class receiver;
+class continue_receiver;
+        
+//! Pure virtual template class that defines a sender of messages of type T
+template< typename T >
+class sender {
+public:
+    //! The output type of this sender
+    typedef T output_type;
+        
+    //! The successor type for this node
+    typedef receiver<T> successor_type;
+        
+    virtual ~sender() {}
+        
+    //! Add a new successor to this node
+    virtual bool register_successor( successor_type &r ) = 0;
+        
+    //! Removes a successor from this node
+    virtual bool remove_successor( successor_type &r ) = 0;
+        
+    //! Request an item from the sender
+    virtual bool try_get( T & ) { return false; }
+        
+    //! Reserves an item in the sender 
+    virtual bool try_reserve( T & ) { return false; }
+        
+    //! Releases the reserved item
+    virtual bool try_release( ) { return false; }
+        
+    //! Consumes the reserved item
+    virtual bool try_consume( ) { return false; }
+        
+};
+        
+        
+//! Pure virtual template class that defines a receiver of messages of type T
+template< typename T >
+class receiver {
+public:
+        
+    //! The input type of this receiver
+    typedef T input_type;
+        
+    //! The predecessor type for this node
+    typedef sender<T> predecessor_type;
+        
+    //! Destructor
+    virtual ~receiver() {}
+        
+    //! Put an item to the receiver
+    virtual bool try_put( const T& t ) = 0;
+        
+    //! Add a predecessor to the node
+    virtual bool register_predecessor( predecessor_type & ) { return false; }
+        
+    //! Remove a predecessor from the node
+    virtual bool remove_predecessor( predecessor_type & ) { return false; }
+        
+};
+        
+//! Base class for receivers of completion messages
+/** These receivers automatically reset, but cannot be explicitly waited on */
+class continue_receiver : public receiver< continue_msg > {
+public:
+        
+    //! The input type
+    typedef continue_msg input_type;
+        
+    //! The predecessor type for this node
+    typedef sender< continue_msg > predecessor_type;
+        
+    //! Constructor
+    continue_receiver( int number_of_predecessors = 0 ) { 
+        my_predecessor_count = my_initial_predecessor_count = number_of_predecessors;
+        my_current_count = 0;
+    }
+        
+    //! Copy constructor
+    continue_receiver( const continue_receiver& src ) : receiver<continue_msg>() { 
+        my_predecessor_count = my_initial_predecessor_count = src.my_initial_predecessor_count;
+        my_current_count = 0;
+    }
+        
+    //! Destructor
+    virtual ~continue_receiver() { }
+        
+    //! Increments the trigger threshold
+    /* override */ bool register_predecessor( predecessor_type & ) {
+        spin_mutex::scoped_lock l(my_mutex);
+        ++my_predecessor_count;
+        return true;
+    }
+        
+    //! Decrements the trigger threshold
+    /** Does not check to see if the removal of the predecessor now makes the current count
+        exceed the new threshold.  So removing a predecessor while the graph is active can cause
+        unexpected results. */
+    /* override */ bool remove_predecessor( predecessor_type & ) {
+        spin_mutex::scoped_lock l(my_mutex);
+        --my_predecessor_count;
+        return true;
+    }
+        
+    //! Puts a continue_msg to the receiver
+    /** If the message causes the message count to reach the predecessor count, execute() is called and
+        the message count is reset to 0.  Otherwise the message count is incremented. */
+    /* override */ bool try_put( const input_type & ) {
+        {
+            spin_mutex::scoped_lock l(my_mutex);
+            if ( ++my_current_count < my_predecessor_count ) 
+                return true;
+            else
+                my_current_count = 0;
+        }
+        execute();
+        return true;
+    }
+        
+protected:
+        
+    spin_mutex my_mutex;
+    int my_predecessor_count;
+    int my_current_count;
+    int my_initial_predecessor_count;
+        
+    //! Does whatever should happen when the threshold is reached
+    /** This should be very fast or else spawn a task.  This is
+        called while the sender is blocked in the try_put(). */
+    virtual void execute() = 0;
+        
+};
+
+#include "internal/_flow_graph_impl.h"
+using namespace internal::graph_policy_namespace;
+
+//! The graph class
+/** This class serves as a handle to the graph */
+class graph : tbb::internal::no_copy {
+        
+    template< typename Body >
+    class run_task : public task {
+    public: 
+        run_task( Body& body ) : my_body(body) {}
+        task *execute() {
+            my_body();
+            return NULL;
+        }
+    private:
+        Body my_body;
+    };
+        
+    template< typename Receiver, typename Body >
+    class run_and_put_task : public task {
+    public: 
+        run_and_put_task( Receiver &r, Body& body ) : my_receiver(r), my_body(body) {}
+        task *execute() {
+            my_receiver.try_put( my_body() );
+            return NULL;
+        }
+    private:
+        Receiver &my_receiver;
+        Body my_body;
+    };
+        
+public:
+        
+        
+    //! Constructs a graph withy no nodes.
+    graph() : my_root_task( new ( task::allocate_root( ) ) empty_task ) {
+        my_root_task->set_ref_count(1);
+    }
+        
+    //! Destroys the graph.
+    /** Calls wait_for_all on the graph, deletes all of the nodes appended by calls to add, and then 
+        destroys the root task of the graph. */ 
+    ~graph() {
+        wait_for_all();
+        my_root_task->set_ref_count(0);
+        task::destroy( *my_root_task );
+    }
+        
+        
+    //! Used to register that an external entity may still interact with the graph.
+    /** The graph will not return from wait_for_all until a matching number of decrement_wait_count calls
+        is made. */
+    void increment_wait_count() { 
+        if (my_root_task)
+            my_root_task->increment_ref_count();
+    }
+        
+    //! Deregisters an external entity that may have interacted with the graph.
+    /** The graph will not return from wait_for_all until all the number of decrement_wait_count calls
+        matches the number of increment_wait_count calls. */
+    void decrement_wait_count() { 
+        if (my_root_task)
+            my_root_task->decrement_ref_count(); 
+    }
+        
+    //! Spawns a task that runs a body and puts its output to a specific receiver
+    /** The task is spawned as a child of the graph. This is useful for running tasks 
+        that need to block a wait_for_all() on the graph.  For example a one-off source. */
+    template< typename Receiver, typename Body >
+        void run( Receiver &r, Body body ) {
+       task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
+           run_and_put_task< Receiver, Body >( r, body ) );
+    }
+        
+    //! Spawns a task that runs a function object 
+    /** The task is spawned as a child of the graph. This is useful for running tasks 
+        that need to block a wait_for_all() on the graph. For example a one-off source. */
+    template< typename Body >
+    void run( Body body ) {
+       task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
+           run_task< Body >( body ) );
+    }
+        
+    //! Waits until the graph is idle and the number of decrement_wait_count calls equals the number of increment_wait_count calls.
+    /** The waiting thread will go off and steal work while it is block in the wait_for_all. */
+    void wait_for_all() {
+        if (my_root_task)
+            my_root_task->wait_for_all();
+        my_root_task->set_ref_count(1);
+    }
+        
+    //! Returns the root task of the graph
+    task * root_task() {
+        return my_root_task;
+    }
+        
+private:
+        
+    task *my_root_task;
+        
+};
+
+#include "internal/_flow_graph_node_impl.h"
+
+//! An executable node that acts as a source, i.e. it has no predecessors
+template < typename Output >
+class source_node : public graph_node, public sender< Output > {
+public:
+        
+    //! The type of the output message, which is complete
+    typedef Output output_type;           
+        
+    //! The type of successors of this node
+    typedef receiver< Output > successor_type;
+        
+    //! Constructor for a node with a successor
+    template< typename Body >
+    source_node( graph &g, Body body, bool is_active = true )
+        : my_root_task(g.root_task()), my_active(is_active), init_my_active(is_active),
+        my_body( new internal::source_body_leaf< output_type, Body>(body) ),
+        my_reserved(false), my_has_cached_item(false) 
+    { 
+        my_successors.set_owner(this);
+    }
+        
+    //! Copy constructor
+    source_node( const source_node& src ) :
+        graph_node(), sender<Output>(),
+        my_root_task( src.my_root_task), my_active(src.init_my_active),
+        init_my_active(src.init_my_active), my_body( src.my_body->clone() ),
+        my_reserved(false), my_has_cached_item(false)
+    {
+        my_successors.set_owner(this);
+    }
+
+    //! The destructor
+    ~source_node() { delete my_body; }
+        
+    //! Add a new successor to this node
+    /* override */ bool register_successor( receiver<output_type> &r ) {
+        spin_mutex::scoped_lock lock(my_mutex);
+        my_successors.register_successor(r);
+        if ( my_active )
+            spawn_put();
+        return true;
+    }
+        
+    //! Removes a successor from this node
+    /* override */ bool remove_successor( receiver<output_type> &r ) {
+        spin_mutex::scoped_lock lock(my_mutex);
+        my_successors.remove_successor(r);
+        return true;
+    }
+        
+    //! Request an item from the node
+    /*override */ bool try_get( output_type &v ) {
+        spin_mutex::scoped_lock lock(my_mutex);
+        if ( my_reserved )  
+            return false;
+        
+        if ( my_has_cached_item ) {
+            v = my_cached_item;
+            my_has_cached_item = false;
+        } else if ( (*my_body)(v) == false ) {
+            return false;
+        }
+        return true;
+    }
+        
+    //! Reserves an item.
+    /* override */ bool try_reserve( output_type &v ) {
+        spin_mutex::scoped_lock lock(my_mutex);
+        if ( my_reserved ) {
+            return false;
+        }
+        
+        if ( !my_has_cached_item && (*my_body)(my_cached_item) )  
+            my_has_cached_item = true;
+        
+        if ( my_has_cached_item ) {
+            v = my_cached_item;
+            my_reserved = true;
+            return true;
+        } else {
+            return false;
+        }
+    }
+        
+    //! Release a reserved item.  
+    /**  true = item has been released and so remains in sender, dest must request or reserve future items */
+    /* override */ bool try_release( ) {
+        spin_mutex::scoped_lock lock(my_mutex);
+        __TBB_ASSERT( my_reserved && my_has_cached_item, "releasing non-existent reservation" );
+        my_reserved = false;
+        spawn_put();
+        return true;
+    }
+        
+    //! Consumes a reserved item
+    /* override */ bool try_consume( ) {
+        spin_mutex::scoped_lock lock(my_mutex);
+        __TBB_ASSERT( my_reserved && my_has_cached_item, "consuming non-existent reservation" );
+        my_reserved = false;
+        my_has_cached_item = false;
+        if ( !my_successors.empty() ) {
+            spawn_put();
+        }
+        return true;
+    }
+        
+    //! Activates a node that was created in the inactive state
+    void activate() {
+        spin_mutex::scoped_lock lock(my_mutex);
+        my_active = true;
+        if ( !my_successors.empty() )
+            spawn_put();
+    }
+        
+private:
+        
+    task *my_root_task;
+    spin_mutex my_mutex;
+    bool my_active;
+    bool init_my_active;
+    internal::source_body<output_type> *my_body;
+    internal::broadcast_cache< output_type > my_successors;
+    bool my_reserved;
+    bool my_has_cached_item;
+    output_type my_cached_item;
+        
+    friend class internal::source_task< source_node< output_type > >;
+        
+    //! Applies the body
+    /* override */ void apply_body( ) {
+        output_type v;
+        if ( try_reserve(v) == false )
+            return;
+        
+        if ( my_successors.try_put( v ) ) 
+            try_consume();
+        else
+            try_release();
+    }
+        
+    //! Spawns a task that applies the body
+    /* override */ void spawn_put( ) {
+        task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
+           internal::source_task< source_node< output_type > >( *this ) ); 
+    }
+        
+};
+        
+//! Implements a function node that supports Input -> Output
+template < typename Input, typename Output = continue_msg, graph_buffer_policy = queueing, typename Allocator=cache_aligned_allocator<Input> >
+class function_node : public graph_node, public internal::function_input<Input,Output,Allocator>, public internal::function_output<Output> {
+public:
+        
+    typedef Input input_type;
+    typedef Output output_type;
+    typedef sender< input_type > predecessor_type;
+    typedef receiver< output_type > successor_type;
+    typedef internal::function_output<output_type> fOutput_type;
+        
+    //! Constructor
+    template< typename Body >
+    function_node( graph &g, size_t concurrency, Body body )
+    : internal::function_input<input_type,output_type,Allocator>( g, concurrency, body ) {
+    }
+
+    //! Copy constructor
+    function_node( const function_node& src ) : 
+        graph_node(), internal::function_input<input_type,output_type,Allocator>( src ),
+        fOutput_type() {}
+        
+protected:
+
+    /* override */ internal::broadcast_cache<output_type> &successors () { return fOutput_type::my_successors; }
+        
+};
+
+//! Implements a function node that supports Input -> Output
+template < typename Input, typename Output, typename Allocator >
+class function_node<Input,Output,queueing,Allocator> : public graph_node, public internal::function_input<Input,Output,Allocator>, public internal::function_output<Output> {
+public:
+        
+    typedef Input input_type;
+    typedef Output output_type;
+    typedef sender< input_type > predecessor_type;
+    typedef receiver< output_type > successor_type;
+    typedef internal::function_input<input_type,output_type,Allocator> fInput_type;
+    typedef internal::function_input_queue<input_type, Allocator> queue_type;
+    typedef internal::function_output<output_type> fOutput_type;
+        
+    //! Constructor
+    template< typename Body >
+    function_node( graph &g, size_t concurrency, Body body ) : fInput_type( g, concurrency, body, new queue_type() ) {
+    }
+
+    //! Copy constructor
+    function_node( const function_node& src ) : 
+        graph_node(), fInput_type( src, new queue_type() ) , fOutput_type() { }
+
+protected:
+
+    /* override */ internal::broadcast_cache<output_type> &successors () { return fOutput_type::my_successors; }
+        
+};
+
+#include "tbb/internal/_flow_graph_types_impl.h"
+
+#if TBB_PREVIEW_GRAPH_NODES
+//! implements a function node that supports Input -> (set of outputs)
+// Output is a tuple of output types.
+template < typename Input, typename Output, graph_buffer_policy = queueing, typename Allocator=cache_aligned_allocator<Input> >
+class multioutput_function_node : 
+    public graph_node, 
+    public internal::multioutput_function_input
+    <  
+        Input, 
+        typename internal::wrap_tuple_elements<
+            std::tuple_size<Output>::value,  // #elements in tuple
+            internal::function_output,  // wrap this around each element
+            Output // the tuple providing the types
+        >::type,
+        Allocator
+    > {
+private:
+    static const int N = std::tuple_size<Output>::value;
+public:
+    typedef Input input_type;
+    typedef typename internal::wrap_tuple_elements<N,internal::function_output, Output>::type ports_type;
+private:
+    typedef typename internal::multioutput_function_input<input_type, ports_type, Allocator> base_type;
+    typedef typename internal::function_input_queue<input_type,Allocator> queue_type;
+public:
+    template<typename Body>
+    multioutput_function_node( graph &g, size_t concurrency, Body body ) : base_type(g,concurrency, body) {}
+    multioutput_function_node( const multioutput_function_node &other) :
+        graph_node(), base_type(other) {}
+    // all the guts are in multioutput_function_input...
+
+};  // multioutput_function_node
+        
+template < typename Input, typename Output, typename Allocator >
+class multioutput_function_node<Input,Output,queueing,Allocator> : public graph_node, public internal::multioutput_function_input<Input, 
+    typename internal::wrap_tuple_elements<std::tuple_size<Output>::value, internal::function_output, Output>::type, Allocator> {
+    static const int N = std::tuple_size<Output>::value;
+public:
+    typedef Input input_type;
+    typedef typename internal::wrap_tuple_elements<N, internal::function_output, Output>::type ports_type;
+private:
+    typedef typename internal::multioutput_function_input<input_type, ports_type, Allocator> base_type;
+    typedef typename internal::function_input_queue<input_type,Allocator> queue_type;
+public:
+
+    template<typename Body>
+    multioutput_function_node( graph &g, size_t concurrency, Body body) : base_type(g,concurrency, body, new queue_type()) {}
+    multioutput_function_node( const multioutput_function_node &other) :
+        graph_node(), base_type(other, new queue_type()) {}
+
+};  // multioutput_function_node
+
+//! split_node: accepts a tuple as input, forwards each element of the tuple to its
+//  successors.  The node has unlimited concurrency, so though it is marked as
+//  "rejecting" it does not reject inputs.
+template<typename TupleType, typename Allocator=cache_aligned_allocator<TupleType> >
+class split_node : public multioutput_function_node<TupleType, TupleType, rejecting, Allocator> {
+    static const int N = std::tuple_size<TupleType>::value;
+    typedef multioutput_function_node<TupleType,TupleType,rejecting,Allocator> base_type;
+public:
+    typedef typename base_type::ports_type ports_type;
+private:
+
+    struct splitting_body {
+        void operator()(const TupleType& t, ports_type &p) {
+            internal::emit_element<N>::emit_this(t, p);
+        }
+    };
+public:
+    typedef TupleType input_type;
+    typedef Allocator allocator_type;
+    split_node(graph &g) : base_type(g, unlimited, splitting_body()) { }
+    split_node( const split_node & other) : base_type(other) { }
+};
+#endif  // TBB_PREVIEW_GRAPH_NODES
+
+//! Implements an executable node that supports continue_msg -> Output
+template <typename Output>
+class continue_node : public graph_node, public internal::continue_input<Output>, public internal::function_output<Output> {
+public:
+        
+    typedef continue_msg input_type;
+    typedef Output output_type;
+    typedef sender< input_type > predecessor_type;
+    typedef receiver< output_type > successor_type;
+    typedef internal::function_output<output_type> fOutput_type;
+        
+     //! Constructor for executable node with continue_msg -> Output
+     template <typename Body >
+     continue_node( graph &g, Body body )
+             : internal::continue_input<output_type>( g, body ) {
+     }
+        
+    //! Constructor for executable node with continue_msg -> Output
+    template <typename Body >
+    continue_node( graph &g, int number_of_predecessors, Body body )
+        : internal::continue_input<output_type>( g, number_of_predecessors, body )
+    {
+    }
+ 
+    //! Copy constructor       
+    continue_node( const continue_node& src ) :
+        graph_node(), internal::continue_input<output_type>(src),
+        internal::function_output<Output>() { }
+
+protected:
+        
+    /* override */ internal::broadcast_cache<output_type> &successors () { return fOutput_type::my_successors; }
+        
+};
+        
+template< typename T >
+class overwrite_node : public graph_node, public receiver<T>, public sender<T> {
+public:
+        
+    typedef T input_type;
+    typedef T output_type;
+    typedef sender< input_type > predecessor_type;
+    typedef receiver< output_type > successor_type;
+        
+    overwrite_node() : my_buffer_is_valid(false) {
+        my_successors.set_owner( this );
+    }
+
+    // Copy constructor; doesn't take anything from src; default won't work
+    overwrite_node( const overwrite_node& ) : 
+        graph_node(), receiver<T>(), sender<T>(), my_buffer_is_valid(false) {
+        my_successors.set_owner( this );
+    }
+        
+    ~overwrite_node() {}
+        
+    /* override */ bool register_successor( successor_type &s ) {
+        spin_mutex::scoped_lock l( my_mutex );
+        if ( my_buffer_is_valid ) {
+            // We have a valid value that must be forwarded immediately.
+            if ( s.try_put( my_buffer ) || !s.register_predecessor( *this  ) ) {
+                // We add the successor: it accepted our put or it rejected it but won't let use become a predecessor
+                my_successors.register_successor( s );
+                return true;
+            } else {
+                // We don't add the successor: it rejected our put and we became its predecessor instead
+                return false;
+            }
+        } else {
+            // No valid value yet, just add as successor
+            my_successors.register_successor( s );
+            return true;
+        }
+    }
+        
+    /* override */ bool remove_successor( successor_type &s ) {
+        spin_mutex::scoped_lock l( my_mutex );
+        my_successors.remove_successor(s);
+        return true;
+    }
+        
+    /* override */ bool try_put( const T &v ) {
+        spin_mutex::scoped_lock l( my_mutex );
+        my_buffer = v;
+        my_buffer_is_valid = true;
+        my_successors.try_put(v);
+        return true;
+    }
+        
+    /* override */ bool try_get( T &v ) {
+        spin_mutex::scoped_lock l( my_mutex );
+        if ( my_buffer_is_valid ) {
+            v = my_buffer;
+            return true;
+        } else {
+            return false;
+        }
+    }
+        
+    bool is_valid() {
+       spin_mutex::scoped_lock l( my_mutex );
+       return my_buffer_is_valid;
+    }
+        
+    void clear() {
+       spin_mutex::scoped_lock l( my_mutex );
+       my_buffer_is_valid = false;
+    }
+        
+protected:
+        
+    spin_mutex my_mutex;
+    internal::broadcast_cache< T, null_rw_mutex > my_successors;
+    T my_buffer;
+    bool my_buffer_is_valid;
+        
+};
+        
+template< typename T >
+class write_once_node : public overwrite_node<T> {
+public:
+        
+    typedef T input_type;
+    typedef T output_type;
+    typedef sender< input_type > predecessor_type;
+    typedef receiver< output_type > successor_type;
+        
+    //! Constructor
+    write_once_node() : overwrite_node<T>() {}
+
+    //! Copy constructor: call base class copy constructor
+    write_once_node( const write_once_node& src ) : overwrite_node<T>(src) {}
+
+    /* override */ bool try_put( const T &v ) {
+        spin_mutex::scoped_lock l( this->my_mutex );
+        if ( this->my_buffer_is_valid ) {
+            return false;
+        } else {
+            this->my_buffer = v;
+            this->my_buffer_is_valid = true;
+            this->my_successors.try_put(v);
+            return true;
+        }
+    }
+};
+        
+//! Forwards messages of type T to all successors
+template <typename T>
+class broadcast_node : public graph_node, public receiver<T>, public sender<T> {
+        
+    internal::broadcast_cache<T> my_successors;
+        
+public:
+        
+    typedef T input_type;
+    typedef T output_type;
+    typedef sender< input_type > predecessor_type;
+    typedef receiver< output_type > successor_type;
+        
+    broadcast_node( ) {
+        my_successors.set_owner( this );
+    }
+        
+    // Copy constructor
+    broadcast_node( const broadcast_node& ) : graph_node(), receiver<T>(), sender<T>() {
+        my_successors.set_owner( this );
+    }
+        
+    //! Adds a successor
+    virtual bool register_successor( receiver<T> &r ) {
+        my_successors.register_successor( r );
+        return true;
+    }
+        
+    //! Removes s as a successor
+    virtual bool remove_successor( receiver<T> &r ) {
+        my_successors.remove_successor( r );
+        return true;
+    }
+        
+    /* override */ bool try_put( const T &t ) {
+        my_successors.try_put(t);
+        return true;
+    }
+        
+};
+
+#include "internal/_flow_graph_item_buffer_impl.h"
+
+//! Forwards messages in arbitrary order
+template <typename T, typename A=cache_aligned_allocator<T> >
+class buffer_node : public graph_node, public reservable_item_buffer<T, A>, public receiver<T>, public sender<T> {
+public:
+    typedef T input_type;
+    typedef T output_type;
+    typedef sender< input_type > predecessor_type;
+    typedef receiver< output_type > successor_type;
+    typedef buffer_node<T, A> my_class;
+protected:
+    typedef size_t size_type;
+    internal::round_robin_cache< T, null_rw_mutex > my_successors;
+        
+    task *my_parent;
+        
+    friend class internal::forward_task< buffer_node< T, A > >;
+        
+    enum op_type {reg_succ, rem_succ, req_item, res_item, rel_res, con_res, put_item, try_fwd};
+    enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+        
+    // implements the aggregator_operation concept
+    class buffer_operation : public internal::aggregated_operation< buffer_operation > {
+    public:
+        char type;
+        T *elem;
+        successor_type *r;
+        buffer_operation(const T& e, op_type t) :
+            type(char(t)), elem(const_cast<T*>(&e)), r(NULL) {}
+        buffer_operation(op_type t) : type(char(t)), r(NULL) {}
+    };
+        
+    bool forwarder_busy;
+    typedef internal::aggregating_functor<my_class, buffer_operation> my_handler;
+    friend class internal::aggregating_functor<my_class, buffer_operation>;
+    internal::aggregator< my_handler, buffer_operation> my_aggregator;
+        
+    virtual void handle_operations(buffer_operation *op_list) {
+        buffer_operation *tmp;
+        bool try_forwarding=false;
+        while (op_list) {
+            tmp = op_list;
+            op_list = op_list->next;
+            switch (tmp->type) {
+            case reg_succ: internal_reg_succ(tmp);  try_forwarding = true; break;
+            case rem_succ: internal_rem_succ(tmp); break;
+            case req_item: internal_pop(tmp); break;
+            case res_item: internal_reserve(tmp); break;
+            case rel_res:  internal_release(tmp);  try_forwarding = true; break;
+            case con_res:  internal_consume(tmp);  try_forwarding = true; break;
+            case put_item: internal_push(tmp);  try_forwarding = true; break;
+            case try_fwd:  internal_forward(tmp); break;
+            }
+        }
+        if (try_forwarding && !forwarder_busy) {
+            forwarder_busy = true;
+            task::enqueue(*new(task::allocate_additional_child_of(*my_parent)) internal::forward_task< buffer_node<input_type, A> >(*this));
+        }
+    }
+        
+    //! This is executed by an enqueued task, the "forwarder"
+    virtual void forward() {
+        buffer_operation op_data(try_fwd);
+        do {
+            op_data.status = WAIT;
+            my_aggregator.execute(&op_data);
+        } while (op_data.status == SUCCEEDED);
+    }
+        
+    //! Register successor
+    virtual void internal_reg_succ(buffer_operation *op) {
+        my_successors.register_successor(*(op->r));
+        __TBB_store_with_release(op->status, SUCCEEDED);
+    }
+        
+    //! Remove successor
+    virtual void internal_rem_succ(buffer_operation *op) {
+        my_successors.remove_successor(*(op->r));
+        __TBB_store_with_release(op->status, SUCCEEDED);
+    }
+        
+    //! Tries to forward valid items to successors
+    virtual void internal_forward(buffer_operation *op) {
+        T i_copy;
+        bool success = false; // flagged when a successor accepts
+        size_type counter = my_successors.size();
+        // Try forwarding, giving each successor a chance
+        while (counter>0 && !this->buffer_empty() && this->item_valid(this->my_tail-1)) {
+            this->fetch_back(i_copy);
+            if( my_successors.try_put(i_copy) ) {
+                this->invalidate_back();
+                --(this->my_tail);
+                success = true; // found an accepting successor
+            }
+            --counter;
+        }
+        if (success && !counter)
+            __TBB_store_with_release(op->status, SUCCEEDED);
+        else {
+            __TBB_store_with_release(op->status, FAILED);
+            forwarder_busy = false;
+        }
+    }
+        
+    virtual void internal_push(buffer_operation *op) {
+        this->push_back(*(op->elem));
+        __TBB_store_with_release(op->status, SUCCEEDED);
+    }
+        
+    virtual void internal_pop(buffer_operation *op) {
+        if(this->pop_back(*(op->elem))) {
+            __TBB_store_with_release(op->status, SUCCEEDED);
+        }
+        else {
+            __TBB_store_with_release(op->status, FAILED);
+        }
+    }
+        
+    virtual void internal_reserve(buffer_operation *op) {
+        if(this->reserve_front(*(op->elem))) {
+            __TBB_store_with_release(op->status, SUCCEEDED);
+        }
+        else {
+            __TBB_store_with_release(op->status, FAILED);
+        }
+    }
+        
+    virtual void internal_consume(buffer_operation *op) {
+        this->consume_front();
+        __TBB_store_with_release(op->status, SUCCEEDED);
+    }
+        
+    virtual void internal_release(buffer_operation *op) {
+        this->release_front();
+        __TBB_store_with_release(op->status, SUCCEEDED);
+    }
+        
+public:
+    //! Constructor
+    buffer_node( graph &g ) : reservable_item_buffer<T>(),
+        my_parent( g.root_task() ), forwarder_busy(false) {
+        my_successors.set_owner(this);
+        my_aggregator.initialize_handler(my_handler(this));
+    }
+
+    //! Copy constructor
+    buffer_node( const buffer_node& src ) :
+        graph_node(), reservable_item_buffer<T>(), receiver<T>(), sender<T>(),
+        my_parent( src.my_parent ) {
+        forwarder_busy = false;
+        my_successors.set_owner(this);
+        my_aggregator.initialize_handler(my_handler(this));
+    }
+
+    virtual ~buffer_node() {}
+        
+    //
+    // message sender implementation
+    //
+        
+    //! Adds a new successor.
+    /** Adds successor r to the list of successors; may forward tasks.  */
+    /* override */ bool register_successor( receiver<output_type> &r ) {
+        buffer_operation op_data(reg_succ);
+        op_data.r = &r;
+        my_aggregator.execute(&op_data);
+        return true;
+    }
+        
+    //! Removes a successor.
+    /** Removes successor r from the list of successors.
+        It also calls r.remove_predecessor(*this) to remove this node as a predecessor. */
+    /* override */ bool remove_successor( receiver<output_type> &r ) {
+        r.remove_predecessor(*this);
+        buffer_operation op_data(rem_succ);
+        op_data.r = &r;
+        my_aggregator.execute(&op_data);
+        return true;
+    }
+        
+    //! Request an item from the buffer_node
+    /**  true = v contains the returned item<BR>
+         false = no item has been returned */
+    /* override */ bool try_get( T &v ) {
+        buffer_operation op_data(req_item);
+        op_data.elem = &v;
+        my_aggregator.execute(&op_data);
+        return (op_data.status==SUCCEEDED);
+    }
+        
+    //! Reserves an item.
+    /**  false = no item can be reserved<BR>
+         true = an item is reserved */
+    /* override */ bool try_reserve( T &v ) {
+        buffer_operation op_data(res_item);
+        op_data.elem = &v;
+        my_aggregator.execute(&op_data);
+        return (op_data.status==SUCCEEDED);
+    }
+        
+    //! Release a reserved item.
+    /**  true = item has been released and so remains in sender */
+    /* override */ bool try_release() {
+        buffer_operation op_data(rel_res);
+        my_aggregator.execute(&op_data);
+        return true;
+    }
+        
+    //! Consumes a reserved item.
+    /** true = item is removed from sender and reservation removed */
+    /* override */ bool try_consume() {
+        buffer_operation op_data(con_res);
+        my_aggregator.execute(&op_data);
+        return true;
+    }
+        
+    //! Receive an item
+    /** true is always returned */
+    /* override */ bool try_put(const T &t) {
+        buffer_operation op_data(t, put_item);
+        my_aggregator.execute(&op_data);
+        return true;
+    }
+};
+        
+        
+//! Forwards messages in FIFO order
+template <typename T, typename A=cache_aligned_allocator<T> >
+class queue_node : public buffer_node<T, A> {
+protected:
+typedef typename buffer_node<T, A>::size_type size_type;
+typedef typename buffer_node<T, A>::buffer_operation queue_operation;
+        
+    enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+        
+    //! Tries to forward valid items to successors
+    /* override */ void internal_forward(queue_operation *op) {
+        T i_copy;
+        bool success = false; // flagged when a successor accepts
+        size_type counter = this->my_successors.size();
+        if (this->my_reserved || !this->item_valid(this->my_head)){
+            __TBB_store_with_release(op->status, FAILED);
+            this->forwarder_busy = false;
+            return;
+        }
+        // Keep trying to send items while there is at least one accepting successor
+        while (counter>0 && this->item_valid(this->my_head)) {
+            this->fetch_front(i_copy);
+            if(this->my_successors.try_put(i_copy)) {
+                 this->invalidate_front();
+                 ++(this->my_head);
+                success = true; // found an accepting successor
+            }
+            --counter;
+        }
+        if (success && !counter)
+            __TBB_store_with_release(op->status, SUCCEEDED);
+        else {
+            __TBB_store_with_release(op->status, FAILED);
+            this->forwarder_busy = false;
+        }
+    }
+        
+    /* override */ void internal_pop(queue_operation *op) {
+        if ( this->my_reserved || !this->item_valid(this->my_head)){
+            __TBB_store_with_release(op->status, FAILED);
+        }
+        else {
+            this->pop_front(*(op->elem));
+            __TBB_store_with_release(op->status, SUCCEEDED);
+        }
+    }
+    /* override */ void internal_reserve(queue_operation *op) {
+        if (this->my_reserved || !this->item_valid(this->my_head)) {
+            __TBB_store_with_release(op->status, FAILED);
+        }
+        else {
+            this->my_reserved = true;
+            this->fetch_front(*(op->elem));
+            this->invalidate_front();
+            __TBB_store_with_release(op->status, SUCCEEDED);
+        }
+    }
+    /* override */ void internal_consume(queue_operation *op) {
+        this->consume_front();
+        __TBB_store_with_release(op->status, SUCCEEDED);
+    }
+        
+public:
+        
+    typedef T input_type;
+    typedef T output_type;
+    typedef sender< input_type > predecessor_type;
+    typedef receiver< output_type > successor_type;
+        
+    //! Constructor
+    queue_node( graph &g ) : buffer_node<T, A>(g) {}
+
+    //! Copy constructor
+    queue_node( const queue_node& src) : buffer_node<T, A>(src) {}
+};
+        
+//! Forwards messages in sequence order
+template< typename T, typename A=cache_aligned_allocator<T> >
+class sequencer_node : public queue_node<T, A> {
+    internal::function_body< T, size_t > *my_sequencer;
+public:
+        
+    typedef T input_type;
+    typedef T output_type;
+    typedef sender< input_type > predecessor_type;
+    typedef receiver< output_type > successor_type;
+        
+    //! Constructor
+    template< typename Sequencer >
+    sequencer_node( graph &g, const Sequencer& s ) : queue_node<T, A>(g),
+        my_sequencer(new internal::function_body_leaf< T, size_t, Sequencer>(s) ) {}
+
+    //! Copy constructor
+    sequencer_node( const sequencer_node& src ) : queue_node<T, A>(src),
+        my_sequencer( src.my_sequencer->clone() ) {}
+        
+    //! Destructor
+    ~sequencer_node() { delete my_sequencer; }
+protected:
+    typedef typename buffer_node<T, A>::size_type size_type;
+    typedef typename buffer_node<T, A>::buffer_operation sequencer_operation;
+        
+    enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+        
+private:
+    /* override */ void internal_push(sequencer_operation *op) {
+        size_type tag = (*my_sequencer)(*(op->elem));
+        
+        this->my_tail = (tag+1 > this->my_tail) ? tag+1 : this->my_tail;
+        
+        if(this->size() > this->capacity())
+            this->grow_my_array(this->size());  // tail already has 1 added to it
+        this->item(tag) = std::make_pair( *(op->elem), true );
+        __TBB_store_with_release(op->status, SUCCEEDED);
+    }
+};
+        
+//! Forwards messages in priority order
+template< typename T, typename Compare = std::less<T>, typename A=cache_aligned_allocator<T> >
+class priority_queue_node : public buffer_node<T, A> {
+public:
+    typedef T input_type;
+    typedef T output_type;
+    typedef sender< input_type > predecessor_type;
+    typedef receiver< output_type > successor_type;
+        
+    //! Constructor
+    priority_queue_node( graph &g ) : buffer_node<T, A>(g), mark(0) {}
+
+    //! Copy constructor
+    priority_queue_node( const priority_queue_node &src ) : buffer_node<T, A>(src), mark(0) {}
+        
+protected:
+    typedef typename buffer_node<T, A>::size_type size_type;
+    typedef typename buffer_node<T, A>::item_type item_type;
+    typedef typename buffer_node<T, A>::buffer_operation prio_operation;
+        
+    enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+        
+    /* override */ void handle_operations(prio_operation *op_list) {
+        prio_operation *tmp /*, *pop_list*/ ;
+        bool try_forwarding=false;
+        while (op_list) {
+            tmp = op_list;
+            op_list = op_list->next;
+            switch (tmp->type) {
+            case buffer_node<T, A>::reg_succ: this->internal_reg_succ(tmp); try_forwarding = true; break;
+            case buffer_node<T, A>::rem_succ: this->internal_rem_succ(tmp); break;
+            case buffer_node<T, A>::put_item: internal_push(tmp); try_forwarding = true; break;
+            case buffer_node<T, A>::try_fwd: internal_forward(tmp); break;
+            case buffer_node<T, A>::rel_res: internal_release(tmp); try_forwarding = true; break;
+            case buffer_node<T, A>::con_res: internal_consume(tmp); try_forwarding = true; break;
+            case buffer_node<T, A>::req_item: internal_pop(tmp); break;
+            case buffer_node<T, A>::res_item: internal_reserve(tmp); break;
+            }
+        }
+        // process pops!  for now, no special pop processing
+        if (mark<this->my_tail) heapify();
+        if (try_forwarding && !this->forwarder_busy) {
+            this->forwarder_busy = true;
+            task::enqueue(*new(task::allocate_additional_child_of(*(this->my_parent))) internal::forward_task< buffer_node<input_type, A> >(*this));
+        }
+    }
+        
+    //! Tries to forward valid items to successors
+    /* override */ void internal_forward(prio_operation *op) {
+        T i_copy;
+        bool success = false; // flagged when a successor accepts
+        size_type counter = this->my_successors.size();
+        
+        if (this->my_reserved || this->my_tail == 0) {
+            __TBB_store_with_release(op->status, FAILED);
+            this->forwarder_busy = false;
+            return;
+        }
+        // Keep trying to send while there exists an accepting successor
+        while (counter>0 && this->my_tail > 0) {
+            i_copy = this->my_array[0].first;
+            bool msg = this->my_successors.try_put(i_copy);
+            if ( msg == true ) {
+                 if (mark == this->my_tail) --mark;
+                --(this->my_tail);
+                this->my_array[0].first=this->my_array[this->my_tail].first;
+                if (this->my_tail > 1) // don't reheap for heap of size 1
+                    reheap();
+                success = true; // found an accepting successor
+            }
+            --counter;
+        }
+        if (success && !counter)
+            __TBB_store_with_release(op->status, SUCCEEDED);
+        else {
+            __TBB_store_with_release(op->status, FAILED);
+            this->forwarder_busy = false;
+        }
+    }
+        
+    /* override */ void internal_push(prio_operation *op) {
+        if ( this->my_tail >= this->my_array_size )
+            this->grow_my_array( this->my_tail + 1 );
+        this->my_array[this->my_tail] = std::make_pair( *(op->elem), true );
+        ++(this->my_tail);
+        __TBB_store_with_release(op->status, SUCCEEDED);
+    }
+    /* override */ void internal_pop(prio_operation *op) {
+        if ( this->my_reserved == true || this->my_tail == 0 ) {
+            __TBB_store_with_release(op->status, FAILED);
+        }
+        else {
+            if (mark<this->my_tail &&
+                compare(this->my_array[0].first,
+                        this->my_array[this->my_tail-1].first)) {
+                // there are newly pushed elems; last one higher than top
+                // copy the data
+                *(op->elem) = this->my_array[this->my_tail-1].first;
+                --(this->my_tail);
+                __TBB_store_with_release(op->status, SUCCEEDED);
+            }
+            else { // extract and push the last element down heap
+                *(op->elem) = this->my_array[0].first; // copy the data
+                if (mark == this->my_tail) --mark;
+                --(this->my_tail);
+                __TBB_store_with_release(op->status, SUCCEEDED);
+                this->my_array[0].first=this->my_array[this->my_tail].first;
+                if (this->my_tail > 1) // don't reheap for heap of size 1
+                    reheap();
+            }
+        }
+    }
+    /* override */ void internal_reserve(prio_operation *op) {
+        if (this->my_reserved == true || this->my_tail == 0) {
+            __TBB_store_with_release(op->status, FAILED);
+        }
+        else {
+            this->my_reserved = true;
+            *(op->elem) = reserved_item = this->my_array[0].first;
+            if (mark == this->my_tail) --mark;
+            --(this->my_tail);
+            __TBB_store_with_release(op->status, SUCCEEDED);
+            this->my_array[0].first = this->my_array[this->my_tail].first;
+            if (this->my_tail > 1) // don't reheap for heap of size 1
+                reheap();
+        }
+    }
+    /* override */ void internal_consume(prio_operation *op) {
+        this->my_reserved = false;
+        __TBB_store_with_release(op->status, SUCCEEDED);
+    }
+    /* override */ void internal_release(prio_operation *op) {
+        if (this->my_tail >= this->my_array_size)
+            this->grow_my_array( this->my_tail + 1 );
+        this->my_array[this->my_tail] = std::make_pair(reserved_item, true);
+        ++(this->my_tail);
+        this->my_reserved = false;
+        __TBB_store_with_release(op->status, SUCCEEDED);
+        heapify();
+    }
+private:
+    Compare compare;
+    size_type mark;
+    input_type reserved_item;
+        
+    void heapify() {
+        if (!mark) mark = 1;
+        for (; mark<this->my_tail; ++mark) { // for each unheaped element
+            size_type cur_pos = mark;
+            input_type to_place = this->my_array[mark].first;
+            do { // push to_place up the heap
+                size_type parent = (cur_pos-1)>>1;
+                if (!compare(this->my_array[parent].first, to_place))
+                    break;
+                this->my_array[cur_pos].first = this->my_array[parent].first;
+                cur_pos = parent;
+            } while( cur_pos );
+            this->my_array[cur_pos].first = to_place;
+        }
+    }
+        
+    void reheap() {
+        size_type cur_pos=0, child=1;
+        while (child < mark) {
+            size_type target = child;
+            if (child+1<mark &&
+                compare(this->my_array[child].first,
+                        this->my_array[child+1].first))
+                ++target;
+            // target now has the higher priority child
+            if (compare(this->my_array[target].first,
+                        this->my_array[this->my_tail].first))
+                break;
+            this->my_array[cur_pos].first = this->my_array[target].first;
+            cur_pos = target;
+            child = (cur_pos<<1)+1;
+        }
+        this->my_array[cur_pos].first = this->my_array[this->my_tail].first;
+    }
+};
+        
+//! Forwards messages only if the threshold has not been reached
+/** This node forwards items until its threshold is reached.
+    It contains no buffering.  If the downstream node rejects, the
+    message is dropped. */
+template< typename T >
+class limiter_node : public graph_node, public receiver< T >, public sender< T > {
+public:
+        
+    typedef T input_type;
+    typedef T output_type;
+    typedef sender< input_type > predecessor_type;
+    typedef receiver< output_type > successor_type;
+        
+private:
+        
+    task *my_root_task;
+    size_t my_threshold;
+    size_t my_count;
+    internal::predecessor_cache< T > my_predecessors;
+    spin_mutex my_mutex;
+    internal::broadcast_cache< T > my_successors;
+    int init_decrement_predecessors;
+
+    friend class internal::forward_task< limiter_node<T> >;
+        
+    // Let decrementer call decrement_counter()
+    friend class internal::decrementer< limiter_node<T> >;
+        
+    void decrement_counter() {
+        input_type v;
+        
+        // If we can't get / put an item immediately then drop the count
+        if ( my_predecessors.get_item( v ) == false 
+             || my_successors.try_put(v) == false ) {
+            spin_mutex::scoped_lock lock(my_mutex);
+            --my_count;
+            if ( !my_predecessors.empty() ) 
+                task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
+                            internal::forward_task< limiter_node<T> >( *this ) );
+        }
+    }
+        
+    void forward() {
+        {
+            spin_mutex::scoped_lock lock(my_mutex);
+            if ( my_count < my_threshold ) 
+                ++my_count;
+            else
+                return;
+        }
+        decrement_counter();
+    }
+        
+public:
+        
+    //! The internal receiver< continue_msg > that decrements the count
+    internal::decrementer< limiter_node<T> > decrement;
+        
+    //! Constructor
+    limiter_node(graph &g, size_t threshold, int num_decrement_predecessors=0) : 
+        my_root_task(g.root_task()), my_threshold(threshold), my_count(0), 
+        init_decrement_predecessors(num_decrement_predecessors), 
+        decrement(num_decrement_predecessors) 
+    {
+        my_predecessors.set_owner(this);
+        my_successors.set_owner(this);
+        decrement.set_owner(this);
+    }
+        
+    //! Copy constructor
+    limiter_node( const limiter_node& src ) : 
+        graph_node(), receiver<T>(), sender<T>(),
+        my_root_task(src.my_root_task), my_threshold(src.my_threshold), my_count(0), 
+        init_decrement_predecessors(src.init_decrement_predecessors), 
+        decrement(src.init_decrement_predecessors) 
+    {
+        my_predecessors.set_owner(this);
+        my_successors.set_owner(this);
+        decrement.set_owner(this);
+    }
+
+    //! Replace the current successor with this new successor
+    /* override */ bool register_successor( receiver<output_type> &r ) {
+        my_successors.register_successor(r);
+        return true;
+    }
+        
+    //! Removes a successor from this node
+    /** r.remove_predecessor(*this) is also called. */
+    /* override */ bool remove_successor( receiver<output_type> &r ) {
+        r.remove_predecessor(*this);
+        my_successors.remove_successor(r);
+        return true;
+    }
+        
+    //! Puts an item to this receiver
+    /* override */ bool try_put( const T &t ) {
+        {
+            spin_mutex::scoped_lock lock(my_mutex);
+            if ( my_count >= my_threshold ) 
+                return false;
+            else
+                ++my_count; 
+        }
+        
+        bool msg = my_successors.try_put(t);
+        
+        if ( msg != true ) {
+            spin_mutex::scoped_lock lock(my_mutex);
+            --my_count;
+            if ( !my_predecessors.empty() ) 
+                task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
+                            internal::forward_task< limiter_node<T> >( *this ) );
+        }
+        
+        return msg;
+    }
+        
+    //! Removes src from the list of cached predecessors.
+    /* override */ bool register_predecessor( predecessor_type &src ) {
+        spin_mutex::scoped_lock lock(my_mutex);
+        my_predecessors.add( src );
+        if ( my_count < my_threshold && !my_successors.empty() ) 
+            task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
+                           internal::forward_task< limiter_node<T> >( *this ) );
+        return true;
+    }
+        
+    //! Removes src from the list of cached predecessors.
+    /* override */ bool remove_predecessor( predecessor_type &src ) {
+        my_predecessors.remove( src );
+        return true;
+    }
+        
+};
+
+#include "internal/_flow_graph_join_impl.h"
+
+using internal::reserving_port;
+using internal::queueing_port;
+using internal::tag_matching_port;
+using internal::input_port;
+using internal::tag_value;
+using internal::NO_TAG;
+
+template<typename OutputTuple, graph_buffer_policy JP=queueing> class join_node;
+
+template<typename OutputTuple>
+class join_node<OutputTuple,reserving>: public internal::unfolded_join_node<std::tuple_size<OutputTuple>::value, reserving_port, OutputTuple, reserving> {
+private:
+    static const int N = std::tuple_size<OutputTuple>::value;
+    typedef typename internal::unfolded_join_node<N, reserving_port, OutputTuple, reserving> unfolded_type;
+public:
+    typedef OutputTuple output_type;
+    typedef typename unfolded_type::input_ports_tuple_type input_ports_tuple_type;
+    join_node(graph &g) : unfolded_type(g) { }
+    join_node(const join_node &other) : unfolded_type(other) {}
+};
+
+template<typename OutputTuple>
+class join_node<OutputTuple,queueing>: public internal::unfolded_join_node<std::tuple_size<OutputTuple>::value, queueing_port, OutputTuple, queueing> {
+private:
+    static const int N = std::tuple_size<OutputTuple>::value;
+    typedef typename internal::unfolded_join_node<N, queueing_port, OutputTuple, queueing> unfolded_type;
+public:
+    typedef OutputTuple output_type;
+    typedef typename unfolded_type::input_ports_tuple_type input_ports_tuple_type;
+    join_node(graph &g) : unfolded_type(g) { }
+    join_node(const join_node &other) : unfolded_type(other) {}
+};
+
+// template for tag_matching join_node
+template<typename OutputTuple>
+class join_node<OutputTuple, tag_matching> : public internal::unfolded_join_node<std::tuple_size<OutputTuple>::value,
+      tag_matching_port, OutputTuple, tag_matching> {
+private:
+    static const int N = std::tuple_size<OutputTuple>::value;
+    typedef typename internal::unfolded_join_node<N, tag_matching_port, OutputTuple, tag_matching> unfolded_type;
+public:
+    typedef OutputTuple output_type;
+    typedef typename unfolded_type::input_ports_tuple_type input_ports_tuple_type;
+    template<typename B0, typename B1>
+    join_node(graph &g, B0 b0, B1 b1) : unfolded_type(g, b0, b1) { }
+    template<typename B0, typename B1, typename B2>
+    join_node(graph &g, B0 b0, B1 b1, B2 b2) : unfolded_type(g, b0, b1, b2) { }
+    template<typename B0, typename B1, typename B2, typename B3>
+    join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3) : unfolded_type(g, b0, b1, b2, b3) { }
+    template<typename B0, typename B1, typename B2, typename B3, typename B4>
+    join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) : unfolded_type(g, b0, b1, b2, b3, b4) { }
+    template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5>
+    join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5) : unfolded_type(g, b0, b1, b2, b3, b4, b5) { }
+    template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6>
+    join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6) { }
+    template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7>
+    join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6, b7) { }
+    template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8>
+    join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7, B8 b8) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6, b7, b8) { }
+    template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9>
+    join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7, B8 b8, B9 b9) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9) { }
+    join_node(const join_node &other) : unfolded_type(other) {}
+};
+
+#if TBB_PREVIEW_GRAPH_NODES
+// or node
+#include "internal/_flow_graph_or_impl.h"
+
+template<typename InputTuple>
+class or_node : public internal::unfolded_or_node<InputTuple> {
+private:
+    static const int N = std::tuple_size<InputTuple>::value;
+public:
+    typedef typename internal::or_output_type<InputTuple>::type output_type;
+    typedef typename internal::unfolded_or_node<InputTuple> unfolded_type;
+    or_node() : unfolded_type() { }
+    // Copy constructor
+    or_node( const or_node& /*other*/ ) : unfolded_type() { }
+};
+#endif  // TBB_PREVIEW_GRAPH_NODES
+
+//! Makes an edge between a single predecessor and a single successor
+template< typename T >
+inline void make_edge( sender<T> &p, receiver<T> &s ) {
+    p.register_successor( s );
+}
+        
+//! Makes an edge between a single predecessor and a single successor
+template< typename T >
+inline void remove_edge( sender<T> &p, receiver<T> &s ) {
+    p.remove_successor( s );
+}
+
+//! Returns a copy of the body from a function or continue node
+template< typename Body, typename Node >
+Body copy_body( Node &n ) {
+    return n.template copy_function_object<Body>();
+}
+        
+        
+} // interface6
+
+    using interface6::graph;
+    using interface6::graph_node;
+    using interface6::continue_msg;
+    using interface6::sender;
+    using interface6::receiver;
+    using interface6::continue_receiver;
+
+    using interface6::source_node;
+    using interface6::function_node;
+#if TBB_PREVIEW_GRAPH_NODES
+    using interface6::multioutput_function_node;
+    using interface6::split_node;
+    using interface6::internal::output_port;
+    using interface6::or_node;
+#endif
+    using interface6::continue_node;
+    using interface6::overwrite_node;
+    using interface6::write_once_node;
+    using interface6::broadcast_node;
+    using interface6::buffer_node;
+    using interface6::queue_node;
+    using interface6::sequencer_node;
+    using interface6::priority_queue_node;
+    using interface6::limiter_node;
+    using namespace interface6::internal::graph_policy_namespace;
+    using interface6::join_node;
+    using interface6::input_port;
+    using interface6::copy_body; 
+    using interface6::make_edge; 
+    using interface6::remove_edge; 
+    using interface6::internal::NO_TAG;
+    using interface6::internal::tag_value;
+
+} // flow
+} // tbb
+
+#endif // __TBB_flow_graph_H
diff --git a/include/tbb/graph.h b/include/tbb/graph.h
deleted file mode 100644
index 510741c..0000000
--- a/include/tbb/graph.h
+++ /dev/null
@@ -1,2673 +0,0 @@
-/*
-    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
-
-    This file is part of Threading Building Blocks.
-
-    Threading Building Blocks is free software; you can redistribute it
-    and/or modify it under the terms of the GNU General Public License
-    version 2 as published by the Free Software Foundation.
-
-    Threading Building Blocks is distributed in the hope that it will be
-    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Threading Building Blocks; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-    As a special exception, you may use this file as part of a free software
-    library without restriction.  Specifically, if other files instantiate
-    templates or use macros or inline functions from this file, or you compile
-    this file and link it with other files to produce an executable, this
-    file does not by itself cause the resulting executable to be covered by
-    the GNU General Public License.  This exception does not however
-    invalidate any other reasons why the executable file might be covered by
-    the GNU General Public License.
-*/
-
-#ifndef __TBB_graph_H
-#define __TBB_graph_H
-
-#if !TBB_PREVIEW_GRAPH
-#error Set TBB_PREVIEW_GRAPH to include graph.h
-#endif
-
-#include "tbb_stddef.h"
-#include "atomic.h"
-#include "spin_mutex.h"
-#include "null_mutex.h"
-#include "spin_rw_mutex.h"
-#include "null_rw_mutex.h"
-#include "task.h"
-#include "concurrent_vector.h"
-#include "_aggregator_internal.h"
-
-// use the VC10 or gcc version of tuple if it is available.
-#if TBB_IMPLEMENT_CPP0X && (!defined(_MSC_VER) || _MSC_VER < 1600)
-#define TBB_PREVIEW_TUPLE 1
-#include "compat/tuple"
-#else
-#include <tuple>
-#endif
-
-#include<list>
-#include<queue>
-
-
-/** @file
-  \brief The graph related classes and functions
-
-  There are some applications that best express dependencies as messages
-  passed between nodes in a graph.  These messages may contain data or
-  simply act as signals that a predecessors has completed. The graph
-  class and its associated node classes can be used to express such
-  applcations.
-*/
-
-namespace tbb {
-
-    //! The base of all graph nodes.  Allows them to be stored in a collection for deletion.
-    class graph_node {
-    public:
-        virtual ~graph_node() {} 
-    }; 
-
-    //! An empty class used for messages that mean "I'm done" 
-    class continue_msg {};
-
-    template< typename T > class sender;
-    template< typename T > class receiver;
-    class continue_receiver;
-
-    //! Pure virtual template class that defines a sender of messages of type T
-    template< typename T >
-    class sender {
-    public:
-        //! The output type of this sender
-        typedef T output_type;
-
-        //! The successor type for this node
-        typedef receiver<T> successor_type;
-
-        virtual ~sender() {}
-
-        //! Add a new successor to this node
-        virtual bool register_successor( successor_type &r ) = 0;
-
-        //! Removes a successor from this node
-        virtual bool remove_successor( successor_type &r ) = 0;
-
-        //! Request an item from the sender
-        virtual bool try_get( T & ) { return false; }
-
-        //! Reserves an item in the sender 
-        virtual bool try_reserve( T & ) { return false; }
-
-        //! Releases the reserved item
-        virtual bool try_release( ) { return false; }
-
-        //! Consumes the reserved item
-        virtual bool try_consume( ) { return false; }
-
-    };
-
-
-    //! Pure virtual template class that defines a receiver of messages of type T
-    template< typename T >
-    class receiver {
-    public:
-
-        //! The input type of this receiver
-        typedef T input_type;
-
-        //! The predecessor type for this node
-        typedef sender<T> predecessor_type;
-
-        //! Destructor
-        virtual ~receiver() {}
-
-        //! Put an item to the receiver
-        virtual bool try_put( T t ) = 0;
-
-        //! Add a predecessor to the node
-        virtual bool register_predecessor( predecessor_type & ) { return false; }
-
-        //! Remove a predecessor from the node
-        virtual bool remove_predecessor( predecessor_type & ) { return false; }
-
-    };
-
-    //! Base class for receivers of completion messages
-    /** These receivers automatically reset, but cannot be explicitly waited on */
-    class continue_receiver : public receiver< continue_msg > {
-    public:
-
-        //! The input type
-        typedef continue_msg input_type;
-
-        //! The predecessor type for this node
-        typedef sender< continue_msg > predecessor_type;
-
-        //! Constructor
-        continue_receiver( int number_of_predecessors = 0 ) { 
-            my_predecessor_count = number_of_predecessors;
-            my_current_count = 0;
-        }
-
-        //! Destructor
-        virtual ~continue_receiver() { }
-
-        //! Increments the trigger threshold
-        /* override */ bool register_predecessor( predecessor_type & ) {
-            spin_mutex::scoped_lock l(my_mutex);
-            ++my_predecessor_count;
-            return true;
-        }
-
-        //! Decrements the trigger threshold
-        /** Does not check to see if the removal of the predecessor now makes the current count
-            exceed the new threshold.  So removing a predecessor while the graph is active can cause
-            unexpected results. */
-        /* override */ bool remove_predecessor( predecessor_type & ) {
-            spin_mutex::scoped_lock l(my_mutex);
-            --my_predecessor_count;
-            return true;
-        }
-
-        //! Puts a continue_msg to the receiver
-        /** If the message causes the message count to reach the predecessor count, execute() is called and
-            the message count is reset to 0.  Otherwise the message count is incremented. */
-        /* override */ bool try_put( input_type ) {
-            {
-                spin_mutex::scoped_lock l(my_mutex);
-                if ( ++my_current_count < my_predecessor_count ) 
-                    return true;
-                else
-                    my_current_count = 0;
-            }
-            execute();
-            return true;
-        }
-
-    protected:
-
-        spin_mutex my_mutex;
-        int my_predecessor_count;
-        int my_current_count;
-
-        //! Does whatever should happen when the threshold is reached
-        /** This should be very fast or else spawn a task.  This is
-            called while the sender is blocked in the try_put(). */
-        virtual void execute() = 0;
-
-    };
-
-    //! @cond INTERNAL
-    namespace internal {
-
-        //! The state of an executable node
-        enum node_state { node_state_idle=0, node_state_nonidle=1, node_state_inactive=2 };
-
-
-        //! A functor that takes no input and generates a value of type Output
-        template< typename Output >
-        class source_body : no_assign   {
-        public:
-            virtual ~source_body() {}
-            virtual bool operator()(Output &output) = 0;
-        };
-
-        //! The leaf for source_body
-        template< typename Output, typename Body>
-        class source_body_leaf : public source_body<Output> {
-        public:
-            source_body_leaf( Body _body ) : body(_body) { }
-            /*override */ bool operator()(Output &output) { return body( output ); }
-        private:
-            Body body;
-        };
-
-        //! A functor that takes an Input and generates an Output
-        template< typename Input, typename Output >
-            class function_body : no_assign {
-        public:
-            virtual ~function_body() {}
-            virtual Output operator()(Input input) = 0;
-        };
-
-        //! the leaf for function_body
-        template <typename Input, typename Output, typename B>
-        class function_body_leaf : public function_body< Input, Output > {
-        public:
-            function_body_leaf( B _body ) : body(_body) { }
-            Output operator()(Input i) { return body(i); }
-
-        private:
-            B body;
-        };
-
-        //! the leaf for function_body specialized for Input and output of continue_msg
-        template <typename B>
-        class function_body_leaf< continue_msg, continue_msg, B> : public function_body< continue_msg, continue_msg > {
-        public:
-            function_body_leaf( B _body ) : body(_body) { }
-            continue_msg operator()( continue_msg i ) { 
-                body(i); 
-                return i; 
-            }
-
-        private:
-            B body;
-        };
-
-        //! the leaf for function_body specialized for Output of continue_msg
-        template <typename Input, typename B>
-        class function_body_leaf< Input, continue_msg, B> : public function_body< Input, continue_msg > {
-        public:
-            function_body_leaf( B _body ) : body(_body) { }
-            continue_msg operator()(Input i) { 
-                body(i); 
-                return continue_msg();
-            }
-
-        private:
-            B body;
-        };
-
-        //! the leaf for function_body specialized for Input of continue_msg
-        template <typename Output, typename B>
-        class function_body_leaf< continue_msg, Output, B > : public function_body< continue_msg, Output > {
-        public:
-            function_body_leaf( B _body ) : body(_body) { }
-            Output operator()(continue_msg i) { 
-                return body(i); 
-            }
-
-        private:
-            B body;
-        };
-
-        //! A task that calls a node's forward function
-        template< typename NodeType >
-        class forward_task : public task {
-
-            NodeType &my_node;
-
-        public:
-
-            forward_task( NodeType &n ) : my_node(n) {}
-
-            task *execute() {
-                my_node.forward();
-                return NULL;
-            }
-        };
-
-        //! A task that calls a node's apply_body function, passing in an input of type Input
-        template< typename NodeType, typename Input >
-        class apply_body_task : public task {
-
-            NodeType &my_node;
-            Input my_input;
-
-        public:
-
-            apply_body_task( NodeType &n, Input i ) : my_node(n), my_input(i) {}
-
-            task *execute() {
-                my_node.apply_body( my_input );
-                return NULL;
-            }
-        };
-
-        //! A task that calls a node's apply_body function with no input
-        template< typename NodeType >
-        class source_task : public task {
-
-            NodeType &my_node;
-
-        public:
-
-            source_task( NodeType &n ) : my_node(n) {}
-
-            task *execute() {
-                my_node.apply_body( );
-                return NULL;
-            }
-        };
-
-        //! An empty functor that takes an Input and returns a default constructed Output
-        template< typename Input, typename Output >
-        struct empty_body {
-           Output operator()( Input & ) const { return Output(); } 
-        };
-
-        //! A node_cache maintains a std::queue of elements of type T.  Each operation is protected by a lock. 
-        template< typename T, typename M=spin_mutex >
-        class node_cache {
-            public:
-
-            typedef size_t size_type;
-
-            bool empty() {
-                typename my_mutex_type::scoped_lock lock( my_mutex );
-                return internal_empty();
-            }
-
-            void add( T &n ) {
-                typename my_mutex_type::scoped_lock lock( my_mutex );
-                internal_push(n);
-            }
-
-            void remove( T &n ) {
-                typename my_mutex_type::scoped_lock lock( my_mutex );
-                for ( size_t i = internal_size(); i != 0; --i ) {
-                    T &s = internal_pop();
-                    if ( &s != &n ) {
-                        internal_push(s);
-                    }
-                }
-            }
-
-        protected:
-
-            typedef M my_mutex_type;
-            my_mutex_type my_mutex;
-            std::queue< T * > my_q;
-
-            // Assumes lock is held
-            inline bool internal_empty( )  {
-                return my_q.empty();
-            }
-
-            // Assumes lock is held
-            inline size_type internal_size( )  {
-                return my_q.size(); 
-            }
-
-            // Assumes lock is held
-            inline void internal_push( T &n )  {
-                my_q.push(&n);
-            }
-
-            // Assumes lock is held
-            inline T &internal_pop() {
-                T *v = my_q.front();
-                my_q.pop();
-                return *v;
-            }
-
-        };
-
-        //! A cache of predecessors that only supports try_get
-        template< typename T, typename M=spin_mutex >
-        class predecessor_cache : public node_cache< sender<T>, M > {
-            public:
-            typedef M my_mutex_type;
-            typedef T output_type; 
-            typedef sender<output_type> predecessor_type;
-            typedef receiver<output_type> successor_type;
-
-            predecessor_cache( ) : my_owner( NULL ) { }
-
-            void set_owner( successor_type *owner ) { my_owner = owner; }
-
-            bool get_item( output_type &v ) {
-
-                bool msg = false;
-
-                do {
-                    predecessor_type *src;
-                    {
-                        typename my_mutex_type::scoped_lock lock(this->my_mutex);
-                        if ( this->internal_empty() ) {
-                            break;
-                        }
-                        src = &this->internal_pop();
-                    }
-
-                    // Try to get from this sender
-                    msg = src->try_get( v );
-
-                    if (msg == false) {
-                        // Relinquish ownership of the edge
-                        if ( my_owner) 
-                            src->register_successor( *my_owner );
-                    } else {
-                        // Retain ownership of the edge
-                        this->add(*src);
-                    }
-                } while ( msg == false );
-                return msg;
-            }
-
-        protected:
-            successor_type *my_owner;
-        };
-
-        //! An cache of predecessors that supports requests and reservations
-        template< typename T, typename M=spin_mutex >
-        class reservable_predecessor_cache : public predecessor_cache< T, M > {
-        public:
-            typedef M my_mutex_type;
-            typedef T output_type; 
-            typedef sender<T> predecessor_type;
-            typedef receiver<T> successor_type;
-
-            reservable_predecessor_cache( ) : reserved_src(NULL) { }
-
-            bool 
-            try_reserve( output_type &v ) {
-                bool msg = false;
-
-                do {
-                    {
-                        typename my_mutex_type::scoped_lock lock(this->my_mutex);
-                        if ( reserved_src || this->internal_empty() ) 
-                            return false;
-
-                        reserved_src = &this->internal_pop();
-                    }
-
-                    // Try to get from this sender
-                    msg = reserved_src->try_reserve( v );
-
-                    if (msg == false) {
-                        typename my_mutex_type::scoped_lock lock(this->my_mutex);
-                        // Relinquish ownership of the edge
-                        reserved_src->register_successor( *this->my_owner );
-                        reserved_src = NULL;
-                    } else {
-                        // Retain ownership of the edge
-                        this->add( *reserved_src );
-                    }
-                } while ( msg == false );
-
-                return msg;
-            }
-
-            bool 
-            try_release( ) {
-                reserved_src->try_release( );
-                reserved_src = NULL;
-                return true;
-            }
-
-            bool 
-            try_consume( ) {
-                reserved_src->try_consume( );
-                reserved_src = NULL;
-                return true;
-            }
-
-        private:
-            predecessor_type *reserved_src;
-        };
-
-
-        //! An abstract cache of succesors
-        template<typename T, typename M=spin_rw_mutex >
-        class successor_cache : no_copy {
-        protected:
-
-            typedef M my_mutex_type;
-            my_mutex_type my_mutex;
-
-            typedef std::list< receiver<T> * > my_successors_type;
-            my_successors_type my_successors;
-
-            sender<T> *my_owner;
-
-        public:
-
-            successor_cache( ) : my_owner(NULL) {}
-
-            void set_owner( sender<T> *owner ) { my_owner = owner; }
-
-            virtual ~successor_cache() {}
-
-            void register_successor( receiver<T> &r ) {
-                typename my_mutex_type::scoped_lock l(my_mutex, true);
-                my_successors.push_back( &r ); 
-            }
-
-            void remove_successor( receiver<T> &r ) {
-                typename my_mutex_type::scoped_lock l(my_mutex, true);
-                for ( typename my_successors_type::iterator i = my_successors.begin();
-                      i != my_successors.end(); ++i ) { 
-                    if ( *i == & r ) { 
-                        my_successors.erase(i);
-                        break;
-                    }
-                }
-            }
-
-            bool empty() { 
-                typename my_mutex_type::scoped_lock l(my_mutex, false);
-                return my_successors.empty(); 
-            }
-
-            virtual bool try_put( T t ) = 0; 
-         };
-
-        //! An abstract cache of succesors, specialized to continue_msg
-        template<>
-        class successor_cache< continue_msg > : no_copy {
-        protected:
-
-            typedef spin_rw_mutex my_mutex_type;
-            my_mutex_type my_mutex;
-
-            typedef std::list< receiver<continue_msg> * > my_successors_type;
-            my_successors_type my_successors;
-
-            sender<continue_msg> *my_owner;
-
-        public:
-
-            successor_cache( ) : my_owner(NULL) {}
-
-            void set_owner( sender<continue_msg> *owner ) { my_owner = owner; }
-
-            virtual ~successor_cache() {}
-
-            void register_successor( receiver<continue_msg> &r ) {
-                my_mutex_type::scoped_lock l(my_mutex, true);
-                my_successors.push_back( &r ); 
-                if ( my_owner )
-                    r.register_predecessor( *my_owner );
-            }
-
-            void remove_successor( receiver<continue_msg> &r ) {
-                my_mutex_type::scoped_lock l(my_mutex, true);
-                for ( my_successors_type::iterator i = my_successors.begin();
-                      i != my_successors.end(); ++i ) { 
-                    if ( *i == & r ) { 
-                        if ( my_owner )
-                            r.remove_predecessor( *my_owner );
-                        my_successors.erase(i);
-                        break;
-                    }
-                }
-            }
-
-            bool empty() { 
-                my_mutex_type::scoped_lock l(my_mutex, false);
-                return my_successors.empty(); 
-            }
-
-            virtual bool try_put( continue_msg t ) = 0; 
-
-         };
-
-        //! A cache of successors that are broadcast to
-        template<typename T, typename M=spin_rw_mutex>
-        class broadcast_cache : public successor_cache<T, M> {
-            typedef M my_mutex_type;
-            typedef std::list< receiver<T> * > my_successors_type;
-
-        public:
-
-            broadcast_cache( ) {}
-
-            bool try_put( T t ) {
-                bool msg = false;
-                bool upgraded = false;
-                typename my_mutex_type::scoped_lock l(this->my_mutex, false);
-                typename my_successors_type::iterator i = this->my_successors.begin();
-                while ( i != this->my_successors.end() ) {
-                   if ( (*i)->try_put( t ) == true ) {
-                       ++i;
-                       msg = true;
-                   } else {
-                      if ( (*i)->register_predecessor(*this->my_owner) ) {
-                          if (!upgraded) {
-                              l.upgrade_to_writer();
-                              upgraded = true;
-                          }
-                          i = this->my_successors.erase(i);
-                      }
-                      else {
-                          ++i;
-                      }
-                   }
-                }
-                return msg;
-            }
-        };
-
-        //! A cache of successors that are put in a round-robin fashion
-        template<typename T, typename M=spin_rw_mutex >
-        class round_robin_cache : public successor_cache<T, M> {
-            typedef size_t size_type;
-            typedef M my_mutex_type;
-            typedef std::list< receiver<T> * > my_successors_type;
-
-        public:
-
-            round_robin_cache( ) {}
-
-            size_type size() {
-                typename my_mutex_type::scoped_lock l(this->my_mutex, false);
-                return this->my_successors.size();
-            }
-
-            bool try_put( T t ) {
-                bool upgraded = false;
-                typename my_mutex_type::scoped_lock l(this->my_mutex, false);
-                typename my_successors_type::iterator i = this->my_successors.begin();
-                while ( i != this->my_successors.end() ) {
-                   if ( (*i)->try_put( t ) ) {
-                       return true;
-                   } else {
-                      if ( (*i)->register_predecessor(*this->my_owner) ) {
-                          if (!upgraded) {
-                              l.upgrade_to_writer();
-                              upgraded = true;
-                          }
-                          i = this->my_successors.erase(i);
-                      }
-                      else {
-                          ++i;
-                      }
-                   }
-                }
-                return false;
-            }
-        };
-
-        template<typename T>
-        class decrementer : public continue_receiver, internal::no_copy {
-
-            T *my_node;
-
-            void execute() {
-                my_node->decrement_counter();
-            }
-
-        public:
-           
-            typedef continue_msg input_type;
-            typedef continue_msg output_type;
-            decrementer( int number_of_predecessors = 0 ) : continue_receiver( number_of_predecessors ) { }
-            void set_owner( T *node ) { my_node = node; }
-        };
-
-    }
-    //! @endcond INTERNAL
-
-
-    //! The graph class
-    /** This class serves as a handle to the graph */
-    class graph : internal::no_copy {
-
-        template< typename Body >
-        class run_task : public task {
-        public: 
-            run_task( Body& body ) : my_body(body) {}
-            task *execute() {
-                my_body();
-                return NULL;
-            }
-        private:
-            Body my_body;
-        };
-
-        template< typename Receiver, typename Body >
-        class run_and_put_task : public task {
-        public: 
-            run_and_put_task( Receiver &r, Body& body ) : my_receiver(r), my_body(body) {}
-            task *execute() {
-                my_receiver.try_put( my_body() );
-                return NULL;
-            }
-        private:
-            Receiver &my_receiver;
-            Body my_body;
-        };
-
-    public:
-
-        //! An enumeration the provides the two most common concurrency levels: unlimited and serial
-        enum concurrency { unlimited = 0, serial = 1 };
-
-        //! Constructs a graph withy no nodes.
-        graph() : my_root_task( new ( task::allocate_root( ) ) empty_task ) {
-            my_root_task->set_ref_count(1);
-        }
-
-        //! Destroys the graph.
-        /** Calls wait_for_all on the graph, deletes all of the nodes appended by calls to add, and then 
-            destroys the root task of the graph. */ 
-        ~graph() {
-            wait_for_all();
-            my_root_task->set_ref_count(0);
-            task::destroy( *my_root_task );
-        }
-
-
-        //! Used to register that an external entity may still interact with the graph.
-        /** The graph will not return from wait_for_all until a matching number of decrement_wait_count calls
-            is made. */
-        void increment_wait_count() { 
-            if (my_root_task)
-                my_root_task->increment_ref_count();
-        }
-
-        //! Deregisters an external entity that may have interacted with the graph.
-        /** The graph will not return from wait_for_all until all the number of decrement_wait_count calls
-            matches the number of increment_wait_count calls. */
-        void decrement_wait_count() { 
-            if (my_root_task)
-                my_root_task->decrement_ref_count(); 
-        }
-
-        //! Spawns a task that runs a body and puts its output to a specific receiver
-        /** The task is spawned as a child of the graph. This is useful for running tasks 
-            that need to block a wait_for_all() on the graph.  For example a one-off source. */
-        template< typename Receiver, typename Body >
-            void run( Receiver &r, Body body ) {
-           task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
-               run_and_put_task< Receiver, Body >( r, body ) );
-        }
-
-        //! Spawns a task that runs a function object 
-        /** The task is spawned as a child of the graph. This is useful for running tasks 
-            that need to block a wait_for_all() on the graph. For example a one-off source. */
-        template< typename Body >
-        void run( Body body ) {
-           task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
-               run_task< Body >( body ) );
-        }
-
-        //! Waits until the graph is idle and the number of decrement_wait_count calls equals the number of increment_wait_count calls.
-        /** The waiting thread will go off and steal work while it is block in the wait_for_all. */
-        void wait_for_all() {
-            if (my_root_task)
-                my_root_task->wait_for_all();
-            my_root_task->set_ref_count(1);
-        }
-
-        //! Returns the root task of the graph
-        task * root_task() {
-            return my_root_task;
-        }
-
-    private:
-
-        task *my_root_task;
-
-    };
-
-
-    //! @cond INTERNAL
-    namespace internal {
-
-        //! Implements methods for a function node that takes a type T as input
-        template< typename Input, typename Output >
-        class function_input : public receiver<Input>, no_assign {
-            typedef sender<Input> predecessor_type;
-            enum op_stat {WAIT=0, SUCCEEDED, FAILED};
-            enum op_type {reg_pred, rem_pred, app_body, tryput, try_fwd};
-
-        public:
-            //! The input type of this receiver
-            typedef Input input_type;
-            //! The output type of this receiver
-            typedef Output output_type;
-
-            //! Constructor for function_input
-            template< typename Body >
-            function_input( graph &g, size_t max_concurrency, Body& body )
-                : my_root_task(g.root_task()), my_max_concurrency(max_concurrency), my_concurrency(internal::node_state_idle),
-                  my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ),
-                forwarder_busy(false) {
-                my_predecessors.set_owner(this);
-                my_aggregator.initialize_handler(my_functor_t(this));
-            }
-
-            //! Destructor
-            virtual ~function_input() { delete my_body; }
-
-            //! Put to the node
-            virtual bool try_put( input_type t ) {
-               if ( my_max_concurrency == 0 ) {
-                   spawn_body_task( t );
-                   return true;
-               } else {
-                   my_operation op_data(t, tryput);
-                   my_aggregator.execute(&op_data);
-                   return op_data.status == SUCCEEDED;
-               }
-            }
-
-            //! Adds src to the list of cached predecessors.
-            /* override */ bool register_predecessor( predecessor_type &src ) {
-                my_operation op_data(reg_pred);
-                op_data.r = &src;
-                my_aggregator.execute(&op_data);
-                return true;
-            }
-
-            //! Removes src from the list of cached predecessors.
-            /* override */ bool remove_predecessor( predecessor_type &src ) {
-                my_operation op_data(rem_pred);
-                op_data.r = &src;
-                my_aggregator.execute(&op_data);
-                return true;
-            }
-
-        protected:
-            task *my_root_task;
-            const size_t my_max_concurrency;
-            size_t my_concurrency;
-            function_body<input_type, output_type> *my_body;
-            predecessor_cache<input_type, null_mutex > my_predecessors;
-
-            virtual broadcast_cache<output_type > &successors() = 0;
-
-        private:
-            friend class apply_body_task< function_input< input_type, output_type >, input_type >;
-            friend class forward_task< function_input< input_type, output_type > >;
-
-            class my_operation : public aggregated_operation< my_operation > {
-            public:
-                char type;
-                union {
-                    input_type *elem;
-                    predecessor_type *r;
-                };
-                my_operation(const input_type& e, op_type t) :
-                    type(char(t)), elem(const_cast<input_type*>(&e)) {}
-                my_operation(op_type t) : type(char(t)), r(NULL) {}
-            };
-
-            class my_functor_t {
-                function_input<input_type, output_type> *fi;
-             public:
-                my_functor_t() {}
-                my_functor_t(function_input<input_type, output_type> *fi_) : fi(fi_) {}
-                void operator()(my_operation* op_list) {
-                    fi->handle_operations(op_list);
-                }
-            };
-
-            bool forwarder_busy;
-            aggregator< my_functor_t, my_operation > my_aggregator;
-
-            void handle_operations(my_operation *op_list) {
-                my_operation *tmp;
-                while (op_list) {
-                    tmp = op_list;
-                    op_list = op_list->next;
-                    switch (tmp->type) {
-                    case reg_pred:
-                        my_predecessors.add(*(tmp->r));
-                        __TBB_store_with_release(tmp->status, SUCCEEDED);
-                        if (!forwarder_busy) {
-                            forwarder_busy = true;
-                            spawn_forward_task();
-                        }
-                        break;
-                    case rem_pred:
-                        my_predecessors.remove(*(tmp->r));
-                        __TBB_store_with_release(tmp->status, SUCCEEDED);
-                        break;
-                    case app_body:
-                        __TBB_ASSERT(my_max_concurrency != 0, NULL);
-                        --my_concurrency;
-                        __TBB_store_with_release(tmp->status, SUCCEEDED);
-                        if (my_concurrency<my_max_concurrency) {
-                            input_type i;
-                            if (my_predecessors.get_item(i)) {
-                                ++my_concurrency;
-                                spawn_body_task(i);
-                            }
-                        }
-                        break;
-                    case tryput: internal_try_put(tmp);  break;
-                    case try_fwd: internal_forward(tmp);  break;
-                    }
-                }
-            }
-
-
-            //! Put to the node
-            void internal_try_put(my_operation *op) {
-                __TBB_ASSERT(my_max_concurrency != 0, NULL);
-                if (my_concurrency < my_max_concurrency) {
-                   ++my_concurrency;
-                   spawn_body_task(*(op->elem));
-                   __TBB_store_with_release(op->status, SUCCEEDED);
-               } else {
-                   __TBB_store_with_release(op->status, FAILED);
-               }
-            }
-
-            //! Tries to spawn bodies if available and if concurrency allows
-            void internal_forward(my_operation *op) {
-                if (my_concurrency<my_max_concurrency || !my_max_concurrency) {
-                    input_type i;
-                    if (my_predecessors.get_item(i)) {
-                        ++my_concurrency;
-                        __TBB_store_with_release(op->status, SUCCEEDED);
-                        spawn_body_task(i);
-                        return;
-                    }
-                }
-                __TBB_store_with_release(op->status, FAILED);
-                forwarder_busy = false;
-            }
-
-            //! Applies the body to the provided input
-            void apply_body( input_type &i ) {
-                successors().try_put( (*my_body)(i) );
-                if ( my_max_concurrency != 0 ) {
-                    my_operation op_data(app_body);
-                    my_aggregator.execute(&op_data);
-                }
-            }
-
-           //! Spawns a task that calls apply_body( input )
-           inline void spawn_body_task( input_type &input ) {
-               task::enqueue(*new(task::allocate_additional_child_of(*my_root_task)) apply_body_task<function_input<input_type, output_type>, input_type >(*this, input));
-           }
-
-           //! This is executed by an enqueued task, the "forwarder"
-           void forward() {
-               my_operation op_data(try_fwd);
-               do {
-                   op_data.status = WAIT;
-                   my_aggregator.execute(&op_data);
-               } while (op_data.status == SUCCEEDED);
-           }
-
-           //! Spawns a task that calls forward()
-           inline void spawn_forward_task() {
-               task::enqueue(*new(task::allocate_additional_child_of(*my_root_task)) forward_task<function_input<input_type, output_type> >(*this));
-           }
-        };
-
-        //! Implements methods for an executable node that takes continue_msg as input
-        template< typename Output >
-        class continue_input : public continue_receiver {
-        public:
-
-            //! The input type of this receiver
-            typedef continue_msg input_type;
-    
-            //! The output type of this receiver
-            typedef Output output_type;
-
-            template< typename Body >
-            continue_input( graph &g, Body& body )
-                : my_root_task(g.root_task()), 
-                 my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }
-
-            template< typename Body >
-            continue_input( graph &g, int number_of_predecessors, Body& body )
-                : continue_receiver( number_of_predecessors ), my_root_task(g.root_task()), 
-                 my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }
-
-        protected:
-
-            task *my_root_task;
-            function_body<input_type, output_type> *my_body;
-
-            virtual broadcast_cache<output_type > &successors() = 0; 
-
-            friend class apply_body_task< continue_input< Output >, continue_msg >;
-
-            //! Applies the body to the provided input
-            /* override */ void apply_body( input_type ) {
-                successors().try_put( (*my_body)( continue_msg() ) );
-            }
-
-            //! Spawns a task that applies the body
-            /* override */ void execute( ) {
-                task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
-                   apply_body_task< continue_input< Output >, continue_msg >( *this, continue_msg() ) ); 
-            }
-        };
-
-        //! Implements methods for both executable and function nodes that puts Output to its successors
-        template< typename Output >
-        class function_output : public sender<Output> {
-        public:
-
-            typedef Output output_type;
-
-            function_output() { }
-
-            //! Adds a new successor to this node
-            /* override */ bool register_successor( receiver<output_type> &r ) {
-                successors().register_successor( r );
-                return true;
-            }
-
-            //! Removes a successor from this node
-            /* override */ bool remove_successor( receiver<output_type> &r ) {
-                successors().remove_successor( r );
-                return true;
-            }
-  
-        protected:
-
-            virtual broadcast_cache<output_type > &successors() = 0; 
-
-        };
-
-    }
-    //! @endcond INTERNAL
-
-    //! An executable node that acts as a source, i.e. it has no predecessors
-    template < typename Output >
-    class source_node : public graph_node, public sender< Output > {
-    public:
-
-        //! The type of the output message, which is complete
-        typedef Output output_type;           
-
-        //! The type of successors of this node
-        typedef receiver< Output > successor_type;
-
-        //! Constructor for a node with a successor
-        template< typename Body >
-        source_node( graph &g, Body body, bool is_active = true )
-             : my_root_task(g.root_task()), my_state( is_active ? internal::node_state_idle : internal::node_state_inactive ),
-              my_body( new internal::source_body_leaf< output_type, Body>(body) ),
-              my_reserved(false), my_has_cached_item(false) { 
-            my_successors.set_owner(this);
-        }
-
-        //! The destructor
-        ~source_node() { delete my_body; }
-
-        //! Add a new successor to this node
-        /* override */ bool register_successor( receiver<output_type> &r ) {
-            spin_mutex::scoped_lock lock(my_mutex);
-            my_successors.register_successor(r);
-            if ( my_state != internal::node_state_inactive )
-                spawn_put();
-            return true;
-        }
-
-        //! Removes a successor from this node
-        /* override */ bool remove_successor( receiver<output_type> &r ) {
-            spin_mutex::scoped_lock lock(my_mutex);
-            my_successors.remove_successor(r);
-            return true;
-        }
-
-        //! Request an item from the node
-        /*override */ bool try_get( output_type &v ) {
-            spin_mutex::scoped_lock lock(my_mutex);
-            if ( my_reserved )  
-                return false;
-
-            if ( my_has_cached_item ) {
-                v = my_cached_item;
-                my_has_cached_item = false;
-            } else if ( (*my_body)(v) == false ) {
-                return false;
-            }
-            return true;
-        }
-
-        //! Reserves an item.
-        /* override */ bool try_reserve( output_type &v ) {
-            spin_mutex::scoped_lock lock(my_mutex);
-            if ( my_reserved ) {
-                return false;
-            }
-
-            if ( !my_has_cached_item && (*my_body)(my_cached_item) )  
-                my_has_cached_item = true;
-
-            if ( my_has_cached_item ) {
-                v = my_cached_item;
-                my_reserved = true;
-                return true;
-            } else {
-                return false;
-            }
-        }
-
-        //! Release a reserved item.  
-        /**  true = item has been released and so remains in sender, dest must request or reserve future items */
-        /* override */ bool try_release( ) {
-            spin_mutex::scoped_lock lock(my_mutex);
-            __TBB_ASSERT( my_reserved && my_has_cached_item, "releasing non-existent reservation" );
-            my_reserved = false;
-            spawn_put();
-            return true;
-        }
-
-        //! Consumes a reserved item
-        /* override */ bool try_consume( ) {
-            spin_mutex::scoped_lock lock(my_mutex);
-            __TBB_ASSERT( my_reserved && my_has_cached_item, "consuming non-existent reservation" );
-            my_reserved = false;
-            my_has_cached_item = false;
-            if ( !my_successors.empty() ) {
-                spawn_put();
-            }
-            return true;
-        }
-
-        //! Activates a node that was created in the inactive state
-        void activate() {
-            spin_mutex::scoped_lock lock(my_mutex);
-            my_state = internal::node_state_idle;
-            if ( !my_successors.empty() )
-                spawn_put();
-        }
-
-    private:
-
-        task *my_root_task;
-        spin_mutex my_mutex;
-        internal::node_state my_state;
-        internal::source_body<output_type> *my_body;
-        internal::broadcast_cache< output_type > my_successors;
-        bool my_reserved;
-        bool my_has_cached_item;
-        output_type my_cached_item;
-
-        friend class internal::source_task< source_node< output_type > >;
-
-        //! Applies the body
-        /* override */ void apply_body( ) {
-            output_type v;
-            if ( try_reserve(v) == false )
-                return;
-
-            if ( my_successors.try_put( v ) ) 
-                try_consume();
-            else
-                try_release();
-        }
-
-        //! Spawns a task that applies the body
-        /* override */ void spawn_put( ) {
-            task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
-               internal::source_task< source_node< output_type > >( *this ) ); 
-        }
-
-    };
-
-    //! Implements a function node that supports Input -> Output
-    template <typename Input, typename Output = continue_msg >
-    class function_node : public graph_node, public internal::function_input<Input,Output>, public internal::function_output<Output> {
-    public:
-
-        typedef Input input_type;
-        typedef Output output_type;
-        typedef sender< input_type > predecessor_type;
-        typedef receiver< output_type > successor_type;
-
-        //! Constructor
-        template< typename Body >
-        function_node( graph &g, size_t concurrency, Body body )
-        : internal::function_input<input_type,output_type>( g, concurrency, body ) {
-            my_successors.set_owner(this);
-        }
-
-    protected:
-
-        internal::broadcast_cache<output_type> my_successors; 
-        /* override */ internal::broadcast_cache<output_type> &successors () { return my_successors; }
-
-    };
-
-    //! Implements an executable node that supports continue_msg -> Output
-    template <typename Output>
-    class executable_node : public graph_node, public internal::continue_input<Output>, public internal::function_output<Output> {
-    public:
-
-        typedef continue_msg input_type;
-        typedef Output output_type;
-        typedef sender< input_type > predecessor_type;
-        typedef receiver< output_type > successor_type;
-
-         //! Constructor for executable node with continue_msg -> Output
-         template <typename Body >
-         executable_node( graph &g, Body body )
-                 : internal::continue_input<output_type>( g, body ) {
-             my_successors.set_owner(this);
-         }
-
-         //! Constructor for executable node with continue_msg -> Output
-         template <typename Body >
-         executable_node( graph &g, int number_of_predecessors, Body body )
-                 : internal::continue_input<output_type>( g, number_of_predecessors, body ) {
-             my_successors.set_owner(this);
-         }
-
-    protected:
-
-        internal::broadcast_cache<output_type> my_successors; 
-        /* override */ internal::broadcast_cache<output_type> &successors () { return my_successors; }
-
-    };
-
-
-
-    template< typename T >
-    class overwrite_node : public graph_node, public receiver<T>, public sender<T>, internal::no_copy {
-    public:
-
-        typedef T input_type;
-        typedef T output_type;
-        typedef sender< input_type > predecessor_type;
-        typedef receiver< output_type > successor_type;
-
-        overwrite_node() : my_buffer_is_valid(false) {
-            my_successors.set_owner( this );
-        }
-
-        ~overwrite_node() {}
-
-        /* override */ bool register_successor( successor_type &s ) {
-            spin_mutex::scoped_lock l( my_mutex );
-            if ( my_buffer_is_valid ) {
-                // We have a valid value that must be forwarded immediately.
-                if ( s.try_put( my_buffer ) || !s.register_predecessor( *this  ) ) {
-                    // We add the successor: it accepted our put or it rejected it but won't let use become a predecessor
-                    my_successors.register_successor( s );
-                    return true;
-                } else {
-                    // We don't add the successor: it rejected our put and we became its predecessor instead
-                    return false;
-                }
-            } else {
-                // No valid value yet, just add as successor
-                my_successors.register_successor( s );
-                return true;
-            }
-        }
-
-        /* override */ bool remove_successor( successor_type &s ) {
-            spin_mutex::scoped_lock l( my_mutex );
-            my_successors.remove_successor(s);
-            return true;
-        }
-
-        /* override */ bool try_put( T v ) {
-            spin_mutex::scoped_lock l( my_mutex );
-            my_buffer = v;
-            my_buffer_is_valid = true;
-            my_successors.try_put(v);
-            return true;
-        }
-
-        /* override */ bool try_get( T &v ) {
-            spin_mutex::scoped_lock l( my_mutex );
-            if ( my_buffer_is_valid ) {
-                v = my_buffer;
-                return true;
-            } else {
-                return false;
-            }
-        }
-
-        bool is_valid() {
-           spin_mutex::scoped_lock l( my_mutex );
-           return my_buffer_is_valid;
-        }
-
-        void clear() {
-           spin_mutex::scoped_lock l( my_mutex );
-           my_buffer_is_valid = false;
-        }
-
-    protected:
-
-        spin_mutex my_mutex;
-        internal::broadcast_cache< T, null_rw_mutex > my_successors;
-        T my_buffer;
-        bool my_buffer_is_valid;
-
-    };
-
-    template< typename T >
-    class write_once_node : public overwrite_node<T> {
-    public:
-
-        typedef T input_type;
-        typedef T output_type;
-        typedef sender< input_type > predecessor_type;
-        typedef receiver< output_type > successor_type;
-
-        /* override */ bool try_put( T v ) {
-            spin_mutex::scoped_lock l( this->my_mutex );
-            if ( this->my_buffer_is_valid ) {
-                return false;
-            } else {
-                this->my_buffer = v;
-                this->my_buffer_is_valid = true;
-                this->my_successors.try_put(v);
-                return true;
-            }
-        }
-    };
-
-    //! Broadcasts completion message when it receives completion messages from all predecessors. Then resets.
-    /** Is equivalent to an executable_node< continue_msg > with an empty_body */
-    class continue_node : public executable_node< continue_msg > { 
-    public:
-
-        typedef continue_msg input_type;
-        typedef continue_msg output_type;
-        typedef sender< input_type > predecessor_type;
-        typedef receiver< output_type > successor_type;
-
-        continue_node( graph &g ) : executable_node<continue_msg>( g, internal::empty_body< continue_msg, continue_msg>() ) {}
-    };
-
-    //! Forwards messages of type T to all successors
-    template <typename T>
-    class broadcast_node : public graph_node, public receiver<T>, public sender<T>, internal::no_copy {
-
-        internal::broadcast_cache<T> my_successors;
-
-    public:
-
-        typedef T input_type;
-        typedef T output_type;
-        typedef sender< input_type > predecessor_type;
-        typedef receiver< output_type > successor_type;
-
-        broadcast_node( ) {
-           my_successors.set_owner( this ); 
-        }
-
-        //! Adds a successor
-        virtual bool register_successor( receiver<T> &r ) {
-            my_successors.register_successor( r );
-            return true;
-        }
-
-        //! Removes s as a successor
-        virtual bool remove_successor( receiver<T> &r ) {
-            my_successors.remove_successor( r );
-            return true;
-        }
-
-        /* override */ bool try_put( T t ) {
-            my_successors.try_put(t);
-            return true;
-        }
-
-    };
-
-
-    //! Forwards messages in arbitrary order
-    template <typename T>
-    class buffer_node : public graph_node, public receiver<T>, public sender<T>, internal::no_copy {
-    public:
-        typedef T input_type;
-        typedef T output_type;
-        typedef sender< input_type > predecessor_type;
-        typedef receiver< output_type > successor_type;
-    protected:
-        typedef size_t size_type;
-        typedef std::pair< T, bool > item_type;
-
-        internal::round_robin_cache< T, null_rw_mutex > my_successors;
-
-        task *my_parent;
-        item_type *my_array;
-        size_type my_array_size;
-        static const size_type initial_buffer_size = 4;
-        size_type my_head;
-        size_type my_tail;
-        spin_mutex my_mutex;
-        bool my_reserved;
-        size_type my_reserved_id;
-
-        friend class internal::forward_task< buffer_node< T > >;
-
-        enum op_type {reg_succ, rem_succ, req_item, res_item, rel_res, con_res, put_item, try_fwd};
-        enum op_stat {WAIT=0, SUCCEEDED, FAILED};
-
-        // implements the aggregator_operation concept
-        class buffer_operation : public internal::aggregated_operation< buffer_operation > {
-        public:
-            char type;
-            T *elem;
-            successor_type *r;
-            buffer_operation(const T& e, op_type t) :
-                type(char(t)), elem(const_cast<T*>(&e)), r(NULL) {}
-            buffer_operation(op_type t) : type(char(t)), r(NULL) {}
-        };
-
-        class my_functor_t {
-            buffer_node<T> *bfr;
-        public:
-            my_functor_t(buffer_node<T> *bfr_) : bfr(bfr_) {}
-            my_functor_t() {}
-            void operator()(buffer_operation* op_list) {
-                bfr->handle_operations(op_list);
-            }
-        };
-
-        bool forwarder_busy;
-        internal::aggregator< my_functor_t, buffer_operation> my_aggregator;
-
-        virtual void handle_operations(buffer_operation *op_list) {
-            buffer_operation *tmp;
-            bool try_forwarding=false;
-            while (op_list) {
-                tmp = op_list;
-                op_list = op_list->next;
-                switch (tmp->type) {
-                case reg_succ: internal_reg_succ(tmp);  try_forwarding = true; break;
-                case rem_succ: internal_rem_succ(tmp); break;
-                case req_item: internal_pop(tmp); break;
-                case res_item: internal_reserve(tmp); break;
-                case rel_res:  internal_release(tmp);  try_forwarding = true; break;
-                case con_res:  internal_consume(tmp);  try_forwarding = true; break;
-                case put_item: internal_push(tmp);  try_forwarding = true; break;
-                case try_fwd:  internal_forward(tmp); break;
-                }
-            }
-            if (try_forwarding && !forwarder_busy) {
-                forwarder_busy = true;
-                task::enqueue(*new(task::allocate_additional_child_of(*my_parent)) internal::forward_task< buffer_node<input_type> >(*this));
-            }
-        }
-
-        //! This is executed by an enqueued task, the "forwarder"
-        virtual void forward() {
-            buffer_operation op_data(try_fwd);
-            do {
-                op_data.status = WAIT;
-                my_aggregator.execute(&op_data);
-            } while (op_data.status == SUCCEEDED);
-        }
-
-        //! Register successor
-        virtual void internal_reg_succ(buffer_operation *op) {
-            my_successors.register_successor(*(op->r));
-            __TBB_store_with_release(op->status, SUCCEEDED);
-        }
-
-        //! Remove successor
-        virtual void internal_rem_succ(buffer_operation *op) {
-            my_successors.remove_successor(*(op->r));
-            __TBB_store_with_release(op->status, SUCCEEDED);
-        }
-
-        //! Tries to forward valid items to successors
-        virtual void internal_forward(buffer_operation *op) {
-            T i_copy;
-            bool success = false; // flagged when a successor accepts
-            size_type counter = my_successors.size();
-            // Try forwarding, giving each successor a chance
-            while (counter>0 && my_tail>my_head && my_array[ (my_tail-1) & (my_array_size-1)].second == true ) {
-                i_copy = my_array[ (my_tail-1) & (my_array_size-1)].first;
-                bool msg = my_successors.try_put(i_copy);
-                if ( msg == true ) {
-                    my_array[ (my_tail-1) & (my_array_size-1)].second = false;
-                    --my_tail;
-                    success = true; // found an accepting successor
-                }
-                --counter;
-            }
-            if (success && !counter)
-                __TBB_store_with_release(op->status, SUCCEEDED);
-            else {
-                __TBB_store_with_release(op->status, FAILED);
-                forwarder_busy = false;
-            }
-        }
-
-        virtual void internal_push(buffer_operation *op) {
-            while( my_tail-my_head >= my_array_size ) {
-                grow_my_array( my_tail - my_head + 1 );
-            }
-            my_array[my_tail&(my_array_size-1)] = std::make_pair( *(op->elem), true );
-            ++my_tail;
-            __TBB_store_with_release(op->status, SUCCEEDED);
-        }
-        virtual void internal_pop(buffer_operation *op) {
-            if ( my_array[(my_tail-1) & (my_array_size-1)].second == false ) {
-                __TBB_store_with_release(op->status, FAILED);
-            }
-            else {
-                *(op->elem) = my_array[(my_tail-1) & (my_array_size-1)].first;
-                my_array[(my_tail-1) & (my_array_size-1)].second = false;
-                --my_tail;
-                __TBB_store_with_release(op->status, SUCCEEDED);
-            }
-        }
-        virtual void internal_reserve(buffer_operation *op) {
-            if (my_reserved == true || my_array[ my_head & (my_array_size-1)].second == false ) {
-                __TBB_store_with_release(op->status, FAILED);
-            }
-            else {
-                my_reserved = true;
-                *(op->elem) = my_array[ my_head & (my_array_size-1)].first;
-                my_array[ my_head & (my_array_size-1)].second = false;
-                __TBB_store_with_release(op->status, SUCCEEDED);
-            }
-        }
-        virtual void internal_consume(buffer_operation *op) {
-            my_reserved = false;
-            ++my_head;
-            __TBB_store_with_release(op->status, SUCCEEDED);
-        }
-
-        virtual void internal_release(buffer_operation *op) {
-            my_array[my_head&(my_array_size-1)].second = true;
-            my_reserved = false;
-            __TBB_store_with_release(op->status, SUCCEEDED);
-        }
-
-        //! Grows the internal array
-        void grow_my_array( size_t minimum_size ) {
-            size_type old_size = my_array_size;
-            size_type new_size = old_size ? 2*old_size : initial_buffer_size;
-            while( new_size<minimum_size )
-                new_size*=2;
-
-            item_type* new_array = cache_aligned_allocator<item_type>().allocate(new_size);
-            item_type* old_array = my_array;
-
-            for( size_type i=0; i<new_size; ++i )
-                new_array[i].second = false;
-
-            size_t t=my_head;
-            for( size_type i=0; i<old_size; ++i, ++t )
-                new_array[t&(new_size-1)] = old_array[t&(old_size-1)];
-            my_array = new_array;
-            my_array_size = new_size;
-            if( old_array )
-                cache_aligned_allocator<item_type>().deallocate(old_array,old_size);
-        }
-
-    public:
-        //! Constructor
-        buffer_node( graph &g ) :
-            my_parent( g.root_task() ), my_array(NULL), my_array_size(0),
-            my_head(0), my_tail(0), my_reserved(false), forwarder_busy(false) {
-            my_successors.set_owner(this);
-            my_aggregator.initialize_handler(my_functor_t(this));
-            grow_my_array(initial_buffer_size);
-        }
-
-        virtual ~buffer_node() {}
-
-        //
-        // message sender implementation
-        //
-
-        //! Adds a new successor.
-        /** Adds successor r to the list of successors; may forward tasks.  */
-        /* override */ bool register_successor( receiver<output_type> &r ) {
-            buffer_operation op_data(reg_succ);
-            op_data.r = &r;
-            my_aggregator.execute(&op_data);
-            return true;
-        }
-
-        //! Removes a successor.
-        /** Removes successor r from the list of successors.
-            It also calls r.remove_predecessor(*this) to remove this node as a predecessor. */
-        /* override */ bool remove_successor( receiver<output_type> &r ) {
-            r.remove_predecessor(*this);
-            buffer_operation op_data(rem_succ);
-            op_data.r = &r;
-            my_aggregator.execute(&op_data);
-            return true;
-        }
-
-        //! Request an item from the buffer_node
-        /**  true = v contains the returned item<BR>
-             false = no item has been returned */
-        /* override */ bool try_get( T &v ) {
-            buffer_operation op_data(req_item);
-            op_data.elem = &v;
-            my_aggregator.execute(&op_data);
-            return (op_data.status==SUCCEEDED);
-        }
-
-        //! Reserves an item.
-        /**  false = no item can be reserved<BR>
-             true = an item is reserved */
-        /* override */ bool try_reserve( T &v ) {
-            buffer_operation op_data(res_item);
-            op_data.elem = &v;
-            my_aggregator.execute(&op_data);
-            return (op_data.status==SUCCEEDED);
-        }
-
-        //! Release a reserved item.
-        /**  true = item has been released and so remains in sender */
-        /* override */ bool try_release() {
-            buffer_operation op_data(rel_res);
-            my_aggregator.execute(&op_data);
-            return true;
-        }
-
-        //! Consumes a reserved item.
-        /** true = item is removed from sender and reservation removed */
-        /* override */ bool try_consume() {
-            buffer_operation op_data(con_res);
-            my_aggregator.execute(&op_data);
-            return true;
-        }
-
-        //! Receive an item
-        /** true is always returned */
-        /* override */ bool try_put(T t) {
-            buffer_operation op_data(t, put_item);
-            my_aggregator.execute(&op_data);
-            return true;
-        }
-    };
-
-
-    //! Forwards messages in FIFO order
-    template <typename T>
-    class queue_node : public buffer_node<T> {
-    protected:
-        typedef typename buffer_node<T>::size_type size_type;
-        typedef typename buffer_node<T>::buffer_operation queue_operation;
-
-        enum op_stat {WAIT=0, SUCCEEDED, FAILED};
-
-        //! Tries to forward valid items to successors
-        /* override */ void internal_forward(queue_operation *op) {
-            T i_copy;
-            bool success = false; // flagged when a successor accepts
-            size_type counter = this->my_successors.size();
-            if (this->my_reserved || this->my_array[ this->my_head & (this->my_array_size-1)].second == false) {
-                __TBB_store_with_release(op->status, FAILED);
-                this->forwarder_busy = false;
-                return;
-            }
-            // Keep trying to send items while there is at least one accepting successor
-            while (counter>0 && this->my_array[ this->my_head & (this->my_array_size-1)].second == true ) {
-                i_copy = this->my_array[ this->my_head & (this->my_array_size-1)].first;
-                bool msg = this->my_successors.try_put(i_copy);
-                if ( msg == true ) {
-                     this->my_array[ this->my_head & (this->my_array_size-1)].second = false;
-                     ++(this->my_head);
-                    success = true; // found an accepting successor
-                }
-                --counter;
-            }
-            if (success && !counter)
-                __TBB_store_with_release(op->status, SUCCEEDED);
-            else {
-                __TBB_store_with_release(op->status, FAILED);
-                this->forwarder_busy = false;
-            }
-        }
-
-        /* override */ void internal_pop(queue_operation *op) {
-            if ( this->my_reserved == true || this->my_array[ this->my_head & (this->my_array_size-1)].second == false ) {
-                __TBB_store_with_release(op->status, FAILED);
-            }
-            else {
-                *(op->elem) = this->my_array[ this->my_head & (this->my_array_size-1)].first;
-                this->my_array[ this->my_head & (this->my_array_size-1)].second = false;
-                ++(this->my_head);
-                __TBB_store_with_release(op->status, SUCCEEDED);
-            }
-        }
-        /* override */ void internal_reserve(queue_operation *op) {
-            if (this->my_reserved == true || this->my_array[ this->my_head & (this->my_array_size-1)].second == false ) {
-                __TBB_store_with_release(op->status, FAILED);
-            }
-            else {
-                this->my_reserved = true;
-                *(op->elem) = this->my_array[ this->my_head & (this->my_array_size-1)].first;
-                __TBB_store_with_release(op->status, SUCCEEDED);
-            }
-        }
-        /* override */ void internal_consume(queue_operation *op) {
-            this->my_reserved = false;
-            this->my_array[ this->my_head & (this->my_array_size-1)].second = false;
-            ++(this->my_head);
-            __TBB_store_with_release(op->status, SUCCEEDED);
-        }
-
-    public:
-
-        typedef T input_type;
-        typedef T output_type;
-        typedef sender< input_type > predecessor_type;
-        typedef receiver< output_type > successor_type;
-
-        //! Constructor
-        queue_node( graph &g ) : buffer_node<T>(g) {}
-    };
-
-    //! Forwards messages in sequence order
-    template< typename T >
-    class sequencer_node : public queue_node<T> {
-        internal::function_body< T, size_t > *my_sequencer;
-    public:
-
-        typedef T input_type;
-        typedef T output_type;
-        typedef sender< input_type > predecessor_type;
-        typedef receiver< output_type > successor_type;
-
-        //! Constructor
-        template< typename Sequencer >
-        sequencer_node( graph &g, const Sequencer& s ) : queue_node<T>(g),
-            my_sequencer(new internal::function_body_leaf< T, size_t, Sequencer>(s) ) {}
-
-        //! Destructor
-        ~sequencer_node() { delete my_sequencer; }
-    protected:
-        typedef typename buffer_node<T>::size_type size_type;
-        typedef typename buffer_node<T>::buffer_operation sequencer_operation;
-
-        enum op_stat {WAIT=0, SUCCEEDED, FAILED};
-
-    private:
-        /* override */ void internal_push(sequencer_operation *op) {
-            size_type tag = (*my_sequencer)(*(op->elem));
-
-            this->my_tail = (tag+1 > this->my_tail) ? tag+1 : this->my_tail;
-            while ( this->my_tail - this->my_head >= this->my_array_size ) {
-                this->grow_my_array( this->my_tail - this->my_head  + 1);
-            }
-            this->my_array[tag&(this->my_array_size-1)] = std::make_pair( *(op->elem), true );
-            __TBB_store_with_release(op->status, SUCCEEDED);
-        }
-    };
-
-    //! Forwards messages in priority order
-    template< typename T, typename Compare = std::less<T> >
-    class priority_queue_node : public buffer_node<T> {
-    public:
-        typedef T input_type;
-        typedef T output_type;
-        typedef sender< input_type > predecessor_type;
-        typedef receiver< output_type > successor_type;
-
-        //! Constructor
-        priority_queue_node( graph &g ) : buffer_node<T>(g), mark(0) {}
-
-    protected:
-        typedef typename buffer_node<T>::size_type size_type;
-        typedef typename buffer_node<T>::item_type item_type;
-        typedef typename buffer_node<T>::buffer_operation prio_operation;
-
-        enum op_stat {WAIT=0, SUCCEEDED, FAILED};
-
-        /* override */ void handle_operations(prio_operation *op_list) {
-            prio_operation *tmp /*, *pop_list*/ ;
-            bool try_forwarding=false;
-            while (op_list) {
-                tmp = op_list;
-                op_list = op_list->next;
-                switch (tmp->type) {
-                case buffer_node<T>::reg_succ: this->internal_reg_succ(tmp); try_forwarding = true; break;
-                case buffer_node<T>::rem_succ: this->internal_rem_succ(tmp); break;
-                case buffer_node<T>::put_item: internal_push(tmp); try_forwarding = true; break;
-                case buffer_node<T>::try_fwd: internal_forward(tmp); break;
-                case buffer_node<T>::rel_res: internal_release(tmp); try_forwarding = true; break;
-                case buffer_node<T>::con_res: internal_consume(tmp); try_forwarding = true; break;
-                case buffer_node<T>::req_item: internal_pop(tmp); break;
-                case buffer_node<T>::res_item: internal_reserve(tmp); break;
-                }
-            }
-            // process pops!  for now, no special pop processing
-            if (mark<this->my_tail) heapify();
-            if (try_forwarding && !this->forwarder_busy) {
-                this->forwarder_busy = true;
-                task::enqueue(*new(task::allocate_additional_child_of(*(this->my_parent))) internal::forward_task< buffer_node<input_type> >(*this));
-            }
-        }
-
-        //! Tries to forward valid items to successors
-        /* override */ void internal_forward(prio_operation *op) {
-            T i_copy;
-            bool success = false; // flagged when a successor accepts
-            size_type counter = this->my_successors.size();
-
-            if (this->my_reserved || this->my_tail == 0) {
-                __TBB_store_with_release(op->status, FAILED);
-                this->forwarder_busy = false;
-                return;
-            }
-            // Keep trying to send while there exists an accepting successor
-            while (counter>0 && this->my_tail > 0) {
-                i_copy = this->my_array[0].first;
-                bool msg = this->my_successors.try_put(i_copy);
-                if ( msg == true ) {
-                     if (mark == this->my_tail) --mark;
-                    --(this->my_tail);
-                    this->my_array[0].first=this->my_array[this->my_tail].first;
-                    if (this->my_tail > 1) // don't reheap for heap of size 1
-                        reheap();
-                    success = true; // found an accepting successor
-                }
-                --counter;
-            }
-            if (success && !counter)
-                __TBB_store_with_release(op->status, SUCCEEDED);
-            else {
-                __TBB_store_with_release(op->status, FAILED);
-                this->forwarder_busy = false;
-            }
-        }
-
-        /* override */ void internal_push(prio_operation *op) {
-            if ( this->my_tail >= this->my_array_size )
-                this->grow_my_array( this->my_tail + 1 );
-            this->my_array[this->my_tail] = std::make_pair( *(op->elem), true );
-            ++(this->my_tail);
-            __TBB_store_with_release(op->status, SUCCEEDED);
-        }
-        /* override */ void internal_pop(prio_operation *op) {
-            if ( this->my_reserved == true || this->my_tail == 0 ) {
-                __TBB_store_with_release(op->status, FAILED);
-            }
-            else {
-                if (mark<this->my_tail &&
-                    compare(this->my_array[0].first,
-                            this->my_array[this->my_tail-1].first)) {
-                    // there are newly pushed elems; last one higher than top
-                    // copy the data
-                    *(op->elem) = this->my_array[this->my_tail-1].first;
-                    --(this->my_tail);
-                    __TBB_store_with_release(op->status, SUCCEEDED);
-                }
-                else { // extract and push the last element down heap
-                    *(op->elem) = this->my_array[0].first; // copy the data
-                    if (mark == this->my_tail) --mark;
-                    --(this->my_tail);
-                    __TBB_store_with_release(op->status, SUCCEEDED);
-                    this->my_array[0].first=this->my_array[this->my_tail].first;
-                    if (this->my_tail > 1) // don't reheap for heap of size 1
-                        reheap();
-                }
-            }
-        }
-        /* override */ void internal_reserve(prio_operation *op) {
-            if (this->my_reserved == true || this->my_tail == 0) {
-                __TBB_store_with_release(op->status, FAILED);
-            }
-            else {
-                this->my_reserved = true;
-                *(op->elem) = reserved_item = this->my_array[0].first;
-                if (mark == this->my_tail) --mark;
-                --(this->my_tail);
-                __TBB_store_with_release(op->status, SUCCEEDED);
-                this->my_array[0].first = this->my_array[this->my_tail].first;
-                if (this->my_tail > 1) // don't reheap for heap of size 1
-                    reheap();
-            }
-        }
-        /* override */ void internal_consume(prio_operation *op) {
-            this->my_reserved = false;
-            __TBB_store_with_release(op->status, SUCCEEDED);
-        }
-        /* override */ void internal_release(prio_operation *op) {
-            if (this->my_tail >= this->my_array_size)
-                this->grow_my_array( this->my_tail + 1 );
-            this->my_array[this->my_tail] = std::make_pair(reserved_item, true);
-            ++(this->my_tail);
-            this->my_reserved = false;
-            __TBB_store_with_release(op->status, SUCCEEDED);
-            heapify();
-        }
-    private:
-        Compare compare;
-        size_type mark;
-        input_type reserved_item;
-
-        void heapify() {
-            if (!mark) mark = 1;
-            for (; mark<this->my_tail; ++mark) { // for each unheaped element
-                size_type cur_pos = mark;
-                input_type to_place = this->my_array[mark].first;
-                do { // push to_place up the heap
-                    size_type parent = (cur_pos-1)>>1;
-                    if (!compare(this->my_array[parent].first, to_place))
-                        break;
-                    this->my_array[cur_pos].first = this->my_array[parent].first;
-                    cur_pos = parent;
-                } while( cur_pos );
-                this->my_array[cur_pos].first = to_place;
-            }
-        }
-
-        void reheap() {
-            size_type cur_pos=0, child=1;
-            while (child < mark) {
-                size_type target = child;
-                if (child+1<mark &&
-                    compare(this->my_array[child].first,
-                            this->my_array[child+1].first))
-                    ++target;
-                // target now has the higher priority child
-                if (compare(this->my_array[target].first,
-                            this->my_array[this->my_tail].first))
-                    break;
-                this->my_array[cur_pos].first = this->my_array[target].first;
-                cur_pos = target;
-                child = (cur_pos<<1)+1;
-            }
-            this->my_array[cur_pos].first = this->my_array[this->my_tail].first;
-        }
-    };
-
-    //! Forwards messages only if the threshold has not been reached
-    /** This node forwards items until its threshold is reached.
-        It contains no buffering.  If the downstream node rejects, the
-        message is dropped. */
-    template< typename T >
-    class limiter_node : public graph_node, public receiver< T >, public sender< T >, internal::no_copy {
-    public:
-
-        typedef T input_type;
-        typedef T output_type;
-        typedef sender< input_type > predecessor_type;
-        typedef receiver< output_type > successor_type;
-
-    private:
-
-        task *my_root_task;
-        size_t my_threshold;
-        size_t my_count;
-        internal::predecessor_cache< T > my_predecessors;
-        spin_mutex my_mutex;
-        internal::broadcast_cache< T > my_successors;
-
-        friend class internal::forward_task< limiter_node<T> >;
-
-        // Let decrementer call decrement_counter()
-        friend class internal::decrementer< limiter_node<T> >;
-
-        void decrement_counter() {
-            input_type v;
-            
-            // If we can't get / put an item immediately then drop the count
-            if ( my_predecessors.get_item( v ) == false 
-                 || my_successors.try_put(v) == false ) {
-                spin_mutex::scoped_lock lock(my_mutex);
-                --my_count;
-                if ( !my_predecessors.empty() ) 
-                    task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
-                                internal::forward_task< limiter_node<T> >( *this ) );
-            }
-        }
-
-        void forward() {
-            {
-                spin_mutex::scoped_lock lock(my_mutex);
-                if ( my_count < my_threshold ) 
-                    ++my_count;
-                else
-                    return;
-            }
-            decrement_counter();
-        }
-
-    public:
-
-        //! The internal receiver< continue_msg > that decrements the count
-        internal::decrementer< limiter_node<T> > decrement;
-
-        //! Constructor
-        limiter_node( graph &g, size_t threshold, int number_of_decrement_predecessors = 0 ) : 
-           my_root_task(g.root_task()), my_threshold(threshold), my_count(0), decrement(number_of_decrement_predecessors) {
-            my_predecessors.set_owner(this);
-            my_successors.set_owner(this);
-            decrement.set_owner(this);
-        }
-
-        //! Replace the current successor with this new successor
-        /* override */ bool register_successor( receiver<output_type> &r ) {
-            my_successors.register_successor(r);
-            return true;
-        }
-
-        //! Removes a successor from this node
-        /** r.remove_predecessor(*this) is also called. */
-        /* override */ bool remove_successor( receiver<output_type> &r ) {
-            r.remove_predecessor(*this);
-            my_successors.remove_successor(r);
-            return true;
-        }
-
-        //! Puts an item to this receiver
-        /* override */ bool try_put( T t ) {
-            {
-                spin_mutex::scoped_lock lock(my_mutex);
-                if ( my_count >= my_threshold ) 
-                    return false;
-                else
-                    ++my_count; 
-            }
-
-            bool msg = my_successors.try_put(t);
-
-            if ( msg != true ) {
-                spin_mutex::scoped_lock lock(my_mutex);
-                --my_count;
-                if ( !my_predecessors.empty() ) 
-                    task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
-                                internal::forward_task< limiter_node<T> >( *this ) );
-            }
-
-            return msg;
-        }
-
-        //! Removes src from the list of cached predecessors.
-        /* override */ bool register_predecessor( predecessor_type &src ) {
-            spin_mutex::scoped_lock lock(my_mutex);
-            my_predecessors.add( src );
-            if ( my_count < my_threshold && !my_successors.empty() ) 
-                task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
-                               internal::forward_task< limiter_node<T> >( *this ) );
-            return true;
-        }
-
-        //! Removes src from the list of cached predecessors.
-        /* override */ bool remove_predecessor( predecessor_type &src ) {
-            my_predecessors.remove( src );
-            return true;
-        }
-
-    };
-
-    namespace internal {
-
-    struct forwarding_base {
-        virtual ~forwarding_base() {}
-        virtual void decrement_port_count() = 0;
-        virtual void increment_port_count() = 0;
-    };
-
-    template< int N >
-    struct join_helper {
-
-        template< typename TupleType, typename PortType >
-        static inline void set_join_node_pointer(TupleType &my_input, PortType *port) {
-            std::get<N-1>( my_input ).set_join_node_pointer(port);
-            join_helper<N-1>::set_join_node_pointer( my_input, port );
-        }
-        template< typename TupleType >
-        static inline void consume_reservations( TupleType &my_input ) {
-            std::get<N-1>( my_input ).consume();
-            join_helper<N-1>::consume_reservations( my_input );
-        }
-
-        template< typename TupleType >
-        static inline void release_my_reservation( TupleType &my_input ) {
-            std::get<N-1>( my_input ).release();
-        }
-
-        template <typename TupleType>
-        static inline void release_reservations( TupleType &my_input) {
-            join_helper<N-1>::release_reservations(my_input);
-            release_my_reservation(my_input);
-        }
-
-        template< typename InputTuple, typename OutputTuple >
-        static inline bool reserve( InputTuple &my_input, OutputTuple &out) {
-            if ( !std::get<N-1>( my_input ).reserve( std::get<N-1>( out ) ) ) return false;
-            if ( !join_helper<N-1>::reserve( my_input, out ) ) {
-                release_my_reservation( my_input );
-                return false;
-            }
-            return true;
-        }
-    };
-
-    template< >
-    struct join_helper<1> {
-
-        template< typename TupleType, typename PortType >
-        static inline void set_join_node_pointer(TupleType &my_input, PortType *port) {
-            std::get<0>( my_input ).set_join_node_pointer(port);
-        }
-
-        template< typename TupleType >
-        static inline void consume_reservations( TupleType &my_input ) {
-            std::get<0>( my_input ).consume();
-        }
-
-        template< typename TupleType >
-        static inline void release_my_reservation( TupleType &my_input ) {
-            std::get<0>( my_input ).release();
-        }
-        
-        template<typename TupleType>
-        static inline void release_reservations( TupleType &my_input) {
-            release_my_reservation(my_input);
-        }
-
-        template< typename InputTuple, typename OutputTuple >
-        static inline bool reserve( InputTuple &my_input, OutputTuple &out) {
-            return std::get<0>( my_input ).reserve( std::get<0>( out ) );
-        }
-    };
-
-    namespace join_policy_namespace {
-        enum join_policy { two_phase
-        };
-    }
-    using namespace join_policy_namespace;
-
-    //! The two-phase join port
-    template< typename T >
-    class two_phase_port : public receiver<T> {
-    public:
-        typedef T input_type;
-        typedef sender<T> predecessor_type;
-
-        //! Constructor
-        two_phase_port() : reserved(false) {
-           my_join = NULL;
-           my_predecessors.set_owner( this );
-        }
-
-        // copy constructor
-        two_phase_port(const two_phase_port& /* other */) : receiver<T>() {
-            reserved = false;
-            my_join = NULL;
-            my_predecessors.set_owner( this );
-        }
-
-        void set_join_node_pointer(forwarding_base *join) {
-            my_join = join;
-        }
-
-        bool try_put( T ) {
-            return false;
-        }
-
-        //! Add a predecessor
-        bool register_predecessor( sender<T> &src ) {
-            spin_mutex::scoped_lock l(my_mutex);
-            bool no_predecessors = my_predecessors.empty();
-            my_predecessors.add(src);
-            if ( no_predecessors ) {
-                my_join->decrement_port_count( );
-            }
-            return true;
-        }
-
-        //! Remove a predecessor
-        bool remove_predecessor( sender<T> &src ) {
-            spin_mutex::scoped_lock l(my_mutex);
-            my_predecessors.remove( src );
-            if(my_predecessors.empty()) my_join->increment_port_count();
-            return true;
-        }
-
-        //! Reserve an item from the port
-        bool reserve( T &v ) {
-            spin_mutex::scoped_lock l(my_mutex);
-            if ( reserved ) {
-                return false;
-            }
-            if ( my_predecessors.try_reserve( v ) ) {
-                reserved = true;
-                return true;
-            } else if ( my_predecessors.empty() ) {
-                my_join->increment_port_count();
-            }
-            return false;
-        }
-
-        //! Release the port
-        void release( ) {
-            spin_mutex::scoped_lock l(my_mutex);
-            reserved = false;
-            my_predecessors.try_release( );
-        }
-
-        //! Complete use of the port
-        void consume( ) {
-            spin_mutex::scoped_lock l(my_mutex);
-            reserved = false;
-            my_predecessors.try_consume( );
-        }
-
-    private:
-        spin_mutex my_mutex;
-        forwarding_base *my_join;
-        reservable_predecessor_cache< T > my_predecessors;
-        bool reserved;
-    };
-
-    template<join_policy JP, typename InputTuple, typename OutputTuple>
-    class join_node_base;
-
-    //! join_node_FE : implements input port policy
-    template<join_policy JP, typename InputTuple, typename OutputTuple>
-    class join_node_FE;
-
-    template<typename InputTuple, typename OutputTuple>
-    class join_node_FE<two_phase, InputTuple, OutputTuple> : public forwarding_base {
-    public:
-        static const int N = std::tuple_size<OutputTuple>::value;
-        typedef OutputTuple output_type;
-        typedef InputTuple input_type;
-        typedef join_node_base<two_phase, InputTuple, OutputTuple> my_node_type; // for forwarding
-
-        join_node_FE(graph &g) : my_root_task(g.root_task()), my_node(NULL) {
-            ports_with_no_inputs = N;
-            join_helper<N>::set_join_node_pointer(my_inputs, this);
-        }
-
-        void set_my_node(my_node_type *new_my_node) { my_node = new_my_node; }
-
-       void increment_port_count() {
-            ++ports_with_no_inputs;
-        }
-
-        // if all input_ports have predecessors, spawn forward to try and consume tuples
-        void decrement_port_count() {
-            if(ports_with_no_inputs.fetch_and_decrement() == 1) {
-                task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) )
-                    forward_task<my_node_type>(*my_node) );
-            }
-        }
-
-        input_type &inputs() { return my_inputs; }
-    protected:
-        // all methods on input ports should be called under spin lock from join_node_base.
-
-        bool tuple_build_may_succeed() {
-            return !ports_with_no_inputs;
-        }
-
-        bool try_to_make_tuple(output_type &out) {
-            if(ports_with_no_inputs) return false;
-            return join_helper<N>::reserve(my_inputs, out);
-        }
-
-        void tuple_accepted() {
-            join_helper<N>::consume_reservations(my_inputs);
-        }
-        void tuple_rejected() {
-            join_helper<N>::release_reservations(my_inputs);
-        }
-
-        input_type my_inputs;
-        task *my_root_task;
-        my_node_type *my_node;
-        atomic<size_t> ports_with_no_inputs;
-    };
-
-    //! join_node_base
-    template<join_policy JP, typename InputTuple, typename OutputTuple>
-    class join_node_base : public graph_node, public join_node_FE<JP, InputTuple, OutputTuple>,
-                           public sender<OutputTuple>, no_copy {
-    public:
-        typedef OutputTuple output_type;
-
-        typedef receiver<output_type> successor_type;
-        typedef join_node_FE<JP, InputTuple, OutputTuple> input_ports_type;
-        using input_ports_type::tuple_build_may_succeed;
-        using input_ports_type::try_to_make_tuple;
-        using input_ports_type::tuple_accepted;
-        using input_ports_type::tuple_rejected;
-
-        join_node_base(graph &g) : input_ports_type(g),  my_root_task(g.root_task()) {
-            my_successors.set_owner(this);
-            input_ports_type::set_my_node(this);
-        }
-
-        bool register_successor(successor_type &r) {
-            spin_mutex::scoped_lock l(my_mutex);
-            my_successors.register_successor(r);
-            if(tuple_build_may_succeed()) {
-                task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task) )
-                        forward_task<join_node_base<JP,InputTuple,OutputTuple> >( *this ) );
-            }
-            return true;
-        }
-
-        template<size_t N>
-        receiver<typename std::tuple_element<N, OutputTuple>::value> & input_port(void) { return std::get<N>(input_ports_type::inputs()); }
-
-        bool remove_successor( successor_type &r) {
-            spin_mutex::scoped_lock l(my_mutex);
-            my_successors.remove_successor(r);
-            return true;
-        }
-
-        bool try_get( output_type &v) {
-            spin_mutex::scoped_lock l(my_mutex);
-            if(tuple_build_may_succeed()) {
-                if(try_to_make_tuple(v)) {
-                    // successor requested, so acceptance guaranteed
-                    tuple_accepted();
-                    return true;
-                }
-            }
-            return false;
-        }
-
-    private:
-        task *my_root_task;
-        broadcast_cache<output_type, null_rw_mutex> my_successors;
-        spin_mutex my_mutex;
-
-        friend class forward_task< join_node_base<JP, InputTuple, OutputTuple> >;
-
-        void forward() {
-            spin_mutex::scoped_lock l(my_mutex);
-            output_type out;
-            if(!tuple_build_may_succeed()) return;
-            while(try_to_make_tuple(out)) {
-                if(my_successors.try_put(out)) {
-                    tuple_accepted();
-                }
-                else {
-                    tuple_rejected();
-                    return;
-                }
-            }
-        }
-    };
-
-    //! unfolded_join_node : passes input_port_tuple to join_node_base.  We build the input port type
-    //  using tuple_element.
-    template<int N, typename OutputTuple, join_policy JP>
-    class unfolded_join_node;
-
-    template<typename OutputTuple>
-    class unfolded_join_node<2,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
-        std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type> >,
-        OutputTuple
-                  >
-                  {
-    private:
-        typedef typename std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type> > port_tuple_type;
-    public:
-        typedef OutputTuple output_type;
-    private:
-        typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
-    public:
-        unfolded_join_node(graph &g) : base_type(g) {}
-    };
-
-    template<typename OutputTuple>
-    class unfolded_join_node<3,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
-        std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type> >,
-        OutputTuple
-                    >
-                    {
-    private:
-        typedef typename std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type> > port_tuple_type;
-    public:
-        typedef OutputTuple output_type;
-    private:
-        typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
-    public:
-        unfolded_join_node(graph &g) : base_type(g) {}
-    };
-
-    template<typename OutputTuple>
-    class unfolded_join_node<4,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
-        std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type> >,
-        OutputTuple
-                    > {
-    private:
-        typedef typename std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type> > port_tuple_type;
-    public:
-        typedef OutputTuple output_type;
-    private:
-        typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
-    public:
-        unfolded_join_node(graph &g) : base_type(g) {}
-    };
-
-    template<typename OutputTuple>
-    class unfolded_join_node<5,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
-        std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<4,OutputTuple>::type> >,
-        OutputTuple
-                > {
-    private:
-        typedef typename std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<4,OutputTuple>::type> > port_tuple_type;
-    public:
-        typedef OutputTuple output_type;
-    private:
-        typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
-    public:
-        unfolded_join_node(graph &g) : base_type(g) {}
-    };
-
-    template<typename OutputTuple>
-    class unfolded_join_node<6,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
-        std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<5,OutputTuple>::type> >,
-        OutputTuple
-                    > {
-    private:
-        typedef typename std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<4,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<5,OutputTuple>::type> > port_tuple_type;
-    public:
-        typedef OutputTuple output_type;
-    private:
-        typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
-    public:
-        unfolded_join_node(graph &g) : base_type(g) {}
-    };
-
-    template<typename OutputTuple>
-    class unfolded_join_node<7,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
-        std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<6,OutputTuple>::type> >,
-        OutputTuple
-                > {
-    private:
-        typedef typename std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<4,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<5,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<6,OutputTuple>::type> > port_tuple_type;
-    public:
-        typedef OutputTuple output_type;
-    private:
-        typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
-    public:
-        unfolded_join_node(graph &g) : base_type(g) {}
-    };
-
-    template<typename OutputTuple>
-    class unfolded_join_node<8,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
-        std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<7,OutputTuple>::type> >,
-        OutputTuple
-                > {
-    private:
-        typedef typename std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<4,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<5,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<6,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<7,OutputTuple>::type> > port_tuple_type;
-    public:
-        typedef OutputTuple output_type;
-    private:
-        typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
-    public:
-        unfolded_join_node(graph &g) : base_type(g) {}
-    };
-
-    template<typename OutputTuple>
-    class unfolded_join_node<9,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
-        std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<7,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<8,OutputTuple>::type> >,
-        OutputTuple
-                > {
-    private:
-        typedef typename std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<4,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<5,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<6,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<7,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<8,OutputTuple>::type> > port_tuple_type;
-    public:
-        typedef OutputTuple output_type;
-    private:
-        typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
-    public:
-        unfolded_join_node(graph &g) : base_type(g) {}
-    };
-
-    template<typename OutputTuple>
-    class unfolded_join_node<10,OutputTuple,two_phase> : public internal::join_node_base<two_phase,
-        std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<4,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<5,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<6,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<7,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<8,OutputTuple>::type>,
-                two_phase_port<typename std::tuple_element<9,OutputTuple>::type> >,
-        OutputTuple
-                > {
-    private:
-        typedef typename std::tuple<
-                two_phase_port<typename std::tuple_element<0,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<1,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<2,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<3,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<4,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<5,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<6,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<7,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<8,OutputTuple>::type>, 
-                two_phase_port<typename std::tuple_element<9,OutputTuple>::type> > port_tuple_type;
-    public:
-        typedef OutputTuple output_type;
-    private:
-        typedef join_node_base<two_phase, port_tuple_type, output_type > base_type;
-    public:
-        unfolded_join_node(graph &g) : base_type(g) {}
-    };
-
-    } // namespace internal
-
-using namespace internal::join_policy_namespace;
-
-template<typename OutputTuple, join_policy JP=two_phase>
-class join_node: public internal::unfolded_join_node<std::tuple_size<OutputTuple>::value, OutputTuple, JP> {
-private:
-    static const int N = std::tuple_size<OutputTuple>::value;
-    typedef typename internal::unfolded_join_node<N, OutputTuple, JP> unfolded_type;
-public:
-    typedef OutputTuple output_type;
-    join_node(graph &g) : unfolded_type(g) { }
-};
-
-    //
-    // Making edges
-    //
-  
-    //! Makes an edge between a single predecessor and a single successor
-    template< typename T >
-    inline void make_edge( sender<T> &p, receiver<T> &s ) {
-        p.register_successor( s );
-    }
-
-    //! Makes edges between a single predecessor and multiple successors
-    template< typename T, typename SIterator >
-    inline void make_edges( sender<T> &p, SIterator s_begin, SIterator s_end ) {
-        for ( SIterator i = s_begin; i != s_end; ++i ) {
-            make_edge( p, **i );
-        }
-    }
-
-    //! Makes edges between a set of predecessors and a single successor
-    template< typename T, typename PIterator >
-    inline void make_edges( PIterator p_begin, PIterator p_end, receiver<T> &s ) {
-        for ( PIterator i = p_begin; i != p_end; ++i ) {
-            make_edge( **i, s );
-        }
-    }
-
-}
-
-#endif
-
diff --git a/include/tbb/index.html b/include/tbb/index.html
index 33f69d1..5eaf53e 100644
--- a/include/tbb/index.html
+++ b/include/tbb/index.html
@@ -18,10 +18,9 @@ Include files for Threading Building Blocks classes and functions.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/include/tbb/_aggregator_internal.h b/include/tbb/internal/_aggregator_impl.h
similarity index 88%
rename from include/tbb/_aggregator_internal.h
rename to include/tbb/internal/_aggregator_impl.h
index 9d71182..33384c1 100644
--- a/include/tbb/_aggregator_internal.h
+++ b/include/tbb/internal/_aggregator_impl.h
@@ -26,11 +26,11 @@
     the GNU General Public License.
 */
 
-#ifndef __TBB_aggregator_internal_H
-#define __TBB_aggregator_internal_H
+#ifndef __TBB__aggregator_impl_H
+#define __TBB__aggregator_impl_H
 
-#include "atomic.h"
-#include "tbb_profiling.h"
+#include "../atomic.h"
+#include "../tbb_profiling.h"
 
 namespace tbb {
 namespace interface6 {
@@ -57,7 +57,9 @@ class aggregated_operation {
 class aggregator {
  public:
     aggregator() : handler_busy(false) { pending_operations = NULL; }
-    ~aggregator() {}
+    explicit aggregator(handler_type h) : handler_busy(false), handle_operations(h) {
+        pending_operations = NULL; 
+    }
 
     void initialize_handler(handler_type h) { handle_operations = h; }
 
@@ -135,14 +137,26 @@ class aggregator {
     }
 };
 
+// the most-compatible friend declaration (vs, gcc, icc) is
+//    template<class U, class V> friend class aggregating_functor;
+template<typename aggregating_class, typename operation_list>
+class aggregating_functor {
+    aggregating_class *fi;
+public:
+    aggregating_functor() {}
+    aggregating_functor(aggregating_class *fi_) : fi(fi_) {}
+    void operator()(operation_list* op_list) { fi->handle_operations(op_list); }
+};
+
 } // namespace internal
 } // namespace interface6
 
 namespace internal {
     using interface6::internal::aggregated_operation;
     using interface6::internal::aggregator;
+    using interface6::internal::aggregating_functor;
 } // namespace internal
 
 } // namespace tbb
 
-#endif
+#endif  // __TBB__aggregator_impl_H
diff --git a/include/tbb/_concurrent_queue_internal.h b/include/tbb/internal/_concurrent_queue_impl.h
similarity index 98%
rename from include/tbb/_concurrent_queue_internal.h
rename to include/tbb/internal/_concurrent_queue_impl.h
index 72754e1..4d6adbb 100644
--- a/include/tbb/_concurrent_queue_internal.h
+++ b/include/tbb/internal/_concurrent_queue_impl.h
@@ -26,16 +26,20 @@
     the GNU General Public License.
 */
 
-#ifndef __TBB_concurrent_queue_internal_H
-#define __TBB_concurrent_queue_internal_H
-
-#include "tbb_stddef.h"
-#include "tbb_machine.h"
-#include "atomic.h"
-#include "spin_mutex.h"
-#include "cache_aligned_allocator.h"
-#include "tbb_exception.h"
-#include "tbb_profiling.h"
+#ifndef __TBB__concurrent_queue_impl_H
+#define __TBB__concurrent_queue_impl_H
+
+#ifndef __TBB_concurrent_queue_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+#include "../tbb_stddef.h"
+#include "../tbb_machine.h"
+#include "../atomic.h"
+#include "../spin_mutex.h"
+#include "../cache_aligned_allocator.h"
+#include "../tbb_exception.h"
+#include "../tbb_profiling.h"
 #include <new>
 
 #if !TBB_USE_EXCEPTIONS && _MSC_VER
@@ -653,7 +657,7 @@ protected:
     //! Default constructor
     concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {
 #if __TBB_GCC_OPTIMIZER_ORDERING_BROKEN
-        __asm__ __volatile__("": : :"memory");
+        __TBB_compiler_fence();
 #endif
     }
 
@@ -1016,4 +1020,4 @@ bool operator!=( const concurrent_queue_iterator<C,T>& i, const concurrent_queue
 
 } // namespace tbb
 
-#endif /* __TBB_concurrent_queue_internal_H */
+#endif /* __TBB__concurrent_queue_impl_H */
diff --git a/include/tbb/_concurrent_unordered_internal.h b/include/tbb/internal/_concurrent_unordered_impl.h
similarity index 98%
rename from include/tbb/_concurrent_unordered_internal.h
rename to include/tbb/internal/_concurrent_unordered_impl.h
index a3a1add..9422728 100644
--- a/include/tbb/_concurrent_unordered_internal.h
+++ b/include/tbb/internal/_concurrent_unordered_impl.h
@@ -29,10 +29,13 @@
 /* Container implementations in this header are based on PPL implementations 
    provided by Microsoft. */
 
-#ifndef __TBB_concurrent_unordered_internal_H
-#define __TBB_concurrent_unordered_internal_H
+#ifndef __TBB__concurrent_unordered_impl_H
+#define __TBB__concurrent_unordered_impl_H
+#if !defined(__TBB_concurrent_unordered_map_H) && !defined(__TBB_concurrent_unordered_set_H) && !defined(__TBB_concurrent_hash_map_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
 
-#include "tbb_stddef.h"
+#include "../tbb_stddef.h"
 
 #if !TBB_USE_EXCEPTIONS && _MSC_VER
     // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
@@ -50,9 +53,9 @@
     #pragma warning (pop)
 #endif
 
-#include "atomic.h"
-#include "tbb_exception.h"
-#include "tbb_allocator.h"
+#include "../atomic.h"
+#include "../tbb_exception.h"
+#include "../tbb_allocator.h"
 
 namespace tbb {
 namespace interface5 {
@@ -1407,5 +1410,20 @@ inline size_t tbb_hasher( const std::pair<F,S>& p ) {
 }
 } // namespace interface5
 using interface5::tbb_hasher;
+
+
+// Template class for hash compare
+template<typename Key>
+class tbb_hash
+{
+public:
+    tbb_hash() {}
+
+    size_t operator()(const Key& key) const
+    {
+        return tbb_hasher(key);
+    }
+};
+
 } // namespace tbb
-#endif// __TBB_concurrent_unordered_internal_H
+#endif// __TBB__concurrent_unordered_impl_H
diff --git a/include/tbb/internal/_flow_graph_impl.h b/include/tbb/internal/_flow_graph_impl.h
new file mode 100644
index 0000000..6e7ea56
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_impl.h
@@ -0,0 +1,582 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB__flow_graph_impl_H
+#define __TBB__flow_graph_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+namespace internal {
+
+    namespace graph_policy_namespace {
+        enum graph_buffer_policy { rejecting, reserving, queueing, tag_matching };
+    }
+
+    //! A functor that takes no input and generates a value of type Output
+    template< typename Output >
+    class source_body : tbb::internal::no_assign {
+    public:
+        virtual ~source_body() {}
+        virtual bool operator()(Output &output) = 0;
+        virtual source_body* clone() = 0;
+    };
+    
+    //! The leaf for source_body
+    template< typename Output, typename Body>
+    class source_body_leaf : public source_body<Output> {
+    public:
+        source_body_leaf( const Body &_body ) : body(_body), init_body(_body) { }
+        /*override*/ bool operator()(Output &output) { return body( output ); }
+        /*override*/ source_body_leaf* clone() { 
+            return new source_body_leaf< Output, Body >(init_body); 
+        }
+    private:
+        Body body;
+        Body init_body;
+    };
+    
+    //! A functor that takes an Input and generates an Output
+    template< typename Input, typename Output >
+    class function_body : tbb::internal::no_assign {
+    public:
+        virtual ~function_body() {}
+        virtual Output operator()(const Input &input) = 0;
+        virtual function_body* clone() = 0;
+    };
+    
+    //! the leaf for function_body
+    template <typename Input, typename Output, typename B>
+    class function_body_leaf : public function_body< Input, Output > {
+    public:
+        function_body_leaf( const B &_body ) : body(_body), init_body(_body) { }
+        Output operator()(const Input &i) { return body(i); }
+        B get_body() { return body; }
+        /*override*/ function_body_leaf* clone() {
+            return new function_body_leaf< Input, Output, B >(init_body);
+        }
+    private:
+        B body;
+        B init_body;
+    };
+    
+    //! the leaf for function_body specialized for Input and output of continue_msg
+    template <typename B>
+    class function_body_leaf< continue_msg, continue_msg, B> : public function_body< continue_msg, continue_msg > {
+    public:
+        function_body_leaf( const B &_body ) : body(_body), init_body(_body) { }
+        continue_msg operator()( const continue_msg &i ) { 
+            body(i); 
+            return i; 
+        }
+        B get_body() { return body; }
+        /*override*/ function_body_leaf* clone() {
+           return new function_body_leaf< continue_msg, continue_msg, B >(init_body);
+        }    
+    private:
+        B body;
+        B init_body;
+    };
+    
+    //! the leaf for function_body specialized for Output of continue_msg
+    template <typename Input, typename B>
+    class function_body_leaf< Input, continue_msg, B> : public function_body< Input, continue_msg > {
+    public:
+        function_body_leaf( const B &_body ) : body(_body), init_body(_body) { }
+        continue_msg operator()(const Input &i) { 
+            body(i); 
+            return continue_msg();
+        }
+        B get_body() { return body; }
+        /*override*/ function_body_leaf* clone() {
+            return new function_body_leaf< Input, continue_msg, B >(init_body);
+        }    
+    private:
+        B body;
+        B init_body;
+    };
+    
+    //! the leaf for function_body specialized for Input of continue_msg
+    template <typename Output, typename B>
+    class function_body_leaf< continue_msg, Output, B > : public function_body< continue_msg, Output > {
+    public:
+        function_body_leaf( const B &_body ) : body(_body), init_body(_body) { }
+        Output operator()(const continue_msg &i) { 
+            return body(i); 
+        }
+        B get_body() { return body; }
+        /*override*/ function_body_leaf* clone() {
+            return new function_body_leaf< continue_msg, Output, B >(init_body);
+        }    
+    private:
+        B body;
+        B init_body;
+    };
+
+# if TBB_PREVIEW_GRAPH_NODES
+    //! function_body that takes an Input and a set of output ports
+    template<typename Input, typename OutputSet>
+    class multioutput_function_body {
+    public:
+        virtual ~multioutput_function_body () {}
+        virtual void operator()(const Input &/* input*/, OutputSet &/*oset*/) = 0;
+        virtual multioutput_function_body* clone() = 0;
+    };
+
+    //! leaf for multi-output function.  OutputSet can be a std::tuple or a vector.
+    template<typename Input, typename OutputSet, typename B>
+    class multioutput_function_body_leaf : public multioutput_function_body<Input, OutputSet> {
+    public:
+        multioutput_function_body_leaf(const B &_body) : body(_body), init_body(_body) { }
+        void operator()(const Input &input, OutputSet &oset) {
+            body(input, oset); // body should explicitly put() to one or more of oset.
+        }
+        B get_body() { return body; }
+        /*override*/ multioutput_function_body_leaf* clone() {
+            return new multioutput_function_body_leaf<Input, OutputSet,B>(init_body);
+        }
+    private:
+        B body;
+        B init_body;
+    };
+#endif  // TBB_PREVIEW_GRAPH_NODES
+    
+    //! A task that calls a node's forward function
+    template< typename NodeType >
+    class forward_task : public task {
+    
+        NodeType &my_node;
+    
+    public:
+    
+        forward_task( NodeType &n ) : my_node(n) {}
+    
+        task *execute() {
+            my_node.forward();
+            return NULL;
+        }
+    };
+    
+    //! A task that calls a node's apply_body function, passing in an input of type Input
+    template< typename NodeType, typename Input >
+    class apply_body_task : public task {
+    
+        NodeType &my_node;
+        Input my_input;
+        
+    public:
+        
+        apply_body_task( NodeType &n, const Input &i ) : my_node(n), my_input(i) {}
+        
+        task *execute() {
+            my_node.apply_body( my_input );
+            return NULL;
+        }
+    };
+    
+    //! A task that calls a node's apply_body function with no input
+    template< typename NodeType >
+    class source_task : public task {
+    
+        NodeType &my_node;
+    
+    public:
+    
+        source_task( NodeType &n ) : my_node(n) {}
+    
+        task *execute() {
+            my_node.apply_body( );
+            return NULL;
+        }
+    };
+    
+    //! An empty functor that takes an Input and returns a default constructed Output
+    template< typename Input, typename Output >
+    struct empty_body {
+       Output operator()( const Input & ) const { return Output(); } 
+    };
+    
+    //! A node_cache maintains a std::queue of elements of type T.  Each operation is protected by a lock. 
+    template< typename T, typename M=spin_mutex >
+    class node_cache {
+        public:
+    
+        typedef size_t size_type;
+        
+        bool empty() {
+            typename my_mutex_type::scoped_lock lock( my_mutex );
+            return internal_empty();
+        }
+    
+        void add( T &n ) {
+            typename my_mutex_type::scoped_lock lock( my_mutex );
+            internal_push(n);
+        }
+    
+        void remove( T &n ) {
+            typename my_mutex_type::scoped_lock lock( my_mutex );
+            for ( size_t i = internal_size(); i != 0; --i ) {
+                T &s = internal_pop();
+                if ( &s != &n ) {
+                    internal_push(s);
+                }
+            }
+        }
+        
+    protected:
+    
+        typedef M my_mutex_type;
+        my_mutex_type my_mutex;
+        std::queue< T * > my_q;
+    
+        // Assumes lock is held
+        inline bool internal_empty( )  {
+            return my_q.empty();
+        }
+    
+        // Assumes lock is held
+        inline size_type internal_size( )  {
+            return my_q.size(); 
+        }
+    
+        // Assumes lock is held
+        inline void internal_push( T &n )  {
+            my_q.push(&n);
+        }
+    
+        // Assumes lock is held
+        inline T &internal_pop() {
+            T *v = my_q.front();
+            my_q.pop();
+            return *v;
+        }
+    
+    };
+    
+    //! A cache of predecessors that only supports try_get
+    template< typename T, typename M=spin_mutex >
+    class predecessor_cache : public node_cache< sender<T>, M > {
+        public:
+        typedef M my_mutex_type;
+        typedef T output_type; 
+        typedef sender<output_type> predecessor_type;
+        typedef receiver<output_type> successor_type;
+    
+        predecessor_cache( ) : my_owner( NULL ) { }
+        
+        void set_owner( successor_type *owner ) { my_owner = owner; }
+        
+        bool get_item( output_type &v ) {
+        
+            bool msg = false;
+        
+            do {
+                predecessor_type *src;
+                {
+                    typename my_mutex_type::scoped_lock lock(this->my_mutex);
+                    if ( this->internal_empty() ) {
+                        break;
+                    }
+                    src = &this->internal_pop();
+                }
+        
+                // Try to get from this sender
+                msg = src->try_get( v );
+        
+                if (msg == false) {
+                    // Relinquish ownership of the edge
+                    if ( my_owner) 
+                        src->register_successor( *my_owner );
+                } else {
+                    // Retain ownership of the edge
+                    this->add(*src);
+                }
+            } while ( msg == false );
+            return msg;
+        }
+    
+    protected:
+        successor_type *my_owner;
+    };
+    
+    //! An cache of predecessors that supports requests and reservations
+    template< typename T, typename M=spin_mutex >
+    class reservable_predecessor_cache : public predecessor_cache< T, M > {
+    public:
+        typedef M my_mutex_type;
+        typedef T output_type; 
+        typedef sender<T> predecessor_type;
+        typedef receiver<T> successor_type;
+        
+        reservable_predecessor_cache( ) : reserved_src(NULL) { }
+        
+        bool 
+        try_reserve( output_type &v ) {
+            bool msg = false;
+        
+            do {
+                {
+                    typename my_mutex_type::scoped_lock lock(this->my_mutex);
+                    if ( reserved_src || this->internal_empty() ) 
+                        return false;
+        
+                    reserved_src = &this->internal_pop();
+                }
+        
+                // Try to get from this sender
+                msg = reserved_src->try_reserve( v );
+        
+                if (msg == false) {
+                    typename my_mutex_type::scoped_lock lock(this->my_mutex);
+                    // Relinquish ownership of the edge
+                    reserved_src->register_successor( *this->my_owner );
+                    reserved_src = NULL;
+                } else {
+                    // Retain ownership of the edge
+                    this->add( *reserved_src );
+                }
+            } while ( msg == false );
+        
+            return msg;
+        }
+        
+        bool 
+        try_release( ) {
+            reserved_src->try_release( );
+            reserved_src = NULL;
+            return true;
+        }
+        
+        bool 
+        try_consume( ) {
+            reserved_src->try_consume( );
+            reserved_src = NULL;
+            return true;
+        }
+    
+    private:
+        predecessor_type *reserved_src;
+    };
+    
+    
+    //! An abstract cache of succesors
+    template<typename T, typename M=spin_rw_mutex >
+    class successor_cache : tbb::internal::no_copy {
+    protected:
+        
+        typedef M my_mutex_type;
+        my_mutex_type my_mutex;
+        
+        typedef std::list< receiver<T> * > my_successors_type;
+        my_successors_type my_successors;
+        
+        sender<T> *my_owner;
+        
+    public:
+        
+        successor_cache( ) : my_owner(NULL) {}
+        
+        void set_owner( sender<T> *owner ) { my_owner = owner; }
+        
+        virtual ~successor_cache() {}
+        
+        void register_successor( receiver<T> &r ) {
+            typename my_mutex_type::scoped_lock l(my_mutex, true);
+            my_successors.push_back( &r ); 
+        }
+    
+        void remove_successor( receiver<T> &r ) {
+            typename my_mutex_type::scoped_lock l(my_mutex, true);
+            for ( typename my_successors_type::iterator i = my_successors.begin();
+                  i != my_successors.end(); ++i ) { 
+                if ( *i == & r ) { 
+                    my_successors.erase(i);
+                    break;
+                }
+            }
+        }
+        
+        bool empty() { 
+            typename my_mutex_type::scoped_lock l(my_mutex, false);
+            return my_successors.empty(); 
+        }
+        
+        virtual bool try_put( const T &t ) = 0; 
+     };
+    
+    //! An abstract cache of succesors, specialized to continue_msg
+    template<>
+    class successor_cache< continue_msg > : tbb::internal::no_copy {
+    protected:
+        
+        typedef spin_rw_mutex my_mutex_type;
+        my_mutex_type my_mutex;
+        
+        typedef std::list< receiver<continue_msg> * > my_successors_type;
+        my_successors_type my_successors;
+        
+        sender<continue_msg> *my_owner;
+        
+    public:
+        
+        successor_cache( ) : my_owner(NULL) {}
+        
+        void set_owner( sender<continue_msg> *owner ) { my_owner = owner; }
+        
+        virtual ~successor_cache() {}
+        
+        void register_successor( receiver<continue_msg> &r ) {
+            my_mutex_type::scoped_lock l(my_mutex, true);
+            my_successors.push_back( &r ); 
+            if ( my_owner ) {
+                continue_receiver *cr = dynamic_cast< continue_receiver * >(&r);
+                if ( cr ) 
+                    cr->register_predecessor( *my_owner );
+            }
+        }
+        
+        void remove_successor( receiver<continue_msg> &r ) {
+            my_mutex_type::scoped_lock l(my_mutex, true);
+            for ( my_successors_type::iterator i = my_successors.begin();
+                  i != my_successors.end(); ++i ) { 
+                if ( *i == & r ) { 
+                    if ( my_owner )
+                        r.remove_predecessor( *my_owner );
+                    my_successors.erase(i);
+                    break;
+                }
+            }
+        }
+    
+        bool empty() { 
+            my_mutex_type::scoped_lock l(my_mutex, false);
+            return my_successors.empty(); 
+        }
+    
+        virtual bool try_put( const continue_msg &t ) = 0; 
+        
+     };
+    
+    //! A cache of successors that are broadcast to
+    template<typename T, typename M=spin_rw_mutex>
+    class broadcast_cache : public successor_cache<T, M> {
+        typedef M my_mutex_type;
+        typedef std::list< receiver<T> * > my_successors_type;
+        
+    public:
+        
+        broadcast_cache( ) {}
+        
+        bool try_put( const T &t ) {
+            bool msg = false;
+            bool upgraded = false;
+            typename my_mutex_type::scoped_lock l(this->my_mutex, false);
+            typename my_successors_type::iterator i = this->my_successors.begin();
+            while ( i != this->my_successors.end() ) {
+               if ( (*i)->try_put( t ) == true ) {
+                   ++i;
+                   msg = true;
+               } else {
+                  if ( (*i)->register_predecessor(*this->my_owner) ) {
+                      if (!upgraded) {
+                          l.upgrade_to_writer();
+                          upgraded = true;
+                      }
+                      i = this->my_successors.erase(i);
+                  }
+                  else {
+                      ++i;
+                  }
+               }
+            }
+            return msg;
+        }
+    };
+
+    //! A cache of successors that are put in a round-robin fashion
+    template<typename T, typename M=spin_rw_mutex >
+    class round_robin_cache : public successor_cache<T, M> {
+        typedef size_t size_type;
+        typedef M my_mutex_type;
+        typedef std::list< receiver<T> * > my_successors_type;
+    
+    public:
+        
+        round_robin_cache( ) {}
+        
+        size_type size() {
+            typename my_mutex_type::scoped_lock l(this->my_mutex, false);
+            return this->my_successors.size();
+        }
+        
+        bool try_put( const T &t ) {
+            bool upgraded = false;
+            typename my_mutex_type::scoped_lock l(this->my_mutex, false);
+            typename my_successors_type::iterator i = this->my_successors.begin();
+            while ( i != this->my_successors.end() ) {
+               if ( (*i)->try_put( t ) ) {
+                   return true;
+               } else {
+                  if ( (*i)->register_predecessor(*this->my_owner) ) {
+                      if (!upgraded) {
+                          l.upgrade_to_writer();
+                          upgraded = true;
+                      }
+                      i = this->my_successors.erase(i);
+                  }
+                  else {
+                      ++i;
+                  }
+               }
+            }
+            return false;
+        }
+    };
+    
+    template<typename T>
+    class decrementer : public continue_receiver, tbb::internal::no_copy {
+        
+        T *my_node;
+        
+        void execute() {
+            my_node->decrement_counter();
+        }
+        
+    public:
+       
+        typedef continue_msg input_type;
+        typedef continue_msg output_type;
+        decrementer( int number_of_predecessors = 0 ) : continue_receiver( number_of_predecessors ) { }
+        void set_owner( T *node ) { my_node = node; }
+    };
+    
+}
+
+#endif // __TBB__flow_graph_impl_H
+
diff --git a/include/tbb/internal/_flow_graph_item_buffer_impl.h b/include/tbb/internal/_flow_graph_item_buffer_impl.h
new file mode 100644
index 0000000..85c0069
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_item_buffer_impl.h
@@ -0,0 +1,190 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB__flow_graph_item_buffer_impl_H
+#define __TBB__flow_graph_item_buffer_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+    //! Expandable buffer of items.  The possible operations are push, pop,
+    //* tests for empty and so forth.  No mutual exclusion is built in.
+    template <typename T, typename A=cache_aligned_allocator<T> >
+    class item_buffer {
+    public:
+        typedef T input_type;
+        typedef T output_type;
+    protected:
+        typedef size_t size_type;
+        typedef std::pair< T, bool > item_type;
+        typedef typename A::template rebind<item_type>::other allocator_type;
+
+        item_type *my_array;
+        size_type my_array_size;
+        static const size_type initial_buffer_size = 4;
+        size_type my_head;
+        size_type my_tail;
+
+        bool buffer_empty() { return my_head == my_tail; }
+
+        item_type &item(size_type i) { return my_array[i & (my_array_size - 1) ]; } // may not be marked valid
+
+        bool item_valid(size_type i) { return item(i).second; }
+
+        void fetch_front(T &v) { __TBB_ASSERT(item_valid(my_head), "front not valid"); v = item(my_head).first; }
+        void fetch_back(T &v) { __TBB_ASSERT(item_valid(my_tail-1), "back not valid"); v = item(my_tail-1).first; }
+
+        void invalidate(size_type i) { __TBB_ASSERT(item_valid(i), "Item not valid"); item(i).second = false; }
+        void validate(size_type i) { __TBB_ASSERT(!item_valid(i), "Item already valid"); item(i).second = true; }
+
+        void invalidate_front() { invalidate(my_head); }
+        void validate_front() { validate(my_head); }
+        void invalidate_back() { invalidate(my_tail-1); }
+
+        size_type size() { return my_tail - my_head; }
+        size_type capacity() { return my_array_size; }
+        bool buffer_full() { return size() == capacity(); }
+
+        //! Grows the internal array.
+        void grow_my_array( size_t minimum_size ) {
+            size_type old_size = my_array_size;
+            size_type new_size = old_size ? 2*old_size : initial_buffer_size;
+            while( new_size<minimum_size )
+                new_size*=2;
+
+            item_type* new_array = allocator_type().allocate(new_size);
+            item_type* old_array = my_array;
+
+            for( size_type i=0; i<new_size; ++i ) {
+                new (&(new_array[i].first)) input_type;
+                new_array[i].second = false;
+            }
+
+            size_t t=my_head;
+            for( size_type i=0; i<old_size; ++i, ++t )
+                new_array[t&(new_size-1)] = old_array[t&(old_size-1)];
+            my_array = new_array;
+            my_array_size = new_size;
+            if( old_array ) {
+                for( size_type i=0; i<old_size; ++i, ++t )
+                    old_array[i].first.~input_type();
+                allocator_type().deallocate(old_array,old_size);
+            }
+        }
+
+        bool push_back(T &v) {
+            if(buffer_full()) {
+                grow_my_array(size() + 1);
+            }
+            item(my_tail) = std::make_pair( v, true );
+            ++my_tail;
+            return true;
+        }
+
+        bool pop_back(T &v) {
+            if (!item_valid(my_tail-1)) {
+                return false;
+            }
+            fetch_back(v);
+            invalidate_back();
+            --my_tail;
+            return true;
+        }
+
+        bool pop_front(T &v) {
+            if(!item_valid(my_head)) {
+                return false;
+            }
+            fetch_front(v);
+            invalidate_front();
+            ++my_head;
+            return true;
+        }
+
+    public:
+        //! Constructor
+        item_buffer( ) : my_array(NULL), my_array_size(0),
+            my_head(0), my_tail(0) {
+            grow_my_array(initial_buffer_size);
+        }
+
+        ~item_buffer() {
+            if (my_array) {
+                for( size_type i=0; i<my_array_size; ++i ) {
+                    my_array[i].first.~input_type();
+                }
+                allocator_type().deallocate(my_array,my_array_size); 
+            }
+        }
+
+    };
+
+    //! item_buffer with reservable front-end.  NOTE: if reserving, do not
+    //* complete operation with pop_front(); use consume_front().  
+    //* No synchronization built-in.
+    template<typename T, typename A=cache_aligned_allocator<T> >
+    class reservable_item_buffer : public item_buffer<T, A> {
+    protected:
+        using item_buffer<T, A>::buffer_empty;
+        using item_buffer<T, A>::fetch_front;
+        using item_buffer<T, A>::invalidate_front;
+        using item_buffer<T, A>::validate_front;
+        using item_buffer<T, A>::item_valid;
+        using item_buffer<T, A>::my_head;
+
+    public:
+        reservable_item_buffer() : item_buffer<T, A>(), my_reserved(false) {}
+    protected:
+
+        bool reserve_front(T &v) {
+            if(my_reserved || !item_valid(my_head)) return false;
+            my_reserved = true;
+            // reserving the head
+            fetch_front(v);
+            // invalidate the head, but don't commit until consume is called
+            invalidate_front();
+            return true;
+        }
+
+        void consume_front() {
+            __TBB_ASSERT(my_reserved, "Attempt to consume a non-reserved item");
+            ++my_head;
+            my_reserved = false;
+        }
+
+        void release_front() {
+            __TBB_ASSERT(my_reserved, "Attempt to release a non-reserved item");
+            validate_front();
+            my_reserved = false;
+        }
+
+        bool my_reserved;
+    };
+
+#endif // __TBB__flow_graph_item_buffer_impl_H
diff --git a/include/tbb/internal/_flow_graph_join_impl.h b/include/tbb/internal/_flow_graph_join_impl.h
new file mode 100644
index 0000000..f24cfa4
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_join_impl.h
@@ -0,0 +1,1702 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB__flow_graph_join_impl_H
+#define __TBB__flow_graph_join_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+namespace internal {
+
+    typedef size_t tag_value;
+    static const tag_value NO_TAG = tag_value(-1);
+
+    struct forwarding_base {
+        forwarding_base(task *rt) : my_root_task(rt), current_tag(NO_TAG) {}
+        virtual ~forwarding_base() {}
+        virtual void decrement_port_count() = 0;
+        virtual void increment_port_count() = 0;
+        virtual void increment_tag_count(tag_value /*t*/) {}
+        // moved here so input ports can queue tasks
+        task* my_root_task;
+        tag_value current_tag; // so ports can refer to FE's desired items
+    };
+
+    template< int N >
+    struct join_helper {
+
+        template< typename TupleType, typename PortType >
+        static inline void set_join_node_pointer(TupleType &my_input, PortType *port) {
+            std::get<N-1>( my_input ).set_join_node_pointer(port);
+            join_helper<N-1>::set_join_node_pointer( my_input, port );
+        }
+        template< typename TupleType >
+        static inline void consume_reservations( TupleType &my_input ) {
+            std::get<N-1>( my_input ).consume();
+            join_helper<N-1>::consume_reservations( my_input );
+        }
+
+        template< typename TupleType >
+        static inline void release_my_reservation( TupleType &my_input ) {
+            std::get<N-1>( my_input ).release();
+        }
+
+        template <typename TupleType>
+        static inline void release_reservations( TupleType &my_input) {
+            join_helper<N-1>::release_reservations(my_input);
+            release_my_reservation(my_input);
+        }
+
+        template< typename InputTuple, typename OutputTuple >
+        static inline bool reserve( InputTuple &my_input, OutputTuple &out) {
+            if ( !std::get<N-1>( my_input ).reserve( std::get<N-1>( out ) ) ) return false;
+            if ( !join_helper<N-1>::reserve( my_input, out ) ) {
+                release_my_reservation( my_input );
+                return false;
+            }
+            return true;
+        }
+
+        template<typename InputTuple, typename OutputTuple>
+        static inline bool get_my_item( InputTuple &my_input, OutputTuple &out) {
+            bool res = std::get<N-1>(my_input).get_item(std::get<N-1>(out) ); // may fail
+            return join_helper<N-1>::get_my_item(my_input, out) && res;       // do get on other inputs before returning
+        }
+
+        template<typename InputTuple, typename OutputTuple>
+        static inline bool get_items(InputTuple &my_input, OutputTuple &out) {
+            return get_my_item(my_input, out);
+        }
+
+        template<typename InputTuple>
+        static inline void reset_my_port(InputTuple &my_input) {
+            join_helper<N-1>::reset_my_port(my_input);
+            std::get<N-1>(my_input).reset_port();
+        }
+
+        template<typename InputTuple>
+        static inline void reset_ports(InputTuple& my_input) {
+            reset_my_port(my_input);
+        }
+
+        template<typename InputTuple, typename TagFuncTuple>
+        static inline void set_tag_func(InputTuple &my_input, TagFuncTuple &my_tag_funcs) {
+            std::get<N-1>(my_input).set_my_original_tag_func(std::get<N-1>(my_tag_funcs));
+            std::get<N-1>(my_input).set_my_tag_func(std::get<N-1>(my_input).my_original_func()->clone());
+            std::get<N-1>(my_tag_funcs) = NULL;
+            join_helper<N-1>::set_tag_func(my_input, my_tag_funcs);
+        }
+
+        template< typename TagFuncTuple1, typename TagFuncTuple2>
+        static inline void copy_tag_functors(TagFuncTuple1 &my_inputs, TagFuncTuple2 &other_inputs) {
+            if(std::get<N-1>(other_inputs).my_original_func()) {
+                std::get<N-1>(my_inputs).set_my_tag_func(std::get<N-1>(other_inputs).my_original_func()->clone());
+                std::get<N-1>(my_inputs).set_my_original_tag_func(std::get<N-1>(other_inputs).my_original_func()->clone());
+            }
+            join_helper<N-1>::copy_tag_functors(my_inputs, other_inputs);
+        }
+    };
+
+    template< >
+    struct join_helper<1> {
+
+        template< typename TupleType, typename PortType >
+        static inline void set_join_node_pointer(TupleType &my_input, PortType *port) {
+            std::get<0>( my_input ).set_join_node_pointer(port);
+        }
+
+        template< typename TupleType >
+        static inline void consume_reservations( TupleType &my_input ) {
+            std::get<0>( my_input ).consume();
+        }
+
+        template< typename TupleType >
+        static inline void release_my_reservation( TupleType &my_input ) {
+            std::get<0>( my_input ).release();
+        }
+
+        template<typename TupleType>
+        static inline void release_reservations( TupleType &my_input) {
+            release_my_reservation(my_input);
+        }
+
+        template< typename InputTuple, typename OutputTuple >
+        static inline bool reserve( InputTuple &my_input, OutputTuple &out) {
+            return std::get<0>( my_input ).reserve( std::get<0>( out ) );
+        }
+
+        template<typename InputTuple, typename OutputTuple>
+        static inline bool get_my_item( InputTuple &my_input, OutputTuple &out) {
+            return std::get<0>(my_input).get_item(std::get<0>(out));
+        }
+
+        template<typename InputTuple, typename OutputTuple>
+        static inline bool get_items(InputTuple &my_input, OutputTuple &out) {
+            return get_my_item(my_input, out);
+        }
+
+        template<typename InputTuple>
+        static inline void reset_my_port(InputTuple &my_input) {
+            std::get<0>(my_input).reset_port();
+        }
+
+        template<typename InputTuple>
+        static inline void reset_ports(InputTuple& my_input) {
+            reset_my_port(my_input);
+        }
+
+        template<typename InputTuple, typename TagFuncTuple>
+        static inline void set_tag_func(InputTuple &my_input, TagFuncTuple &my_tag_funcs) {
+            std::get<0>(my_input).set_my_original_tag_func(std::get<0>(my_tag_funcs));
+            std::get<0>(my_input).set_my_tag_func(std::get<0>(my_input).my_original_func()->clone());
+            std::get<0>(my_tag_funcs) = NULL;
+        }
+
+        template< typename TagFuncTuple1, typename TagFuncTuple2>
+        static inline void copy_tag_functors(TagFuncTuple1 &my_inputs, TagFuncTuple2 &other_inputs) {
+            if(std::get<0>(other_inputs).my_original_func()) {
+                std::get<0>(my_inputs).set_my_tag_func(std::get<0>(other_inputs).my_original_func()->clone());
+                std::get<0>(my_inputs).set_my_original_tag_func(std::get<0>(other_inputs).my_original_func()->clone());
+            }
+        }
+    };
+
+    //! The two-phase join port
+    template< typename T >
+    class reserving_port : public receiver<T> {
+    public:
+        typedef T input_type;
+        typedef sender<T> predecessor_type;
+    private:
+        // ----------- Aggregator ------------
+        enum op_type { reg_pred, rem_pred, res_item, rel_res, con_res };
+        enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+        typedef reserving_port<T> my_class;
+
+        class reserving_port_operation : public aggregated_operation<reserving_port_operation> {
+        public:
+            char type;
+            union {
+                T *my_arg;
+                predecessor_type *my_pred;
+            };
+            reserving_port_operation(const T& e, op_type t) :
+                type(char(t)), my_arg(const_cast<T*>(&e)) {}
+            reserving_port_operation(const predecessor_type &s, op_type t) : type(char(t)), 
+                my_pred(const_cast<predecessor_type *>(&s)) {}
+            reserving_port_operation(op_type t) : type(char(t)) {}
+        };
+
+        typedef internal::aggregating_functor<my_class, reserving_port_operation> my_handler;
+        friend class internal::aggregating_functor<my_class, reserving_port_operation>;
+        aggregator<my_handler, reserving_port_operation> my_aggregator;
+
+        void handle_operations(reserving_port_operation* op_list) {
+            reserving_port_operation *current;
+            bool no_predecessors;
+            while(op_list) {
+                current = op_list;
+                op_list = op_list->next;
+                switch(current->type) {
+                case reg_pred:
+                    no_predecessors = my_predecessors.empty();
+                    my_predecessors.add(*(current->my_pred));
+                    if ( no_predecessors ) {
+                        my_join->decrement_port_count( ); // may try to forward
+                    }
+                    __TBB_store_with_release(current->status, SUCCEEDED);
+                    break;
+                case rem_pred:
+                    my_predecessors.remove(*(current->my_pred));
+                    if(my_predecessors.empty()) my_join->increment_port_count();
+                    __TBB_store_with_release(current->status, SUCCEEDED);
+                    break;
+                case res_item:
+                    if ( reserved ) {
+                        __TBB_store_with_release(current->status, FAILED);
+                    }
+                    else if ( my_predecessors.try_reserve( *(current->my_arg) ) ) {
+                        reserved = true;
+                        __TBB_store_with_release(current->status, SUCCEEDED);
+                    } else {
+                        if ( my_predecessors.empty() ) {
+                            my_join->increment_port_count();
+                        }
+                        __TBB_store_with_release(current->status, FAILED);
+                    }
+                    break;
+                case rel_res:
+                    reserved = false;
+                    my_predecessors.try_release( );
+                    __TBB_store_with_release(current->status, SUCCEEDED);
+                    break;
+                case con_res:
+                    reserved = false;
+                    my_predecessors.try_consume( );
+                    __TBB_store_with_release(current->status, SUCCEEDED);
+                    break;
+                }
+            }
+        }
+
+    public:
+
+        //! Constructor
+        reserving_port() : reserved(false) {
+            my_join = NULL;
+            my_predecessors.set_owner( this );
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        // copy constructor
+        reserving_port(const reserving_port& /* other */) : receiver<T>() {
+            reserved = false;
+            my_join = NULL;
+            my_predecessors.set_owner( this );
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        void set_join_node_pointer(forwarding_base *join) {
+            my_join = join;
+        }
+
+        // always rejects, so arc is reversed (and reserves can be done.)
+        bool try_put( const T & ) {
+            return false;
+        }
+
+        //! Add a predecessor
+        bool register_predecessor( sender<T> &src ) {
+            reserving_port_operation op_data(src, reg_pred);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+        //! Remove a predecessor
+        bool remove_predecessor( sender<T> &src ) {
+            reserving_port_operation op_data(src, rem_pred);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+        //! Reserve an item from the port
+        bool reserve( T &v ) {
+            reserving_port_operation op_data(v, res_item);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+        //! Release the port
+        void release( ) {
+            reserving_port_operation op_data(rel_res);
+            my_aggregator.execute(&op_data);
+        }
+
+        //! Complete use of the port
+        void consume( ) {
+            reserving_port_operation op_data(con_res);
+            my_aggregator.execute(&op_data);
+        }
+
+    private:
+        forwarding_base *my_join;
+        reservable_predecessor_cache< T, null_mutex > my_predecessors;
+        bool reserved;
+    };
+
+    //! queueing join_port
+    template<typename T>
+    class queueing_port : public receiver<T>, public item_buffer<T> {
+    public:
+        typedef T input_type;
+        typedef sender<T> predecessor_type;
+        typedef queueing_port<T> my_node_type;
+
+    // ----------- Aggregator ------------
+    private:
+        enum op_type { try__put, get__item, res_port };
+        enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+        typedef queueing_port<T> my_class;
+
+        class queueing_port_operation : public aggregated_operation<queueing_port_operation> {
+        public:
+            char type;
+            T my_val;
+            T *my_arg;
+            // constructor for value parameter
+            queueing_port_operation(const T& e, op_type t) :
+                // type(char(t)), my_val(const_cast<T>(e)) {}
+                type(char(t)), my_val(e) {}
+            // constructor for pointer parameter
+            queueing_port_operation(const T* p, op_type t) :
+                type(char(t)), my_arg(const_cast<T*>(p)) {}
+            // constructor with no parameter
+            queueing_port_operation(op_type t) : type(char(t)) {}
+        };
+
+        typedef internal::aggregating_functor<my_class, queueing_port_operation> my_handler;
+        friend class internal::aggregating_functor<my_class, queueing_port_operation>;
+        aggregator<my_handler, queueing_port_operation> my_aggregator;
+
+        void handle_operations(queueing_port_operation* op_list) {
+            queueing_port_operation *current;
+            bool was_empty;
+            while(op_list) {
+                current = op_list;
+                op_list = op_list->next;
+                switch(current->type) {
+                case try__put:
+                    was_empty = this->buffer_empty();
+                    this->push_back(current->my_val);
+                    if (was_empty) my_join->decrement_port_count();
+                    __TBB_store_with_release(current->status, SUCCEEDED);
+                    break;
+                case get__item:
+                    if(!this->buffer_empty()) {
+                        this->fetch_front(*(current->my_arg));
+                        __TBB_store_with_release(current->status, SUCCEEDED);
+                    }
+                    else {
+                        __TBB_store_with_release(current->status, FAILED);
+                    }
+                    break;
+                case res_port:
+                    __TBB_ASSERT(this->item_valid(this->my_head), "No item to reset");
+                    this->invalidate_front(); ++(this->my_head);
+                    if(this->item_valid(this->my_head)) {
+                        my_join->decrement_port_count();
+                    }
+                    __TBB_store_with_release(current->status, SUCCEEDED);
+                    break;
+                }
+            }
+        }
+    // ------------ End Aggregator ---------------
+    public:
+
+        //! Constructor
+        queueing_port() : item_buffer<T>() {
+            my_join = NULL;
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        //! copy constructor
+        queueing_port(const queueing_port& /* other */) : receiver<T>(), item_buffer<T>() {
+            my_join = NULL;
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        //! record parent for tallying available items
+        void set_join_node_pointer(forwarding_base *join) {
+            my_join = join;
+        }
+
+        /*override*/bool try_put(const T &v) {
+            queueing_port_operation op_data(v, try__put);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+
+        bool get_item( T &v ) {
+            queueing_port_operation op_data(&v, get__item);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+        // reset_port is called when item is accepted by successor, but
+        // is initiated by join_node.
+        void reset_port() {
+            queueing_port_operation op_data(res_port);
+            my_aggregator.execute(&op_data);
+            return;
+        }
+
+    private:
+        forwarding_base *my_join;
+    };
+
+#include "_flow_graph_tagged_buffer_impl.h"
+
+    template< typename T >
+    class tag_matching_port : public receiver<T>, public tagged_buffer< tag_value, T, NO_TAG > {
+    public:
+        typedef T input_type;
+        typedef sender<T> predecessor_type;
+        typedef tag_matching_port<T> my_node_type;  // for forwarding, if needed
+        typedef function_body<input_type, tag_value> my_tag_func_type;
+    private:
+// ----------- Aggregator ------------
+    private:
+        enum op_type { try__put, get__item, res_port };
+        enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+        typedef tag_matching_port<T> my_class;
+
+        class tag_matching_port_operation : public aggregated_operation<tag_matching_port_operation> {
+        public:
+            char type;
+            T my_val;
+            T *my_arg;
+            tag_value my_tag_value;
+            // constructor for value parameter
+            tag_matching_port_operation(const T& e, op_type t) :
+                // type(char(t)), my_val(const_cast<T>(e)) {}
+                type(char(t)), my_val(e) {}
+            // constructor for pointer parameter
+            tag_matching_port_operation(const T* p, op_type t) :
+                type(char(t)), my_arg(const_cast<T*>(p)) {}
+            // constructor with no parameter
+            tag_matching_port_operation(op_type t) : type(char(t)) {}
+        };
+
+        typedef internal::aggregating_functor<my_class, tag_matching_port_operation> my_handler;
+        friend class internal::aggregating_functor<my_class, tag_matching_port_operation>;
+        aggregator<my_handler, tag_matching_port_operation> my_aggregator;
+
+        void handle_operations(tag_matching_port_operation* op_list) {
+            tag_matching_port_operation *current;
+            while(op_list) {
+                current = op_list;
+                op_list = op_list->next;
+                switch(current->type) {
+                case try__put: {
+                        bool was_inserted = this->tagged_insert(current->my_tag_value, current->my_val);
+                        if(!was_inserted) __TBB_ASSERT( false, "multiple insertions of same tag");
+                        __TBB_store_with_release(current->status, SUCCEEDED);
+                    }
+                    break;
+                case get__item:
+                    // use current_tag from FE for item
+                    if(!this->tagged_find(my_join->current_tag, *(current->my_arg))) {
+                        __TBB_ASSERT(false, "Failed to find item corresponding to current_tag.");
+                    }
+                    __TBB_store_with_release(current->status, SUCCEEDED);
+                    break;
+                case res_port:
+                    // use current_tag from FE for item
+                    this->tagged_delete(my_join->current_tag);
+                    __TBB_store_with_release(current->status, SUCCEEDED);
+                    break;
+                }
+            }
+        }
+// ------------ End Aggregator ---------------
+    public:
+
+        tag_matching_port() : receiver<T>(), tagged_buffer<tag_value, T, NO_TAG>() {
+            my_join = NULL;
+            my_tag_func = NULL;
+            my_original_tag_func = NULL;
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        // copy constructor
+        tag_matching_port(const tag_matching_port& /*other*/) : receiver<T>(), tagged_buffer<tag_value,T, NO_TAG>() {
+            my_join = NULL;
+            // setting the tag methods is done in the copy-constructor for the front-end.
+            my_tag_func = NULL;
+            my_original_tag_func = NULL;
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        ~tag_matching_port() {
+            if (my_tag_func) delete my_tag_func;
+            if (my_original_tag_func) delete my_original_tag_func;
+        }
+
+        void set_join_node_pointer(forwarding_base *join) {
+            my_join = join;
+        }
+
+        void set_my_original_tag_func(my_tag_func_type *f) {
+            my_original_tag_func = f;
+        }
+
+        void set_my_tag_func(my_tag_func_type *f) {
+            my_tag_func = f;
+        }
+
+        /*override*/bool try_put(const T& v) {
+            tag_matching_port_operation op_data(v, try__put);
+            op_data.my_tag_value = (*my_tag_func)(v);
+            my_aggregator.execute(&op_data);
+            if(op_data.status == SUCCEEDED) {
+                // the assertion in the aggregator above will ensure we do not call with the same
+                // tag twice.  We have to exit the aggregator to keep lock-ups from happening;
+                // the increment of the tag hash table in the FE is under a separate aggregator,
+                // so that is serialized.
+                // is a race possible?  I do not believe so; the increment may cause a build of
+                // an output tuple, but its component is already in the hash table for the port.
+                my_join->increment_tag_count(op_data.my_tag_value);  // may spawn
+
+            }
+            return op_data.status == SUCCEEDED;
+        }
+
+
+        bool get_item( T &v ) {
+            tag_matching_port_operation op_data(&v, get__item);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+        // reset_port is called when item is accepted by successor, but
+        // is initiated by join_node.
+        void reset_port() {
+            tag_matching_port_operation op_data(res_port);
+            my_aggregator.execute(&op_data);
+            return;
+        }
+
+        my_tag_func_type *my_func() { return my_tag_func; }
+        my_tag_func_type *my_original_func() { return my_original_tag_func; }
+
+    private:
+        // need map of tags to values
+        forwarding_base *my_join;
+        my_tag_func_type *my_tag_func;
+        my_tag_func_type *my_original_tag_func;
+    };  // tag_matching_port
+
+    using namespace graph_policy_namespace;
+
+    template<graph_buffer_policy JP, typename InputTuple, typename OutputTuple>
+    class join_node_base;
+
+    //! join_node_FE : implements input port policy
+    template<graph_buffer_policy JP, typename InputTuple, typename OutputTuple>
+    class join_node_FE;
+
+    template<typename InputTuple, typename OutputTuple>
+    class join_node_FE<reserving, InputTuple, OutputTuple> : public forwarding_base {
+    public:
+        static const int N = std::tuple_size<OutputTuple>::value;
+        typedef OutputTuple output_type;
+        typedef InputTuple input_type;
+        typedef join_node_base<reserving, InputTuple, OutputTuple> my_node_type; // for forwarding
+
+        join_node_FE(graph &g) : forwarding_base(g.root_task()), my_node(NULL) {
+            ports_with_no_inputs = N;
+            join_helper<N>::set_join_node_pointer(my_inputs, this);
+        }
+
+        join_node_FE(const join_node_FE& other) : forwarding_base(other.my_root_task), my_node(NULL) {
+            ports_with_no_inputs = N;
+            join_helper<N>::set_join_node_pointer(my_inputs, this);
+        }
+
+        void set_my_node(my_node_type *new_my_node) { my_node = new_my_node; }
+
+       void increment_port_count() {
+            ++ports_with_no_inputs;
+        }
+
+        // if all input_ports have predecessors, spawn forward to try and consume tuples
+        void decrement_port_count() {
+            if(ports_with_no_inputs.fetch_and_decrement() == 1) {
+                task::enqueue( * new ( task::allocate_additional_child_of( *(this->my_root_task) ) )
+                    forward_task<my_node_type>(*my_node) );
+            }
+        }
+
+        input_type &inputs() { return my_inputs; }
+    protected:
+        // all methods on input ports should be called under mutual exclusion from join_node_base.
+
+        bool tuple_build_may_succeed() {
+            return !ports_with_no_inputs;
+        }
+
+        bool try_to_make_tuple(output_type &out) {
+            if(ports_with_no_inputs) return false;
+            return join_helper<N>::reserve(my_inputs, out);
+        }
+
+        void tuple_accepted() {
+            join_helper<N>::consume_reservations(my_inputs);
+        }
+        void tuple_rejected() {
+            join_helper<N>::release_reservations(my_inputs);
+        }
+
+        input_type my_inputs;
+        my_node_type *my_node;
+        atomic<size_t> ports_with_no_inputs;
+    };
+
+    template<typename InputTuple, typename OutputTuple>
+    class join_node_FE<queueing, InputTuple, OutputTuple> : public forwarding_base {
+    public:
+        static const int N = std::tuple_size<OutputTuple>::value;
+        typedef OutputTuple output_type;
+        typedef InputTuple input_type;
+        typedef join_node_base<queueing, InputTuple, OutputTuple> my_node_type; // for forwarding
+
+        join_node_FE(graph &g) : forwarding_base(g.root_task()), my_node(NULL) {
+            ports_with_no_items = N;
+            join_helper<N>::set_join_node_pointer(my_inputs, this);
+        }
+
+        join_node_FE(const join_node_FE& other) : forwarding_base(other.my_root_task), my_node(NULL) {
+            ports_with_no_items = N;
+            join_helper<N>::set_join_node_pointer(my_inputs, this);
+        }
+
+        // needed for forwarding
+        void set_my_node(my_node_type *new_my_node) { my_node = new_my_node; }
+
+        void reset_port_count() {
+            ports_with_no_items = N;
+        }
+
+        // if all input_ports have items, spawn forward to try and consume tuples
+        void decrement_port_count() {
+            if(ports_with_no_items.fetch_and_decrement() == 1) {
+                task::enqueue( * new ( task::allocate_additional_child_of( *(this->my_root_task) ) )
+                    forward_task<my_node_type>(*my_node) );
+            }
+        }
+
+        void increment_port_count() { __TBB_ASSERT(false, NULL); }  // should never be called
+
+        input_type &inputs() { return my_inputs; }
+    protected:
+        // all methods on input ports should be called under mutual exclusion from join_node_base.
+
+        bool tuple_build_may_succeed() {
+            return !ports_with_no_items;
+        }
+
+        bool try_to_make_tuple(output_type &out) {
+            if(ports_with_no_items) return false;
+            return join_helper<N>::get_items(my_inputs, out);
+        }
+
+        void tuple_accepted() {
+            reset_port_count();
+            join_helper<N>::reset_ports(my_inputs);
+        }
+        void tuple_rejected() {
+            // nothing to do.
+        }
+
+        input_type my_inputs;
+        my_node_type *my_node;
+        atomic<size_t> ports_with_no_items;
+    };
+
+    // tag_matching join input port.
+    template<typename InputTuple, typename OutputTuple>
+    class join_node_FE<tag_matching, InputTuple, OutputTuple> : public forwarding_base,
+             public tagged_buffer<tag_value, size_t, NO_TAG>, public item_buffer<OutputTuple> {
+    public:
+        static const int N = std::tuple_size<OutputTuple>::value;
+        typedef OutputTuple output_type;
+        typedef InputTuple input_type;
+        typedef tagged_buffer<tag_value, size_t, NO_TAG> my_tag_buffer;
+        typedef item_buffer<output_type> output_buffer_type;
+        typedef join_node_base<tag_matching, InputTuple, OutputTuple> my_node_type; // for forwarding
+
+// ----------- Aggregator ------------
+        // the aggregator is only needed to serialize the access to the hash table.
+        // and the output_buffer_type base class
+    private:
+        enum op_type { res_count, inc_count, may_succeed, try_make };
+        enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+        typedef join_node_FE<tag_matching, InputTuple, OutputTuple> my_class;
+
+        class tag_matching_FE_operation : public aggregated_operation<tag_matching_FE_operation> {
+        public:
+            char type;
+            union {
+                tag_value my_val;
+                output_type* my_output;
+            };
+            // constructor for value parameter
+            tag_matching_FE_operation(const tag_value& e, op_type t) :
+                // type(char(t)), my_val(const_cast<T>(e)) {}
+                type(char(t)), my_val(e) {}
+            tag_matching_FE_operation(output_type *p, op_type t) :
+                type(char(t)), my_output(p) {}
+            // constructor with no parameter
+            tag_matching_FE_operation(op_type t) : type(char(t)) {}
+        };
+
+        typedef internal::aggregating_functor<my_class, tag_matching_FE_operation> my_handler;
+        friend class internal::aggregating_functor<my_class, tag_matching_FE_operation>;
+        aggregator<my_handler, tag_matching_FE_operation> my_aggregator;
+
+        // called from aggregator, so serialized
+        void fill_output_buffer(bool should_enqueue) {
+            output_type l_out;
+            bool do_fwd = should_enqueue && this->buffer_empty();
+            while(find_value_tag(this->current_tag,N)) {
+                this->tagged_delete(this->current_tag);
+                if(join_helper<N>::get_items(my_inputs, l_out)) {  //  <== call back
+                    this->push_back(l_out);
+                    if(do_fwd) {
+                        task::enqueue( * new ( task::allocate_additional_child_of( *(this->my_root_task) ) )
+                        forward_task<my_node_type>(*my_node) );
+                        do_fwd = false;
+                    }
+                    // retire the input values
+                    join_helper<N>::reset_ports(my_inputs);  //  <== call back
+                    this->current_tag = NO_TAG;    
+                }
+                else {
+                    __TBB_ASSERT(false, "should have had something to push");
+                }
+            }
+        }
+
+        void handle_operations(tag_matching_FE_operation* op_list) {
+            tag_matching_FE_operation *current;
+            while(op_list) {
+                current = op_list;
+                op_list = op_list->next;
+                switch(current->type) {
+                case res_count:  // called from BE
+                    {
+                        output_type l_out;
+                        this->pop_front(l_out);  // don't care about returned value.
+                        // buffer as many tuples as we can make
+                        fill_output_buffer(true);
+                        __TBB_store_with_release(current->status, SUCCEEDED);
+                    }
+                    break;
+                case inc_count: {  // called from input ports
+                        size_t *p = 0;
+                        tag_value t = current->my_val;
+                        if(!(this->tagged_find_ref(t,p))) {
+                            this->tagged_insert(t, 0);
+                            if(!(this->tagged_find_ref(t,p))) {
+                                __TBB_ASSERT(false, NULL);
+                            }
+                        }
+                        if(++(*p) == size_t(N)) {
+                            task::enqueue( * new ( task::allocate_additional_child_of( *(this->my_root_task) ) )
+                            forward_task<my_node_type>(*my_node) );
+                        }
+                    }
+                    __TBB_store_with_release(current->status, SUCCEEDED);
+                    break;
+                case may_succeed:  // called from BE
+                    fill_output_buffer(false);
+                    __TBB_store_with_release(current->status, this->buffer_empty() ? FAILED : SUCCEEDED);
+                    break;
+                case try_make:  // called from BE
+                    if(this->buffer_empty()) {
+                        __TBB_store_with_release(current->status, FAILED);
+                    }
+                    else {
+                        this->fetch_front(*(current->my_output));
+                        __TBB_store_with_release(current->status, SUCCEEDED);
+                    }
+                    break;
+                }
+            }
+        }
+// ------------ End Aggregator ---------------
+
+    public:
+        template<typename FunctionTuple>
+        join_node_FE(graph &g, FunctionTuple tag_funcs) : forwarding_base(g.root_task()), my_node(NULL) {
+            join_helper<N>::set_join_node_pointer(my_inputs, this);
+            join_helper<N>::set_tag_func(my_inputs, tag_funcs);
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        join_node_FE(const join_node_FE& other) : forwarding_base(other.my_root_task), my_tag_buffer(),
+        output_buffer_type() {
+            my_node = NULL;
+            join_helper<N>::set_join_node_pointer(my_inputs, this);
+            join_helper<N>::copy_tag_functors(my_inputs, const_cast<input_type &>(other.my_inputs));
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        // needed for forwarding
+        void set_my_node(my_node_type *new_my_node) { my_node = new_my_node; }
+
+        void reset_port_count() {  // called from BE
+            tag_matching_FE_operation op_data(res_count);
+            my_aggregator.execute(&op_data);
+            return;
+        }
+
+        // if all input_ports have items, spawn forward to try and consume tuples
+        void increment_tag_count(tag_value t) {  // called from input_ports
+            tag_matching_FE_operation op_data(t, inc_count);
+            my_aggregator.execute(&op_data);
+            return;
+        }
+
+        void decrement_port_count() { __TBB_ASSERT(false, NULL); }
+
+        void increment_port_count() { __TBB_ASSERT(false, NULL); }  // should never be called
+
+        input_type &inputs() { return my_inputs; }
+    protected:
+        // all methods on input ports should be called under mutual exclusion from join_node_base.
+
+        bool tuple_build_may_succeed() {  // called from back-end
+            tag_matching_FE_operation op_data(may_succeed);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+        // cannot lock while calling back to input_ports.  current_tag will only be set
+        // and reset under the aggregator, so it will remain consistent.
+        bool try_to_make_tuple(output_type &out) {
+            tag_matching_FE_operation op_data(&out,try_make);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+        void tuple_accepted() {
+            reset_port_count();  // reset current_tag after ports reset.
+        }
+
+        void tuple_rejected() {
+            // nothing to do.
+        }
+
+        input_type my_inputs;  // input ports
+        my_node_type *my_node;
+    }; // join_node_FE<tag_matching, InputTuple, OutputTuple>
+
+    //! join_node_base
+    template<graph_buffer_policy JP, typename InputTuple, typename OutputTuple>
+    class join_node_base : public graph_node, public join_node_FE<JP, InputTuple, OutputTuple>,
+                           public sender<OutputTuple> {
+    public:
+        typedef OutputTuple output_type;
+
+        typedef receiver<output_type> successor_type;
+        typedef join_node_FE<JP, InputTuple, OutputTuple> input_ports_type;
+        using input_ports_type::tuple_build_may_succeed;
+        using input_ports_type::try_to_make_tuple;
+        using input_ports_type::tuple_accepted;
+        using input_ports_type::tuple_rejected;
+
+    private:
+        // ----------- Aggregator ------------
+        enum op_type { reg_succ, rem_succ, try__get, do_fwrd };
+        enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+        typedef join_node_base<JP,InputTuple,OutputTuple> my_class;
+
+        class join_node_base_operation : public aggregated_operation<join_node_base_operation> {
+        public:
+            char type;
+            union {
+                output_type *my_arg;
+                successor_type *my_succ;
+            };
+            join_node_base_operation(const output_type& e, op_type t) :
+                type(char(t)), my_arg(const_cast<output_type*>(&e)) {}
+            join_node_base_operation(const successor_type &s, op_type t) : type(char(t)), 
+                my_succ(const_cast<successor_type *>(&s)) {}
+            join_node_base_operation(op_type t) : type(char(t)) {}
+        };
+
+        typedef internal::aggregating_functor<my_class, join_node_base_operation> my_handler;
+        friend class internal::aggregating_functor<my_class, join_node_base_operation>;
+        bool forwarder_busy;
+        aggregator<my_handler, join_node_base_operation> my_aggregator;
+
+        void handle_operations(join_node_base_operation* op_list) {
+            join_node_base_operation *current;
+            while(op_list) {
+                current = op_list;
+                op_list = op_list->next;
+                switch(current->type) {
+                case reg_succ:
+                    my_successors.register_successor(*(current->my_succ));
+                    if(tuple_build_may_succeed() && !forwarder_busy) {
+                        task::enqueue( * new ( task::allocate_additional_child_of(*(this->my_root_task)) )
+                                forward_task<join_node_base<JP,InputTuple,OutputTuple> >(*this));
+                        forwarder_busy = true;
+                    }
+                    __TBB_store_with_release(current->status, SUCCEEDED);
+                    break;
+                case rem_succ:
+                    my_successors.remove_successor(*(current->my_succ));
+                    __TBB_store_with_release(current->status, SUCCEEDED);
+                    break;
+                case try__get:
+                    if(tuple_build_may_succeed()) {
+                        if(try_to_make_tuple(*(current->my_arg))) {
+                            tuple_accepted();
+                            __TBB_store_with_release(current->status, SUCCEEDED);
+                        }
+                        else __TBB_store_with_release(current->status, FAILED);
+                    }
+                    else __TBB_store_with_release(current->status, FAILED);
+                    break;
+                case do_fwrd: {
+                        bool build_succeeded;
+                        output_type out;
+                        if(tuple_build_may_succeed()) {
+                            do {
+                                build_succeeded = try_to_make_tuple(out);
+                                if(build_succeeded) {
+                                    if(my_successors.try_put(out)) {
+                                        tuple_accepted();
+                                    }
+                                    else {
+                                        tuple_rejected();
+                                        build_succeeded = false;
+                                    }
+                                }
+                            } while(build_succeeded);
+                        }
+                        __TBB_store_with_release(current->status, SUCCEEDED);
+                        forwarder_busy = false;
+                    }
+                    break;
+                }
+            }
+        }
+        // ---------- end aggregator -----------
+    public:
+        join_node_base(graph &g) : input_ports_type(g), forwarder_busy(false) {
+            my_successors.set_owner(this);
+            input_ports_type::set_my_node(this);
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        join_node_base(const join_node_base& other) :
+            graph_node(), input_ports_type(other),
+            sender<OutputTuple>(), forwarder_busy(false), my_successors() {
+            my_successors.set_owner(this);
+            input_ports_type::set_my_node(this);
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        template<typename FunctionTuple>
+        join_node_base(graph &g, FunctionTuple f) : input_ports_type(g, f), forwarder_busy(false) {
+            my_successors.set_owner(this);
+            input_ports_type::set_my_node(this);
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        bool register_successor(successor_type &r) {
+            join_node_base_operation op_data(r, reg_succ);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+        bool remove_successor( successor_type &r) {
+            join_node_base_operation op_data(r, rem_succ);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+        bool try_get( output_type &v) {
+            join_node_base_operation op_data(v, try__get);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+    private:
+        broadcast_cache<output_type, null_rw_mutex> my_successors;
+
+        friend class forward_task< join_node_base<JP, InputTuple, OutputTuple> >;
+
+        void forward() {
+            join_node_base_operation op_data(do_fwrd);
+            my_aggregator.execute(&op_data);
+        }
+    };
+
+    //! unfolded_join_node : passes input_ports_tuple_type to join_node_base.  We build the input port type
+    //  using tuple_element.  The class PT is the port type (reserving_port, queueing_port, tag_matching_port)
+    //  and should match the graph_buffer_policy.
+    template<int N, template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+    class unfolded_join_node;
+
+    template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+    class unfolded_join_node<2,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+        std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>, 
+                PT<typename std::tuple_element<1,OutputTuple>::type> >,
+        OutputTuple
+                  >
+                  {
+    public:
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>, 
+                PT<typename std::tuple_element<1,OutputTuple>::type> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+    public:
+        unfolded_join_node(graph &g) : base_type(g) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+    class unfolded_join_node<3,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+        std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>,
+                PT<typename std::tuple_element<1,OutputTuple>::type>,
+                PT<typename std::tuple_element<2,OutputTuple>::type> >,
+        OutputTuple
+                    >
+                    {
+    public:
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>, 
+                PT<typename std::tuple_element<1,OutputTuple>::type>, 
+                PT<typename std::tuple_element<2,OutputTuple>::type> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+    public:
+        unfolded_join_node(graph &g) : base_type(g) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+    class unfolded_join_node<4,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+        std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>,
+                PT<typename std::tuple_element<1,OutputTuple>::type>,
+                PT<typename std::tuple_element<2,OutputTuple>::type>,
+                PT<typename std::tuple_element<3,OutputTuple>::type> >,
+        OutputTuple
+                    > {
+    public:
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>, 
+                PT<typename std::tuple_element<1,OutputTuple>::type>, 
+                PT<typename std::tuple_element<2,OutputTuple>::type>, 
+                PT<typename std::tuple_element<3,OutputTuple>::type> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+    public:
+        unfolded_join_node(graph &g) : base_type(g) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+    class unfolded_join_node<5,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+        std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>,
+                PT<typename std::tuple_element<1,OutputTuple>::type>,
+                PT<typename std::tuple_element<2,OutputTuple>::type>,
+                PT<typename std::tuple_element<3,OutputTuple>::type>,
+                PT<typename std::tuple_element<4,OutputTuple>::type> >,
+        OutputTuple
+                > {
+    public:
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>, 
+                PT<typename std::tuple_element<1,OutputTuple>::type>, 
+                PT<typename std::tuple_element<2,OutputTuple>::type>, 
+                PT<typename std::tuple_element<3,OutputTuple>::type>, 
+                PT<typename std::tuple_element<4,OutputTuple>::type> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+    public:
+        unfolded_join_node(graph &g) : base_type(g) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+    class unfolded_join_node<6,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+        std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>,
+                PT<typename std::tuple_element<1,OutputTuple>::type>,
+                PT<typename std::tuple_element<2,OutputTuple>::type>,
+                PT<typename std::tuple_element<3,OutputTuple>::type>,
+                PT<typename std::tuple_element<4,OutputTuple>::type>,
+                PT<typename std::tuple_element<5,OutputTuple>::type> >,
+        OutputTuple
+                    > {
+    public:
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>, 
+                PT<typename std::tuple_element<1,OutputTuple>::type>, 
+                PT<typename std::tuple_element<2,OutputTuple>::type>, 
+                PT<typename std::tuple_element<3,OutputTuple>::type>, 
+                PT<typename std::tuple_element<4,OutputTuple>::type>, 
+                PT<typename std::tuple_element<5,OutputTuple>::type> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+    public:
+        unfolded_join_node(graph &g) : base_type(g) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+    class unfolded_join_node<7,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+        std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>,
+                PT<typename std::tuple_element<1,OutputTuple>::type>,
+                PT<typename std::tuple_element<2,OutputTuple>::type>,
+                PT<typename std::tuple_element<3,OutputTuple>::type>,
+                PT<typename std::tuple_element<4,OutputTuple>::type>,
+                PT<typename std::tuple_element<5,OutputTuple>::type>,
+                PT<typename std::tuple_element<6,OutputTuple>::type> >,
+        OutputTuple
+                > {
+    public:
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>, 
+                PT<typename std::tuple_element<1,OutputTuple>::type>, 
+                PT<typename std::tuple_element<2,OutputTuple>::type>, 
+                PT<typename std::tuple_element<3,OutputTuple>::type>, 
+                PT<typename std::tuple_element<4,OutputTuple>::type>, 
+                PT<typename std::tuple_element<5,OutputTuple>::type>, 
+                PT<typename std::tuple_element<6,OutputTuple>::type> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+    public:
+        unfolded_join_node(graph &g) : base_type(g) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+    class unfolded_join_node<8,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+        std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>,
+                PT<typename std::tuple_element<1,OutputTuple>::type>,
+                PT<typename std::tuple_element<2,OutputTuple>::type>,
+                PT<typename std::tuple_element<3,OutputTuple>::type>,
+                PT<typename std::tuple_element<4,OutputTuple>::type>,
+                PT<typename std::tuple_element<5,OutputTuple>::type>,
+                PT<typename std::tuple_element<6,OutputTuple>::type>,
+                PT<typename std::tuple_element<7,OutputTuple>::type> >,
+        OutputTuple
+                > {
+    public:
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>, 
+                PT<typename std::tuple_element<1,OutputTuple>::type>, 
+                PT<typename std::tuple_element<2,OutputTuple>::type>, 
+                PT<typename std::tuple_element<3,OutputTuple>::type>, 
+                PT<typename std::tuple_element<4,OutputTuple>::type>, 
+                PT<typename std::tuple_element<5,OutputTuple>::type>, 
+                PT<typename std::tuple_element<6,OutputTuple>::type>, 
+                PT<typename std::tuple_element<7,OutputTuple>::type> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+    public:
+        unfolded_join_node(graph &g) : base_type(g) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+    class unfolded_join_node<9,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+        std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>,
+                PT<typename std::tuple_element<1,OutputTuple>::type>,
+                PT<typename std::tuple_element<2,OutputTuple>::type>,
+                PT<typename std::tuple_element<3,OutputTuple>::type>,
+                PT<typename std::tuple_element<4,OutputTuple>::type>,
+                PT<typename std::tuple_element<5,OutputTuple>::type>,
+                PT<typename std::tuple_element<6,OutputTuple>::type>,
+                PT<typename std::tuple_element<7,OutputTuple>::type>,
+                PT<typename std::tuple_element<8,OutputTuple>::type> >,
+        OutputTuple
+                > {
+    public:
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>, 
+                PT<typename std::tuple_element<1,OutputTuple>::type>, 
+                PT<typename std::tuple_element<2,OutputTuple>::type>, 
+                PT<typename std::tuple_element<3,OutputTuple>::type>, 
+                PT<typename std::tuple_element<4,OutputTuple>::type>, 
+                PT<typename std::tuple_element<5,OutputTuple>::type>, 
+                PT<typename std::tuple_element<6,OutputTuple>::type>, 
+                PT<typename std::tuple_element<7,OutputTuple>::type>, 
+                PT<typename std::tuple_element<8,OutputTuple>::type> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+    public:
+        unfolded_join_node(graph &g) : base_type(g) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<template<class> class PT, typename OutputTuple, graph_buffer_policy JP>
+    class unfolded_join_node<10,PT,OutputTuple,JP> : public internal::join_node_base<JP,
+        std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>,
+                PT<typename std::tuple_element<1,OutputTuple>::type>,
+                PT<typename std::tuple_element<2,OutputTuple>::type>,
+                PT<typename std::tuple_element<3,OutputTuple>::type>,
+                PT<typename std::tuple_element<4,OutputTuple>::type>,
+                PT<typename std::tuple_element<5,OutputTuple>::type>,
+                PT<typename std::tuple_element<6,OutputTuple>::type>,
+                PT<typename std::tuple_element<7,OutputTuple>::type>,
+                PT<typename std::tuple_element<8,OutputTuple>::type>,
+                PT<typename std::tuple_element<9,OutputTuple>::type> >,
+        OutputTuple
+                > {
+    public:
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,OutputTuple>::type>, 
+                PT<typename std::tuple_element<1,OutputTuple>::type>, 
+                PT<typename std::tuple_element<2,OutputTuple>::type>, 
+                PT<typename std::tuple_element<3,OutputTuple>::type>, 
+                PT<typename std::tuple_element<4,OutputTuple>::type>, 
+                PT<typename std::tuple_element<5,OutputTuple>::type>, 
+                PT<typename std::tuple_element<6,OutputTuple>::type>, 
+                PT<typename std::tuple_element<7,OutputTuple>::type>, 
+                PT<typename std::tuple_element<8,OutputTuple>::type>, 
+                PT<typename std::tuple_element<9,OutputTuple>::type> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<JP, input_ports_tuple_type, output_type > base_type;
+    public:
+        unfolded_join_node(graph &g) : base_type(g) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    // tag_matching unfolded_join_node.  This must be a separate specialization because the constructors
+    // differ.
+
+    template<typename OutputTuple>
+    class unfolded_join_node<2,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+        std::tuple<
+                tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>, 
+                tag_matching_port<typename std::tuple_element<1,OutputTuple>::type> >,
+        OutputTuple
+                  >
+                  {
+        typedef typename std::tuple_element<0, OutputTuple>::type T0;
+        typedef typename std::tuple_element<1, OutputTuple>::type T1;
+    public:
+        typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<tag_matching, input_ports_tuple_type, output_type > base_type;
+        typedef typename internal::function_body<T0, tag_value> *f0_p;
+        typedef typename internal::function_body<T1, tag_value> *f1_p;
+        typedef typename std::tuple< f0_p, f1_p > func_initializer_type;
+    public:
+        template<typename B0, typename B1>
+        unfolded_join_node(graph &g, B0 b0, B1 b1) : base_type(g,
+                func_initializer_type(
+                    new internal::function_body_leaf<T0, tag_value, B0>(b0),
+                    new internal::function_body_leaf<T1, tag_value, B1>(b1)
+                    ) ) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<typename OutputTuple>
+    class unfolded_join_node<3,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+        std::tuple<
+                tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>, 
+                tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<2,OutputTuple>::type> >,
+        OutputTuple
+                  >
+                  {
+        typedef typename std::tuple_element<0, OutputTuple>::type T0;
+        typedef typename std::tuple_element<1, OutputTuple>::type T1;
+        typedef typename std::tuple_element<2, OutputTuple>::type T2;
+    public:
+        typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>
+            > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<tag_matching, input_ports_tuple_type, output_type > base_type;
+        typedef typename internal::function_body<T0, tag_value> *f0_p;
+        typedef typename internal::function_body<T1, tag_value> *f1_p;
+        typedef typename internal::function_body<T2, tag_value> *f2_p;
+        typedef typename std::tuple< f0_p, f1_p, f2_p > func_initializer_type;
+    public:
+        template<typename B0, typename B1, typename B2>
+        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2) : base_type(g,
+                func_initializer_type(
+                    new internal::function_body_leaf<T0, tag_value, B0>(b0),
+                    new internal::function_body_leaf<T1, tag_value, B1>(b1),
+                    new internal::function_body_leaf<T2, tag_value, B2>(b2)
+                    ) ) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<typename OutputTuple>
+    class unfolded_join_node<4,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+        std::tuple<
+                tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>, 
+                tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>
+            >, OutputTuple >
+                  {
+        typedef typename std::tuple_element<0, OutputTuple>::type T0;
+        typedef typename std::tuple_element<1, OutputTuple>::type T1;
+        typedef typename std::tuple_element<2, OutputTuple>::type T2;
+        typedef typename std::tuple_element<3, OutputTuple>::type T3;
+    public:
+        typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+                tag_matching_port<T3> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<tag_matching, input_ports_tuple_type, output_type > base_type;
+        typedef typename internal::function_body<T0, tag_value> *f0_p;
+        typedef typename internal::function_body<T1, tag_value> *f1_p;
+        typedef typename internal::function_body<T2, tag_value> *f2_p;
+        typedef typename internal::function_body<T3, tag_value> *f3_p;
+        typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p > func_initializer_type;
+    public:
+        template<typename B0, typename B1, typename B2, typename B3>
+        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3) : base_type(g,
+                func_initializer_type(
+                    new internal::function_body_leaf<T0, tag_value, B0>(b0),
+                    new internal::function_body_leaf<T1, tag_value, B1>(b1),
+                    new internal::function_body_leaf<T2, tag_value, B2>(b2),
+                    new internal::function_body_leaf<T3, tag_value, B3>(b3)
+                    ) ) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<typename OutputTuple>
+    class unfolded_join_node<5,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+        std::tuple<
+                tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>, 
+                tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<4,OutputTuple>::type>
+            >, OutputTuple >
+                  {
+        typedef typename std::tuple_element<0, OutputTuple>::type T0;
+        typedef typename std::tuple_element<1, OutputTuple>::type T1;
+        typedef typename std::tuple_element<2, OutputTuple>::type T2;
+        typedef typename std::tuple_element<3, OutputTuple>::type T3;
+        typedef typename std::tuple_element<4, OutputTuple>::type T4;
+    public:
+        typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+                tag_matching_port<T3>, tag_matching_port<T4> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<tag_matching, input_ports_tuple_type, output_type > base_type;
+        typedef typename internal::function_body<T0, tag_value> *f0_p;
+        typedef typename internal::function_body<T1, tag_value> *f1_p;
+        typedef typename internal::function_body<T2, tag_value> *f2_p;
+        typedef typename internal::function_body<T3, tag_value> *f3_p;
+        typedef typename internal::function_body<T4, tag_value> *f4_p;
+        typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p, f4_p > func_initializer_type;
+    public:
+        template<typename B0, typename B1, typename B2, typename B3, typename B4>
+        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) : base_type(g,
+                func_initializer_type(
+                    new internal::function_body_leaf<T0, tag_value, B0>(b0),
+                    new internal::function_body_leaf<T1, tag_value, B1>(b1),
+                    new internal::function_body_leaf<T2, tag_value, B2>(b2),
+                    new internal::function_body_leaf<T3, tag_value, B3>(b3),
+                    new internal::function_body_leaf<T4, tag_value, B4>(b4)
+                    ) ) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<typename OutputTuple>
+    class unfolded_join_node<6,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+        std::tuple<
+                tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>, 
+                tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<4,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<5,OutputTuple>::type>
+            >, OutputTuple >
+                  {
+        typedef typename std::tuple_element<0, OutputTuple>::type T0;
+        typedef typename std::tuple_element<1, OutputTuple>::type T1;
+        typedef typename std::tuple_element<2, OutputTuple>::type T2;
+        typedef typename std::tuple_element<3, OutputTuple>::type T3;
+        typedef typename std::tuple_element<4, OutputTuple>::type T4;
+        typedef typename std::tuple_element<5, OutputTuple>::type T5;
+    public:
+        typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+                tag_matching_port<T3>, tag_matching_port<T4>, tag_matching_port<T5> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<tag_matching, input_ports_tuple_type, output_type > base_type;
+        typedef typename internal::function_body<T0, tag_value> *f0_p;
+        typedef typename internal::function_body<T1, tag_value> *f1_p;
+        typedef typename internal::function_body<T2, tag_value> *f2_p;
+        typedef typename internal::function_body<T3, tag_value> *f3_p;
+        typedef typename internal::function_body<T4, tag_value> *f4_p;
+        typedef typename internal::function_body<T5, tag_value> *f5_p;
+        typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p > func_initializer_type;
+    public:
+        template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5>
+        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5) : base_type(g,
+                func_initializer_type(
+                    new internal::function_body_leaf<T0, tag_value, B0>(b0),
+                    new internal::function_body_leaf<T1, tag_value, B1>(b1),
+                    new internal::function_body_leaf<T2, tag_value, B2>(b2),
+                    new internal::function_body_leaf<T3, tag_value, B3>(b3),
+                    new internal::function_body_leaf<T4, tag_value, B4>(b4),
+                    new internal::function_body_leaf<T5, tag_value, B5>(b5)
+                    ) ) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<typename OutputTuple>
+    class unfolded_join_node<7,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+        std::tuple<
+                tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>, 
+                tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<4,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<5,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<6,OutputTuple>::type>
+            >, OutputTuple >
+                  {
+        typedef typename std::tuple_element<0, OutputTuple>::type T0;
+        typedef typename std::tuple_element<1, OutputTuple>::type T1;
+        typedef typename std::tuple_element<2, OutputTuple>::type T2;
+        typedef typename std::tuple_element<3, OutputTuple>::type T3;
+        typedef typename std::tuple_element<4, OutputTuple>::type T4;
+        typedef typename std::tuple_element<5, OutputTuple>::type T5;
+        typedef typename std::tuple_element<6, OutputTuple>::type T6;
+    public:
+        typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+                tag_matching_port<T3>, tag_matching_port<T4>, tag_matching_port<T5>, tag_matching_port<T6>
+            > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<tag_matching, input_ports_tuple_type, output_type > base_type;
+        typedef typename internal::function_body<T0, tag_value> *f0_p;
+        typedef typename internal::function_body<T1, tag_value> *f1_p;
+        typedef typename internal::function_body<T2, tag_value> *f2_p;
+        typedef typename internal::function_body<T3, tag_value> *f3_p;
+        typedef typename internal::function_body<T4, tag_value> *f4_p;
+        typedef typename internal::function_body<T5, tag_value> *f5_p;
+        typedef typename internal::function_body<T6, tag_value> *f6_p;
+        typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p > func_initializer_type;
+    public:
+        template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6>
+        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6) : base_type(g,
+                func_initializer_type(
+                    new internal::function_body_leaf<T0, tag_value, B0>(b0),
+                    new internal::function_body_leaf<T1, tag_value, B1>(b1),
+                    new internal::function_body_leaf<T2, tag_value, B2>(b2),
+                    new internal::function_body_leaf<T3, tag_value, B3>(b3),
+                    new internal::function_body_leaf<T4, tag_value, B4>(b4),
+                    new internal::function_body_leaf<T5, tag_value, B5>(b5),
+                    new internal::function_body_leaf<T6, tag_value, B6>(b6)
+                    ) ) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<typename OutputTuple>
+    class unfolded_join_node<8,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+        std::tuple<
+                tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>, 
+                tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<4,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<5,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<6,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<7,OutputTuple>::type>
+            >, OutputTuple >
+                  {
+        typedef typename std::tuple_element<0, OutputTuple>::type T0;
+        typedef typename std::tuple_element<1, OutputTuple>::type T1;
+        typedef typename std::tuple_element<2, OutputTuple>::type T2;
+        typedef typename std::tuple_element<3, OutputTuple>::type T3;
+        typedef typename std::tuple_element<4, OutputTuple>::type T4;
+        typedef typename std::tuple_element<5, OutputTuple>::type T5;
+        typedef typename std::tuple_element<6, OutputTuple>::type T6;
+        typedef typename std::tuple_element<7, OutputTuple>::type T7;
+    public:
+        typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+                tag_matching_port<T3>, tag_matching_port<T4>, tag_matching_port<T5>, tag_matching_port<T6>,
+                tag_matching_port<T7> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<tag_matching, input_ports_tuple_type, output_type > base_type;
+        typedef typename internal::function_body<T0, tag_value> *f0_p;
+        typedef typename internal::function_body<T1, tag_value> *f1_p;
+        typedef typename internal::function_body<T2, tag_value> *f2_p;
+        typedef typename internal::function_body<T3, tag_value> *f3_p;
+        typedef typename internal::function_body<T4, tag_value> *f4_p;
+        typedef typename internal::function_body<T5, tag_value> *f5_p;
+        typedef typename internal::function_body<T6, tag_value> *f6_p;
+        typedef typename internal::function_body<T7, tag_value> *f7_p;
+        typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p > func_initializer_type;
+    public:
+        template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7>
+        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7) : base_type(g,
+                func_initializer_type(
+                    new internal::function_body_leaf<T0, tag_value, B0>(b0),
+                    new internal::function_body_leaf<T1, tag_value, B1>(b1),
+                    new internal::function_body_leaf<T2, tag_value, B2>(b2),
+                    new internal::function_body_leaf<T3, tag_value, B3>(b3),
+                    new internal::function_body_leaf<T4, tag_value, B4>(b4),
+                    new internal::function_body_leaf<T5, tag_value, B5>(b5),
+                    new internal::function_body_leaf<T6, tag_value, B6>(b6),
+                    new internal::function_body_leaf<T7, tag_value, B7>(b7)
+                    ) ) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<typename OutputTuple>
+    class unfolded_join_node<9,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+        std::tuple<
+                tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>, 
+                tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<4,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<5,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<6,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<7,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<8,OutputTuple>::type>
+            >, OutputTuple >
+                  {
+        typedef typename std::tuple_element<0, OutputTuple>::type T0;
+        typedef typename std::tuple_element<1, OutputTuple>::type T1;
+        typedef typename std::tuple_element<2, OutputTuple>::type T2;
+        typedef typename std::tuple_element<3, OutputTuple>::type T3;
+        typedef typename std::tuple_element<4, OutputTuple>::type T4;
+        typedef typename std::tuple_element<5, OutputTuple>::type T5;
+        typedef typename std::tuple_element<6, OutputTuple>::type T6;
+        typedef typename std::tuple_element<7, OutputTuple>::type T7;
+        typedef typename std::tuple_element<8, OutputTuple>::type T8;
+    public:
+        typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+                tag_matching_port<T3>, tag_matching_port<T4>, tag_matching_port<T5>, tag_matching_port<T6>,
+                tag_matching_port<T7>, tag_matching_port<T8> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<tag_matching, input_ports_tuple_type, output_type > base_type;
+        typedef typename internal::function_body<T0, tag_value> *f0_p;
+        typedef typename internal::function_body<T1, tag_value> *f1_p;
+        typedef typename internal::function_body<T2, tag_value> *f2_p;
+        typedef typename internal::function_body<T3, tag_value> *f3_p;
+        typedef typename internal::function_body<T4, tag_value> *f4_p;
+        typedef typename internal::function_body<T5, tag_value> *f5_p;
+        typedef typename internal::function_body<T6, tag_value> *f6_p;
+        typedef typename internal::function_body<T7, tag_value> *f7_p;
+        typedef typename internal::function_body<T8, tag_value> *f8_p;
+        typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p, f8_p > func_initializer_type;
+    public:
+        template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8>
+        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7, B8 b8) : base_type(g,
+                func_initializer_type(
+                    new internal::function_body_leaf<T0, tag_value, B0>(b0),
+                    new internal::function_body_leaf<T1, tag_value, B1>(b1),
+                    new internal::function_body_leaf<T2, tag_value, B2>(b2),
+                    new internal::function_body_leaf<T3, tag_value, B3>(b3),
+                    new internal::function_body_leaf<T4, tag_value, B4>(b4),
+                    new internal::function_body_leaf<T5, tag_value, B5>(b5),
+                    new internal::function_body_leaf<T6, tag_value, B6>(b6),
+                    new internal::function_body_leaf<T7, tag_value, B7>(b7),
+                    new internal::function_body_leaf<T8, tag_value, B8>(b8)
+                    ) ) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    template<typename OutputTuple>
+    class unfolded_join_node<10,tag_matching_port,OutputTuple,tag_matching> : public internal::join_node_base<tag_matching,
+        std::tuple<
+                tag_matching_port<typename std::tuple_element<0,OutputTuple>::type>, 
+                tag_matching_port<typename std::tuple_element<1,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<2,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<3,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<4,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<5,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<6,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<7,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<8,OutputTuple>::type>,
+                tag_matching_port<typename std::tuple_element<9,OutputTuple>::type>
+            >, OutputTuple >
+                  {
+        typedef typename std::tuple_element<0, OutputTuple>::type T0;
+        typedef typename std::tuple_element<1, OutputTuple>::type T1;
+        typedef typename std::tuple_element<2, OutputTuple>::type T2;
+        typedef typename std::tuple_element<3, OutputTuple>::type T3;
+        typedef typename std::tuple_element<4, OutputTuple>::type T4;
+        typedef typename std::tuple_element<5, OutputTuple>::type T5;
+        typedef typename std::tuple_element<6, OutputTuple>::type T6;
+        typedef typename std::tuple_element<7, OutputTuple>::type T7;
+        typedef typename std::tuple_element<8, OutputTuple>::type T8;
+        typedef typename std::tuple_element<9, OutputTuple>::type T9;
+    public:
+        typedef typename std::tuple< tag_matching_port<T0>, tag_matching_port<T1>, tag_matching_port<T2>,
+                tag_matching_port<T3>, tag_matching_port<T4>, tag_matching_port<T5>, tag_matching_port<T6>,
+                tag_matching_port<T7>, tag_matching_port<T8>, tag_matching_port<T9> > input_ports_tuple_type;
+        typedef OutputTuple output_type;
+    private:
+        typedef join_node_base<tag_matching, input_ports_tuple_type, output_type > base_type;
+        typedef typename internal::function_body<T0, tag_value> *f0_p;
+        typedef typename internal::function_body<T1, tag_value> *f1_p;
+        typedef typename internal::function_body<T2, tag_value> *f2_p;
+        typedef typename internal::function_body<T3, tag_value> *f3_p;
+        typedef typename internal::function_body<T4, tag_value> *f4_p;
+        typedef typename internal::function_body<T5, tag_value> *f5_p;
+        typedef typename internal::function_body<T6, tag_value> *f6_p;
+        typedef typename internal::function_body<T7, tag_value> *f7_p;
+        typedef typename internal::function_body<T8, tag_value> *f8_p;
+        typedef typename internal::function_body<T9, tag_value> *f9_p;
+        typedef typename std::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p, f8_p, f9_p > func_initializer_type;
+    public:
+        template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9>
+        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7, B8 b8, B9 b9) : base_type(g,
+                func_initializer_type(
+                    new internal::function_body_leaf<T0, tag_value, B0>(b0),
+                    new internal::function_body_leaf<T1, tag_value, B1>(b1),
+                    new internal::function_body_leaf<T2, tag_value, B2>(b2),
+                    new internal::function_body_leaf<T3, tag_value, B3>(b3),
+                    new internal::function_body_leaf<T4, tag_value, B4>(b4),
+                    new internal::function_body_leaf<T5, tag_value, B5>(b5),
+                    new internal::function_body_leaf<T6, tag_value, B6>(b6),
+                    new internal::function_body_leaf<T7, tag_value, B7>(b7),
+                    new internal::function_body_leaf<T8, tag_value, B8>(b8),
+                    new internal::function_body_leaf<T9, tag_value, B9>(b9)
+                    ) ) {}
+        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}
+    };
+
+    //! templated function to refer to input ports of the join node
+    template<size_t N, typename JNT>
+    typename std::tuple_element<N, typename JNT::input_ports_tuple_type>::type &input_port(JNT &jn) {
+        return std::get<N>(jn.inputs());
+    }
+
+} 
+
+#endif // __TBB__flow_graph_join_impl_H
+
diff --git a/include/tbb/internal/_flow_graph_node_impl.h b/include/tbb/internal/_flow_graph_node_impl.h
new file mode 100644
index 0000000..de2fe40
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_node_impl.h
@@ -0,0 +1,473 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB__flow_graph_node_impl_H
+#define __TBB__flow_graph_node_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+#include "_flow_graph_item_buffer_impl.h"
+
+//! @cond INTERNAL
+namespace internal {
+
+    using tbb::internal::aggregated_operation;
+    using tbb::internal::aggregating_functor;
+    using tbb::internal::aggregator;
+
+     template< typename T, typename A >
+     class function_input_queue : public item_buffer<T,A> {
+     public:
+         bool pop( T& t ) {
+             return this->pop_front( t );
+         }
+
+         bool push( T& t ) {
+             return this->push_back( t );
+         }
+     };
+
+    //! Input and scheduling for a function node that takes a type Input as input
+    //  The only up-ref is apply_body_impl, which should implement the function 
+    //  call and any handling of the result.
+    template< typename Input, typename A, typename ImplType >
+    class function_input_base : public receiver<Input>, tbb::internal::no_assign {
+        typedef sender<Input> predecessor_type;
+        enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+        enum op_type {reg_pred, rem_pred, app_body, tryput, try_fwd};
+        typedef function_input_base<Input, A, ImplType> my_class;
+        
+    public:
+
+        //! The input type of this receiver
+        typedef Input input_type;
+        
+        //! Constructor for function_input_base
+        function_input_base( graph &g, size_t max_concurrency, function_input_queue<input_type,A> *q = NULL )
+            : my_root_task(g.root_task()), my_max_concurrency(max_concurrency), my_concurrency(0),
+              my_queue(q), forwarder_busy(false) {
+            my_predecessors.set_owner(this);
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+        
+        //! Copy constructor
+        function_input_base( const function_input_base& src, function_input_queue<input_type,A> *q = NULL ) :
+            receiver<Input>(), tbb::internal::no_assign(),
+            my_root_task( src.my_root_task), my_max_concurrency(src.my_max_concurrency),
+            my_concurrency(0), my_queue(q), forwarder_busy(false)
+        {
+            my_predecessors.set_owner(this);
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        //! Destructor
+        virtual ~function_input_base() { 
+            if ( my_queue ) delete my_queue;
+        }
+        
+        //! Put to the node
+        virtual bool try_put( const input_type &t ) {
+           if ( my_max_concurrency == 0 ) {
+               spawn_body_task( t );
+               return true;
+           } else {
+               my_operation op_data(t, tryput);
+               my_aggregator.execute(&op_data);
+               return op_data.status == SUCCEEDED;
+           }
+        }
+        
+        //! Adds src to the list of cached predecessors.
+        /* override */ bool register_predecessor( predecessor_type &src ) {
+            my_operation op_data(reg_pred);
+            op_data.r = &src;
+            my_aggregator.execute(&op_data);
+            return true;
+        }
+        
+        //! Removes src from the list of cached predecessors.
+        /* override */ bool remove_predecessor( predecessor_type &src ) {
+            my_operation op_data(rem_pred);
+            op_data.r = &src;
+            my_aggregator.execute(&op_data);
+            return true;
+        }
+
+    protected:
+
+        task *my_root_task;
+        const size_t my_max_concurrency;
+        size_t my_concurrency;
+        function_input_queue<input_type, A> *my_queue;
+        predecessor_cache<input_type, null_mutex > my_predecessors;
+        
+    private:
+
+        friend class apply_body_task< my_class, input_type >;
+        friend class forward_task< my_class >;
+        
+        class my_operation : public aggregated_operation< my_operation > {
+        public:
+            char type;
+            union {
+                input_type *elem;
+                predecessor_type *r;
+            };
+            my_operation(const input_type& e, op_type t) :
+                type(char(t)), elem(const_cast<input_type*>(&e)) {}
+            my_operation(op_type t) : type(char(t)), r(NULL) {}
+        };
+        
+        bool forwarder_busy;
+        typedef internal::aggregating_functor<my_class, my_operation> my_handler;
+        friend class internal::aggregating_functor<my_class, my_operation>;
+        aggregator< my_handler, my_operation > my_aggregator;
+        
+        void handle_operations(my_operation *op_list) {
+            my_operation *tmp;
+            while (op_list) {
+                tmp = op_list;
+                op_list = op_list->next;
+                switch (tmp->type) {
+                case reg_pred:
+                    my_predecessors.add(*(tmp->r));
+                    __TBB_store_with_release(tmp->status, SUCCEEDED);
+                    if (!forwarder_busy) {
+                        forwarder_busy = true;
+                        spawn_forward_task();
+                    }
+                    break;
+                case rem_pred:
+                    my_predecessors.remove(*(tmp->r));
+                    __TBB_store_with_release(tmp->status, SUCCEEDED);
+                    break;
+                case app_body:
+                    __TBB_ASSERT(my_max_concurrency != 0, NULL);
+                    --my_concurrency;
+                    __TBB_store_with_release(tmp->status, SUCCEEDED);
+                    if (my_concurrency<my_max_concurrency) {
+                        input_type i;
+                        bool item_was_retrieved = false;
+                        if ( my_queue )
+                            item_was_retrieved = my_queue->pop(i);
+                        else
+                            item_was_retrieved = my_predecessors.get_item(i);
+                        if (item_was_retrieved) {
+                            ++my_concurrency;
+                            spawn_body_task(i);
+                        }
+                    }
+                    break;
+                case tryput: internal_try_put(tmp);  break;
+                case try_fwd: internal_forward(tmp);  break;
+                }
+            }
+        }
+        
+        //! Put to the node
+        void internal_try_put(my_operation *op) {
+            __TBB_ASSERT(my_max_concurrency != 0, NULL);
+            if (my_concurrency < my_max_concurrency) {
+               ++my_concurrency;
+               spawn_body_task(*(op->elem));
+               __TBB_store_with_release(op->status, SUCCEEDED);
+           } else if ( my_queue && my_queue->push(*(op->elem)) ) { 
+               __TBB_store_with_release(op->status, SUCCEEDED);
+           } else {
+               __TBB_store_with_release(op->status, FAILED);
+           }
+        }
+        
+        //! Tries to spawn bodies if available and if concurrency allows
+        void internal_forward(my_operation *op) {
+            if (my_concurrency<my_max_concurrency || !my_max_concurrency) {
+                input_type i;
+                bool item_was_retrieved = false;
+                if ( my_queue )
+                    item_was_retrieved = my_queue->pop(i);
+                else
+                    item_was_retrieved = my_predecessors.get_item(i);
+                if (item_was_retrieved) {
+                    ++my_concurrency;
+                    __TBB_store_with_release(op->status, SUCCEEDED);
+                    spawn_body_task(i);
+                    return;
+                }
+            }
+            __TBB_store_with_release(op->status, FAILED);
+            forwarder_busy = false;
+        }
+        
+        //! Applies the body to the provided input
+        void apply_body( input_type &i ) {
+            static_cast<ImplType *>(this)->apply_body_impl(i);
+            if ( my_max_concurrency != 0 ) {
+                my_operation op_data(app_body);
+                my_aggregator.execute(&op_data);
+            }
+        }
+        
+       //! Spawns a task that calls apply_body( input )
+       inline void spawn_body_task( const input_type &input ) {
+           task::enqueue(*new(task::allocate_additional_child_of(*my_root_task)) apply_body_task< my_class, input_type >(*this, input));
+       }
+        
+       //! This is executed by an enqueued task, the "forwarder"
+       void forward() {
+           my_operation op_data(try_fwd);
+           do {
+               op_data.status = WAIT;
+               my_aggregator.execute(&op_data);
+           } while (op_data.status == SUCCEEDED);
+       }
+        
+       //! Spawns a task that calls forward()
+       inline void spawn_forward_task() {
+           task::enqueue(*new(task::allocate_additional_child_of(*my_root_task)) forward_task< my_class >(*this));
+       }
+    };  // function_input_base
+
+    //! Implements methods for a function node that takes a type Input as input and sends
+    //  a type Output to its successors.
+    template< typename Input, typename Output, typename A>
+    class function_input : public function_input_base<Input, A, function_input<Input,Output,A> > {
+    public:
+        typedef Input input_type;
+        typedef Output output_type;
+        typedef function_input<Input,Output,A> my_class;
+        typedef function_input_base<Input, A, my_class> base_type;
+        typedef function_input_queue<input_type, A> input_queue_type;
+
+
+        // constructor
+        template<typename Body>
+        function_input( graph &g, size_t max_concurrency, Body& body, function_input_queue<input_type,A> *q = NULL ) :
+            base_type(g, max_concurrency, q),
+            my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) {
+        }
+
+        //! Copy constructor
+        function_input( const function_input& src, input_queue_type *q = NULL ) : 
+                base_type(src, q),
+                my_body( src.my_body->clone() ) {
+        }
+
+        ~function_input() {
+            delete my_body;
+        }
+
+        template< typename Body >
+        Body copy_function_object() {
+            internal::function_body<input_type, output_type> &body_ref = *this->my_body;
+            return dynamic_cast< internal::function_body_leaf<input_type, output_type, Body> & >(body_ref).get_body(); 
+        } 
+
+        void apply_body_impl( const input_type &i) {
+            successors().try_put( (*my_body)(i) );
+        }
+
+    protected:
+        function_body<input_type, output_type> *my_body;
+        virtual broadcast_cache<output_type > &successors() = 0;
+
+    };
+
+#if TBB_PREVIEW_GRAPH_NODES
+    //! Implements methods for a function node that takes a type Input as input
+    //  and has a tuple of output ports specified.  
+    template< typename Input, typename OutputPortSet, typename A>
+    class multioutput_function_input : public function_input_base<Input, A, multioutput_function_input<Input,OutputPortSet,A> > {
+    public:
+        typedef Input input_type;
+        typedef OutputPortSet output_ports_type;
+        typedef multioutput_function_input<Input,OutputPortSet,A> my_class;
+        typedef function_input_base<Input, A, my_class> base_type;
+        typedef function_input_queue<input_type, A> input_queue_type;
+
+
+        // constructor
+        template<typename Body>
+        multioutput_function_input( 
+                graph &g, 
+                size_t max_concurrency, 
+                Body& body,
+                function_input_queue<input_type,A> *q = NULL ) :
+            base_type(g, max_concurrency, q),
+            my_body( new internal::multioutput_function_body_leaf<input_type, output_ports_type, Body>(body) ) {
+        }
+
+        //! Copy constructor
+        multioutput_function_input( const multioutput_function_input& src, input_queue_type *q = NULL ) : 
+                base_type(src, q),
+                my_body( src.my_body->clone() ) {
+        }
+
+        ~multioutput_function_input() {
+            delete my_body;
+        }
+
+        template< typename Body >
+        Body copy_function_object() {
+            internal::multioutput_function_body<input_type, output_ports_type> &body_ref = *this->my_body;
+            return dynamic_cast< internal::multioutput_function_body_leaf<input_type, output_ports_type, Body> & >(body_ref).get_body(); 
+        } 
+
+        void apply_body_impl( const input_type &i) {
+            (*my_body)(i, my_output_ports);
+        }
+
+        output_ports_type &output_ports(){ return my_output_ports; }
+
+    protected:
+        multioutput_function_body<input_type, output_ports_type> *my_body;
+        output_ports_type my_output_ports;
+
+    };
+
+    // template to refer to an output port of a multioutput_function_node
+    template<size_t N, typename MOP>
+    typename std::tuple_element<N, typename MOP::output_ports_type>::type &output_port(MOP &op) {
+        return std::get<N>(op.output_ports()); 
+    }
+
+// helper structs for split_node
+    template<int N>
+    struct emit_element {
+        template<typename T, typename P>
+        static void emit_this(const T &t, P &p) {
+            std::get<N-1>(p).put(std::get<N-1>(t));
+            emit_element<N-1>::emit_this(t,p);
+        }
+    };
+
+    template<>
+    struct emit_element<1> {
+        template<typename T, typename P>
+        static void emit_this(const T &t, P &p) {
+            std::get<0>(p).put(std::get<0>(t));
+        }
+    };
+#endif  // TBB_PREVIEW_GRAPH_NODES
+
+    //! Implements methods for an executable node that takes continue_msg as input
+    template< typename Output >
+    class continue_input : public continue_receiver {
+    public:
+        
+        //! The input type of this receiver
+        typedef continue_msg input_type;
+            
+        //! The output type of this receiver
+        typedef Output output_type;
+        
+        template< typename Body >
+        continue_input( graph &g, Body& body )
+            : my_root_task(g.root_task()), 
+             my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }
+        
+        template< typename Body >
+        continue_input( graph &g, int number_of_predecessors, Body& body )
+            : continue_receiver( number_of_predecessors ), my_root_task(g.root_task()), 
+             my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }
+
+        continue_input( const continue_input& src ) : continue_receiver(src), 
+            my_root_task(src.my_root_task), my_body( src.my_body->clone() ) {}
+
+        template< typename Body >
+        Body copy_function_object() {
+            internal::function_body<input_type, output_type> &body_ref = *my_body;
+            return dynamic_cast< internal::function_body_leaf<input_type, output_type, Body> & >(body_ref).get_body(); 
+        } 
+
+    protected:
+        
+        task *my_root_task;
+        function_body<input_type, output_type> *my_body;
+        
+        virtual broadcast_cache<output_type > &successors() = 0; 
+        
+        friend class apply_body_task< continue_input< Output >, continue_msg >;
+        
+        //! Applies the body to the provided input
+        /* override */ void apply_body( input_type ) {
+            successors().try_put( (*my_body)( continue_msg() ) );
+        }
+        
+        //! Spawns a task that applies the body
+        /* override */ void execute( ) {
+            task::enqueue( * new ( task::allocate_additional_child_of( *my_root_task ) ) 
+               apply_body_task< continue_input< Output >, continue_msg >( *this, continue_msg() ) ); 
+        }
+
+    };
+        
+    //! Implements methods for both executable and function nodes that puts Output to its successors
+    template< typename Output >
+    class function_output : public sender<Output> {
+    public:
+        
+        typedef Output output_type;
+        
+        function_output() { my_successors.set_owner(this); }
+        function_output(const function_output & /*other*/) : sender<output_type>() {
+            my_successors.set_owner(this);
+        }
+        
+        //! Adds a new successor to this node
+        /* override */ bool register_successor( receiver<output_type> &r ) {
+            successors().register_successor( r );
+            return true;
+        }
+        
+        //! Removes a successor from this node
+        /* override */ bool remove_successor( receiver<output_type> &r ) {
+            successors().remove_successor( r );
+            return true;
+        }
+
+        // for multioutput_function_node.  The function_body that implements
+        // the node will have an input and an output tuple of ports.  To put
+        // an item to a successor, the body should
+        //
+        //    get<I>(output_ports).put(output_value);
+        //
+        // successors must always accept (for instance, a queue_node) or items
+        // may be dropped.
+        void put(const output_type &i) { my_successors.try_put(i); }
+          
+    protected:
+        broadcast_cache<output_type> my_successors;
+        broadcast_cache<output_type > &successors() { return my_successors; } 
+        
+    };
+
+}  // internal
+
+#endif // __TBB__flow_graph_node_impl_H
diff --git a/include/tbb/internal/_flow_graph_or_impl.h b/include/tbb/internal/_flow_graph_or_impl.h
new file mode 100644
index 0000000..f17f536
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_or_impl.h
@@ -0,0 +1,268 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB__flow_graph_or_impl_H
+#define __TBB__flow_graph_or_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+#if TBB_PREVIEW_GRAPH_NODES
+#include "tbb/internal/_flow_graph_types_impl.h"
+
+namespace internal {
+
+    // Output of the or_node is a struct containing a std::tuple, and will be of
+    // the form
+    //
+    //  struct {
+    //     size_t indx;
+    //     tuple_types result;
+    //  };
+    //
+    //  where the value of indx will indicate which result was put to the
+    //  successor. So if oval is the output to the successor, indx == 0 
+    //  means std::get<0>(oval.result) is the output, and so on.
+    //
+    //  tuple_types is the tuple that specified the possible outputs (and
+    //  the corresponding inputs to the or_node.)
+    //
+    //  the types of each element are represented by tuple_types, a typedef
+    //  in the or_node.  So the 2nd type in the union that is the
+    //  output type for an or_node OrType is
+    //
+    //      std::tuple_element<1,OrType::tuple_types>::type
+
+    // the struct has an OutputTuple default constructed, with element index assigned
+    // the actual output value.
+    template<typename OutputTuple>
+    struct or_output_type {
+        typedef OutputTuple tuple_types;
+        typedef struct {
+            size_t indx;
+            OutputTuple result;
+        } type;
+    };
+
+    template<typename TupleTypes,int N>
+    struct or_item_helper {
+        template<typename OutputType>
+        static inline void create_output_value(OutputType &o, void *v) {
+            o.indx = N;
+            std::get<N>(o.result) = *(reinterpret_cast<typename std::tuple_element<N, TupleTypes>::type *>(v));
+        }
+    };
+
+    template<typename TupleTypes,int N>
+    struct or_helper {
+        template<typename OutputType>
+        static inline void create_output(OutputType &o, size_t i, void* v) {
+            if(i == N-1) {
+                or_item_helper<TupleTypes,N-1>::create_output_value(o,v);
+            }
+            else
+                or_helper<TupleTypes,N-1>::create_output(o,i,v);
+        }
+        template<typename PortTuple, typename PutBase>
+        static inline void set_or_node_pointer(PortTuple &my_input, PutBase *p) {
+            std::get<N-1>(my_input).set_up(p, N-1);
+            or_helper<TupleTypes,N-1>::set_or_node_pointer(my_input, p);
+        }
+    };
+
+    template<typename TupleTypes>
+    struct or_helper<TupleTypes,1> {
+        template<typename OutputType>
+        static inline void create_output(OutputType &o, size_t i, void* v) {
+            if(i == 0) {
+                or_item_helper<TupleTypes,0>::create_output_value(o,v);
+            }
+        }
+        template<typename PortTuple, typename PutBase>
+        static inline void set_or_node_pointer(PortTuple &my_input, PutBase *p) {
+            std::get<0>(my_input).set_up(p, 0);
+        }
+    };
+
+    struct put_base {
+        virtual bool try_put_with_index(size_t index, void *v) = 0;
+        virtual ~put_base() { }
+    };
+
+    template<typename T>
+    class or_input_port : public receiver<T> {
+    private:
+        size_t my_index;
+        put_base *my_or_node;
+    public:
+        void set_up(put_base *p, size_t i) { my_index = i; my_or_node = p; }
+        bool try_put(const T &v) {
+            return my_or_node->try_put_with_index(my_index, reinterpret_cast<void *>(const_cast<T*>(&v)));
+        }
+    };
+
+    template<typename InputTuple, typename OutputType, typename StructTypes>
+    class or_node_FE : public put_base {
+    public:
+        static const int N = std::tuple_size<InputTuple>::value;
+        typedef OutputType output_type;
+        typedef InputTuple input_type;
+
+        or_node_FE( ) {
+            or_helper<StructTypes,N>::set_or_node_pointer(my_inputs, this);
+        }
+
+        input_type &inputs() { return my_inputs; }
+    protected:
+        input_type my_inputs;
+    };
+
+    //! or_node_base
+    template<typename InputTuple, typename OutputType, typename StructTypes>
+    class or_node_base : public graph_node, public or_node_FE<InputTuple, OutputType,StructTypes>,
+                           public sender<OutputType> {
+    public:
+        static const size_t N = std::tuple_size<InputTuple>::value;
+        typedef OutputType output_type;
+        typedef StructTypes tuple_types;
+        typedef receiver<output_type> successor_type;
+        typedef or_node_FE<InputTuple, output_type,StructTypes> input_ports_type;
+
+    private:
+        // ----------- Aggregator ------------
+        enum op_type { reg_succ, rem_succ, try__put };
+        enum op_stat {WAIT=0, SUCCEEDED, FAILED};
+        typedef or_node_base<InputTuple,output_type,StructTypes> my_class;
+
+        class or_node_base_operation : public aggregated_operation<or_node_base_operation> {
+        public:
+            char type;
+            size_t indx;
+            union {
+                void *my_arg;
+                successor_type *my_succ;
+            };
+            or_node_base_operation(size_t i, const void* e, op_type t) :
+                type(char(t)), indx(i), my_arg(const_cast<void *>(e)) {}
+            or_node_base_operation(const successor_type &s, op_type t) : type(char(t)), 
+                my_succ(const_cast<successor_type *>(&s)) {}
+            or_node_base_operation(op_type t) : type(char(t)) {}
+        };
+
+        typedef internal::aggregating_functor<my_class, or_node_base_operation> my_handler;
+        friend class internal::aggregating_functor<my_class, or_node_base_operation>;
+        aggregator<my_handler, or_node_base_operation> my_aggregator;
+
+        void handle_operations(or_node_base_operation* op_list) {
+            or_node_base_operation *current;
+            while(op_list) {
+                current = op_list;
+                op_list = op_list->next;
+                switch(current->type) {
+
+                case reg_succ:
+                    my_successors.register_successor(*(current->my_succ));
+                    __TBB_store_with_release(current->status, SUCCEEDED);
+                    break;
+
+                case rem_succ:
+                    my_successors.remove_successor(*(current->my_succ));
+                    __TBB_store_with_release(current->status, SUCCEEDED);
+                    break;
+
+                case try__put:
+                    output_type oval;
+                    or_helper<tuple_types,N>::create_output(oval,current->indx,current->my_arg);
+                    bool res = my_successors.try_put(oval);
+                    __TBB_store_with_release(current->status, res ? SUCCEEDED : FAILED);
+                    break;
+                }
+            }
+        }
+        // ---------- end aggregator -----------
+    public:
+        or_node_base( ) : input_ports_type() {
+            my_successors.set_owner(this);
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        or_node_base( const or_node_base& /*other*/) : input_ports_type() {
+            my_successors.set_owner(this);
+            my_aggregator.initialize_handler(my_handler(this));
+        }
+
+        bool register_successor(successor_type &r) {
+            or_node_base_operation op_data(r, reg_succ);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+        bool remove_successor( successor_type &r) {
+            or_node_base_operation op_data(r, rem_succ);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+        bool try_put_with_index(size_t indx, void *v) {
+            or_node_base_operation op_data(indx, v, try__put);
+            my_aggregator.execute(&op_data);
+            return op_data.status == SUCCEEDED;
+        }
+
+    private:
+        broadcast_cache<output_type, null_rw_mutex> my_successors;
+    };
+
+    // type generators
+    template<typename OutputTuple>
+    struct or_types {
+        static const int N = std::tuple_size<OutputTuple>::value;
+        typedef typename wrap_tuple_elements<N,or_input_port,OutputTuple>::type input_ports_tuple_type;
+        typedef typename or_output_type<OutputTuple>::type output_type;
+        typedef internal::or_node_FE<input_ports_tuple_type,output_type,OutputTuple> or_FE_type;
+        typedef internal::or_node_base<input_ports_tuple_type, output_type, OutputTuple> or_base_type;
+    };
+
+    template<class OutputTuple>
+    class unfolded_or_node : public or_types<OutputTuple>::or_base_type {
+    public:
+        typedef typename or_types<OutputTuple>::input_ports_tuple_type input_ports_tuple_type;
+        typedef OutputTuple tuple_types;
+        typedef typename or_types<OutputTuple>::output_type output_type;
+    private:
+        typedef typename or_types<OutputTuple>::or_base_type base_type;
+    public:
+        unfolded_or_node() : base_type() {}
+    };
+
+
+} /* namespace internal */
+#endif  // TBB_PREVIEW_GRAPH_NODES
+
+#endif  /* __TBB__flow_graph_or_impl_H */
diff --git a/include/tbb/internal/_flow_graph_tagged_buffer_impl.h b/include/tbb/internal/_flow_graph_tagged_buffer_impl.h
new file mode 100644
index 0000000..8b87fd1
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_tagged_buffer_impl.h
@@ -0,0 +1,212 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+// tagged buffer that can expand, and can support as many deletions as additions
+// list-based, with elements of list held in std::vector (for destruction management),
+// multiplicative hashing (like ets).  No synchronization built-in.
+//
+
+#ifndef __TBB__flow_graph_tagged_buffer_impl_H
+#define __TBB__flow_graph_tagged_buffer_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+template<typename TagType, typename ValueType, size_t NoTagMark>
+struct buffer_element {
+    TagType t;
+    ValueType v;
+    buffer_element *next;
+    buffer_element() : t(NoTagMark), next(NULL) {}
+};
+
+template
+    <
+     typename TagType, 
+     typename ValueType, 
+     size_t   NoTagMark = 0,
+     typename Allocator=tbb::cache_aligned_allocator< buffer_element<TagType,ValueType,NoTagMark> >
+    >
+class tagged_buffer {
+public:
+    static const size_t INITIAL_SIZE = 8;  // initial size of the hash pointer table
+    static const TagType NO_TAG = TagType(NoTagMark);
+    typedef ValueType value_type;
+    typedef buffer_element<TagType,ValueType, NO_TAG> element_type;
+    typedef value_type *pointer_type;
+    typedef std::vector<element_type, Allocator> list_array_type;
+    typedef typename Allocator::template rebind<element_type*>::other pointer_array_allocator_type;
+    typedef typename Allocator::template rebind<list_array_type>::other list_array_allocator;
+private:
+
+    size_t my_size;
+    size_t nelements;
+    element_type** array;
+    std::vector<element_type, Allocator> *lists;
+    element_type* free_list;
+
+    size_t mask() { return my_size - 1; }
+
+// #define ABYSMAL 1
+    static size_t hash(TagType t) {
+#if ABYSMAL
+        return (size_t)1;
+#else
+#if __TBB_WORDSIZE == 4
+        return uintptr_t(t)*0x9E3779B9;
+#else
+        return uintptr_t(t)*0x9E3779B97F4A7C15;
+#endif
+#endif
+    }
+
+    void set_up_free_list( element_type **p_free_list, list_array_type *la, size_t sz) {
+        for(size_t i=0; i < sz - 1; ++i ) {  // construct free list
+            (*la)[i].next = &((*la)[i+1]);
+            (*la)[i].t = NO_TAG;
+        }
+        (*la)[sz-1].next = NULL;
+        *p_free_list = &((*la)[0]);
+    }
+
+    void grow_array() {
+        // make the pointer array larger
+        element_type **new_array;
+        element_type **old_array = array;
+        size_t old_size = my_size;
+        my_size *=2;
+        new_array = pointer_array_allocator_type().allocate(my_size);
+        for(size_t i=0; i < my_size; ++i) new_array[i] = NULL;
+        list_array_type *new_list_array = new list_array_type(old_size, element_type(), Allocator());
+        set_up_free_list(&free_list, new_list_array, old_size );
+
+        for(size_t i=0; i < old_size; ++i) {
+            for( element_type* op = old_array[i]; op; op = op->next) {
+                internal_tagged_insert(new_array, my_size, op->t, op->v);
+            }
+        }
+        pointer_array_allocator_type().deallocate(old_array, old_size);
+
+        delete lists;  // destroy and deallocate instead
+        array = new_array;
+        lists = new_list_array;
+    }
+
+    void internal_tagged_insert( element_type **ar, size_t sz, TagType t, value_type v) {
+        size_t l_mask = sz-1;
+        size_t h = hash(t) & l_mask;
+        __TBB_ASSERT(free_list, "Error: free list not set up.");
+        element_type* my_elem = free_list; free_list = free_list->next;
+        my_elem->t = t;
+        my_elem->v = v;
+        my_elem->next = ar[h];
+        ar[h] = my_elem;
+    }
+
+public:
+    tagged_buffer() : my_size(INITIAL_SIZE), nelements(0) {
+        array = pointer_array_allocator_type().allocate(my_size);
+        for(size_t i = 0; i < my_size; ++i) array[i] = NULL;
+        lists = new list_array_type(INITIAL_SIZE/2, element_type(), Allocator());
+        set_up_free_list(&free_list, lists, INITIAL_SIZE/2);
+    }
+
+    ~tagged_buffer() {
+        if(array) {
+            pointer_array_allocator_type().deallocate(array, my_size); 
+        }
+        if(lists) {
+            delete lists;
+        }
+    }
+
+    bool tagged_insert(TagType t, value_type v) {
+        pointer_type p;
+        if(tagged_find_ref(t, p)) {
+            *p = v;  // replace the value
+            return false;
+        }
+        ++nelements;
+        if(nelements*2 > my_size) grow_array();
+        internal_tagged_insert(array, my_size, t, v);
+        return true;
+    }
+
+    // returns reference to array element.v
+    bool tagged_find_ref(TagType t, pointer_type &v) {
+        size_t i = hash(t) & mask();
+        for(element_type* p = array[i]; p; p = p->next) {
+            if(p->t == t) {
+                v = &(p->v);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    bool tagged_find( TagType t, value_type &v) {
+        value_type *p;
+        if(tagged_find_ref(t, p)) {
+            v = *p;
+            return true;
+        }
+        else
+            return false;
+    }
+
+    void tagged_delete(TagType t) {
+        size_t h = hash(t) & mask();
+        element_type* prev = NULL;
+        for(element_type* p = array[h]; p; prev = p, p = p->next) {
+            if(p->t == t) {
+                p->t = NO_TAG;
+                if(prev) prev->next = p->next;
+                else array[h] = p->next;
+                p->next = free_list;
+                free_list = p;
+                --nelements;
+                return;
+            }
+        }
+        __TBB_ASSERT(false, "tag not found for delete");
+    }
+
+    // search for v in the array; if found {set t, return true} else return false
+    // we use this in join_node_FE to find if a tag's items are all available.
+    bool find_value_tag( TagType &t, value_type v) {
+        for(size_t i= 0; i < my_size / 2; ++i) {  // remember the vector is half the size of the hash array
+            if( (*lists)[i].t != NO_TAG && (*lists)[i].v == v) {
+                t = (*lists)[i].t;
+                return true;
+            }
+        }
+        return false;
+    }
+};
+#endif // __TBB__flow_graph_tagged_buffer_impl_H
diff --git a/include/tbb/internal/_flow_graph_types_impl.h b/include/tbb/internal/_flow_graph_types_impl.h
new file mode 100644
index 0000000..335b04f
--- /dev/null
+++ b/include/tbb/internal/_flow_graph_types_impl.h
@@ -0,0 +1,158 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB__flow_graph_types_impl_H
+#define __TBB__flow_graph_types_impl_H
+
+#ifndef __TBB_flow_graph_H
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+namespace internal {
+// wrap each element of a tuple in a template, and make a tuple of the result.
+
+    template<int N, template<class> class PT, typename TypeTuple>
+    struct wrap_tuple_elements;
+
+    template<template<class> class PT, typename TypeTuple>
+    struct wrap_tuple_elements<1, PT, TypeTuple> {
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,TypeTuple>::type> >
+            type;
+    };
+
+    template<template<class> class PT, typename TypeTuple>
+    struct wrap_tuple_elements<2, PT, TypeTuple> {
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,TypeTuple>::type>, 
+                PT<typename std::tuple_element<1,TypeTuple>::type> >
+            type;
+    };
+
+    template<template<class> class PT, typename TypeTuple>
+    struct wrap_tuple_elements<3, PT, TypeTuple> {
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,TypeTuple>::type>,
+                PT<typename std::tuple_element<1,TypeTuple>::type>,
+                PT<typename std::tuple_element<2,TypeTuple>::type> >
+            type;
+    };
+
+    template<template<class> class PT, typename TypeTuple>
+    struct wrap_tuple_elements<4, PT, TypeTuple> {
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,TypeTuple>::type>,
+                PT<typename std::tuple_element<1,TypeTuple>::type>,
+                PT<typename std::tuple_element<2,TypeTuple>::type>,
+                PT<typename std::tuple_element<3,TypeTuple>::type> >
+            type;
+    };
+
+    template<template<class> class PT, typename TypeTuple>
+    struct wrap_tuple_elements<5, PT, TypeTuple> {
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,TypeTuple>::type>,
+                PT<typename std::tuple_element<1,TypeTuple>::type>,
+                PT<typename std::tuple_element<2,TypeTuple>::type>,
+                PT<typename std::tuple_element<3,TypeTuple>::type>,
+                PT<typename std::tuple_element<4,TypeTuple>::type> >
+            type;
+    };
+
+    template<template<class> class PT, typename TypeTuple>
+    struct wrap_tuple_elements<6, PT, TypeTuple> {
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,TypeTuple>::type>,
+                PT<typename std::tuple_element<1,TypeTuple>::type>,
+                PT<typename std::tuple_element<2,TypeTuple>::type>,
+                PT<typename std::tuple_element<3,TypeTuple>::type>,
+                PT<typename std::tuple_element<4,TypeTuple>::type>,
+                PT<typename std::tuple_element<5,TypeTuple>::type> >
+            type;
+    };
+
+    template<template<class> class PT, typename TypeTuple>
+    struct wrap_tuple_elements<7, PT, TypeTuple> {
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,TypeTuple>::type>,
+                PT<typename std::tuple_element<1,TypeTuple>::type>,
+                PT<typename std::tuple_element<2,TypeTuple>::type>,
+                PT<typename std::tuple_element<3,TypeTuple>::type>,
+                PT<typename std::tuple_element<4,TypeTuple>::type>,
+                PT<typename std::tuple_element<5,TypeTuple>::type>,
+                PT<typename std::tuple_element<6,TypeTuple>::type> >
+            type;
+    };
+
+    template<template<class> class PT, typename TypeTuple>
+    struct wrap_tuple_elements<8, PT, TypeTuple> {
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,TypeTuple>::type>,
+                PT<typename std::tuple_element<1,TypeTuple>::type>,
+                PT<typename std::tuple_element<2,TypeTuple>::type>,
+                PT<typename std::tuple_element<3,TypeTuple>::type>,
+                PT<typename std::tuple_element<4,TypeTuple>::type>,
+                PT<typename std::tuple_element<5,TypeTuple>::type>,
+                PT<typename std::tuple_element<6,TypeTuple>::type>,
+                PT<typename std::tuple_element<7,TypeTuple>::type> >
+            type;
+    };
+
+    template<template<class> class PT, typename TypeTuple>
+    struct wrap_tuple_elements<9, PT, TypeTuple> {
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,TypeTuple>::type>,
+                PT<typename std::tuple_element<1,TypeTuple>::type>,
+                PT<typename std::tuple_element<2,TypeTuple>::type>,
+                PT<typename std::tuple_element<3,TypeTuple>::type>,
+                PT<typename std::tuple_element<4,TypeTuple>::type>,
+                PT<typename std::tuple_element<5,TypeTuple>::type>,
+                PT<typename std::tuple_element<6,TypeTuple>::type>,
+                PT<typename std::tuple_element<7,TypeTuple>::type>,
+                PT<typename std::tuple_element<8,TypeTuple>::type> >
+            type;
+    };
+
+    template<template<class> class PT, typename TypeTuple>
+    struct wrap_tuple_elements<10, PT, TypeTuple> {
+        typedef typename std::tuple<
+                PT<typename std::tuple_element<0,TypeTuple>::type>,
+                PT<typename std::tuple_element<1,TypeTuple>::type>,
+                PT<typename std::tuple_element<2,TypeTuple>::type>,
+                PT<typename std::tuple_element<3,TypeTuple>::type>,
+                PT<typename std::tuple_element<4,TypeTuple>::type>,
+                PT<typename std::tuple_element<5,TypeTuple>::type>,
+                PT<typename std::tuple_element<6,TypeTuple>::type>,
+                PT<typename std::tuple_element<7,TypeTuple>::type>,
+                PT<typename std::tuple_element<8,TypeTuple>::type>,
+                PT<typename std::tuple_element<9,TypeTuple>::type> >
+            type;
+    };
+
+}  // namespace internal
+#endif  /* __TBB__flow_graph_types_impl_H */
diff --git a/include/tbb/_tbb_windef.h b/include/tbb/internal/_tbb_windef.h
similarity index 94%
rename from include/tbb/_tbb_windef.h
rename to include/tbb/internal/_tbb_windef.h
index dd96c60..bda75c7 100644
--- a/include/tbb/_tbb_windef.h
+++ b/include/tbb/internal/_tbb_windef.h
@@ -27,7 +27,7 @@
 */
 
 #ifndef __TBB_tbb_windef_H
-#error Do not #include this file directly.  Use "#include tbb/tbb_stddef.h" instead.
+#error Do not #include this internal file directly; use public TBB headers instead.
 #endif /* __TBB_tbb_windef_H */
 
 // Check that the target Windows version has all API calls requried for TBB.
@@ -60,11 +60,7 @@ namespace std {
 #            pragma message(__FILE__ "(" __TBB_STRING(__LINE__) ") : Warning: Recommend using /MD if compiling with TBB_USE_DEBUG==0")
 #        endif
 #    endif
-#else
-#    ifdef _DEBUG
-#        define TBB_USE_DEBUG 1
-#    endif
-#endif 
+#endif
 
 #if __TBB_BUILD && !defined(__TBB_NO_IMPLICIT_LINKAGE)
 #define __TBB_NO_IMPLICIT_LINKAGE 1
diff --git a/include/tbb/machine/gcc_generic.h b/include/tbb/machine/gcc_generic.h
new file mode 100644
index 0000000..0192fde
--- /dev/null
+++ b/include/tbb/machine/gcc_generic.h
@@ -0,0 +1,74 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_gcc_generic_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
+#endif
+
+#define __TBB_machine_gcc_generic_H
+
+#include <stdint.h>
+#include <unistd.h>
+
+#define __TBB_WORDSIZE      __SIZEOF_INT__
+
+// For some reason straight mapping does not work on mingw
+#if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__
+    #define __TBB_BIG_ENDIAN    0
+#elif __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__
+    #define __TBB_BIG_ENDIAN    1
+#else
+#error Unsupported endianness
+#endif
+
+/** As this generic implementation has absolutely no information about underlying
+    hardware, its performance most likely will be sub-optimal because of full memory
+    fence usages where a more lightweight synchronization means (or none at all)
+    could suffice. Thus if you use this header to enable TBB on a new platform,
+    consider forking it and relaxing below helpers as appropriate. **/
+#define __TBB_acquire_consistency_helper()  __sync_synchronize()
+#define __TBB_release_consistency_helper()  __sync_synchronize()
+#define __TBB_full_memory_fence()           __sync_synchronize()
+#define __TBB_control_consistency_helper()  __sync_synchronize()
+
+#define __TBB_MACHINE_DEFINE_ATOMICS(S,T)                                                         \
+inline T __TBB_machine_cmpswp##S( volatile void *ptr, T value, T comparand ) {                    \
+    return __sync_val_compare_and_swap(reinterpret_cast<volatile T *>(ptr),comparand,value);      \
+}                                                                                                 \
+
+__TBB_MACHINE_DEFINE_ATOMICS(1,int8_t)
+__TBB_MACHINE_DEFINE_ATOMICS(2,int16_t)
+__TBB_MACHINE_DEFINE_ATOMICS(4,int32_t)
+__TBB_MACHINE_DEFINE_ATOMICS(8,int64_t)
+
+#undef __TBB_MACHINE_DEFINE_ATOMICS
+
+#define __TBB_USE_GENERIC_FETCH_ADD                 1
+#define __TBB_USE_GENERIC_FETCH_STORE               1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE    1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE        1
diff --git a/include/tbb/machine/ibm_aix51.h b/include/tbb/machine/ibm_aix51.h
index 54bd080..2cd606e 100644
--- a/include/tbb/machine/ibm_aix51.h
+++ b/include/tbb/machine/ibm_aix51.h
@@ -26,10 +26,14 @@
     the GNU General Public License.
 */
 
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+// TODO: revise by comparing with mac_ppc.h
+
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_ibm_aix51_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
 #endif
 
+#define __TBB_machine_ibm_aix51_H
+
 #define __TBB_WORDSIZE 8
 #define __TBB_BIG_ENDIAN 1
 
@@ -38,23 +42,36 @@
 #include <sched.h>
 
 extern "C" {
-
 int32_t __TBB_machine_cas_32 (volatile void* ptr, int32_t value, int32_t comparand);
 int64_t __TBB_machine_cas_64 (volatile void* ptr, int64_t value, int64_t comparand);
-void    __TBB_machine_flush  ();
-
+void __TBB_machine_flush ();
+void __TBB_machine_lwsync ();
+void __TBB_machine_isync ();
 }
 
-#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cas_32(P,V,C)
-#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cas_64(P,V,C)
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cas_64(P,V,C)
+// Mapping of old entry point names retained for the sake of backward binary compatibility
+#define __TBB_machine_cmpswp4 __TBB_machine_cas_32
+#define __TBB_machine_cmpswp8 __TBB_machine_cas_64
+
 #define __TBB_Yield() sched_yield()
 
+#define __TBB_USE_GENERIC_PART_WORD_CAS             1
+#define __TBB_USE_GENERIC_FETCH_ADD                 1
+#define __TBB_USE_GENERIC_FETCH_STORE               1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE    1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE        1
+
 #if __GNUC__
-#define __TBB_full_memory_fence() __asm__ __volatile__("sync": : :"memory")
-#define __TBB_release_consistency_helper() __asm__ __volatile__("lwsync": : :"memory")
+    #define __TBB_control_consistency_helper() __asm__ __volatile__( "isync": : :"memory")
+    #define __TBB_acquire_consistency_helper() __asm__ __volatile__("lwsync": : :"memory")
+    #define __TBB_release_consistency_helper() __asm__ __volatile__("lwsync": : :"memory")
+    #define __TBB_full_memory_fence()          __asm__ __volatile__(  "sync": : :"memory")
 #else
-// IBM C++ Compiler does not support inline assembly
-#define __TBB_full_memory_fence() __TBB_machine_flush ()
-#define __TBB_release_consistency_helper() __TBB_machine_flush ()
+    // IBM C++ Compiler does not support inline assembly
+    // TODO: Since XL 9.0 or earlier GCC syntax is supported. Replace with more
+    //       lightweight implementation (like in mac_ppc.h)
+    #define __TBB_control_consistency_helper() __TBB_machine_isync ()
+    #define __TBB_acquire_consistency_helper() __TBB_machine_lwsync ()
+    #define __TBB_release_consistency_helper() __TBB_machine_lwsync ()
+    #define __TBB_full_memory_fence()          __TBB_machine_flush ()
 #endif
diff --git a/include/tbb/machine/linux_common.h b/include/tbb/machine/linux_common.h
index 15b581c..2efa77d 100644
--- a/include/tbb/machine/linux_common.h
+++ b/include/tbb/machine/linux_common.h
@@ -27,7 +27,7 @@
 */
 
 #ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#error Do not #include this internal file directly; use public TBB headers instead.
 #endif
 
 #include <sched.h>
diff --git a/include/tbb/machine/linux_ia32.h b/include/tbb/machine/linux_ia32.h
index df080c4..3218341 100644
--- a/include/tbb/machine/linux_ia32.h
+++ b/include/tbb/machine/linux_ia32.h
@@ -26,18 +26,23 @@
     the GNU General Public License.
 */
 
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_linux_ia32_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
 #endif
 
+#define __TBB_machine_linux_ia32_H
+
 #include <stdint.h>
 #include <unistd.h>
 
 #define __TBB_WORDSIZE 4
 #define __TBB_BIG_ENDIAN 0
 
-#define __TBB_release_consistency_helper() __asm__ __volatile__("": : :"memory")
-#define __TBB_full_memory_fence() __asm__ __volatile__("mfence": : :"memory")
+#define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory")
+#define __TBB_control_consistency_helper() __TBB_compiler_fence()
+#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()
+#define __TBB_release_consistency_helper() __TBB_compiler_fence()
+#define __TBB_full_memory_fence()          __asm__ __volatile__("mfence": : :"memory")
 
 #if __TBB_ICC_ASM_VOLATILE_BROKEN
 #define __TBB_VOLATILE
@@ -45,7 +50,7 @@
 #define __TBB_VOLATILE volatile
 #endif
 
-#define __MACHINE_DECL_ATOMICS(S,T,X) \
+#define __TBB_MACHINE_DEFINE_ATOMICS(S,T,X,R)                                        \
 static inline T __TBB_machine_cmpswp##S (volatile void *ptr, T value, T comparand )  \
 {                                                                                    \
     T result;                                                                        \
@@ -61,7 +66,7 @@ static inline T __TBB_machine_fetchadd##S(volatile void *ptr, T addend)
 {                                                                                    \
     T result;                                                                        \
     __asm__ __volatile__("lock\nxadd" X " %0,%1"                                     \
-                          : "=r"(result), "=m"(*(__TBB_VOLATILE T*)ptr)              \
+                          : R (result), "=m"(*(__TBB_VOLATILE T*)ptr)                \
                           : "0"(addend), "m"(*(__TBB_VOLATILE T*)ptr)                \
                           : "memory");                                               \
     return result;                                                                   \
@@ -71,15 +76,21 @@ static inline  T __TBB_machine_fetchstore##S(volatile void *ptr, T value)
 {                                                                                    \
     T result;                                                                        \
     __asm__ __volatile__("lock\nxchg" X " %0,%1"                                     \
-                          : "=r"(result), "=m"(*(__TBB_VOLATILE T*)ptr)              \
+                          : R (result), "=m"(*(__TBB_VOLATILE T*)ptr)                \
                           : "0"(value), "m"(*(__TBB_VOLATILE T*)ptr)                 \
                           : "memory");                                               \
     return result;                                                                   \
 }                                                                                    \
                                                                                      
-__MACHINE_DECL_ATOMICS(1,int8_t,"")
-__MACHINE_DECL_ATOMICS(2,int16_t,"")
-__MACHINE_DECL_ATOMICS(4,int32_t,"l")
+__TBB_MACHINE_DEFINE_ATOMICS(1,int8_t,"","=q")
+__TBB_MACHINE_DEFINE_ATOMICS(2,int16_t,"","=r")
+__TBB_MACHINE_DEFINE_ATOMICS(4,int32_t,"l","=r")
+
+#if __INTEL_COMPILER
+#pragma warning( push )
+// reference to EBX in a function requiring stack alignment
+#pragma warning( disable: 998 )
+#endif
 
 static inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t comparand )
 {
@@ -130,6 +141,10 @@ static inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value,
     return result;
 }
 
+#if __INTEL_COMPILER
+#pragma warning( pop )
+#endif // warning 998 is back
+
 static inline int32_t __TBB_machine_lg( uint32_t x ) {
     int32_t j;
     __asm__ ("bsr %1,%0" : "=r"(j) : "r"(x));
@@ -184,46 +199,18 @@ static inline void __TBB_machine_store8(volatile void *ptr, int64_t value) {
 }
  
 // Machine specific atomic operations
-
-#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)
-#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)
-#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
-#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C)
-
-#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)
-#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)
-#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4(P,V)
-#define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchadd4(P,V)
-
-#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)
-#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
-#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4(P,V)
-#define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstore4(P,V)
-
-#define __TBB_Store8(P,V) __TBB_machine_store8(P,V)
-#define __TBB_Load8(P)    __TBB_machine_load8(P)
-
 #define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V)
 #define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)
 
-
-// Those we chose not to implement (they will be implemented generically using CMPSWP8)
-#undef __TBB_FetchAndAdd8
-#undef __TBB_FetchAndStore8
-
 // Definition of other functions
 #define __TBB_Pause(V) __TBB_machine_pause(V)
 #define __TBB_Log2(V)  __TBB_machine_lg(V)
 
-// Special atomic functions
-#define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAddW(P,V)
-#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)
-#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,-1)
-
-// Use generic definitions from tbb_machine.h
-#undef __TBB_TryLockByte
-#undef __TBB_LockByte
+#define __TBB_USE_GENERIC_DWORD_FETCH_ADD           1
+#define __TBB_USE_GENERIC_DWORD_FETCH_STORE         1
+#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE   1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE    1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE        1
 
 // API to retrieve/update FPU control setting
 #define __TBB_CPU_CTL_ENV_PRESENT 1
@@ -247,4 +234,3 @@ inline void __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* ctl ) {
             : : "m"(ctl->mxcsr), "m"(ctl->x87cw)
     );
 }
-
diff --git a/include/tbb/machine/linux_ia64.h b/include/tbb/machine/linux_ia64.h
index b815d3c..7d92936 100644
--- a/include/tbb/machine/linux_ia64.h
+++ b/include/tbb/machine/linux_ia64.h
@@ -26,64 +26,85 @@
     the GNU General Public License.
 */
 
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_linux_ia64_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
 #endif
 
+#define __TBB_machine_linux_ia64_H
+
 #include <stdint.h>
 #include <unistd.h>
 #include <ia64intrin.h>
 
 #define __TBB_WORDSIZE 8
 #define __TBB_BIG_ENDIAN 0
-#define __TBB_DECL_FENCED_ATOMICS 1
+
+#if __INTEL_COMPILER
+    #define __TBB_compiler_fence()
+    #define __TBB_control_consistency_helper() __TBB_compiler_fence()
+    #define __TBB_acquire_consistency_helper()
+    #define __TBB_release_consistency_helper()
+    #define __TBB_full_memory_fence()          __mf()
+#else
+    #define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory")
+    #define __TBB_control_consistency_helper() __TBB_compiler_fence()
+    // Even though GCC imbues volatile loads with acquire semantics, it sometimes moves 
+    // loads over the acquire fence. The following helpers stop such incorrect code motion.
+    #define __TBB_acquire_consistency_helper() __TBB_compiler_fence()
+    #define __TBB_release_consistency_helper() __TBB_compiler_fence()
+    #define __TBB_full_memory_fence()          __asm__ __volatile__("mf": : :"memory")
+#endif /* !__INTEL_COMPILER */
 
 // Most of the functions will be in a .s file
 
 extern "C" {
-    int8_t __TBB_machine_cmpswp1__TBB_full_fence (volatile void *ptr, int8_t value, int8_t comparand); 
     int8_t __TBB_machine_fetchadd1__TBB_full_fence (volatile void *ptr, int8_t addend);
     int8_t __TBB_machine_fetchadd1acquire(volatile void *ptr, int8_t addend);
     int8_t __TBB_machine_fetchadd1release(volatile void *ptr, int8_t addend);
-    int8_t __TBB_machine_fetchstore1acquire(volatile void *ptr, int8_t value);
-    int8_t __TBB_machine_fetchstore1release(volatile void *ptr, int8_t value);
 
-    int16_t __TBB_machine_cmpswp2__TBB_full_fence (volatile void *ptr, int16_t value, int16_t comparand);
     int16_t __TBB_machine_fetchadd2__TBB_full_fence (volatile void *ptr, int16_t addend);
     int16_t __TBB_machine_fetchadd2acquire(volatile void *ptr, int16_t addend);
     int16_t __TBB_machine_fetchadd2release(volatile void *ptr, int16_t addend);
+
+    int32_t __TBB_machine_fetchadd4__TBB_full_fence (volatile void *ptr, int32_t value);
+    int32_t __TBB_machine_fetchadd4acquire(volatile void *ptr, int32_t addend);
+    int32_t __TBB_machine_fetchadd4release(volatile void *ptr, int32_t addend);
+
+    int64_t __TBB_machine_fetchadd8__TBB_full_fence (volatile void *ptr, int64_t value);
+    int64_t __TBB_machine_fetchadd8acquire(volatile void *ptr, int64_t addend);
+    int64_t __TBB_machine_fetchadd8release(volatile void *ptr, int64_t addend);
+
+    int8_t __TBB_machine_fetchstore1__TBB_full_fence (volatile void *ptr, int8_t value);
+    int8_t __TBB_machine_fetchstore1acquire(volatile void *ptr, int8_t value);
+    int8_t __TBB_machine_fetchstore1release(volatile void *ptr, int8_t value);
+
+    int16_t __TBB_machine_fetchstore2__TBB_full_fence (volatile void *ptr, int16_t value);
     int16_t __TBB_machine_fetchstore2acquire(volatile void *ptr, int16_t value);
     int16_t __TBB_machine_fetchstore2release(volatile void *ptr, int16_t value);
 
     int32_t __TBB_machine_fetchstore4__TBB_full_fence (volatile void *ptr, int32_t value);
     int32_t __TBB_machine_fetchstore4acquire(volatile void *ptr, int32_t value);
     int32_t __TBB_machine_fetchstore4release(volatile void *ptr, int32_t value);
-    int32_t __TBB_machine_fetchadd4acquire(volatile void *ptr, int32_t addend);
-    int32_t __TBB_machine_fetchadd4release(volatile void *ptr, int32_t addend);
 
-    int64_t __TBB_machine_cmpswp8__TBB_full_fence (volatile void *ptr, int64_t value, int64_t comparand);
     int64_t __TBB_machine_fetchstore8__TBB_full_fence (volatile void *ptr, int64_t value);
     int64_t __TBB_machine_fetchstore8acquire(volatile void *ptr, int64_t value);
     int64_t __TBB_machine_fetchstore8release(volatile void *ptr, int64_t value);
-    int64_t __TBB_machine_fetchadd8acquire(volatile void *ptr, int64_t addend);
-    int64_t __TBB_machine_fetchadd8release(volatile void *ptr, int64_t addend);
 
+    int8_t __TBB_machine_cmpswp1__TBB_full_fence (volatile void *ptr, int8_t value, int8_t comparand); 
     int8_t __TBB_machine_cmpswp1acquire(volatile void *ptr, int8_t value, int8_t comparand); 
     int8_t __TBB_machine_cmpswp1release(volatile void *ptr, int8_t value, int8_t comparand); 
-    int8_t __TBB_machine_fetchstore1__TBB_full_fence (volatile void *ptr, int8_t value);
 
+    int16_t __TBB_machine_cmpswp2__TBB_full_fence (volatile void *ptr, int16_t value, int16_t comparand);
     int16_t __TBB_machine_cmpswp2acquire(volatile void *ptr, int16_t value, int16_t comparand); 
     int16_t __TBB_machine_cmpswp2release(volatile void *ptr, int16_t value, int16_t comparand); 
-    int16_t __TBB_machine_fetchstore2__TBB_full_fence (volatile void *ptr, int16_t value);
 
     int32_t __TBB_machine_cmpswp4__TBB_full_fence (volatile void *ptr, int32_t value, int32_t comparand);
     int32_t __TBB_machine_cmpswp4acquire(volatile void *ptr, int32_t value, int32_t comparand); 
     int32_t __TBB_machine_cmpswp4release(volatile void *ptr, int32_t value, int32_t comparand); 
-    int32_t __TBB_machine_fetchadd4__TBB_full_fence (volatile void *ptr, int32_t value);
 
+    int64_t __TBB_machine_cmpswp8__TBB_full_fence (volatile void *ptr, int64_t value, int64_t comparand);
     int64_t __TBB_machine_cmpswp8acquire(volatile void *ptr, int64_t value, int64_t comparand); 
     int64_t __TBB_machine_cmpswp8release(volatile void *ptr, int64_t value, int64_t comparand); 
-    int64_t __TBB_machine_fetchadd8__TBB_full_fence (volatile void *ptr, int64_t value);
 
     int64_t __TBB_machine_lg(uint64_t value);
     void __TBB_machine_pause(int32_t delay);
@@ -92,73 +113,71 @@ extern "C" {
 
     //! Retrieves the current RSE backing store pointer. IA64 specific.
     void* __TBB_get_bsp();
-}
-
-#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1__TBB_full_fence(P,V,C)
-#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2__TBB_full_fence(P,V,C) 
-
-#define __TBB_FetchAndAdd1(P,V)        __TBB_machine_fetchadd1__TBB_full_fence(P,V)
-#define __TBB_FetchAndAdd1acquire(P,V) __TBB_machine_fetchadd1acquire(P,V)
-#define __TBB_FetchAndAdd1release(P,V) __TBB_machine_fetchadd1release(P,V)
-#define __TBB_FetchAndAdd2(P,V)        __TBB_machine_fetchadd2__TBB_full_fence(P,V)
-#define __TBB_FetchAndAdd2acquire(P,V) __TBB_machine_fetchadd2acquire(P,V)
-#define __TBB_FetchAndAdd2release(P,V) __TBB_machine_fetchadd2release(P,V)
-#define __TBB_FetchAndAdd4acquire(P,V) __TBB_machine_fetchadd4acquire(P,V)
-#define __TBB_FetchAndAdd4release(P,V) __TBB_machine_fetchadd4release(P,V)
-#define __TBB_FetchAndAdd8acquire(P,V) __TBB_machine_fetchadd8acquire(P,V)
-#define __TBB_FetchAndAdd8release(P,V) __TBB_machine_fetchadd8release(P,V)
-
-#define __TBB_FetchAndStore1acquire(P,V) __TBB_machine_fetchstore1acquire(P,V)
-#define __TBB_FetchAndStore1release(P,V) __TBB_machine_fetchstore1release(P,V)
-#define __TBB_FetchAndStore2acquire(P,V) __TBB_machine_fetchstore2acquire(P,V)
-#define __TBB_FetchAndStore2release(P,V) __TBB_machine_fetchstore2release(P,V)
-#define __TBB_FetchAndStore4acquire(P,V) __TBB_machine_fetchstore4acquire(P,V)
-#define __TBB_FetchAndStore4release(P,V) __TBB_machine_fetchstore4release(P,V)
-#define __TBB_FetchAndStore8acquire(P,V) __TBB_machine_fetchstore8acquire(P,V)
-#define __TBB_FetchAndStore8release(P,V) __TBB_machine_fetchstore8release(P,V)
-
-#define __TBB_CompareAndSwap1acquire(P,V,C) __TBB_machine_cmpswp1acquire(P,V,C)
-#define __TBB_CompareAndSwap1release(P,V,C) __TBB_machine_cmpswp1release(P,V,C)
-#define __TBB_CompareAndSwap2acquire(P,V,C) __TBB_machine_cmpswp2acquire(P,V,C)
-#define __TBB_CompareAndSwap2release(P,V,C) __TBB_machine_cmpswp2release(P,V,C)
-#define __TBB_CompareAndSwap4(P,V,C)        __TBB_machine_cmpswp4__TBB_full_fence(P,V,C)
-#define __TBB_CompareAndSwap4acquire(P,V,C) __TBB_machine_cmpswp4acquire(P,V,C)
-#define __TBB_CompareAndSwap4release(P,V,C) __TBB_machine_cmpswp4release(P,V,C)
-#define __TBB_CompareAndSwap8(P,V,C)        __TBB_machine_cmpswp8__TBB_full_fence(P,V,C)
-#define __TBB_CompareAndSwap8acquire(P,V,C) __TBB_machine_cmpswp8acquire(P,V,C)
-#define __TBB_CompareAndSwap8release(P,V,C) __TBB_machine_cmpswp8release(P,V,C)
-
-#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4__TBB_full_fence(P,V)
-#define __TBB_FetchAndAdd8(P,V) __TBB_machine_fetchadd8__TBB_full_fence(P,V)
-
-#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1__TBB_full_fence(P,V)
-#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2__TBB_full_fence(P,V)
-#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4__TBB_full_fence(P,V)
-#define __TBB_FetchAndStore8(P,V) __TBB_machine_fetchstore8__TBB_full_fence(P,V)
-
-#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAdd8acquire(P,1)
-#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAdd8release(P,-1)
-
-#ifndef __INTEL_COMPILER
-/* Even though GCC imbues volatile loads with acquire semantics, 
-   it sometimes moves loads over the acquire fence.  The
-   fences defined here stop such incorrect code motion. */
-#define __TBB_release_consistency_helper() __asm__ __volatile__("": : :"memory")
-#define __TBB_full_memory_fence() __asm__ __volatile__("mf": : :"memory")
-#else
-#define __TBB_release_consistency_helper()
-#define __TBB_full_memory_fence() __mf()
-#endif /* __INTEL_COMPILER */
 
-// Special atomic functions
-#define __TBB_CompareAndSwapW(P,V,C)   __TBB_CompareAndSwap8(P,V,C)
-#define __TBB_FetchAndStoreW(P,V)      __TBB_FetchAndStore8(P,V)
-#define __TBB_FetchAndAddW(P,V)        __TBB_FetchAndAdd8(P,V)
-#define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAdd8release(P,V)
-
-// Not needed
-#undef __TBB_Store8
-#undef __TBB_Load8
+    int32_t __TBB_machine_load1_relaxed(const void *ptr);
+    int32_t __TBB_machine_load2_relaxed(const void *ptr);
+    int32_t __TBB_machine_load4_relaxed(const void *ptr);
+    int64_t __TBB_machine_load8_relaxed(const void *ptr);
+
+    void __TBB_machine_store1_relaxed(void *ptr, int32_t value);
+    void __TBB_machine_store2_relaxed(void *ptr, int32_t value);
+    void __TBB_machine_store4_relaxed(void *ptr, int32_t value);
+    void __TBB_machine_store8_relaxed(void *ptr, int64_t value);
+} // extern "C"
+
+// Mapping old entry points to the names corresponding to the new full_fence identifier.
+#define __TBB_machine_fetchadd1full_fence   __TBB_machine_fetchadd1__TBB_full_fence
+#define __TBB_machine_fetchadd2full_fence   __TBB_machine_fetchadd2__TBB_full_fence
+#define __TBB_machine_fetchadd4full_fence   __TBB_machine_fetchadd4__TBB_full_fence
+#define __TBB_machine_fetchadd8full_fence   __TBB_machine_fetchadd8__TBB_full_fence
+#define __TBB_machine_fetchstore1full_fence __TBB_machine_fetchstore1__TBB_full_fence
+#define __TBB_machine_fetchstore2full_fence __TBB_machine_fetchstore2__TBB_full_fence
+#define __TBB_machine_fetchstore4full_fence __TBB_machine_fetchstore4__TBB_full_fence
+#define __TBB_machine_fetchstore8full_fence __TBB_machine_fetchstore8__TBB_full_fence
+#define __TBB_machine_cmpswp1full_fence     __TBB_machine_cmpswp1__TBB_full_fence
+#define __TBB_machine_cmpswp2full_fence     __TBB_machine_cmpswp2__TBB_full_fence 
+#define __TBB_machine_cmpswp4full_fence     __TBB_machine_cmpswp4__TBB_full_fence
+#define __TBB_machine_cmpswp8full_fence     __TBB_machine_cmpswp8__TBB_full_fence
+
+// Mapping relaxed operations to the entry points implementing them.
+/** On IA64 RMW operations implicitly have acquire semantics. Thus one cannot
+    actually have completely relaxed RMW operation here. **/
+#define __TBB_machine_fetchadd1relaxed      __TBB_machine_fetchadd1acquire
+#define __TBB_machine_fetchadd2relaxed      __TBB_machine_fetchadd2acquire
+#define __TBB_machine_fetchadd4relaxed      __TBB_machine_fetchadd4acquire
+#define __TBB_machine_fetchadd8relaxed      __TBB_machine_fetchadd8acquire
+#define __TBB_machine_fetchstore1relaxed    __TBB_machine_fetchstore1acquire
+#define __TBB_machine_fetchstore2relaxed    __TBB_machine_fetchstore2acquire
+#define __TBB_machine_fetchstore4relaxed    __TBB_machine_fetchstore4acquire
+#define __TBB_machine_fetchstore8relaxed    __TBB_machine_fetchstore8acquire
+#define __TBB_machine_cmpswp1relaxed        __TBB_machine_cmpswp1acquire
+#define __TBB_machine_cmpswp2relaxed        __TBB_machine_cmpswp2acquire 
+#define __TBB_machine_cmpswp4relaxed        __TBB_machine_cmpswp4acquire
+#define __TBB_machine_cmpswp8relaxed        __TBB_machine_cmpswp8acquire
+
+#define __TBB_MACHINE_DEFINE_ATOMICS(S,V)                               \
+    template <typename T>                                               \
+    struct machine_load_store_relaxed<T,S> {                      \
+        static inline T load ( const T& location ) {                    \
+            return (T)__TBB_machine_load##S##_relaxed(&location);       \
+        }                                                               \
+        static inline void store ( T& location, T value ) {             \
+            __TBB_machine_store##S##_relaxed(&location, (V)value);      \
+        }                                                               \
+    }
+
+namespace tbb {
+namespace internal {
+    __TBB_MACHINE_DEFINE_ATOMICS(1,int8_t);
+    __TBB_MACHINE_DEFINE_ATOMICS(2,int16_t);
+    __TBB_MACHINE_DEFINE_ATOMICS(4,int32_t);
+    __TBB_MACHINE_DEFINE_ATOMICS(8,int64_t);
+}} // namespaces internal, tbb
+
+#undef __TBB_MACHINE_DEFINE_ATOMICS
+
+#define __TBB_USE_FENCED_ATOMICS 1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1
 
 // Definition of Lock functions
 #define __TBB_TryLockByte(P) __TBB_machine_trylockbyte(P)
@@ -167,4 +186,3 @@ extern "C" {
 // Definition of other utility functions
 #define __TBB_Pause(V) __TBB_machine_pause(V)
 #define __TBB_Log2(V)  __TBB_machine_lg(V)
-
diff --git a/include/tbb/machine/linux_intel64.h b/include/tbb/machine/linux_intel64.h
index 8d05762..8e34e08 100644
--- a/include/tbb/machine/linux_intel64.h
+++ b/include/tbb/machine/linux_intel64.h
@@ -26,24 +26,28 @@
     the GNU General Public License.
 */
 
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_linux_intel64_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
 #endif
 
+#define __TBB_machine_linux_intel64_H
+
 #include <stdint.h>
 #include <unistd.h>
 
 #define __TBB_WORDSIZE 8
 #define __TBB_BIG_ENDIAN 0
 
-#define __TBB_release_consistency_helper() __asm__ __volatile__("": : :"memory")
+#define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory")
+#define __TBB_control_consistency_helper() __TBB_compiler_fence()
+#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()
+#define __TBB_release_consistency_helper() __TBB_compiler_fence()
 
-// __TBB_full_memory_fence can be predefined
 #ifndef __TBB_full_memory_fence
 #define __TBB_full_memory_fence() __asm__ __volatile__("mfence": : :"memory")
 #endif
 
-#define __MACHINE_DECL_ATOMICS(S,T,X) \
+#define __TBB_MACHINE_DEFINE_ATOMICS(S,T,X)                                          \
 static inline T __TBB_machine_cmpswp##S (volatile void *ptr, T value, T comparand )  \
 {                                                                                    \
     T result;                                                                        \
@@ -75,10 +79,12 @@ static inline  T __TBB_machine_fetchstore##S(volatile void *ptr, T value)
     return result;                                                                   \
 }                                                                                    \
                                                                                      
-__MACHINE_DECL_ATOMICS(1,int8_t,"")
-__MACHINE_DECL_ATOMICS(2,int16_t,"")
-__MACHINE_DECL_ATOMICS(4,int32_t,"")
-__MACHINE_DECL_ATOMICS(8,int64_t,"q")
+__TBB_MACHINE_DEFINE_ATOMICS(1,int8_t,"")
+__TBB_MACHINE_DEFINE_ATOMICS(2,int16_t,"")
+__TBB_MACHINE_DEFINE_ATOMICS(4,int32_t,"")
+__TBB_MACHINE_DEFINE_ATOMICS(8,int64_t,"q")
+
+#undef __TBB_MACHINE_DEFINE_ATOMICS
 
 static inline int64_t __TBB_machine_lg( uint64_t x ) {
     int64_t j;
@@ -94,29 +100,6 @@ static inline void __TBB_machine_and( volatile void *ptr, uint64_t addend ) {
     __asm__ __volatile__("lock\nandq %1,%0" : "=m"(*(volatile uint64_t*)ptr) : "r"(addend), "m"(*(volatile uint64_t*)ptr) : "memory");
 }
 
-// Machine specific atomic operations
-
-#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)
-#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)
-#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
-#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)
-
-#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)
-#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)
-#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4(P,V)
-#define __TBB_FetchAndAdd8(P,V)  __TBB_machine_fetchadd8(P,V)
-#define __TBB_FetchAndAddW(P,V)  __TBB_machine_fetchadd8(P,V)
-
-#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)
-#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
-#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4(P,V)
-#define __TBB_FetchAndStore8(P,V)  __TBB_machine_fetchstore8(P,V)
-#define __TBB_FetchAndStoreW(P,V)  __TBB_machine_fetchstore8(P,V)
-
-#undef __TBB_Store8
-#undef __TBB_Load8
-
 #define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V)
 #define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)
 
@@ -129,17 +112,13 @@ static inline void __TBB_machine_pause( int32_t delay ) {
     return;
 }
 #define __TBB_Pause(V) __TBB_machine_pause(V)
-#endif
-#define __TBB_Log2(V)    __TBB_machine_lg(V)
+#endif /* !__TBB_Pause */
 
-// Special atomic functions
-#define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAddW(P,V)
-#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)
-#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,-1)
+#define __TBB_Log2(V)  __TBB_machine_lg(V)
 
-// Use generic definitions from tbb_machine.h
-#undef __TBB_TryLockByte
-#undef __TBB_LockByte
+#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE   1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE    1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE        1
 
 // API to retrieve/update FPU control setting
 #ifndef __TBB_CPU_CTL_ENV_PRESENT
@@ -151,11 +130,21 @@ struct __TBB_cpu_ctl_env_t {
 };
 
 inline void __TBB_get_cpu_ctl_env ( __TBB_cpu_ctl_env_t* ctl ) {
+#if __TBB_ICC_12_0_INL_ASM_FSTCW_BROKEN
+    __TBB_cpu_ctl_env_t loc_ctl;
+    __asm__ __volatile__ (
+            "stmxcsr %0\n\t"
+            "fstcw %1"
+            : "=m"(loc_ctl.mxcsr), "=m"(loc_ctl.x87cw)
+    );
+    *ctl = loc_ctl;
+#else
     __asm__ __volatile__ (
             "stmxcsr %0\n\t"
             "fstcw %1"
             : "=m"(ctl->mxcsr), "=m"(ctl->x87cw)
     );
+#endif
 }
 inline void __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* ctl ) {
     __asm__ __volatile__ (
@@ -164,4 +153,4 @@ inline void __TBB_set_cpu_ctl_env ( const __TBB_cpu_ctl_env_t* ctl ) {
             : : "m"(ctl->mxcsr), "m"(ctl->x87cw)
     );
 }
-#endif
+#endif /* !__TBB_CPU_CTL_ENV_PRESENT */
diff --git a/include/tbb/machine/mac_ppc.h b/include/tbb/machine/mac_ppc.h
index 3114039..bb7bd8a 100644
--- a/include/tbb/machine/mac_ppc.h
+++ b/include/tbb/machine/mac_ppc.h
@@ -26,93 +26,279 @@
     the GNU General Public License.
 */
 
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_gcc_power_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
 #endif
 
+#define __TBB_machine_gcc_power_H
+
 #include <stdint.h>
 #include <unistd.h>
 
-// This file is for PowerPC with compilers supporting GNU inline-assembler syntax (currently GNU g++ and IBM XL).
+// TODO: rename to gcc_power.h?
+// This file is for Power Architecture with compilers supporting GNU inline-assembler syntax (currently GNU g++ and IBM XL).
+// Note that XL V9.0 (sometimes?) has trouble dealing with empty input and/or clobber lists, so they should be avoided.
+
+#if __powerpc64__ || __ppc64__
+    // IBM XL documents __powerpc64__ (and __PPC64__).
+    // Apple documents __ppc64__ (with __ppc__ only on 32-bit).
+    #define __TBB_WORDSIZE 8
+#else
+    #define __TBB_WORDSIZE 4
+#endif
+
+// On Power Architecture, (lock-free) 64-bit atomics require 64-bit hardware:
+#if __TBB_WORDSIZE==8
+    // Do not change the following definition, because TBB itself will use 64-bit atomics in 64-bit builds.
+    #define __TBB_64BIT_ATOMICS 1
+#elif __bgp__
+    // Do not change the following definition on known 32-bit hardware.
+    #define __TBB_64BIT_ATOMICS 0
+#else
+    // To enable 64-bit atomics in 32-bit builds, set the value below to 1 instead of 0.
+    // You must make certain that the program will only use them on actual 64-bit hardware
+    // (which typically means that the entire program is only executed on such hardware),
+    // because their implementation involves machine instructions that are illegal elsewhere.
+    // The setting can be chosen independently per compilation unit,
+    // which also means that TBB itself does not need to be rebuilt.
+    // Alternatively (but only for the current architecture and TBB version),
+    // override the default as a predefined macro when invoking the compiler.
+    #ifndef __TBB_64BIT_ATOMICS
+    #define __TBB_64BIT_ATOMICS 0
+    #endif
+#endif
 
-// Motivation for use of "#if defined(__powerpc64__) || defined(__ppc64__)" to detect a 64-bit environment:
-// IBM XL documents both __powerpc64__ and __PPC64__, and these also appear to work on g++ (documentation?)
-// Apple documents __ppc64__ (with __ppc__ only 32-bit, which is not portable even to other environments using g++)
 inline int32_t __TBB_machine_cmpswp4 (volatile void *ptr, int32_t value, int32_t comparand )
 {
     int32_t result;
 
     __asm__ __volatile__("sync\n"
-                         "0: lwarx %0,0,%2\n\t"  /* load w/ reservation */
-                         "cmpw %0,%4\n\t"        /* compare against comparand */
-                         "bne- 1f\n\t"           /* exit if not same */
-                         "stwcx. %3,0,%2\n\t"    /* store new_value */
-                         "bne- 0b\n"             /* retry if reservation lost */
-                         "1: sync"               /* the exit */
-                          : "=&r"(result), "=m"(* (int32_t*) ptr)
-                          : "r"(ptr), "r"(value), "r"(comparand), "m"(* (int32_t*) ptr)
-                          : "cr0", "memory");
+                         "0:\n\t"
+                         "lwarx %[res],0,%[ptr]\n\t"     /* load w/ reservation */
+                         "cmpw %[res],%[cmp]\n\t"        /* compare against comparand */
+                         "bne- 1f\n\t"                   /* exit if not same */
+                         "stwcx. %[val],0,%[ptr]\n\t"    /* store new value */
+                         "bne- 0b\n"                     /* retry if reservation lost */
+                         "1:\n\t"                        /* the exit */
+                         "isync"
+                         : [res]"=&r"(result)
+                         , "+m"(* (int32_t*) ptr)        /* redundant with "memory" */
+                         : [ptr]"r"(ptr)
+                         , [val]"r"(value)
+                         , [cmp]"r"(comparand)
+                         : "memory"                      /* compiler full fence */
+                         , "cr0"                         /* clobbered by cmp and/or stwcx. */
+                         );
     return result;
 }
 
-#if defined(__powerpc64__) || defined(__ppc64__)
+#if __TBB_WORDSIZE==8
 
 inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t comparand )
 {
     int64_t result;
     __asm__ __volatile__("sync\n"
-                         "0: ldarx %0,0,%2\n\t"  /* load w/ reservation */
-                         "cmpd %0,%4\n\t"        /* compare against comparand */
-                         "bne- 1f\n\t"           /* exit if not same */
-                         "stdcx. %3,0,%2\n\t"    /* store new_value */
-                         "bne- 0b\n"             /* retry if reservation lost */
-                         "1: sync"               /* the exit */
-                          : "=&r"(result), "=m"(* (int64_t*) ptr)
-                          : "r"(ptr), "r"(value), "r"(comparand), "m"(* (int64_t*) ptr)
-                          : "cr0", "memory");
+                         "0:\n\t"
+                         "ldarx %[res],0,%[ptr]\n\t"     /* load w/ reservation */
+                         "cmpd %[res],%[cmp]\n\t"        /* compare against comparand */
+                         "bne- 1f\n\t"                   /* exit if not same */
+                         "stdcx. %[val],0,%[ptr]\n\t"    /* store new value */
+                         "bne- 0b\n"                     /* retry if reservation lost */
+                         "1:\n\t"                        /* the exit */
+                         "isync"
+                         : [res]"=&r"(result)
+                         , "+m"(* (int64_t*) ptr)        /* redundant with "memory" */
+                         : [ptr]"r"(ptr)
+                         , [val]"r"(value)
+                         , [cmp]"r"(comparand)
+                         : "memory"                      /* compiler full fence */
+                         , "cr0"                         /* clobbered by cmp and/or stdcx. */
+                         );
     return result;
 }
-#else
-// Except for special circumstances, 32-bit builds are meant to run on actual 32-bit hardware
-// A locked implementation would also be a possibility
-#define __TBB_64BIT_ATOMICS 0
-#endif /* 64bit CAS */
 
-#define __TBB_BIG_ENDIAN 1
+#elif __TBB_64BIT_ATOMICS /* && __TBB_WORDSIZE==4 */
 
-#if defined(__powerpc64__) || defined(__ppc64__)
-#define __TBB_WORDSIZE 8
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)
-#else
-#define __TBB_WORDSIZE 4
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C)
-#endif
+inline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t comparand )
+{
+    int64_t result;
+    int64_t value_register, comparand_register, result_register; // dummy variables to allocate registers
+    __asm__ __volatile__("sync\n\t"
+                         "ld %[val],%[valm]\n\t"
+                         "ld %[cmp],%[cmpm]\n"
+                         "0:\n\t"
+                         "ldarx %[res],0,%[ptr]\n\t"     /* load w/ reservation */
+                         "cmpd %[res],%[cmp]\n\t"        /* compare against comparand */
+                         "bne- 1f\n\t"                   /* exit if not same */
+                         "stdcx. %[val],0,%[ptr]\n\t"    /* store new value */
+                         "bne- 0b\n"                     /* retry if reservation lost */
+                         "1:\n\t"                        /* the exit */
+                         "std %[res],%[resm]\n\t"
+                         "isync"
+                         : [resm]"=m"(result)
+                         , [res] "=&r"(   result_register)
+                         , [val] "=&r"(    value_register)
+                         , [cmp] "=&r"(comparand_register)
+                         , "+m"(* (int64_t*) ptr)        /* redundant with "memory" */
+                         : [ptr] "r"(ptr)
+                         , [valm]"m"(value)
+                         , [cmpm]"m"(comparand)
+                         : "memory"                      /* compiler full fence */
+                         , "cr0"                         /* clobbered by cmpd and/or stdcx. */
+                         );
+    return result;
+}
+#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */
 
-#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
-#if __TBB_64BIT_ATOMICS
-#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
-#endif
-#define __TBB_full_memory_fence() __asm__ __volatile__("sync": : :"memory")
-#define __TBB_release_consistency_helper() __asm__ __volatile__("lwsync": : :"memory")
+#define __TBB_MACHINE_DEFINE_LOAD_STORE(S,ldx,stx,cmpx)                                                       \
+    template <typename T>                                                                                     \
+    struct machine_load_store<T,S> {                                                                          \
+        static inline T load_with_acquire(const volatile T& location) {                                       \
+            T result;                                                                                         \
+            __asm__ __volatile__(ldx " %[res],0(%[ptr])\n"                                                    \
+                                 "0:\n\t"                                                                     \
+                                 cmpx " %[res],%[res]\n\t"                                                    \
+                                 "bne- 0b\n\t"                                                                \
+                                 "isync"                                                                      \
+                                 : [res]"=r"(result)                                                          \
+                                 : [ptr]"b"(&location) /* cannot use register 0 here */                       \
+                                 , "m"(location)       /* redundant with "memory" */                          \
+                                 : "memory"            /* compiler acquire fence */                           \
+                                 , "cr0"               /* clobbered by cmpw/cmpd */);                         \
+            return result;                                                                                    \
+        }                                                                                                     \
+        static inline void store_with_release(volatile T &location, T value) {                                \
+            __asm__ __volatile__("lwsync\n\t"                                                                 \
+                                 stx " %[val],0(%[ptr])"                                                      \
+                                 : "=m"(location)      /* redundant with "memory" */                          \
+                                 : [ptr]"b"(&location) /* cannot use register 0 here */                       \
+                                 , [val]"r"(value)                                                            \
+                                 : "memory"/*compiler release fence*/ /*(cr0 not affected)*/);                \
+        }                                                                                                     \
+    };                                                                                                        \
+                                                                                                              \
+    template <typename T>                                                                                     \
+    struct machine_load_store_relaxed<T,S> {                                                                  \
+        static inline T load (const __TBB_atomic T& location) {                                               \
+            T result;                                                                                         \
+            __asm__ __volatile__(ldx " %[res],0(%[ptr])"                                                      \
+                                 : [res]"=r"(result)                                                          \
+                                 : [ptr]"b"(&location) /* cannot use register 0 here */                       \
+                                 , "m"(location)                                                              \
+                                 ); /*(no compiler fence)*/ /*(cr0 not affected)*/                            \
+            return result;                                                                                    \
+        }                                                                                                     \
+        static inline void store (__TBB_atomic T &location, T value) {                                        \
+            __asm__ __volatile__(stx " %[val],0(%[ptr])"                                                      \
+                                 : "=m"(location)                                                             \
+                                 : [ptr]"b"(&location) /* cannot use register 0 here */                       \
+                                 , [val]"r"(value)                                                            \
+                                 ); /*(no compiler fence)*/ /*(cr0 not affected)*/                            \
+        }                                                                                                     \
+    };
+
+namespace tbb {
+namespace internal {
+    __TBB_MACHINE_DEFINE_LOAD_STORE(1,"lbz","stb","cmpw")
+    __TBB_MACHINE_DEFINE_LOAD_STORE(2,"lhz","sth","cmpw")
+    __TBB_MACHINE_DEFINE_LOAD_STORE(4,"lwz","stw","cmpw")
+
+#if __TBB_WORDSIZE==8
+
+    __TBB_MACHINE_DEFINE_LOAD_STORE(8,"ld" ,"std","cmpd")
+
+#elif __TBB_64BIT_ATOMICS /* && __TBB_WORDSIZE==4 */
+
+    template <typename T>
+    struct machine_load_store<T,8> {
+        static inline T load_with_acquire(const volatile T& location) {
+            T result;
+            T result_register; // dummy variable to allocate a register
+            __asm__ __volatile__("ld %[res],0(%[ptr])\n\t"
+                                 "std %[res],%[resm]\n"
+                                 "0:\n\t"
+                                 "cmpd %[res],%[res]\n\t"
+                                 "bne- 0b\n\t"
+                                 "isync"
+                                 : [resm]"=m"(result)
+                                 , [res]"=&r"(result_register)
+                                 : [ptr]"b"(&location) /* cannot use register 0 here */
+                                 , "m"(location)       /* redundant with "memory" */
+                                 : "memory"            /* compiler acquire fence */
+                                 , "cr0"               /* clobbered by cmpd */);
+            return result;
+        }
+
+        static inline void store_with_release(volatile T &location, T value) {
+            T value_register; // dummy variable to allocate a register
+            __asm__ __volatile__("lwsync\n\t"
+                                 "ld %[val],%[valm]\n\t"
+                                 "std %[val],0(%[ptr])"
+                                 : "=m"(location)      /* redundant with "memory" */
+                                 , [val]"=&r"(value_register)
+                                 : [ptr]"b"(&location) /* cannot use register 0 here */
+                                 , [valm]"m"(value)
+                                 : "memory"/*compiler release fence*/ /*(cr0 not affected)*/);
+        }
+    };
+
+    struct machine_load_store_relaxed<T,8> {
+        static inline T load (const volatile T& location) {
+            T result;
+            T result_register; // dummy variable to allocate a register
+            __asm__ __volatile__("ld %[res],0(%[ptr])\n\t"
+                                 "std %[res],%[resm]"
+                                 : [resm]"=m"(result)
+                                 , [res]"=&r"(result_register)
+                                 : [ptr]"b"(&location) /* cannot use register 0 here */
+                                 , "m"(location)
+                                 ); /*(no compiler fence)*/ /*(cr0 not affected)*/
+            return result;
+        }
+
+        static inline void store (volatile T &location, T value) {
+            T value_register; // dummy variable to allocate a register
+            __asm__ __volatile__("ld %[val],%[valm]\n\t"
+                                 "std %[val],0(%[ptr])"
+                                 : "=m"(location)
+                                 , [val]"=&r"(value_register)
+                                 : [ptr]"b"(&location) /* cannot use register 0 here */
+                                 , [valm]"m"(value)
+                                 ); /*(no compiler fence)*/ /*(cr0 not affected)*/
+        }
+    };
+    #define __TBB_machine_load_store_relaxed_8
+
+#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */
+
+}} // namespaces internal, tbb
+
+#undef __TBB_MACHINE_DEFINE_LOAD_STORE
+
+#define __TBB_USE_GENERIC_PART_WORD_CAS 1
+#define __TBB_USE_GENERIC_FETCH_ADD     1
+#define __TBB_USE_GENERIC_FETCH_STORE   1
+
+#define __TBB_control_consistency_helper() __asm__ __volatile__("isync": : :"memory")
+#define __TBB_full_memory_fence()          __asm__ __volatile__( "sync": : :"memory")
 
-#if !__IBMCPP__
-// "1501-230 (S) Internal compiler error; please contact your Service Representative"
 static inline intptr_t __TBB_machine_lg( uintptr_t x ) {
-    // TODO: assumes sizeof(uintptr_t)<=8 resp. 4
-    #if defined(__powerpc64__) || defined(__ppc64__)
-    __asm__ __volatile__ ("cntlzd %0,%0" : "+r"(x)); // counting starts at 2^63
+    // cntlzd/cntlzw starts counting at 2^63/2^31 (ignoring any higher-order bits), and does not affect cr0
+#if __TBB_WORDSIZE==8
+    __asm__ __volatile__ ("cntlzd %0,%0" : "+r"(x));
     return 63-static_cast<intptr_t>(x);
-    #else
-    __asm__ __volatile__ ("cntlzw %0,%0" : "+r"(x)); // counting starts at 2^31 (on 64-bit hardware, higher-order bits are ignored)
+#else
+    __asm__ __volatile__ ("cntlzw %0,%0" : "+r"(x));
     return 31-static_cast<intptr_t>(x);
-    #endif
+#endif
 }
 #define __TBB_Log2(V) __TBB_machine_lg(V)
-#endif
 
-#define __TBB_Byte uint32_t // TODO: would this ever not be aligned without an alignment specification?
+// Assumes implicit alignment for any 32-bit value
+typedef uint32_t __TBB_Flag;
+#define __TBB_Flag __TBB_Flag
 
-inline bool __TBB_machine_trylockbyte( __TBB_Byte &flag ) {
+inline bool __TBB_machine_trylockbyte( __TBB_atomic __TBB_Flag &flag ) {
     return __TBB_machine_cmpswp4(&flag,1,0)==0;
 }
 #define __TBB_TryLockByte(P) __TBB_machine_trylockbyte(P)
diff --git a/include/tbb/machine/macos_common.h b/include/tbb/machine/macos_common.h
index c0e8799..dd12779 100644
--- a/include/tbb/machine/macos_common.h
+++ b/include/tbb/machine/macos_common.h
@@ -26,14 +26,15 @@
     the GNU General Public License.
 */
 
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_macos_common_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
 #endif
 
+#define __TBB_machine_macos_common_H
+
 #include <sched.h>
 #define __TBB_Yield()  sched_yield()
 
-
 // __TBB_HardwareConcurrency
 
 #include <sys/types.h>
@@ -49,40 +50,21 @@ static inline int __TBB_macos_available_cpu() {
 
 #define __TBB_HardwareConcurrency() __TBB_macos_available_cpu()
 
-
-#ifndef __TBB_WORDSIZE
-#define __TBB_WORDSIZE 4
-#endif
-
-#ifndef __TBB_BIG_ENDIAN
-#if __BIG_ENDIAN__
-#define __TBB_BIG_ENDIAN 1
-#else
-#define __TBB_BIG_ENDIAN 0
-#endif
+#ifndef __TBB_full_memory_fence
+    // TBB has not recognized the architecture (none of the architecture abstraction
+    // headers was included).
+    #define __TBB_UnknownArchitecture 1
 #endif
 
-
-#if !defined(__TBB_CompareAndSwap4) || !defined(__TBB_CompareAndSwap8)
+#if __TBB_UnknownArchitecture || __TBB_WORDSIZE==4
+// In case of IA32 this is a workaround for compiler bugs triggered by inline
+// assembly implementation of __TBB_machine_cmpswp8 in linux_ia32.h, which may
+// lead to incorrect codegen (gcc) or compilation failures (any icc including 12.0.4).
 
 // Implementation of atomic operations based on OS provided primitives
 #include <libkern/OSAtomic.h>
 
-#define __TBB_release_consistency_helper() OSMemoryBarrier()
-#define __TBB_full_memory_fence()          OSMemoryBarrier()
-
-static inline int32_t __TBB_macos_cmpswp4(volatile void *ptr, int32_t value, int32_t comparand)
-{
-    __TBB_ASSERT( !((uintptr_t)ptr&0x3), "address not properly aligned for Mac OS atomics");
-    int32_t* address = (int32_t*)ptr;
-    while( !OSAtomicCompareAndSwap32Barrier(comparand, value, address) ){
-        int32_t snapshot = *address;
-        if( snapshot!=comparand ) return snapshot;
-    }
-    return comparand;
-}
-
-static inline int64_t __TBB_macos_cmpswp8(volatile void *ptr, int64_t value, int64_t comparand)
+static inline int64_t __TBB_machine_cmpswp8_OsX(volatile void *ptr, int64_t value, int64_t comparand)
 {
     __TBB_ASSERT( !((uintptr_t)ptr&0x7), "address not properly aligned for Mac OS atomics");
     int64_t* address = (int64_t*)ptr;
@@ -97,30 +79,58 @@ static inline int64_t __TBB_macos_cmpswp8(volatile void *ptr, int64_t value, int
     return comparand;
 }
 
-#define __TBB_CompareAndSwap4(P,V,C) __TBB_macos_cmpswp4(P,V,C)
-#define __TBB_CompareAndSwap8(P,V,C) __TBB_macos_cmpswp8(P,V,C)
+#define __TBB_machine_cmpswp8 __TBB_machine_cmpswp8_OsX
 
-static inline int32_t __TBB_macos_fetchadd4(volatile void *ptr, int32_t addend)
+#endif /* __TBB_UnknownArchitecture || __TBB_WORDSIZE==4 */
+
+#if __TBB_UnknownArchitecture
+
+#ifndef __TBB_WORDSIZE
+#define __TBB_WORDSIZE 4
+#endif
+
+#define __TBB_BIG_ENDIAN __BIG_ENDIAN__
+
+/** As this generic implementation has absolutely no information about underlying
+    hardware, its performance most likely will be sub-optimal because of full memory
+    fence usages where a more lightweight synchronization means (or none at all)
+    could suffice. Thus if you use this header to enable TBB on a new platform,
+    consider forking it and relaxing below helpers as appropriate. **/
+#define __TBB_control_consistency_helper() OSMemoryBarrier()
+#define __TBB_acquire_consistency_helper() OSMemoryBarrier()
+#define __TBB_release_consistency_helper() OSMemoryBarrier()
+#define __TBB_full_memory_fence()          OSMemoryBarrier()
+
+static inline int32_t __TBB_machine_cmpswp4(volatile void *ptr, int32_t value, int32_t comparand)
+{
+    __TBB_ASSERT( !((uintptr_t)ptr&0x3), "address not properly aligned for Mac OS atomics");
+    int32_t* address = (int32_t*)ptr;
+    while( !OSAtomicCompareAndSwap32Barrier(comparand, value, address) ){
+        int32_t snapshot = *address;
+        if( snapshot!=comparand ) return snapshot;
+    }
+    return comparand;
+}
+
+static inline int32_t __TBB_machine_fetchadd4(volatile void *ptr, int32_t addend)
 {
     __TBB_ASSERT( !((uintptr_t)ptr&0x3), "address not properly aligned for Mac OS atomics");
     return OSAtomicAdd32Barrier(addend, (int32_t*)ptr) - addend;
 }
 
-static inline int64_t __TBB_macos_fetchadd8(volatile void *ptr, int64_t addend)
+static inline int64_t __TBB_machine_fetchadd8(volatile void *ptr, int64_t addend)
 {
     __TBB_ASSERT( !((uintptr_t)ptr&0x7), "address not properly aligned for Mac OS atomics");
     return OSAtomicAdd64Barrier(addend, (int64_t*)ptr) - addend;
 }
 
-#define __TBB_FetchAndAdd4(P,V) __TBB_macos_fetchadd4(P,V)
-#define __TBB_FetchAndAdd8(P,V) __TBB_macos_fetchadd8(P,V)
-
-#if __TBB_WORDSIZE==4
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_CompareAndSwap4(P,V,C)
-#define __TBB_FetchAndAddW(P,V) __TBB_FetchAndAdd4(P,V)
-#else
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_CompareAndSwap8(P,V,C)
-#define __TBB_FetchAndAddW(P,V) __TBB_FetchAndAdd8(P,V)
+#define __TBB_USE_GENERIC_PART_WORD_CAS             1
+#define __TBB_USE_GENERIC_PART_WORD_FETCH_ADD       1
+#define __TBB_USE_GENERIC_FETCH_STORE               1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE    1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE        1
+#if __TBB_WORDSIZE == 4
+    #define __TBB_USE_GENERIC_DWORD_LOAD_STORE      1
 #endif
 
-#endif /* !defined(__TBB_CompareAndSwap4) || !defined(__TBB_CompareAndSwap8) */
+#endif /* __TBB_UnknownArchitecture */
diff --git a/include/tbb/machine/sunos_sparc.h b/include/tbb/machine/sunos_sparc.h
index ca228fa..e6e8079 100644
--- a/include/tbb/machine/sunos_sparc.h
+++ b/include/tbb/machine/sunos_sparc.h
@@ -27,18 +27,25 @@
 */
 
 
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_sunos_sparc_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
 #endif
 
+#define __TBB_machine_sunos_sparc_H
+
 #include <stdint.h>
 #include <unistd.h>
 
 #define __TBB_WORDSIZE 8
 #define __TBB_BIG_ENDIAN 1
 
-#define __TBB_release_consistency_helper() __asm__ __volatile__ ("": : :"memory")
-#define __TBB_full_memory_fence() __asm__ __volatile__("membar #LoadLoad|#LoadStore|#StoreStore|#StoreLoad": : : "memory")
+/** To those working on SPARC hardware. Consider relaxing acquire and release
+    consistency helpers to no-op (as this port covers TSO mode only). **/
+#define __TBB_compiler_fence()             __asm__ __volatile__ ("": : :"memory")
+#define __TBB_control_consistency_helper() __TBB_compiler_fence()
+#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()
+#define __TBB_release_consistency_helper() __TBB_compiler_fence()
+#define __TBB_full_memory_fence()          __asm__ __volatile__("membar #LoadLoad|#LoadStore|#StoreStore|#StoreLoad": : : "memory")
 
 //--------------------------------------------------
 // Compare and swap
@@ -184,45 +191,17 @@ static inline bool __TBB_machine_trylockbyte(unsigned char &flag){
     return result == 0;
 }
 
-
-// Machine specific atomic operations
-
-//#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)  // use generic version in tbb_machine.h
-//#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)  // use generic version in tbb_machine.h
-#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
-#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp8(P,V,C)
-
-//#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)       // use generic version in tbb_machine.h
-//#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)       // use generic version in tbb_machine.h
-#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4(P,V)
-#define __TBB_FetchAndAdd8(P,V)  __TBB_machine_fetchadd8(P,V)
-#define __TBB_FetchAndAddW(P,V)  __TBB_machine_fetchadd8(P,V)
-
-// use generic version in tbb_machine.h
-//#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)  
-//#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
-//#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4(P,V)
-//#define __TBB_FetchAndStore8(P,V)  __TBB_machine_fetchstore8(P,V)
-//#define __TBB_FetchAndStoreW(P,V)  __TBB_machine_fetchstore8(P,V)
-
-#undef __TBB_Store8
-#undef __TBB_Load8
+#define __TBB_USE_GENERIC_PART_WORD_CAS             1
+#define __TBB_USE_GENERIC_PART_WORD_FETCH_ADD       1
+#define __TBB_USE_GENERIC_FETCH_STORE               1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE    1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE        1
 
 #define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V)
 #define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)
 
 // Definition of other functions
 #define __TBB_Pause(V) __TBB_machine_pause(V)
-#define __TBB_Log2(V)    __TBB_machine_lg(V)
-
-// Special atomic functions
-#define __TBB_FetchAndAddWrelease(P,V) __TBB_FetchAndAddW(P,V)
-#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)
-#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,-1)
-
-// Definition of Lock functions
-// Repeatedly runs TryLockByte, no need to implement
-#undef __TBB_LockByte
+#define __TBB_Log2(V)  __TBB_machine_lg(V)
 
 #define __TBB_TryLockByte(P) __TBB_machine_trylockbyte(P)
diff --git a/include/tbb/machine/windows_ia32.h b/include/tbb/machine/windows_ia32.h
index 22dbddd..2902f18 100644
--- a/include/tbb/machine/windows_ia32.h
+++ b/include/tbb/machine/windows_ia32.h
@@ -26,24 +26,29 @@
     the GNU General Public License.
 */
 
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_windows_ia32_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
 #endif
 
-#if defined(__INTEL_COMPILER)
-#define __TBB_release_consistency_helper() __asm { __asm nop }
+#define __TBB_machine_windows_ia32_H
+
+#define __TBB_WORDSIZE 4
+#define __TBB_BIG_ENDIAN 0
+
+#if __INTEL_COMPILER
+    #define __TBB_compiler_fence() __asm { __asm nop }
 #elif _MSC_VER >= 1300
-extern "C" void _ReadWriteBarrier();
-#pragma intrinsic(_ReadWriteBarrier)
-#define __TBB_release_consistency_helper() _ReadWriteBarrier()
+    extern "C" void _ReadWriteBarrier();
+    #pragma intrinsic(_ReadWriteBarrier)
+    #define __TBB_compiler_fence() _ReadWriteBarrier()
 #else
-#error Unsupported compiler - need to define __TBB_release_consistency_helper to support it
+    #error Unsupported compiler - need to define __TBB_{control,acquire,release}_consistency_helper to support it
 #endif
 
-#define __TBB_full_memory_fence() __asm { __asm mfence }
-
-#define __TBB_WORDSIZE 4
-#define __TBB_BIG_ENDIAN 0
+#define __TBB_control_consistency_helper() __TBB_compiler_fence()
+#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()
+#define __TBB_release_consistency_helper() __TBB_compiler_fence()
+#define __TBB_full_memory_fence()          __asm { __asm mfence }
 
 #if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
     // Workaround for overzealous compiler warnings in /Wp64 mode
@@ -59,11 +64,10 @@ extern "C" {
     __int64 __TBB_EXPORTED_FUNC __TBB_machine_load8 (const volatile void *ptr);
 }
 
-#define __TBB_DEFINE_ATOMICS(S,T,U,A,C) \
+#define __TBB_MACHINE_DEFINE_ATOMICS(S,T,U,A,C) \
 static inline T __TBB_machine_cmpswp##S ( volatile void * ptr, U value, U comparand ) { \
     T result; \
     volatile T *p = (T *)ptr; \
-    __TBB_release_consistency_helper(); \
     __asm \
     { \
        __asm mov edx, p \
@@ -72,14 +76,12 @@ static inline T __TBB_machine_cmpswp##S ( volatile void * ptr, U value, U compar
        __asm lock cmpxchg [edx], C \
        __asm mov result, A \
     } \
-    __TBB_release_consistency_helper(); \
     return result; \
 } \
 \
 static inline T __TBB_machine_fetchadd##S ( volatile void * ptr, U addend ) { \
     T result; \
     volatile T *p = (T *)ptr; \
-    __TBB_release_consistency_helper(); \
     __asm \
     { \
         __asm mov edx, p \
@@ -87,14 +89,12 @@ static inline T __TBB_machine_fetchadd##S ( volatile void * ptr, U addend ) { \
         __asm lock xadd [edx], A \
         __asm mov result, A \
     } \
-    __TBB_release_consistency_helper(); \
     return result; \
 }\
 \
 static inline T __TBB_machine_fetchstore##S ( volatile void * ptr, U value ) { \
     T result; \
     volatile T *p = (T *)ptr; \
-    __TBB_release_consistency_helper(); \
     __asm \
     { \
         __asm mov edx, p \
@@ -102,14 +102,15 @@ static inline T __TBB_machine_fetchstore##S ( volatile void * ptr, U value ) { \
         __asm lock xchg [edx], A \
         __asm mov result, A \
     } \
-    __TBB_release_consistency_helper(); \
     return result; \
 }
 
-__TBB_DEFINE_ATOMICS(1, __int8, __int8, al, cl)
-__TBB_DEFINE_ATOMICS(2, __int16, __int16, ax, cx)
-__TBB_DEFINE_ATOMICS(4, __int32, __int32, eax, ecx)
-__TBB_DEFINE_ATOMICS(W, ptrdiff_t, ptrdiff_t, eax, ecx)
+
+__TBB_MACHINE_DEFINE_ATOMICS(1, __int8, __int8, al, cl)
+__TBB_MACHINE_DEFINE_ATOMICS(2, __int16, __int16, ax, cx)
+__TBB_MACHINE_DEFINE_ATOMICS(4, ptrdiff_t, ptrdiff_t, eax, ecx)
+
+#undef __TBB_MACHINE_DEFINE_ATOMICS
 
 static inline __int32 __TBB_machine_lg( unsigned __int64 i ) {
     unsigned __int32 j;
@@ -151,39 +152,18 @@ static inline void __TBB_machine_pause (__int32 delay ) {
     return;
 }
 
-#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)
-#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)
-#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
-#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswpW(P,V,C)
-
-#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)
-#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)
-#define __TBB_FetchAndAdd4(P,V) __TBB_machine_fetchadd4(P,V)
-#define __TBB_FetchAndAdd8(P,V) __TBB_machine_fetchadd8(P,V)
-#define __TBB_FetchAndAddW(P,V) __TBB_machine_fetchaddW(P,V)
-
-#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)
-#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
-#define __TBB_FetchAndStore4(P,V) __TBB_machine_fetchstore4(P,V)
-#define __TBB_FetchAndStore8(P,V) __TBB_machine_fetchstore8(P,V)
-#define __TBB_FetchAndStoreW(P,V) __TBB_machine_fetchstoreW(P,V)
-
-// Should define this: 
-#define __TBB_Store8(P,V) __TBB_machine_store8(P,V)
-#define __TBB_Load8(P) __TBB_machine_load8(P)
 #define __TBB_AtomicOR(P,V) __TBB_machine_OR(P,V)
 #define __TBB_AtomicAND(P,V) __TBB_machine_AND(P,V)
 
+#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE   1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE    1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE        1
+
 // Definition of other functions
 extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
 #define __TBB_Yield()  SwitchToThread()
 #define __TBB_Pause(V) __TBB_machine_pause(V)
-#define __TBB_Log2(V)    __TBB_machine_lg(V)
-
-// Use generic definitions from tbb_machine.h
-#undef __TBB_TryLockByte
-#undef __TBB_LockByte
+#define __TBB_Log2(V)  __TBB_machine_lg(V)
 
 #if defined(_MSC_VER)&&_MSC_VER<1400
     static inline void* __TBB_machine_get_current_teb () {
diff --git a/include/tbb/machine/windows_intel64.h b/include/tbb/machine/windows_intel64.h
index 9a45f5d..4d86eaf 100644
--- a/include/tbb/machine/windows_intel64.h
+++ b/include/tbb/machine/windows_intel64.h
@@ -26,35 +26,42 @@
     the GNU General Public License.
 */
 
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_windows_intel64_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
 #endif
 
+#define __TBB_machine_windows_intel64_H
+
+#define __TBB_WORDSIZE 8
+#define __TBB_BIG_ENDIAN 0
+
 #include <intrin.h>
-#if !defined(__INTEL_COMPILER)
-#pragma intrinsic(_InterlockedOr64)
-#pragma intrinsic(_InterlockedAnd64)
-#pragma intrinsic(_InterlockedCompareExchange)
-#pragma intrinsic(_InterlockedCompareExchange64)
-#pragma intrinsic(_InterlockedExchangeAdd)
-#pragma intrinsic(_InterlockedExchangeAdd64)
-#pragma intrinsic(_InterlockedExchange)
-#pragma intrinsic(_InterlockedExchange64)
+
+#if !__INTEL_COMPILER
+    #pragma intrinsic(_InterlockedOr64)
+    #pragma intrinsic(_InterlockedAnd64)
+    #pragma intrinsic(_InterlockedCompareExchange)
+    #pragma intrinsic(_InterlockedCompareExchange64)
+    #pragma intrinsic(_InterlockedExchangeAdd)
+    #pragma intrinsic(_InterlockedExchangeAdd64)
+    #pragma intrinsic(_InterlockedExchange)
+    #pragma intrinsic(_InterlockedExchange64)
 #endif /* !defined(__INTEL_COMPILER) */
 
-#if defined(__INTEL_COMPILER)
-#define __TBB_release_consistency_helper() __asm { __asm nop }
-#define __TBB_full_memory_fence() __asm { __asm mfence }
+#if __INTEL_COMPILER
+    #define __TBB_compiler_fence()    __asm { __asm nop }
+    #define __TBB_full_memory_fence() __asm { __asm mfence }
 #elif _MSC_VER >= 1300
-extern "C" void _ReadWriteBarrier();
-#pragma intrinsic(_ReadWriteBarrier)
-#define __TBB_release_consistency_helper() _ReadWriteBarrier()
-#pragma intrinsic(_mm_mfence)
-#define __TBB_full_memory_fence() _mm_mfence()
+    extern "C" void _ReadWriteBarrier();
+    #pragma intrinsic(_ReadWriteBarrier)
+    #pragma intrinsic(_mm_mfence)
+    #define __TBB_compiler_fence()    _ReadWriteBarrier()
+    #define __TBB_full_memory_fence() _mm_mfence()
 #endif
 
-#define __TBB_WORDSIZE 8
-#define __TBB_BIG_ENDIAN 0
+#define __TBB_control_consistency_helper() __TBB_compiler_fence()
+#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()
+#define __TBB_release_consistency_helper() __TBB_compiler_fence()
 
 // ATTENTION: if you ever change argument types in machine-specific primitives,
 // please take care of atomic_word<> specializations in tbb/atomic.h
@@ -68,6 +75,29 @@ extern "C" {
     void __TBB_EXPORTED_FUNC __TBB_machine_pause (__int32 delay );
 }
 
+inline long __TBB_machine_cmpswp4 (volatile void *ptr, __int32 value, __int32 comparand ) {
+    return _InterlockedCompareExchange( (long*)ptr, value, comparand );
+}
+inline long __TBB_machine_fetchadd4 (volatile void *ptr, __int32 addend ) {
+    return _InterlockedExchangeAdd( (long*)ptr, addend );
+}
+inline long __TBB_machine_fetchstore4 (volatile void *ptr, __int32 value ) {
+    return _InterlockedExchange( (long*)ptr, value );
+}
+
+inline __int64 __TBB_machine_cmpswp8 (volatile void *ptr, __int64 value, __int64 comparand ) {
+    return _InterlockedCompareExchange64( (__int64*)ptr, value, comparand );
+}
+inline __int64 __TBB_machine_fetchadd8 (volatile void *ptr, __int64 addend ) {
+    return _InterlockedExchangeAdd64( (__int64*)ptr, addend );
+}
+inline __int64 __TBB_machine_fetchstore8 (volatile void *ptr, __int64 value ) {
+    return _InterlockedExchange64( (__int64*)ptr, value );
+}
+
+#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE   1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE    1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE        1
 
 #if !__INTEL_COMPILER
 extern "C" unsigned char _BitScanReverse64( unsigned long* i, unsigned __int64 w );
@@ -97,39 +127,13 @@ inline void __TBB_machine_AND( volatile void *operand, intptr_t addend ) {
     _InterlockedAnd64((__int64*)operand, addend); 
 }
 
-#define __TBB_CompareAndSwap1(P,V,C) __TBB_machine_cmpswp1(P,V,C)
-#define __TBB_CompareAndSwap2(P,V,C) __TBB_machine_cmpswp2(P,V,C)
-#define __TBB_CompareAndSwap4(P,V,C) _InterlockedCompareExchange( (long*) P , V , C ) 
-#define __TBB_CompareAndSwap8(P,V,C) _InterlockedCompareExchange64( (__int64*) P , V , C )
-#define __TBB_CompareAndSwapW(P,V,C) _InterlockedCompareExchange64( (__int64*) P , V , C )
-
-#define __TBB_FetchAndAdd1(P,V) __TBB_machine_fetchadd1(P,V)
-#define __TBB_FetchAndAdd2(P,V) __TBB_machine_fetchadd2(P,V)
-#define __TBB_FetchAndAdd4(P,V) _InterlockedExchangeAdd((long*) P , V )
-#define __TBB_FetchAndAdd8(P,V) _InterlockedExchangeAdd64((__int64*) P , V )
-#define __TBB_FetchAndAddW(P,V) _InterlockedExchangeAdd64((__int64*) P , V )
-
-#define __TBB_FetchAndStore1(P,V) __TBB_machine_fetchstore1(P,V)
-#define __TBB_FetchAndStore2(P,V) __TBB_machine_fetchstore2(P,V)
-#define __TBB_FetchAndStore4(P,V) _InterlockedExchange((long*) P , V )
-#define __TBB_FetchAndStore8(P,V) _InterlockedExchange64((__int64*) P , V )
-#define __TBB_FetchAndStoreW(P,V) _InterlockedExchange64((__int64*) P , V ) 
-
-// Not used if wordsize == 8
-#undef __TBB_Store8
-#undef __TBB_Load8
-
 #define __TBB_AtomicOR(P,V) __TBB_machine_OR(P,V)
 #define __TBB_AtomicAND(P,V) __TBB_machine_AND(P,V)
 
 extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
 #define __TBB_Yield()  SwitchToThread()
 #define __TBB_Pause(V) __TBB_machine_pause(V)
-#define __TBB_Log2(V)    __TBB_machine_lg(V)
-
-// Use generic definitions from tbb_machine.h
-#undef __TBB_TryLockByte
-#undef __TBB_LockByte
+#define __TBB_Log2(V)  __TBB_machine_lg(V)
 
 // API to retrieve/update FPU control setting
 #define __TBB_CPU_CTL_ENV_PRESENT 1
diff --git a/include/tbb/machine/xbox360_ppc.h b/include/tbb/machine/xbox360_ppc.h
index 7bde308..382b4ef 100644
--- a/include/tbb/machine/xbox360_ppc.h
+++ b/include/tbb/machine/xbox360_ppc.h
@@ -26,10 +26,14 @@
     the GNU General Public License.
 */
 
-#ifndef __TBB_machine_H
-#error Do not include this file directly; include tbb_machine.h instead
+// TODO: revise by comparing with mac_ppc.h
+
+#if !defined(__TBB_machine_H) || defined(__TBB_machine_xbox360_ppc_H)
+#error Do not #include this internal file directly; use public TBB headers instead.
 #endif
 
+#define __TBB_machine_xbox360_ppc_H
+
 #define NONET
 #define NOD3D
 #include "xtl.h"    
@@ -38,6 +42,8 @@
 #if _MSC_VER >= 1300
 extern "C" void _MemoryBarrier();
 #pragma intrinsic(_MemoryBarrier)
+#define __TBB_control_consistency_helper() __isync()
+#define __TBB_acquire_consistency_helper() _MemoryBarrier()
 #define __TBB_release_consistency_helper() _MemoryBarrier()
 #endif
 
@@ -46,27 +52,30 @@ extern "C" void _MemoryBarrier();
 #define __TBB_WORDSIZE 4
 #define __TBB_BIG_ENDIAN 1
 
-//todo: define __TBB_DECL_FENCED_ATOMICS and define acquire/release primitives to maximize performance
-
-typedef __int64 int64_t;  //required for definition of Store8/Load8 in atomic.h
-typedef unsigned char uint8_t;  //same reason
+//todo: define __TBB_USE_FENCED_ATOMICS and define acquire/release primitives to maximize performance
 
-inline __int32 __TBB_machine_cmpswp4(volatile void *ptr, __int32 value, __int32 comparand )
-{                               
- __lwsync();
+inline __int32 __TBB_machine_cmpswp4(volatile void *ptr, __int32 value, __int32 comparand ) {                               
+ __sync();
  __int32 result = InterlockedCompareExchange((volatile LONG*)ptr, value, comparand);
- __lwsync();
+ __isync();
  return result;
 }
 
 inline __int64 __TBB_machine_cmpswp8(volatile void *ptr, __int64 value, __int64 comparand )
 {
- __lwsync();
+ __sync();
  __int64 result = InterlockedCompareExchange64((volatile LONG64*)ptr, value, comparand);
- __lwsync();
+ __isync();
  return result;
 }
 
+#define __TBB_USE_GENERIC_PART_WORD_CAS             1
+#define __TBB_USE_GENERIC_FETCH_ADD                 1
+#define __TBB_USE_GENERIC_FETCH_STORE               1
+#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE    1
+#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE        1
+#define __TBB_USE_GENERIC_DWORD_LOAD_STORE          1
+
 #pragma optimize( "", off )
 inline void __TBB_machine_pause (__int32 delay ) 
 {
@@ -74,10 +83,6 @@ inline void __TBB_machine_pause (__int32 delay )
 }
 #pragma optimize( "", on ) 
 
-
-#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)
-#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)
-#define __TBB_CompareAndSwapW(P,V,C) __TBB_machine_cmpswp4(P,V,C)
 #define __TBB_Yield()  Sleep(0)
 #define __TBB_Pause(V) __TBB_machine_pause(V)
 
diff --git a/include/tbb/memory_pool.h b/include/tbb/memory_pool.h
new file mode 100644
index 0000000..980a8bf
--- /dev/null
+++ b/include/tbb/memory_pool.h
@@ -0,0 +1,259 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_memory_pool_H
+#define __TBB_memory_pool_H
+
+#if !TBB_PREVIEW_MEMORY_POOL
+#error Set TBB_PREVIEW_MEMORY_POOL to include memory_pool.h
+#endif
+/** @file */
+
+#include "scalable_allocator.h"
+#include "tbb_stddef.h"
+#include "tbb_machine.h" // TODO: Itanium requires linkage with TBB library
+#include <new> // std::bad_alloc
+
+#if __TBB_EXTRA_DEBUG
+#define __TBBMALLOC_ASSERT ASSERT
+#else
+#define __TBBMALLOC_ASSERT(a,b) ((void)0)
+#endif
+
+namespace tbb {
+namespace interface6 {
+//! @cond INTERNAL
+namespace internal {
+
+//! Base of thread-safe pool allocator for variable-size requests
+class pool_base : tbb::internal::no_copy {
+    // Pool interface is separate from standard allocator classes because it has
+    // to maintain internal state, no copy or assignment. Move and swap are possible.
+public:
+    //! Reset pool to reuse its memory (free all objects at once)
+    void recycle() { rml::pool_reset(my_pool); }
+
+    //! The "malloc" analogue to allocate block of memory of size bytes
+    void *malloc(size_t size) { return rml::pool_malloc(my_pool, size); }
+
+    //! The "free" analogue to discard a previously allocated piece of memory.
+    void free(void* ptr) { rml::pool_free(my_pool, ptr); }
+
+    //! The "realloc" analogue complementing pool_malloc.
+    // Enables some low-level optimization possibilities
+    void *realloc(void* ptr, size_t size) {
+        return rml::pool_realloc(my_pool, ptr, size);
+    }
+
+protected:
+    //! destroy pool - must be called in a child class
+    void destroy() { rml::pool_destroy(my_pool); }
+
+    rml::MemoryPool *my_pool;
+};
+
+} // namespace internal
+//! @endcond
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+    // Workaround for erroneous "unreferenced parameter" warning in method destroy.
+    #pragma warning (push)
+    #pragma warning (disable: 4100)
+#endif
+
+//! Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5
+/** @ingroup memory_allocation */
+template<typename T, typename P = internal::pool_base>
+class memory_pool_allocator {
+protected:
+    typedef P pool_type;
+    pool_type *my_pool;
+    template<typename U, typename R>
+    friend class memory_pool_allocator;
+    template<typename V, typename U, typename R>
+    friend bool operator==( const memory_pool_allocator<V,R>& a, const memory_pool_allocator<U,R>& b);
+    template<typename V, typename U, typename R>
+    friend bool operator!=( const memory_pool_allocator<V,R>& a, const memory_pool_allocator<U,R>& b);
+public:
+    typedef typename tbb::internal::allocator_type<T>::value_type value_type;
+    typedef value_type* pointer;
+    typedef const value_type* const_pointer;
+    typedef value_type& reference;
+    typedef const value_type& const_reference;
+    typedef size_t size_type;
+    typedef ptrdiff_t difference_type;
+    template<typename U> struct rebind {
+        typedef memory_pool_allocator<U, P> other;
+    };
+
+    memory_pool_allocator(pool_type &pool) throw() : my_pool(&pool) {}
+    memory_pool_allocator(const memory_pool_allocator& src) throw() : my_pool(src.my_pool) {}
+    template<typename U>
+    memory_pool_allocator(const memory_pool_allocator<U,P>& src) throw() : my_pool(src.my_pool) {}
+
+    pointer address(reference x) const { return &x; }
+    const_pointer address(const_reference x) const { return &x; }
+    
+    //! Allocate space for n objects.
+    pointer allocate( size_type n, const void* /*hint*/ = 0) {
+        return static_cast<pointer>( my_pool->malloc( n*sizeof(value_type) ) );
+    }
+    //! Free previously allocated block of memory.
+    void deallocate( pointer p, size_type ) {
+        my_pool->free(p);
+    }
+    //! Largest value for which method allocate might succeed.
+    size_type max_size() const throw() {
+        size_type max = static_cast<size_type>(-1) / sizeof (value_type);
+        return (max > 0 ? max : 1);
+    }
+    //! Copy-construct value at location pointed to by p.
+    void construct( pointer p, const value_type& value ) { ::new((void*)(p)) value_type(value); }
+
+    //! Destroy value at location pointed to by p.
+    void destroy( pointer p ) { p->~value_type(); }
+
+};
+
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+    #pragma warning (pop)
+#endif // warning 4100 is back
+
+//! Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1
+/** @ingroup memory_allocation */
+template<typename P> 
+class memory_pool_allocator<void, P> {
+public:
+    typedef P pool_type;
+    typedef void* pointer;
+    typedef const void* const_pointer;
+    typedef void value_type;
+    template<typename U> struct rebind {
+        typedef memory_pool_allocator<U, P> other;
+    };
+
+    memory_pool_allocator( pool_type &pool) throw() : my_pool(&pool) {}
+    memory_pool_allocator( const memory_pool_allocator& src) throw() : my_pool(src.my_pool) {}
+    template<typename U>
+    memory_pool_allocator(const memory_pool_allocator<U,P>& src) throw() : my_pool(src.my_pool) {}
+
+protected:
+    pool_type *my_pool;
+    template<typename U, typename R>
+    friend class memory_pool_allocator;
+    template<typename V, typename U, typename R>
+    friend bool operator==( const memory_pool_allocator<V,R>& a, const memory_pool_allocator<U,R>& b);
+    template<typename V, typename U, typename R>
+    friend bool operator!=( const memory_pool_allocator<V,R>& a, const memory_pool_allocator<U,R>& b);
+};
+
+template<typename T, typename U, typename P>
+inline bool operator==( const memory_pool_allocator<T,P>& a, const memory_pool_allocator<U,P>& b) {return a.my_pool==b.my_pool;}
+
+template<typename T, typename U, typename P>
+inline bool operator!=( const memory_pool_allocator<T,P>& a, const memory_pool_allocator<U,P>& b) {return a.my_pool!=b.my_pool;}
+
+
+//! Thread-safe growable pool allocator for variable-size requests
+template <typename Alloc>
+class memory_pool : public internal::pool_base {
+    Alloc my_alloc; // TODO: base-class optimization
+    static void *allocate_request(intptr_t pool_id, size_t & bytes);
+    static int deallocate_request(intptr_t pool_id, void*, size_t raw_bytes);
+
+public:
+    //! construct pool with underlying allocator
+    memory_pool(const Alloc &src = Alloc());
+
+    //! destroy pool
+    ~memory_pool() { destroy(); } // call the callbacks first and destroy my_alloc latter
+
+};
+
+class fixed_pool : public internal::pool_base {
+    void *my_buffer;
+    size_t my_size;
+    inline static void *allocate_request(intptr_t pool_id, size_t & bytes);
+
+public:
+    //! construct pool with underlying allocator
+    inline fixed_pool(void *buf, size_t size);
+    //! destroy pool
+    ~fixed_pool() { destroy(); }
+};
+
+//////////////// Implementation ///////////////
+
+template <typename Alloc>
+memory_pool<Alloc>::memory_pool(const Alloc &src) : my_alloc(src) {
+    rml::MemPoolPolicy args = {
+        allocate_request, deallocate_request, sizeof(typename Alloc::value_type)
+    };
+    my_pool = rml::pool_create(intptr_t(this), &args);
+    __TBBMALLOC_ASSERT(my_pool, "Pool is not created");
+    if( !my_pool ) __TBB_THROW(std::bad_alloc());
+}
+template <typename Alloc>
+void *memory_pool<Alloc>::allocate_request(intptr_t pool_id, size_t & bytes) {
+    memory_pool<Alloc> &self = *reinterpret_cast<memory_pool<Alloc>*>(pool_id);
+    const size_t unit_size = sizeof(typename Alloc::value_type);
+    __TBBMALLOC_ASSERT( 0 == bytes%unit_size, NULL);
+    void *ptr;
+    __TBB_TRY { ptr = self.my_alloc.allocate( bytes/unit_size ); }
+    __TBB_CATCH(...) { return 0; }
+    return ptr;
+}
+template <typename Alloc>
+int memory_pool<Alloc>::deallocate_request(intptr_t pool_id, void* raw_ptr, size_t raw_bytes) {
+    memory_pool<Alloc> &self = *reinterpret_cast<memory_pool<Alloc>*>(pool_id);
+    const size_t unit_size = sizeof(typename Alloc::value_type);
+    __TBBMALLOC_ASSERT( 0 == raw_bytes%unit_size, NULL);
+    self.my_alloc.deallocate( static_cast<typename Alloc::value_type*>(raw_ptr), raw_bytes/unit_size );
+    return 0;
+}
+inline fixed_pool::fixed_pool(void *buf, size_t size) : my_buffer(buf), my_size(size) {
+    rml::MemPoolPolicy args = { allocate_request, 0, size };
+    my_pool = rml::pool_create(intptr_t(this), &args);
+    __TBBMALLOC_ASSERT(my_pool, "Pool is not created");
+    if( !my_pool ) __TBB_THROW(std::bad_alloc());
+}
+inline void *fixed_pool::allocate_request(intptr_t pool_id, size_t & bytes) {
+    fixed_pool &self = *reinterpret_cast<fixed_pool*>(pool_id);
+    if( bytes > self.my_size || !__TBB_CompareAndSwapW(&self.my_size, 0, (bytes=self.my_size)) )
+        return 0; // all the memory was given already
+    return self.my_buffer;
+}
+
+} //namespace interface6
+using interface6::memory_pool_allocator;
+using interface6::memory_pool;
+using interface6::fixed_pool;
+} //namespace tbb
+
+#undef __TBBMALLOC_ASSERT
+#endif// __TBB_memory_pool_H
diff --git a/include/tbb/parallel_for.h b/include/tbb/parallel_for.h
index 31b9f98..5b998fd 100644
--- a/include/tbb/parallel_for.h
+++ b/include/tbb/parallel_for.h
@@ -29,14 +29,15 @@
 #ifndef __TBB_parallel_for_H
 #define __TBB_parallel_for_H
 
+#include <new>
 #include "task.h"
 #include "partitioner.h"
 #include "blocked_range.h"
-#include <new>
 #include "tbb_exception.h"
 
 namespace tbb {
 
+namespace interface6 {
 //! @cond INTERNAL
 namespace internal {
 
@@ -46,9 +47,10 @@ namespace internal {
     class start_for: public task {
         Range my_range;
         const Body my_body;
-        typename Partitioner::partition_type my_partition;
+        typename Partitioner::task_partition_type my_partition;
         /*override*/ task* execute();
 
+    public:
         //! Constructor for root task.
         start_for( const Range& range, const Body& body, Partitioner& partitioner ) :
             my_range(range),    
@@ -57,19 +59,28 @@ namespace internal {
         {
         }
         //! Splitting constructor used to generate children.
-        /** this becomes left child.  Newly constructed object is right child. */
+        /** parent_ becomes left child.  Newly constructed object is right child. */
         start_for( start_for& parent_, split ) :
-            my_range(parent_.my_range,split()),    
+            my_range(parent_.my_range,split()),
+            my_body(parent_.my_body),
+            my_partition(parent_.my_partition, split())
+        {
+            my_partition.set_affinity(*this);
+        }
+        //! Construct right child from the given range as response to the demand.
+        /** parent_ remains left child.  Newly constructed object is right child. */
+        start_for( start_for& parent_, const Range& r, depth_t d ) :
+            my_range(r),
             my_body(parent_.my_body),
             my_partition(parent_.my_partition,split())
         {
             my_partition.set_affinity(*this);
+            my_partition.align_depth( d );
         }
         //! Update affinity info, if any.
         /*override*/ void note_affinity( affinity_id id ) {
             my_partition.note_affinity( id );
         }
-    public:
         static void run(  const Range& range, const Body& body, const Partitioner& partitioner ) {
             if( !range.empty() ) {
 #if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
@@ -91,26 +102,45 @@ namespace internal {
             }
         }
 #endif /* __TBB_TASK_GROUP_CONTEXT */
+        //! create a continuation task, serve as callback for partitioner
+        flag_task *create_continuation() {
+            return new( allocate_continuation() ) flag_task();
+        }
+        //! Run body for range
+        void run_body( Range &r ) { my_body( r ); }
     };
 
     template<typename Range, typename Body, typename Partitioner>
     task* start_for<Range,Body,Partitioner>::execute() {
-        if( !my_range.is_divisible() || my_partition.should_execute_range(*this) ) {
-            my_body( my_range );
-            return my_partition.continue_after_execute_range(); 
-        } else {
-            empty_task& c = *new( this->allocate_continuation() ) empty_task;
-            recycle_as_child_of(c);
-            c.set_ref_count(2);
-            bool delay = my_partition.decide_whether_to_delay();
-            start_for& b = *new( c.allocate_child() ) start_for(*this,split());
-            my_partition.spawn_or_delay(delay,b);
-            return this;
-        }
+        my_partition.check_being_stolen( *this );
+        my_partition.execute(*this, my_range);
+        return NULL;
     } 
 } // namespace internal
 //! @endcond
+} // namespace interfaceX
 
+//! @cond INTERNAL
+namespace internal {
+    using interface6::internal::start_for;
+    
+    //! Calls the function with values from range [begin, end) with a step provided
+    template<typename Function, typename Index>
+    class parallel_for_body : internal::no_assign {
+        const Function &my_func;
+        const Index my_begin;
+        const Index my_step; 
+    public:
+        parallel_for_body( const Function& _func, Index& _begin, Index& _step) 
+            : my_func(_func), my_begin(_begin), my_step(_step) {}
+        
+        void operator()( tbb::blocked_range<Index>& r ) const {
+            for( Index i = r.begin(),  k = my_begin + i * my_step; i < r.end(); i++, k = k + my_step)
+                my_func( k );
+        }
+    };
+} // namespace internal
+//! @endcond
 
 // Requirements on Range concept are documented in blocked_range.h
 
@@ -177,37 +207,12 @@ void parallel_for( const Range& range, const Body& body, affinity_partitioner& p
 #endif /* __TBB_TASK_GROUP_CONTEXT */
 //@}
 
-//! @cond INTERNAL
-namespace internal {
-    //! Calls the function with values from range [begin, end) with a step provided
-template<typename Function, typename Index>
-class parallel_for_body : internal::no_assign {
-    const Function &my_func;
-    const Index my_begin;
-    const Index my_step; 
-public:
-    parallel_for_body( const Function& _func, Index& _begin, Index& _step) 
-        : my_func(_func), my_begin(_begin), my_step(_step) {}
-    
-    void operator()( tbb::blocked_range<Index>& r ) const {
-        for( Index i = r.begin(),  k = my_begin + i * my_step; i < r.end(); i++, k = k + my_step)
-            my_func( k );
-    }
-};
-} // namespace internal
-//! @endcond
-
 namespace strict_ppl {
 
 //@{
 //! Parallel iteration over a range of integers with a step provided
 template <typename Index, typename Function>
 void parallel_for(Index first, Index last, Index step, const Function& f) {
-    tbb::task_group_context context;
-    parallel_for(first, last, step, f, context);
-}
-template <typename Index, typename Function>
-void parallel_for(Index first, Index last, Index step, const Function& f, tbb::task_group_context &context) {
     if (step <= 0 )
         internal::throw_exception(internal::eid_nonpositive_step); // throws std::invalid_argument
     else if (last > first) {
@@ -215,20 +220,35 @@ void parallel_for(Index first, Index last, Index step, const Function& f, tbb::t
         Index end = (last - first - Index(1)) / step + Index(1);
         tbb::blocked_range<Index> range(static_cast<Index>(0), end);
         internal::parallel_for_body<Function, Index> body(f, first, step);
-        tbb::parallel_for(range, body, tbb::auto_partitioner(), context);
+        tbb::parallel_for(range, body, tbb::auto_partitioner());
     }
 }
 //! Parallel iteration over a range of integers with a default step value
 template <typename Index, typename Function>
 void parallel_for(Index first, Index last, const Function& f) {
-    tbb::task_group_context context;
-    parallel_for(first, last, static_cast<Index>(1), f, context);
+    parallel_for(first, last, static_cast<Index>(1), f);
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+//! Parallel iteration over a range of integers with explicit step and task group context
+template <typename Index, typename Function>
+void parallel_for(Index first, Index last, Index step, const Function& f, tbb::task_group_context &context) {
+    if (step <= 0 )
+        internal::throw_exception(internal::eid_nonpositive_step); // throws std::invalid_argument
+    else if (last > first) {
+        // Above "else" avoids "potential divide by zero" warning on some platforms
+        Index end = (last - first - Index(1)) / step + Index(1);
+        tbb::blocked_range<Index> range(static_cast<Index>(0), end);
+        internal::parallel_for_body<Function, Index> body(f, first, step);
+        tbb::parallel_for(range, body, tbb::auto_partitioner(), context);
+    }
 }
+//! Parallel iteration over a range of integers with a default step value and explicit task group context
 template <typename Index, typename Function>
 void parallel_for(Index first, Index last, const Function& f, tbb::task_group_context &context) {
     parallel_for(first, last, static_cast<Index>(1), f, context);
 }
-
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 //@}
 
 } // namespace strict_ppl
@@ -237,5 +257,11 @@ using strict_ppl::parallel_for;
 
 } // namespace tbb
 
+#if TBB_PREVIEW_SERIAL_SUBSET
+#define __TBB_NORMAL_EXECUTION
+#include "../serial/tbb/parallel_for.h"
+#undef __TBB_NORMAL_EXECUTION
+#endif
+
 #endif /* __TBB_parallel_for_H */
 
diff --git a/include/tbb/parallel_for_each.h b/include/tbb/parallel_for_each.h
index e59ee76..59200b1 100644
--- a/include/tbb/parallel_for_each.h
+++ b/include/tbb/parallel_for_each.h
@@ -43,7 +43,7 @@ namespace internal {
         parallel_for_each_body(const Function &_func) : my_func(_func) {}
         parallel_for_each_body(const parallel_for_each_body<Function, Iterator> &_caller) : my_func(_caller.my_func) {}
 
-        void operator() ( typename std::iterator_traits<Iterator>::value_type& value ) const {
+        void operator() ( typename std::iterator_traits<Iterator>::reference value ) const {
             my_func(value);
         }
     };
@@ -55,18 +55,18 @@ namespace internal {
 //@{
 //! Calls function f for all items from [first, last) interval using user-supplied context
 /** @ingroup algorithms */
+#if __TBB_TASK_GROUP_CONTEXT
 template<typename InputIterator, typename Function>
 void parallel_for_each(InputIterator first, InputIterator last, const Function& f, task_group_context &context) {
     internal::parallel_for_each_body<Function, InputIterator> body(f);
-
     tbb::parallel_do (first, last, body, context);
 }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
 //! Uses default context
 template<typename InputIterator, typename Function>
 void parallel_for_each(InputIterator first, InputIterator last, const Function& f) {
     internal::parallel_for_each_body<Function, InputIterator> body(f);
-
     tbb::parallel_do (first, last, body);
 }
 
diff --git a/include/tbb/parallel_invoke.h b/include/tbb/parallel_invoke.h
index 3303c41..6cc38e2 100644
--- a/include/tbb/parallel_invoke.h
+++ b/include/tbb/parallel_invoke.h
@@ -33,6 +33,11 @@
 
 namespace tbb {
 
+#if !__TBB_TASK_GROUP_CONTEXT
+    /** Dummy to avoid cluttering the bulk of the header with enormous amount of ifdefs. **/
+    struct task_group_context {};
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
 //! @cond INTERNAL
 namespace internal {
     // Simple task object, executing user method
@@ -137,8 +142,15 @@ namespace internal {
     // The class destroys root if exception occured as well as in normal case
     class parallel_invoke_cleaner: internal::no_copy { 
     public:
-        parallel_invoke_cleaner(int number_of_children, tbb::task_group_context& context) : root(*new(task::allocate_root(context)) internal::parallel_invoke_helper(number_of_children))
+#if __TBB_TASK_GROUP_CONTEXT
+        parallel_invoke_cleaner(int number_of_children, tbb::task_group_context& context)
+            : root(*new(task::allocate_root(context)) internal::parallel_invoke_helper(number_of_children))
+#else
+        parallel_invoke_cleaner(int number_of_children, tbb::task_group_context&)
+            : root(*new(task::allocate_root()) internal::parallel_invoke_helper(number_of_children))
+#endif /* !__TBB_TASK_GROUP_CONTEXT */
         {}
+
         ~parallel_invoke_cleaner(){
             root.destroy(root);
         }
diff --git a/include/tbb/parallel_reduce.h b/include/tbb/parallel_reduce.h
index bef9d6c..12d17ca 100644
--- a/include/tbb/parallel_reduce.h
+++ b/include/tbb/parallel_reduce.h
@@ -29,16 +29,20 @@
 #ifndef __TBB_parallel_reduce_H
 #define __TBB_parallel_reduce_H
 
+#include <new>
 #include "task.h"
 #include "aligned_space.h"
 #include "partitioner.h"
 #include "tbb_profiling.h"
-#include <new>
 
 namespace tbb {
 
+namespace interface6 {
 //! @cond INTERNAL
 namespace internal {
+
+    using namespace tbb::internal;
+
     //! 0 if root, 1 if a left child, 2 if a right child.
     /** Represented as a char, not enum, for compactness. */
     typedef char reduction_context;
@@ -46,16 +50,16 @@ namespace internal {
     //! Task type use to combine the partial results of parallel_reduce.
     /** @ingroup algorithms */
     template<typename Body>
-    class finish_reduce: public task {
+    class finish_reduce: public flag_task {
         //! Pointer to body, or NULL if the left child has not yet finished. 
-        Body* my_body;
         bool has_right_zombie;
         const reduction_context my_context;
+        Body* my_body;
         aligned_space<Body,1> zombie_space;
         finish_reduce( reduction_context context_ ) : 
-            my_body(NULL),
-            has_right_zombie(false),
-            my_context(context_)
+            has_right_zombie(false), // TODO: substitute by flag_task::child_stolen?
+            my_context(context_),
+            my_body(NULL)
         {
         }
         task* execute() {
@@ -80,12 +84,13 @@ namespace internal {
         typedef finish_reduce<Body> finish_type;
         Body* my_body;
         Range my_range;
-        typename Partitioner::partition_type my_partition;
-        reduction_context my_context;
+        typename Partitioner::task_partition_type my_partition;
+        reduction_context my_context; // TODO: factor out into start_reduce_base
         /*override*/ task* execute();
         template<typename Body_>
         friend class finish_reduce;
     
+public:
         //! Constructor used for root task
         start_reduce( const Range& range, Body* body, Partitioner& partitioner ) :
             my_body(body),
@@ -105,12 +110,22 @@ namespace internal {
             my_partition.set_affinity(*this);
             parent_.my_context = 1;
         }
+        //! Construct right child from the given range as response to the demand.
+        /** parent_ remains left child.  Newly constructed object is right child. */
+        start_reduce( start_reduce& parent_, const Range& r, depth_t d ) :
+            my_body(parent_.my_body),
+            my_range(r),
+            my_partition(parent_.my_partition,split()),
+            my_context(2) // right leaf mark
+        {
+            my_partition.set_affinity(*this);
+            my_partition.align_depth( d );
+            parent_.my_context = 1; // left leaf mark
+        }
         //! Update affinity info, if any
         /*override*/ void note_affinity( affinity_id id ) {
             my_partition.note_affinity( id );
         }
-
-public:
         static void run( const Range& range, Body& body, Partitioner& partitioner ) {
             if( !range.empty() ) {
 #if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
@@ -129,33 +144,122 @@ public:
                 task::spawn_root_and_wait( *new(task::allocate_root(context)) start_reduce(range,&body,partitioner) );
         }
 #endif /* __TBB_TASK_GROUP_CONTEXT */
+        //! create a continuation task, serve as callback for partitioner
+        finish_type *create_continuation() {
+            return new( allocate_continuation() ) finish_type(my_context);
+        }
+        //! Run body for range
+        void run_body( Range &r ) { (*my_body)( r ); }
     };
-
     template<typename Range, typename Body, typename Partitioner>
     task* start_reduce<Range,Body,Partitioner>::execute() {
+        my_partition.check_being_stolen( *this );
         if( my_context==2 ) { // right child
-            finish_type* p = static_cast<finish_type*>(parent());
-            if( !itt_load_word_with_acquire(p->my_body) ) {
-                my_body = new( p->zombie_space.begin() ) Body(*my_body,split());
-                p->has_right_zombie = true;
+            finish_type* parent_ptr = static_cast<finish_type*>(parent());
+            if( !itt_load_word_with_acquire(parent_ptr->my_body) ) { // TODO: replace by is_stolen_task() or by parent_ptr->ref_count() == 2???
+                my_body = new( parent_ptr->zombie_space.begin() ) Body(*my_body,split());
+                parent_ptr->has_right_zombie = true;
+            }
+        } else __TBB_ASSERT(my_context==0,0);// because left leaf spawns right leafs without recycling
+        my_partition.execute(*this, my_range);
+        if( my_context==1 ) {
+            finish_type* parent_ptr = static_cast<finish_type*>(parent());
+            __TBB_ASSERT(my_body!=parent_ptr->zombie_space.begin(),0);
+            itt_store_word_with_release(parent_ptr->my_body, my_body );
+        }
+        return NULL;
+    }
+
+#if TBB_PREVIEW_DETERMINISTIC_REDUCE
+    //! Task type use to combine the partial results of parallel_deterministic_reduce.
+    /** @ingroup algorithms */
+    template<typename Body>
+    class finish_deterministic_reduce: public task {
+        Body &my_left_body;
+        Body my_right_body;
+
+        finish_deterministic_reduce( Body &body ) :
+            my_left_body( body ),
+            my_right_body( body, split() )
+        {
+        }
+        task* execute() {
+            my_left_body.join( my_right_body );
+            return NULL;
+        }
+        template<typename Range,typename Body_>
+        friend class start_deterministic_reduce;
+    };
+
+    //! Task type used to split the work of parallel_deterministic_reduce.
+    /** @ingroup algorithms */
+    template<typename Range, typename Body>
+    class start_deterministic_reduce: public task {
+        typedef finish_deterministic_reduce<Body> finish_type;
+        Body &my_body;
+        Range my_range;
+        /*override*/ task* execute();
+
+        //! Constructor used for root task
+        start_deterministic_reduce( const Range& range, Body& body ) :
+            my_body( body ),
+            my_range( range )
+        {
+        }
+        //! Splitting constructor used to generate children.
+        /** parent_ becomes left child.  Newly constructed object is right child. */
+        start_deterministic_reduce( start_deterministic_reduce& parent_, finish_type& c ) :
+            my_body( c.my_right_body ),
+            my_range( parent_.my_range, split() )
+        {
+        }
+
+public:
+        static void run( const Range& range, Body& body ) {
+            if( !range.empty() ) {
+#if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP
+                task::spawn_root_and_wait( *new(task::allocate_root()) start_deterministic_reduce(range,&body) );
+#else
+                // Bound context prevents exceptions from body to affect nesting or sibling algorithms,
+                // and allows users to handle exceptions safely by wrapping parallel_for in the try-block.
+                task_group_context context;
+                task::spawn_root_and_wait( *new(task::allocate_root(context)) start_deterministic_reduce(range,body) );
+#endif /* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */
             }
         }
-        if( !my_range.is_divisible() || my_partition.should_execute_range(*this) ) {
-            (*my_body)( my_range );
-            if( my_context==1 ) 
-                itt_store_word_with_release(static_cast<finish_type*>(parent())->my_body, my_body );
-            return my_partition.continue_after_execute_range();
+#if __TBB_TASK_GROUP_CONTEXT
+        static void run( const Range& range, Body& body, task_group_context& context ) {
+            if( !range.empty() ) 
+                task::spawn_root_and_wait( *new(task::allocate_root(context)) start_deterministic_reduce(range,body) );
+        }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+    };
+
+    template<typename Range, typename Body>
+    task* start_deterministic_reduce<Range,Body>::execute() {
+        if( !my_range.is_divisible() ) {
+            my_body( my_range );
+            return NULL;
         } else {
-            finish_type& c = *new( allocate_continuation()) finish_type(my_context);
+            finish_type& c = *new( allocate_continuation() ) finish_type( my_body );
             recycle_as_child_of(c);
-            c.set_ref_count(2);    
-            bool delay = my_partition.decide_whether_to_delay();
-            start_reduce& b = *new( c.allocate_child() ) start_reduce(*this,split());
-            my_partition.spawn_or_delay(delay,b);
+            c.set_ref_count(2);
+            start_deterministic_reduce& b = *new( c.allocate_child() ) start_deterministic_reduce( *this, c );
+            task::spawn(b);
             return this;
         }
     }
+#endif /* TBB_PREVIEW_DETERMINISTIC_REDUCE */
+} // namespace internal
+//! @endcond
+} //namespace interfaceX
 
+//! @cond INTERNAL
+namespace internal {
+    using interface6::internal::start_reduce;
+#if TBB_PREVIEW_DETERMINISTIC_REDUCE
+    using interface6::internal::start_deterministic_reduce;
+#endif
     //! Auxiliary class for parallel_reduce; for internal use only.
     /** The adaptor class that implements \ref parallel_reduce_body_req "parallel_reduce Body"
         using given \ref parallel_reduce_lambda_req "anonymous function objects".
@@ -357,6 +461,50 @@ Value parallel_reduce( const Range& range, const Value& identity, const RealBody
     return body.result();
 }
 #endif /* __TBB_TASK_GROUP_CONTEXT */
+
+#if TBB_PREVIEW_DETERMINISTIC_REDUCE
+//! Parallel iteration with deterministic reduction and default partitioner.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_deterministic_reduce( const Range& range, Body& body ) {
+    internal::start_deterministic_reduce<Range,Body>::run( range, body );
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+//! Parallel iteration with deterministic reduction, simple partitioner and user-supplied context.
+/** @ingroup algorithms **/
+template<typename Range, typename Body>
+void parallel_deterministic_reduce( const Range& range, Body& body, task_group_context& context ) {
+    internal::start_deterministic_reduce<Range,Body>::run( range, body, context );
+}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
+/** parallel_reduce overloads that work with anonymous function objects
+    (see also \ref parallel_reduce_lambda_req "requirements on parallel_reduce anonymous function objects"). **/
+
+//! Parallel iteration with deterministic reduction and default partitioner.
+/** @ingroup algorithms **/
+template<typename Range, typename Value, typename RealBody, typename Reduction>
+Value parallel_deterministic_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction ) {
+    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+    internal::start_deterministic_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction> >
+                          ::run(range, body);
+    return body.result();
+}
+
+#if __TBB_TASK_GROUP_CONTEXT
+//! Parallel iteration with deterministic reduction, simple partitioner and user-supplied context.
+/** @ingroup algorithms **/
+template<typename Range, typename Value, typename RealBody, typename Reduction>
+Value parallel_deterministic_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,
+                       task_group_context& context ) {
+    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);
+    internal::start_deterministic_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction> >
+                          ::run( range, body, context );
+    return body.result();
+}
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+#endif /* TBB_PREVIEW_DETERMINISTIC_REDUCE */
 //@}
 
 } // namespace tbb
diff --git a/include/tbb/parallel_sort.h b/include/tbb/parallel_sort.h
index 0050046..cdfbb61 100644
--- a/include/tbb/parallel_sort.h
+++ b/include/tbb/parallel_sort.h
@@ -111,6 +111,7 @@ partition:
     }
 };
 
+#if __TBB_TASK_GROUP_CONTEXT
 //! Body class used to test if elements in a range are presorted
 /** @ingroup algorithms */
 template<typename RandomAccessIterator, typename Compare>
@@ -137,6 +138,7 @@ public:
     }
 
 };
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
 //! Body class used to sort elements in a range that is smaller than the grainsize.
 /** @ingroup algorithms */
@@ -152,6 +154,7 @@ struct quick_sort_body {
 /** @ingroup algorithms */
 template<typename RandomAccessIterator, typename Compare>
 void parallel_quick_sort( RandomAccessIterator begin, RandomAccessIterator end, const Compare& comp ) {
+#if __TBB_TASK_GROUP_CONTEXT
     task_group_context my_context;
     const int serial_cutoff = 9;
 
@@ -170,6 +173,7 @@ void parallel_quick_sort( RandomAccessIterator begin, RandomAccessIterator end,
 
     if (my_context.is_group_execution_cancelled())
 do_parallel_quick_sort:
+#endif /* __TBB_TASK_GROUP_CONTEXT */
         parallel_for( quick_sort_range<RandomAccessIterator,Compare>(begin, end-begin, comp ), 
                       quick_sort_body<RandomAccessIterator,Compare>(),
                       auto_partitioner() );
diff --git a/include/tbb/partitioner.h b/include/tbb/partitioner.h
index eaa95c6..9301be8 100644
--- a/include/tbb/partitioner.h
+++ b/include/tbb/partitioner.h
@@ -29,19 +29,44 @@
 #ifndef __TBB_partitioner_H
 #define __TBB_partitioner_H
 
+#ifndef __TBB_INITIAL_CHUNKS
+#define __TBB_INITIAL_CHUNKS 2
+#endif
+#ifndef __TBB_RANGE_POOL_CAPACITY
+#define __TBB_RANGE_POOL_CAPACITY 8
+#endif
+#ifndef __TBB_INIT_DEPTH
+#define __TBB_INIT_DEPTH 5
+#endif
+
 #include "task.h"
+#include "aligned_space.h"
+#include "atomic.h"
+
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
+    // Workaround for overzealous compiler warnings 
+    #pragma warning (push)
+    #pragma warning (disable: 4244)
+#endif
 
 namespace tbb {
+
+class auto_partitioner;
+class simple_partitioner;
 class affinity_partitioner;
+namespace interface6 {
+    namespace internal {
+        class affinity_partition_type;
+    }
+}
 
-//! @cond INTERNAL
 namespace internal {
 size_t __TBB_EXPORTED_FUNC get_initial_auto_partitioner_divisor();
 
-//! Defines entry points into tbb run-time library;
-/** The entry points are the constructor and destructor. */
+//! Defines entry point for affinity partitioner into tbb run-time library.
 class affinity_partitioner_base_v3: no_copy {
     friend class tbb::affinity_partitioner;
+    friend class tbb::interface6::internal::affinity_partition_type;
     //! Array that remembers affinities of tree positions to affinity_id.
     /** NULL if my_size==0. */
     affinity_id* my_array;
@@ -54,10 +79,9 @@ class affinity_partitioner_base_v3: no_copy {
     //! Resize my_array.
     /** Retains values if resulting size is the same. */
     void __TBB_EXPORTED_METHOD resize( unsigned factor );
-    friend class affinity_partition_type;
 };
 
-//! Provides default methods for partition objects without affinity.
+//! Provides backward-compatible methods for partition objects without affinity.
 class partition_type_base {
 public:
     void set_affinity( task & ) {}
@@ -69,115 +93,279 @@ public:
     }
 };
 
-class affinity_partition_type;
-
-template<typename Range, typename Body, typename Partitioner> class start_for;
-template<typename Range, typename Body, typename Partitioner> class start_reduce;
 template<typename Range, typename Body, typename Partitioner> class start_scan;
 
 } // namespace internal
 //! @endcond
 
-//! A simple partitioner 
-/** Divides the range until the range is not divisible. 
-    @ingroup algorithms */
-class simple_partitioner {
-public:
-    simple_partitioner() {}
-private:
-    template<typename Range, typename Body, typename Partitioner> friend class internal::start_for;
-    template<typename Range, typename Body, typename Partitioner> friend class internal::start_reduce;
-    template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+namespace serial {
+namespace interface6 {
+template<typename Range, typename Body, typename Partitioner> class start_for;
+}
+}
 
-    class partition_type: public internal::partition_type_base {
-    public:
-        bool should_execute_range(const task& ) {return false;}
-        partition_type( const simple_partitioner& ) {}
-        partition_type( const partition_type&, split ) {}
-    };
-};
+namespace interface6 {
+//! @cond INTERNAL
+namespace internal {
+using namespace tbb::internal;
+template<typename Range, typename Body, typename Partitioner> class start_for;
+template<typename Range, typename Body, typename Partitioner> class start_reduce;
 
-//! An auto partitioner 
-/** The range is initial divided into several large chunks.
-    Chunks are further subdivided into VICTIM_CHUNKS pieces if they are stolen and divisible.
-    @ingroup algorithms */
-class auto_partitioner {
+//! Join task node that contains shared flag for stealing feedback
+class flag_task: public task {
 public:
-    auto_partitioner() {}
-
-private:
-    template<typename Range, typename Body, typename Partitioner> friend class internal::start_for;
-    template<typename Range, typename Body, typename Partitioner> friend class internal::start_reduce;
-    template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+    tbb::atomic<bool> child_stolen;
+    flag_task() { child_stolen = false; }
+    task* execute() { return NULL; }
+};
 
-    class partition_type: public internal::partition_type_base {
-        size_t num_chunks;
-        static const size_t VICTIM_CHUNKS = 4;
+//! Task to signal the demand without carrying the work
+class signal_task: public task {
 public:
-        bool should_execute_range(const task &t) {
-            if( num_chunks<VICTIM_CHUNKS && t.is_stolen_task() )
-                num_chunks = VICTIM_CHUNKS;
-            return num_chunks==1;
+    task* execute() {
+        if( is_stolen_task() ) {
+            static_cast<flag_task*>(parent())->child_stolen = true;
         }
-        partition_type( const auto_partitioner& ) : num_chunks(internal::get_initial_auto_partitioner_divisor()) {}
-        partition_type( partition_type& pt, split ) {
-            num_chunks = pt.num_chunks /= 2u;
-        }
-    };
+        return NULL;
+    }
 };
 
-//! An affinity partitioner
-class affinity_partitioner: internal::affinity_partitioner_base_v3 {
-public:
-    affinity_partitioner() {}
+//! Depth is a relative depth of recursive division inside a range pool. Relative depth allows
+//! infinite absolute depth of the recursion for heavily imbalanced workloads with range represented
+//! by a number that cannot fit into machine word.
+typedef unsigned char depth_t;
 
-private:
-    template<typename Range, typename Body, typename Partitioner> friend class internal::start_for;
-    template<typename Range, typename Body, typename Partitioner> friend class internal::start_reduce;
-    template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+//! Range pool stores ranges of type T in a circular buffer with MaxCapacity
+template <typename T, depth_t MaxCapacity>
+class range_vector {
+    depth_t my_head;
+    depth_t my_tail;
+    depth_t my_size;
+    depth_t my_depth[MaxCapacity]; // relative depths of stored ranges
+    tbb::aligned_space<T, MaxCapacity> my_pool;
 
-    typedef internal::affinity_partition_type partition_type;
-    friend class internal::affinity_partition_type;
+public:
+    //! initialize via first range in pool
+    range_vector(const T& elem) : my_head(0), my_tail(0), my_size(1) {
+        my_depth[0] = 0;
+        new( my_pool.begin() ) T(elem);//TODO: std::move?
+    }
+    ~range_vector() {
+        while( !empty() ) pop_back();
+    }
+    bool empty() const { return my_size == 0; }
+    depth_t size() const { return my_size; }
+    //! Populates range pool via ranges up to max depth or while divisible
+    //! max_depth starts from 0, e.g. value 2 makes 3 ranges in the pool up to two 1/4 pieces
+    void split_to_fill(depth_t max_depth) {
+        while( my_size < MaxCapacity && my_depth[my_head] < max_depth
+          && my_pool.begin()[my_head].is_divisible() ) {
+            depth_t prev = my_head;
+            my_head = (my_head + 1) % MaxCapacity;
+            new(my_pool.begin()+my_head) T(my_pool.begin()[prev]); // copy TODO: std::move?
+            my_pool.begin()[prev].~T(); // instead of assignment
+            new(my_pool.begin()+prev) T(my_pool.begin()[my_head], split()); // do 'inverse' split
+            my_depth[my_head] = ++my_depth[prev];
+            my_size++;
+        }
+    }
+    void pop_back() {
+        __TBB_ASSERT(my_size > 0, "range_vector::pop_back() with empty size");
+        my_pool.begin()[my_head].~T();
+        my_size--;
+        my_head = (my_head + MaxCapacity - 1) % MaxCapacity;
+    }
+    void pop_front() {
+        __TBB_ASSERT(my_size > 0, "range_vector::pop_front() with empty size");
+        my_pool.begin()[my_tail].~T();
+        my_size--;
+        my_tail = (my_tail + 1) % MaxCapacity;
+    }
+    T& back() {
+        __TBB_ASSERT(my_size > 0, "range_vector::back() with empty size");
+        return my_pool.begin()[my_head];
+    }
+    T& front() {
+        __TBB_ASSERT(my_size > 0, "range_vector::front() with empty size");
+        return my_pool.begin()[my_tail];
+    }
+    //! similarly to front(), returns depth of the first range in the pool
+    depth_t front_depth() {
+        __TBB_ASSERT(my_size > 0, "range_vector::front_depth() with empty size");
+        return my_depth[my_tail];
+    }
 };
 
-//! @cond INTERNAL
-namespace internal {
+//! Provides default methods for partition objects and common algorithm blocks.
+template <typename Partition>
+struct partition_type_base {
+    // decision makers
+    void set_affinity( task & ) {}
+    void note_affinity( task::affinity_id ) {}
+    bool check_being_stolen(task &) { return false; } // part of old should_execute_range()
+    bool check_for_demand(task &) { return false; }
+    bool divisions_left() { return true; } // part of old should_execute_range()
+    bool should_create_trap() { return false; }
+    depth_t max_depth() { return 0; }
+    void align_depth(depth_t) { }
+    // common function blocks
+    Partition& derived() { return *static_cast<Partition*>(this); }
+    template<typename StartType>
+    flag_task* split_work(StartType &start) {
+        flag_task* parent_ptr = start.create_continuation(); // the type here is to express expectation
+        start.set_parent(parent_ptr);
+        parent_ptr->set_ref_count(2);
+        StartType& right_work = *new( parent_ptr->allocate_child() ) StartType(start, split());
+        start.spawn(right_work);
+        return parent_ptr;
+    }
+    template<typename StartType, typename Range>
+    void execute(StartType &start, Range &range) {
+        // The algorithm in a few words ([]-denotes calls to decision mathods of partitioner):
+        // [If this task is stolen, adjust depth and divisions if necessary, set flag].
+        // If range is divisible {
+        //    Spread the work while [initial divisions left];
+        //    Create trap task [if necessary];
+        // }
+        // If not divisible or [max depth is reached], execute, else do the range pool part
+        task* parent_ptr = start.parent();
+        if( range.is_divisible() ) {
+            if( derived().divisions_left() )
+                do parent_ptr = split_work(start); // split until divisions_left()
+                while( range.is_divisible() && derived().divisions_left() );
+            if( derived().should_create_trap() ) { // only for range pool
+                if( parent_ptr->ref_count() > 1 ) { // create new parent if necessary
+                    parent_ptr = start.create_continuation();
+                    start.set_parent(parent_ptr);
+                } else __TBB_ASSERT(parent_ptr->ref_count() == 1, NULL);
+                parent_ptr->set_ref_count(2); // safe because parent has only one reference
+                signal_task& right_signal = *new( parent_ptr->allocate_child() ) signal_task();
+                start.spawn(right_signal); // pure signal is to avoid deep recursion in the end
+            }
+        }
+        if( !range.is_divisible() || !derived().max_depth() )
+            start.run_body( range ); // simple partitioner goes always here
+        else { // do range pool
+            internal::range_vector<Range, Partition::range_pool_size> range_pool(range);
+            do {
+                range_pool.split_to_fill(derived().max_depth()); // fill range pool
+                if( derived().check_for_demand( start ) ) {
+                    if( range_pool.size() > 1 ) {
+                        parent_ptr = start.create_continuation();
+                        start.set_parent(parent_ptr);
+                        parent_ptr->set_ref_count(2);
+                        StartType& right_work = *new( parent_ptr->allocate_child() ) StartType(start, range_pool.front(), range_pool.front_depth());
+                        start.spawn(right_work);
+                        range_pool.pop_front();
+                        continue;
+                    }
+                    if( range_pool.back().is_divisible() ) // was not enough depth to fork a task
+                        continue; // note: check_for_demand() should guarantee increasing max_depth() next time
+                }
+                start.run_body( range_pool.back() );
+                range_pool.pop_back();  
+            } while( !range_pool.empty() && !start.is_cancelled() );
+        }
+    }
+};
 
-class affinity_partition_type: public no_copy {
-    //! Must be power of two
-    static const unsigned factor = 16;
-    static const size_t VICTIM_CHUNKS = 4;
+//! Provides default methods for auto (adaptive) partition objects.
+template <typename Partition>
+struct auto_partition_type_base : partition_type_base<Partition> {
+    size_t my_divisor;
+    depth_t my_max_depth;
+    auto_partition_type_base() : my_max_depth(__TBB_INIT_DEPTH) {
+        my_divisor = tbb::internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4;
+        __TBB_ASSERT(my_divisor, "initial value of get_initial_auto_partitioner_divisor() is not valid");
+    }
+    auto_partition_type_base(auto_partition_type_base &src, split) {
+        my_max_depth = src.my_max_depth;
+#if __TBB_INITIAL_TASK_IMBALANCE
+        if( src.my_divisor <= 1 ) my_divisor = 0;
+        else my_divisor = src.my_divisor = (src.my_divisor+1u) / 2u;
+#else
+        my_divisor = src.my_divisor / 2u;
+        src.my_divisor = src.my_divisor - my_divisor; // TODO: check the effect separately
+        if(my_divisor) src.my_max_depth += static_cast<depth_t>(__TBB_Log2(src.my_divisor/my_divisor));
+#endif
+    }
+    bool check_being_stolen( task &t) { // part of old should_execute_range()
+        if( !my_divisor ) {
+            my_divisor = 1; // todo: replace by on-stack flag (partition_state's member)?
+            if( t.is_stolen_task() ) {
+#if TBB_USE_EXCEPTIONS
+                // RTTI is available, check whether the cast is valid
+                __TBB_ASSERT(dynamic_cast<flag_task*>(t.parent()), 0);
+                // correctess of the cast rely on avoiding the root task for which:
+                // - initial value of my_divisor != 0 (protected by separate assertion)
+                // - is_stolen_task() always return false for the root task.
+#endif
+                static_cast<flag_task*>(t.parent())->child_stolen = true;
+                my_max_depth++;
+                return true;
+            }
+        }
+        return false;
+    }
+    bool divisions_left() { // part of old should_execute_range()
+        if( my_divisor > 1 ) return true;
+        if( my_divisor && my_max_depth > 1 ) { // can split the task and once more internally. TODO: on-stack flag instead
+            // keep same fragmentation while splitting for the local task pool
+            my_max_depth--;
+            my_divisor = 0;
+            return true;
+        } else return false;
+    }
+    bool should_create_trap() {
+        return my_divisor > 0;
+    }
+    bool check_for_demand(task &t) {
+        if( static_cast<flag_task*>(t.parent())->child_stolen ) {
+            my_max_depth++;
+            return true;
+        } else return false;
+    }
+    void align_depth(depth_t base) {
+        __TBB_ASSERT(base <= my_max_depth, 0);
+        my_max_depth -= base;
+    }
+    depth_t max_depth() { return my_max_depth; }
+};
 
-    internal::affinity_id* my_array;
-    task_list delay_list;
-    unsigned map_begin, map_end;
-    size_t num_chunks;
+//! Provides default methods for affinity (adaptive) partition objects.
+class affinity_partition_type : public auto_partition_type_base<affinity_partition_type> {
+    static const unsigned factor_power = 4;
+    static const unsigned factor = 1<<factor_power;
+    bool my_delay;
+    unsigned map_begin, map_end, map_mid;
+    tbb::internal::affinity_id* my_array;
+    void set_mid() {
+        unsigned d = (map_end - map_begin)/2; // we could add 1 but it is rather for LIFO affinity
+        if( d > factor )
+            d &= 0u-factor;
+        map_mid = map_end - d;
+    }
 public:
-    affinity_partition_type( affinity_partitioner& ap ) {
+    affinity_partition_type( tbb::internal::affinity_partitioner_base_v3& ap ) {
         __TBB_ASSERT( (factor&(factor-1))==0, "factor must be power of two" ); 
         ap.resize(factor);
         my_array = ap.my_array;
         map_begin = 0;
         map_end = unsigned(ap.my_size);
-        num_chunks = internal::get_initial_auto_partitioner_divisor();
+        set_mid();
+        my_delay = true;
+        my_divisor /= __TBB_INITIAL_CHUNKS; // let excatly P tasks to be distributed across workers
+        my_max_depth = factor_power+1; // the first factor_power ranges will be spawned, and >=1 ranges should left
+        __TBB_ASSERT( my_max_depth < __TBB_RANGE_POOL_CAPACITY, 0 );
     }
-    affinity_partition_type(affinity_partition_type& p, split) : my_array(p.my_array) {
+    affinity_partition_type(affinity_partition_type& p, split)
+        : auto_partition_type_base<affinity_partition_type>(p, split()), my_array(p.my_array) {
         __TBB_ASSERT( p.map_end-p.map_begin<factor || (p.map_end-p.map_begin)%factor==0, NULL );
-        num_chunks = p.num_chunks /= 2;
-        unsigned e = p.map_end;
-        unsigned d = (e - p.map_begin)/2;
-        if( d>factor ) 
-            d &= 0u-factor;
-        map_end = e;
-        map_begin = p.map_end = e-d;
+        map_end = p.map_end;
+        map_begin = p.map_end = p.map_mid;
+        set_mid(); p.set_mid();
+        my_delay = p.my_delay;
     }
-
-    bool should_execute_range(const task &t) {
-        if( num_chunks < VICTIM_CHUNKS && t.is_stolen_task() )
-            num_chunks = VICTIM_CHUNKS;
-        return num_chunks == 1;
-    }
-
     void set_affinity( task &t ) {
         if( map_begin<map_end )
             t.set_affinity( my_array[map_begin] );
@@ -186,41 +374,136 @@ public:
         if( map_begin<map_end ) 
             my_array[map_begin] = id;
     }
-    task* continue_after_execute_range() {
-        task* first = NULL;
-        if( !delay_list.empty() ) {
-            first = &delay_list.pop_front();
-            while( !delay_list.empty() ) {
-                task::spawn(*first);
-                first = &delay_list.pop_front();
+    bool check_for_demand( task &t ) {
+        if( !my_delay ) {
+            if( map_mid<map_end ) {
+                __TBB_ASSERT(my_max_depth>__TBB_Log2(map_end-map_mid), 0);
+                return true;// do not do my_max_depth++ here, but be sure my_max_depth is big enough
             }
-        }
-        return first;
+            if( static_cast<flag_task*>(t.parent())->child_stolen ) {
+                my_max_depth++;
+                return true;
+            }
+        } else my_delay = false;
+        return false;
     }
-    bool decide_whether_to_delay() {
-        // The possible underflow caused by "-1u" is deliberate
-        return (map_begin&(factor-1))==0 && map_end-map_begin-1u<factor;
+    bool divisions_left() { // part of old should_execute_range()
+        return my_divisor > 1;
     }
-    void spawn_or_delay( bool delay, task& b ) {
-        if( delay )  
-            delay_list.push_back(b);
-        else 
-            task::spawn(b);
+    bool should_create_trap() {
+        return true; // TODO: rethink for the stage after memorizing level
     }
+    static const unsigned range_pool_size = __TBB_RANGE_POOL_CAPACITY;
+};
+
+class auto_partition_type: public auto_partition_type_base<auto_partition_type> {
+public:
+    auto_partition_type( const auto_partitioner& ) {}
+    auto_partition_type( auto_partition_type& src, split)
+      : auto_partition_type_base<auto_partition_type>(src, split()) {}
+    static const unsigned range_pool_size = __TBB_RANGE_POOL_CAPACITY;
+};
 
-    ~affinity_partition_type() {
-        // The delay_list can be non-empty if an exception is thrown.
-        while( !delay_list.empty() ) {
-            task& t = delay_list.pop_front();
-            t.destroy(t);
-        } 
+class simple_partition_type: public partition_type_base<simple_partition_type> {
+public:
+    simple_partition_type( const simple_partitioner& ) {}
+    simple_partition_type( const simple_partition_type&, split ) {}
+    //! simplified algorithm
+    template<typename StartType, typename Range>
+    void execute(StartType &start, Range &range) {
+        while( range.is_divisible() )
+            split_work( start );
+        start.run_body( range );
     }
+    //static const unsigned range_pool_size = 1; - not necessary because execute() is overridden
 };
 
-} // namespace internal
+//! Backward-compatible partition for auto and affinity partition objects.
+class old_auto_partition_type: public tbb::internal::partition_type_base {
+    size_t num_chunks;
+    static const size_t VICTIM_CHUNKS = 4;
+public:
+    bool should_execute_range(const task &t) {
+        if( num_chunks<VICTIM_CHUNKS && t.is_stolen_task() )
+            num_chunks = VICTIM_CHUNKS;
+        return num_chunks==1;
+    }
+    old_auto_partition_type( const auto_partitioner& )
+      : num_chunks(internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4) {}
+    old_auto_partition_type( const affinity_partitioner& )
+      : num_chunks(internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4) {}
+    old_auto_partition_type( old_auto_partition_type& pt, split ) {
+        num_chunks = pt.num_chunks = (pt.num_chunks+1u) / 2u;
+    }
+};
+
+} // namespace interfaceX::internal
 //! @endcond
+} // namespace interfaceX
 
+//! A simple partitioner 
+/** Divides the range until the range is not divisible. 
+    @ingroup algorithms */
+class simple_partitioner {
+public:
+    simple_partitioner() {}
+private:
+    template<typename Range, typename Body, typename Partitioner> friend class serial::interface6::start_for;
+    template<typename Range, typename Body, typename Partitioner> friend class interface6::internal::start_for;
+    template<typename Range, typename Body, typename Partitioner> friend class interface6::internal::start_reduce;
+    template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+    // backward compatibility
+    class partition_type: public internal::partition_type_base {
+    public:
+        bool should_execute_range(const task& ) {return false;}
+        partition_type( const simple_partitioner& ) {}
+        partition_type( const partition_type&, split ) {}
+    };
+    // new implementation just extends existing interface
+    typedef interface6::internal::simple_partition_type task_partition_type;
+};
+
+//! An auto partitioner 
+/** The range is initial divided into several large chunks.
+    Chunks are further subdivided into smaller pieces if demand detected and they are divisible.
+    @ingroup algorithms */
+class auto_partitioner {
+public:
+    auto_partitioner() {}
+
+private:
+    template<typename Range, typename Body, typename Partitioner> friend class serial::interface6::start_for;
+    template<typename Range, typename Body, typename Partitioner> friend class interface6::internal::start_for;
+    template<typename Range, typename Body, typename Partitioner> friend class interface6::internal::start_reduce;
+    template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+    // backward compatibility
+    typedef interface6::internal::old_auto_partition_type partition_type;
+    // new implementation just extends existing interface
+    typedef interface6::internal::auto_partition_type task_partition_type;
+};
+
+//! An affinity partitioner
+class affinity_partitioner: internal::affinity_partitioner_base_v3 {
+public:
+    affinity_partitioner() {}
+
+private:
+    template<typename Range, typename Body, typename Partitioner> friend class serial::interface6::start_for;
+    template<typename Range, typename Body, typename Partitioner> friend class interface6::internal::start_for;
+    template<typename Range, typename Body, typename Partitioner> friend class interface6::internal::start_reduce;
+    template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;
+    // backward compatibility - for parallel_scan only
+    typedef interface6::internal::old_auto_partition_type partition_type;
+    // new implementation just extends existing interface
+    typedef interface6::internal::affinity_partition_type task_partition_type;
+};
 
 } // namespace tbb
 
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
+    #pragma warning (pop)
+#endif // warning 4244 is back
+#undef __TBB_INITIAL_CHUNKS
+#undef __TBB_RANGE_POOL_CAPACITY
+#undef __TBB_INIT_DEPTH
 #endif /* __TBB_partitioner_H */
diff --git a/include/tbb/queuing_mutex.h b/include/tbb/queuing_mutex.h
index fe0d5d9..a7e224b 100644
--- a/include/tbb/queuing_mutex.h
+++ b/include/tbb/queuing_mutex.h
@@ -104,7 +104,7 @@ public:
         scoped_lock *next;
 
         //! The local spin-wait variable
-        /** Inverted (0 - blocked, 1 - acquired the mutex) for the sake of 
+        /** Inverted (0 - blocked, 1 - acquired the mutex) for the sake of
             zero-initialization.  Defining it as an entire word instead of
             a byte seems to help performance slightly. */
         uintptr_t going;
@@ -116,8 +116,6 @@ public:
     static const bool is_rw_mutex = false;
     static const bool is_recursive_mutex = false;
     static const bool is_fair_mutex = true;
-
-    friend class scoped_lock;
 private:
     //! The last competitor requesting the lock
     atomic<scoped_lock*> q_tail;
diff --git a/include/tbb/queuing_rw_mutex.h b/include/tbb/queuing_rw_mutex.h
index 3c76332..644bdfd 100644
--- a/include/tbb/queuing_rw_mutex.h
+++ b/include/tbb/queuing_rw_mutex.h
@@ -78,11 +78,11 @@ public:
     class scoped_lock: internal::no_copy {
         //! Initialize fields
         void initialize() {
-            mutex = NULL;
+            my_mutex = NULL;
 #if TBB_USE_ASSERT
-            state = 0xFF; // Set to invalid state
-            internal::poison_pointer(next);
-            internal::poison_pointer(prev);
+            my_state = 0xFF; // Set to invalid state
+            internal::poison_pointer(my_next);
+            internal::poison_pointer(my_prev);
 #endif /* TBB_USE_ASSERT */
         }
     public:
@@ -98,7 +98,7 @@ public:
 
         //! Release lock (if lock is held).
         ~scoped_lock() {
-            if( mutex ) release();
+            if( my_mutex ) release();
         }
 
         //! Acquire lock on given mutex.
@@ -119,22 +119,22 @@ public:
 
     private:
         //! The pointer to the current mutex to work
-        queuing_rw_mutex* mutex;
+        queuing_rw_mutex* my_mutex;
 
         //! The pointer to the previous and next competitors for a mutex
-        scoped_lock * prev, * next;
+        scoped_lock *__TBB_atomic my_prev, *__TBB_atomic my_next;
 
         typedef unsigned char state_t;
 
         //! State of the request: reader, writer, active reader, other service states
-        atomic<state_t> state;
+        atomic<state_t> my_state;
 
         //! The local spin-wait variable
         /** Corresponds to "spin" in the pseudocode but inverted for the sake of zero-initialization */
-        unsigned char going;
+        unsigned char __TBB_atomic my_going;
 
         //! A tiny internal lock
-        unsigned char internal_lock;
+        unsigned char my_internal_lock;
 
         //! Acquire the internal lock
         void acquire_internal_lock();
diff --git a/include/tbb/reader_writer_lock.h b/include/tbb/reader_writer_lock.h
index a5cace9..877234b 100644
--- a/include/tbb/reader_writer_lock.h
+++ b/include/tbb/reader_writer_lock.h
@@ -93,7 +93,7 @@ namespace interface5 {
 
     //! The scoped lock pattern for write locks
     /** Scoped locks help avoid the common problem of forgetting to release the lock.
-        This type is also serves as the node for queuing locks. */
+        This type also serves as the node for queuing locks. */
     class scoped_lock : tbb::internal::no_copy {
     public:
         friend class reader_writer_lock;
diff --git a/include/tbb/runtime_loader.h b/include/tbb/runtime_loader.h
new file mode 100644
index 0000000..e0d4526
--- /dev/null
+++ b/include/tbb/runtime_loader.h
@@ -0,0 +1,188 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#ifndef __TBB_runtime_loader_H
+#define __TBB_runtime_loader_H
+
+#if ! TBB_PREVIEW_RUNTIME_LOADER
+    #error Set TBB_PREVIEW_RUNTIME_LOADER to include runtime_loader.h
+#endif
+
+#include "tbb/tbb_stddef.h"
+#include <climits>
+
+#if _MSC_VER
+    #if ! __TBB_NO_IMPLICIT_LINKAGE
+        #ifdef _DEBUG
+            #pragma comment( linker, "/nodefaultlib:tbb_debug.lib" )
+            #pragma comment( linker, "/defaultlib:tbbproxy_debug.lib" )
+        #else
+            #pragma comment( linker, "/nodefaultlib:tbb.lib" )
+            #pragma comment( linker, "/defaultlib:tbbproxy.lib" )
+        #endif
+    #endif
+#endif
+
+namespace tbb {
+
+namespace interface6 {
+
+//! Load TBB at runtime.
+/*!
+
+\b Usage:
+
+In source code:
+
+\code
+#include "tbb/runtime_loader.h"
+
+char const * path[] = { "<install dir>/lib/ia32", NULL };
+tbb::runtime_loader loader( path );
+
+// Now use TBB.
+\endcode
+
+Link with \c tbbproxy.lib (or \c libtbbproxy.a) instead of \c tbb.lib (\c libtbb.dylib,
+\c libtbb.so).
+
+TBB library will be loaded at runtime from \c <install dir>/lib/ia32 directory.
+
+\b Attention:
+
+All \c runtime_loader objects (in the same module, i.e. exe or dll) share some global state.
+The most noticeable piece of global state is loaded TBB library.
+There are some implications:
+
+    -   Only one TBB library can be loaded per module.
+
+    -   If one object has already loaded TBB library, another object will not load TBB.
+        If the loaded TBB library is suitable for the second object, both will use TBB
+        cooperatively, otherwise the second object will report an error.
+
+    -   \c runtime_loader objects will not work (correctly) in parallel due to absence of
+        syncronization.
+
+*/
+
+class runtime_loader : tbb::internal::no_copy {
+
+    public:
+
+        //! Error mode constants.
+        enum error_mode {
+            em_status,     //!< Save status of operation and continue.
+            em_throw,      //!< Throw an exception of tbb::runtime_loader::error_code type.
+            em_abort       //!< Print message to \c stderr and call \c abort().
+        }; // error_mode
+
+        //! Error codes.
+        enum error_code {
+            ec_ok,         //!< No errors.
+            ec_bad_call,   //!< Invalid function call (e. g. load() called when TBB is already loaded).
+            ec_bad_arg,    //!< Invalid argument passed.
+            ec_bad_lib,    //!< Invalid library found (e. g. \c TBB_runtime_version symbol not found).
+            ec_bad_ver,    //!< TBB found but version is not suitable.
+            ec_no_lib      //!< No suitable TBB library found.
+        }; // error_code
+
+        //! Initialize object but do not load TBB.
+        runtime_loader( error_mode mode = em_abort );
+
+        //! Initialize object and load TBB.
+        /*!
+            See load() for details.
+
+            If error mode is \c em_status, call status() to check whether TBB was loaded or not.
+        */
+        runtime_loader(
+            char const * path[],                           //!< List of directories to search TBB in.
+            int          min_ver = TBB_INTERFACE_VERSION,  //!< Minimal suitable version of TBB.
+            int          max_ver = INT_MAX,                //!< Maximal suitable version of TBB.
+            error_mode   mode    = em_abort                //!< Error mode for this object.
+        );
+
+        //! Destroy object.
+        ~runtime_loader();
+
+        //! Load TBB.
+        /*!
+            The method searches the directories specified in \c path[] array for the TBB library.
+            When the library is found, it is loaded and its version is checked. If the version is
+            not suitable, the library is unloaded, and the search continues.
+
+            \b Note:
+
+            For security reasons, avoid using relative directory names. For example, never load
+            TBB from current (\c "."), parent (\c "..") or any other relative directory (like
+            \c "lib" ). Use only absolute directory names (e. g. "/usr/local/lib").
+
+            For the same security reasons, avoid using system default directories (\c "") on
+            Windows. (See http://www.microsoft.com/technet/security/advisory/2269637.mspx for
+            details.)
+
+            Neglecting these rules may cause your program to execute 3-rd party malicious code.
+
+            \b Errors:
+                -   \c ec_bad_call - TBB already loaded by this object.
+                -   \c ec_bad_arg - \p min_ver and/or \p max_ver negative or zero,
+                    or \p min_ver > \p max_ver.
+                -   \c ec_bad_ver - TBB of unsuitable version already loaded by another object.
+                -   \c ec_no_lib - No suitable library found.
+        */
+        error_code
+        load(
+            char const * path[],                           //!< List of directories to search TBB in.
+            int          min_ver = TBB_INTERFACE_VERSION,  //!< Minimal suitable version of TBB.
+            int          max_ver = INT_MAX                 //!< Maximal suitable version of TBB.
+
+        );
+
+
+        //! Report status.
+        /*!
+            If error mode is \c em_status, the function returns status of the last operation.
+        */
+        error_code status();
+
+    private:
+
+        error_mode const my_mode;
+        error_code       my_status;
+        bool             my_loaded;
+
+}; // class runtime_loader
+
+} // namespace interface6
+
+using interface6::runtime_loader;
+
+} // namespace tbb
+
+#endif /* __TBB_runtime_loader_H */
+
diff --git a/include/tbb/scalable_allocator.h b/include/tbb/scalable_allocator.h
index 65f80b5..27f230e 100644
--- a/include/tbb/scalable_allocator.h
+++ b/include/tbb/scalable_allocator.h
@@ -31,6 +31,9 @@
 /** @file */
 
 #include <stddef.h> /* Need ptrdiff_t and size_t from here. */
+#if !_MSC_VER
+#include <stdint.h> /* Need intptr_t from here. */
+#endif
 
 #if !defined(__cplusplus) && __ICC==1100
     #pragma warning (push)
@@ -91,6 +94,29 @@ size_t __TBB_EXPORTED_FUNC scalable_msize (void* ptr);
 
 #ifdef __cplusplus
 
+namespace rml {
+class MemoryPool;
+
+#define MEM_POLICY_DEFINED 1
+typedef void *(*rawAllocType)(intptr_t pool_id, size_t &bytes);
+typedef int   (*rawFreeType)(intptr_t pool_id, void* raw_ptr, size_t raw_bytes);
+
+struct MemPoolPolicy {
+    rawAllocType pAlloc;
+    rawFreeType  pFree;
+    size_t       granularity;   // granularity of pAlloc allocations
+    void        *pReserved;     // reserved for future extensions
+    size_t       szReserved;    // size of pReserved data
+};
+
+MemoryPool *pool_create(intptr_t pool_id, const MemPoolPolicy* memPoolPolicy);
+bool  pool_destroy(MemoryPool* memPool);
+void *pool_malloc(MemoryPool* memPool, size_t size);
+void *pool_realloc(MemoryPool* memPool, void *object, size_t size);
+bool  pool_reset(MemoryPool* memPool);
+bool  pool_free(MemoryPool *memPool, void *object);
+}
+
 #include <new>      /* To use new with the placement argument */
 
 /* Ensure that including this header does not cause implicit linkage with TBB */
diff --git a/include/tbb/spin_mutex.h b/include/tbb/spin_mutex.h
index 140c6e9..0d200a1 100644
--- a/include/tbb/spin_mutex.h
+++ b/include/tbb/spin_mutex.h
@@ -46,7 +46,7 @@ namespace tbb {
     @ingroup synchronization */
 class spin_mutex {
     //! 0 if lock is released, 1 if lock is acquired.
-    __TBB_Byte flag;
+    __TBB_atomic_flag flag;
 
 public:
     //! Construct unacquired lock.
@@ -64,7 +64,7 @@ public:
         spin_mutex* my_mutex; 
 
         //! Value to store into spin_mutex::flag to unlock the mutex.
-        uintptr_t my_unlock_value;
+        __TBB_Flag my_unlock_value;
 
         //! Like acquire, but with ITT instrumentation.
         void __TBB_EXPORTED_METHOD internal_acquire( spin_mutex& m );
@@ -122,7 +122,7 @@ public:
 #if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
             internal_release();
 #else
-            __TBB_UnlockByte(my_mutex->flag, static_cast<__TBB_Byte>(my_unlock_value));
+            __TBB_UnlockByte(my_mutex->flag, my_unlock_value);
             my_mutex = NULL;
 #endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
         }
@@ -133,7 +133,7 @@ public:
 #if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
                 internal_release();
 #else
-                __TBB_UnlockByte(my_mutex->flag, static_cast<__TBB_Byte>(my_unlock_value));
+                __TBB_UnlockByte(my_mutex->flag, my_unlock_value);
 #endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
             }
         }
diff --git a/include/tbb/task.h b/include/tbb/task.h
index 7b8dab8..a887431 100644
--- a/include/tbb/task.h
+++ b/include/tbb/task.h
@@ -44,7 +44,7 @@ class task_list;
 class task_group_context;
 #endif /* __TBB_TASK_GROUP_CONTEXT */
 
-// MSVC does not allow taking the address of a member that was defined 
+// MSVC does not allow taking the address of a member that was defined
 // privately in task_base and made public in class task via a using declaration.
 #if _MSC_VER || (__GNUC__==3 && __GNUC_MINOR__<3)
 #define __TBB_TASK_BASE_ACCESS public
@@ -71,8 +71,8 @@ namespace interface5 {
         //! Base class for methods that became static in TBB 3.0.
         /** TBB's evolution caused the "this" argument for several methods to become obsolete.
             However, for backwards binary compatibility, the new methods need distinct names,
-            otherwise the One Definition Rule would be broken.  Hence the new methods are 
-            defined in this private base class, and then exposed in class task via 
+            otherwise the One Definition Rule would be broken.  Hence the new methods are
+            defined in this private base class, and then exposed in class task via
             using declarations. */
         class task_base: tbb::internal::no_copy {
         __TBB_TASK_BASE_ACCESS:
@@ -80,7 +80,7 @@ namespace interface5 {
 
             //! Schedule task for execution when a worker becomes available.
             static void spawn( task& t );
- 
+
             //! Spawn multiple tasks and clear list.
             static void spawn( task_list& list );
 
@@ -97,7 +97,7 @@ namespace interface5 {
                 sometimes a task needs to be explicitly deallocated, such as
                 when a root task is used as the parent in spawn_and_wait_for_all. */
             static void __TBB_EXPORTED_FUNC destroy( task& victim );
-        }; 
+        };
     } // internal
 } // interface5
 
@@ -168,8 +168,14 @@ namespace internal {
     //! Memory prefix to a task object.
     /** This class is internal to the library.
         Do not reference it directly, except within the library itself.
-        Fields are ordered in way that preserves backwards compatibility and yields 
+        Fields are ordered in way that preserves backwards compatibility and yields
         good packing on typical 32-bit and 64-bit platforms.
+
+        In case task prefix size exceeds 32 or 64 bytes on IA32 and Intel64
+        architectures correspondingly, consider dynamic setting of task_alignment
+        and task_prefix_reservation_size based on the maximal operand size supported
+        by the current CPU.
+
         @ingroup task_scheduling */
     class task_prefix {
     private:
@@ -184,34 +190,34 @@ namespace internal {
 
 #if __TBB_TASK_GROUP_CONTEXT
         //! Shared context that is used to communicate asynchronous state changes
-        /** Currently it is used to broadcast cancellation requests generated both 
+        /** Currently it is used to broadcast cancellation requests generated both
             by users and as the result of unhandled exceptions in the task::execute()
             methods. */
         task_group_context  *context;
 #endif /* __TBB_TASK_GROUP_CONTEXT */
-        
+
         //! The scheduler that allocated the task, or NULL if the task is big.
         /** Small tasks are pooled by the scheduler that allocated the task.
             If a scheduler needs to free a small task allocated by another scheduler,
             it returns the task to that other scheduler.  This policy avoids
-            memory space blowup issues for memory allocators that allocate from 
+            memory space blowup issues for memory allocators that allocate from
             thread-specific pools. */
         scheduler* origin;
 
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
         union {
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
         //! Obsolete. The scheduler that owns the task.
-        /** Retained only for the sake of backward binary compatibility. 
+        /** Retained only for the sake of backward binary compatibility.
             Still used by inline methods in the task.h header. **/
         scheduler* owner;
 
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
         //! Pointer to the next offloaded lower priority task.
         /** Used to maintain a list of offloaded tasks inside the scheduler. **/
         task* next_offloaded;
         };
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
 
         //! The task whose reference count includes me.
         /** In the "blocking style" of programming, this field points to the parent task.
@@ -224,7 +230,7 @@ namespace internal {
             the difference of the number of allocated children minus the
             number of children that have completed.
             In the "blocking style" of programming, this field is one more than the difference. */
-        reference_count ref_count;
+        __TBB_atomic reference_count ref_count;
 
         //! Obsolete. Used to be scheduling depth before TBB 2.2
         /** Retained only for the sake of backward binary compatibility.
@@ -257,7 +263,7 @@ namespace internal {
 
 #if __TBB_TASK_GROUP_CONTEXT
 
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
 namespace internal {
     static const int priority_stride_v4 = INT_MAX / 4;
 }
@@ -268,7 +274,7 @@ enum priority_t {
     priority_high = priority_normal + internal::priority_stride_v4
 };
 
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
 
 #if TBB_USE_CAPTURED_EXCEPTION
     class tbb_exception;
@@ -280,25 +286,25 @@ enum priority_t {
 
 class task_scheduler_init;
 
-//! Used to form groups of tasks 
-/** @ingroup task_scheduling 
-    The context services explicit cancellation requests from user code, and unhandled 
-    exceptions intercepted during tasks execution. Intercepting an exception results 
-    in generating internal cancellation requests (which is processed in exactly the 
-    same way as external ones). 
+//! Used to form groups of tasks
+/** @ingroup task_scheduling
+    The context services explicit cancellation requests from user code, and unhandled
+    exceptions intercepted during tasks execution. Intercepting an exception results
+    in generating internal cancellation requests (which is processed in exactly the
+    same way as external ones).
 
-    The context is associated with one or more root tasks and defines the cancellation 
-    group that includes all the descendants of the corresponding root task(s). Association 
+    The context is associated with one or more root tasks and defines the cancellation
+    group that includes all the descendants of the corresponding root task(s). Association
     is established when a context object is passed as an argument to the task::allocate_root()
     method. See task_group_context::task_group_context for more details.
-    
+
     The context can be bound to another one, and other contexts can be bound to it,
     forming a tree-like structure: parent -> this -> children. Arrows here designate
     cancellation propagation direction. If a task in a cancellation group is canceled
     all the other tasks in this group and groups bound to it (as children) get canceled too.
 
-    IMPLEMENTATION NOTE: 
-    When adding new members to task_group_context or changing types of existing ones, 
+    IMPLEMENTATION NOTE:
+    When adding new members to task_group_context or changing types of existing ones,
     update the size of both padding buffers (_leading_padding and _trailing_padding)
     appropriately. See also VERSIONING NOTE at the constructor definition below. **/
 class task_group_context : internal::no_copy {
@@ -349,7 +355,7 @@ private:
     task_group_context *my_parent;
 
     //! Used to form the thread specific list of contexts without additional memory allocation.
-    /** A context is included into the list of the current thread when its binding to 
+    /** A context is included into the list of the current thread when its binding to
         its parent happens. Any context can be present in the list of one thread only. **/
     internal::context_list_node_t my_node;
 
@@ -358,15 +364,15 @@ private:
 
     //! Leading padding protecting accesses to frequently used members from false sharing.
     /** Read accesses to the field my_cancellation_requested are on the hot path inside
-        the scheduler. This padding ensures that this field never shares the same cache 
+        the scheduler. This padding ensures that this field never shares the same cache
         line with a local variable that is frequently written to. **/
     char _leading_padding[internal::NFS_MaxLineSize
                           - 2 * sizeof(uintptr_t)- sizeof(void*) - sizeof(internal::context_list_node_t)
                           - sizeof(__itt_caller)];
-    
+
     //! Specifies whether cancellation was request for this task group.
     uintptr_t my_cancellation_requested;
-    
+
     //! Version for run-time checks and behavioral traits of the context.
     /** Version occupies low 16 bits, and traits (zero or more ORed enumerators
         from the traits_type enumerations) take the next 16 bits.
@@ -382,48 +388,48 @@ private:
     //! Internal state (combination of state flags).
     uintptr_t my_state;
 
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
     //! Priority level of the task group (in normalized representation)
     intptr_t my_priority;
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
 
     //! Trailing padding protecting accesses to frequently used members from false sharing
     /** \sa _leading_padding **/
     char _trailing_padding[internal::NFS_MaxLineSize - 2 * sizeof(uintptr_t) - 2 * sizeof(void*)
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
                             - sizeof(intptr_t)
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
                           ];
 
 public:
     //! Default & binding constructor.
-    /** By default a bound context is created. That is this context will be bound 
-        (as child) to the context of the task calling task::allocate_root(this_context) 
+    /** By default a bound context is created. That is this context will be bound
+        (as child) to the context of the task calling task::allocate_root(this_context)
         method. Cancellation requests passed to the parent context are propagated
         to all the contexts bound to it. Similarly priority change is propagated
         from the parent context to its children.
 
         If task_group_context::isolated is used as the argument, then the tasks associated
         with this context will never be affected by events in any other context.
-        
+
         Creating isolated contexts involve much less overhead, but they have limited
         utility. Normally when an exception occurs in an algorithm that has nested
-        ones running, it is desirably to have all the nested algorithms canceled 
+        ones running, it is desirably to have all the nested algorithms canceled
         as well. Such a behavior requires nested algorithms to use bound contexts.
-        
+
         There is one good place where using isolated algorithms is beneficial. It is
         a master thread. That is if a particular algorithm is invoked directly from
-        the master thread (not from a TBB task), supplying it with explicitly 
+        the master thread (not from a TBB task), supplying it with explicitly
         created isolated context will result in a faster algorithm startup.
-        
-        VERSIONING NOTE: 
-        Implementation(s) of task_group_context constructor(s) cannot be made 
-        entirely out-of-line because the run-time version must be set by the user 
-        code. This will become critically important for binary compatibility, if 
+
+        VERSIONING NOTE:
+        Implementation(s) of task_group_context constructor(s) cannot be made
+        entirely out-of-line because the run-time version must be set by the user
+        code. This will become critically important for binary compatibility, if
         we ever have to change the size of the context object.
 
-        Boosting the runtime version will also be necessary if new data fields are 
-        introduced in the currently unused padding areas and these fields are updated 
+        Boosting the runtime version will also be necessary if new data fields are
+        introduced in the currently unused padding areas and these fields are updated
         by inline methods. **/
     task_group_context ( kind_type relation_with_parent = bound,
                          uintptr_t traits = default_traits )
@@ -436,22 +442,22 @@ public:
     __TBB_EXPORTED_METHOD ~task_group_context ();
 
     //! Forcefully reinitializes the context after the task tree it was associated with is completed.
-    /** Because the method assumes that all the tasks that used to be associated with 
-        this context have already finished, calling it while the context is still 
+    /** Because the method assumes that all the tasks that used to be associated with
+        this context have already finished, calling it while the context is still
         in use somewhere in the task hierarchy leads to undefined behavior.
-        
+
         IMPORTANT: This method is not thread safe!
 
-        The method does not change the context's parent if it is set. **/ 
+        The method does not change the context's parent if it is set. **/
     void __TBB_EXPORTED_METHOD reset ();
 
     //! Initiates cancellation of all tasks in this cancellation group and its subordinate groups.
-    /** \return false if cancellation has already been requested, true otherwise. 
+    /** \return false if cancellation has already been requested, true otherwise.
 
-        Note that canceling never fails. When false is returned, it just means that 
+        Note that canceling never fails. When false is returned, it just means that
         another thread (or this one) has already sent cancellation request to this
         context or to one of its ancestors (if this context is bound). It is guaranteed
-        that when this method is concurrently called on the same not yet cancelled 
+        that when this method is concurrently called on the same not yet cancelled
         context, true will be returned by one and only one invocation. **/
     bool __TBB_EXPORTED_METHOD cancel_group_execution ();
 
@@ -459,24 +465,24 @@ public:
     bool __TBB_EXPORTED_METHOD is_group_execution_cancelled () const;
 
     //! Records the pending exception, and cancels the task group.
-    /** May be called only from inside a catch-block. If the context is already 
-        canceled, does nothing. 
-        The method brings the task group associated with this context exactly into 
-        the state it would be in, if one of its tasks threw the currently pending 
-        exception during its execution. In other words, it emulates the actions 
+    /** May be called only from inside a catch-block. If the context is already
+        canceled, does nothing.
+        The method brings the task group associated with this context exactly into
+        the state it would be in, if one of its tasks threw the currently pending
+        exception during its execution. In other words, it emulates the actions
         of the scheduler's dispatch loop exception handler. **/
     void __TBB_EXPORTED_METHOD register_pending_exception ();
 
-#if TBB_PREVIEW_TASK_PRIORITY
-    //! Changes priority of the task grop 
+#if __TBB_TASK_PRIORITY
+    //! Changes priority of the task grop
     void set_priority ( priority_t );
 
     //! Retrieves current priority of the current task group
     priority_t priority () const;
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
 
 protected:
-    //! Out-of-line part of the constructor. 
+    //! Out-of-line part of the constructor.
     /** Singled out to ensure backward binary compatibility of the future versions. **/
     void __TBB_EXPORTED_METHOD init ();
 
@@ -490,7 +496,7 @@ private:
     static const kind_type dying = kind_type(detached+1);
 
     //! Propagates state change (if any) from an ancestor
-    /** Checks if one of this object's ancestors is in a new state, and propagates 
+    /** Checks if one of this object's ancestors is in a new state, and propagates
         the new state to all its descendants in this object's heritage line. **/
     template <typename T>
     void propagate_state_from_ancestors ( T task_group_context::*mptr_state, T new_state );
@@ -542,7 +548,7 @@ public:
         //! task object is on free list, or is going to be put there, or was just taken off.
         freed,
         //! task to be recycled as continuation
-        recycle 
+        recycle
     };
 
     //------------------------------------------------------------------------
@@ -595,8 +601,8 @@ public:
     /** The caller must guarantee that the task's refcount does not become zero until
         after the method execute() returns.  Typically, this is done by having
         method execute() return a pointer to a child of the task.  If the guarantee
-        cannot be made, use method recycle_as_safe_continuation instead. 
-       
+        cannot be made, use method recycle_as_safe_continuation instead.
+
         Because of the hazard, this method may be deprecated in the future. */
     void recycle_as_continuation() {
         __TBB_ASSERT( prefix().state==executing, "execute not running?" );
@@ -605,7 +611,7 @@ public:
 
     //! Recommended to use, safe variant of recycle_as_continuation
     /** For safety, it requires additional increment of ref_count.
-        With no decendants and ref_count of 1, it has the semantics of recycle_to_reexecute. */
+        With no descendants and ref_count of 1, it has the semantics of recycle_to_reexecute. */
     void recycle_as_safe_continuation() {
         __TBB_ASSERT( prefix().state==executing, "execute not running?" );
         prefix().state = recycle;
@@ -634,7 +640,7 @@ public:
         prefix().state = reexecute;
     }
 
-    // All depth-related methods are obsolete, and are retained for the sake 
+    // All depth-related methods are obsolete, and are retained for the sake
     // of backward source compatibility only
     intptr_t depth() const {return 0;}
     void set_depth( intptr_t ) {}
@@ -655,13 +661,13 @@ public:
     }
 
     //! Atomically increment reference count and returns its old value.
-    /** Has acquire semantics */  
+    /** Has acquire semantics */
     void increment_ref_count() {
         __TBB_FetchAndIncrementWacquire( &prefix().ref_count );
     }
 
     //! Atomically decrement reference count and returns its new value.
-    /** Has release semantics. */  
+    /** Has release semantics. */
     int decrement_ref_count() {
 #if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
         return int(internal_decrement_ref_count());
@@ -698,29 +704,29 @@ public:
     }
 
     //! Enqueue task for starvation-resistant execution.
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
     /** The task will be enqueued on the normal priority level disregarding the
         priority of its task group.
-        
+
         The rationale of such semantics is that priority of an enqueued task is
         statically fixed at the moment of its enqueuing, while task group priority
         is dynamic. Thus automatic priority inheritance would be generally a subject
-        to the race, which may result in unexpected behavior. 
-        
+        to the race, which may result in unexpected behavior.
+
         Use enqueue() overload with explicit priority value and task::group_priority()
         method to implement such priority inheritance when it is really necessary. **/
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
     static void enqueue( task& t ) {
         t.prefix().owner->enqueue( t, NULL );
     }
 
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
     //! Enqueue task for starvation-resistant execution on the specified priority level.
     static void enqueue( task& t, priority_t p ) {
         __TBB_ASSERT( p == priority_low || p == priority_normal || p == priority_high, "Invalid priority level value" );
         t.prefix().owner->enqueue( t, (void*)p );
     }
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
 
     //! The innermost task being executed or destroyed by the current thread at the moment.
     static task& __TBB_EXPORTED_FUNC self();
@@ -728,6 +734,14 @@ public:
     //! task on whose behalf this task is working, or NULL if this is a root.
     task* parent() const {return prefix().parent;}
 
+    //! sets parent task pointer to specified value
+    void set_parent(task* p) {
+#if __TBB_TASK_GROUP_CONTEXT
+        __TBB_ASSERT(prefix().context == p->prefix().context, "The tasks must be in the same context");
+#endif
+        prefix().parent = p;
+    }
+
 #if __TBB_TASK_GROUP_CONTEXT
     //! This method is deprecated and will be removed in the future.
     /** Use method group() instead. **/
@@ -735,7 +749,7 @@ public:
 
     //! Pointer to the task group descriptor.
     task_group_context* group () { return prefix().context; }
-#endif /* __TBB_TASK_GROUP_CONTEXT */   
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
     //! True if task was stolen from the task pool of another thread.
     bool is_stolen_task() const {
@@ -764,7 +778,7 @@ public:
     //------------------------------------------------------------------------
     // Affinity
     //------------------------------------------------------------------------
- 
+
     //! An id as used for specifying affinity.
     /** Guaranteed to be integral type.  Value of 0 means no affinity. */
     typedef internal::affinity_id affinity_id;
@@ -776,8 +790,8 @@ public:
     affinity_id affinity() const {return prefix().affinity;}
 
     //! Invoked by scheduler to notify task that it ran on unexpected thread.
-    /** Invoked before method execute() runs, if task is stolen, or task has 
-        affinity but will be executed on another thread. 
+    /** Invoked before method execute() runs, if task is stolen, or task has
+        affinity but will be executed on another thread.
 
         The default action does nothing. */
     virtual void __TBB_EXPORTED_METHOD note_affinity( affinity_id id );
@@ -792,7 +806,7 @@ public:
         traditional usage model where task group context are allocated locally on
         the stack inapplicable. Dynamic allocation of context objects is performance
         inefficient. Method change_group() allows to make task group context object
-        a member of the task class, and then associate it with its containing task 
+        a member of the task class, and then associate it with its containing task
         object in the latter's constructor. **/
     void __TBB_EXPORTED_METHOD change_group ( task_group_context& ctx );
 
@@ -804,14 +818,14 @@ public:
     bool is_cancelled () const { return prefix().context->is_group_execution_cancelled(); }
 #endif /* __TBB_TASK_GROUP_CONTEXT */
 
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
     //! Changes priority of the task group this task belongs to.
     void set_group_priority ( priority_t p ) {  prefix().context->set_priority(p); }
 
     //! Retrieves current priority of the task group this task belongs to.
     priority_t group_priority () const { return prefix().context->priority(); }
 
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
 
 private:
     friend class interface5::internal::task_base;
@@ -824,7 +838,7 @@ private:
     friend class internal::allocate_continuation_proxy;
     friend class internal::allocate_child_proxy;
     friend class internal::allocate_additional_child_of_proxy;
-    
+
     //! Get reference to corresponding task_prefix.
     /** Version tag prevents loader on Linux from using the wrong symbol in debug builds. **/
     internal::task_prefix& prefix( internal::version_tag* = NULL ) const {
diff --git a/include/tbb/task_group.h b/include/tbb/task_group.h
index fd4d552..2e42544 100644
--- a/include/tbb/task_group.h
+++ b/include/tbb/task_group.h
@@ -32,6 +32,8 @@
 #include "task.h"
 #include "tbb_exception.h"
 
+#if __TBB_TASK_GROUP_CONTEXT
+
 namespace tbb {
 
 namespace internal {
@@ -245,4 +247,6 @@ task_handle<F> make_task( const F& f ) {
 
 } // namespace tbb
 
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
 #endif /* __TBB_task_group_H */
diff --git a/include/tbb/task_scheduler_init.h b/include/tbb/task_scheduler_init.h
index 2f8658e..576d370 100644
--- a/include/tbb/task_scheduler_init.h
+++ b/include/tbb/task_scheduler_init.h
@@ -59,13 +59,11 @@ namespace internal {
     as described in task_scheduler_init::initialize().
     @ingroup task_scheduling */
 class task_scheduler_init: internal::no_copy {
-#if TBB_USE_EXCEPTIONS
     enum ExceptionPropagationMode {
         propagation_mode_exact = 1u,
         propagation_mode_captured = 2u,
         propagation_mode_mask = propagation_mode_exact | propagation_mode_captured
     };
-#endif /* TBB_USE_EXCEPTIONS */
 
     /** NULL if not currently initialized. */
     internal::scheduler* my_scheduler;
@@ -100,8 +98,7 @@ public:
 
     //! Shorthand for default constructor followed by call to initialize(number_of_threads).
     task_scheduler_init( int number_of_threads=automatic, stack_size_type thread_stack_size=0 ) : my_scheduler(NULL)  {
-#if TBB_USE_EXCEPTIONS
-        // Take two lowest order bits of the stack size argument to communicate
+        // Two lowest order bits of the stack size argument may be taken to communicate
         // default exception propagation mode of the client to be used when the
         // client manually creates tasks in the master thread and does not use
         // explicit task group context object. This is necessary because newer 
@@ -109,6 +106,7 @@ public:
         // by older clients that expect tbb::captured_exception wrapper.
         // All zeros mean old client - no preference. 
         __TBB_ASSERT( !(thread_stack_size & propagation_mode_mask), "Requested stack size is not aligned" );
+#if TBB_USE_EXCEPTIONS
         thread_stack_size |= TBB_USE_CAPTURED_EXCEPTION ? propagation_mode_captured : propagation_mode_exact;
 #endif /* TBB_USE_EXCEPTIONS */
         initialize( number_of_threads, thread_stack_size );
diff --git a/include/tbb/tbb_config.h b/include/tbb/tbb_config.h
index 501538e..8b86b89 100644
--- a/include/tbb/tbb_config.h
+++ b/include/tbb/tbb_config.h
@@ -31,21 +31,49 @@
 
 /** This header is supposed to contain macro definitions and C style comments only.
     The macros defined here are intended to control such aspects of TBB build as 
+    - presence of compiler features
     - compilation modes
     - feature sets
-    - workarounds presence 
+    - known compiler/platform issues
 **/
 
-/** Compilation modes **/
+#define __TBB_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+
+/** Presence of compiler features **/
+
+#if (__TBB_GCC_VERSION >= 40400) && !defined(__INTEL_COMPILER)
+    /** warning suppression pragmas available in GCC since 4.4 **/
+    #define __TBB_GCC_WARNING_SUPPRESSION_PRESENT 1
+#endif
+
+/* TODO: The following condition should be extended when new compilers/runtimes 
+         with std::exception_ptr support appear. */
+#define __TBB_EXCEPTION_PTR_PRESENT  ((_MSC_VER >= 1600 || (__GXX_EXPERIMENTAL_CXX0X__ && __GNUC__==4 && __GNUC_MINOR__>=4)) && !__INTEL_COMPILER)
+
+#if __GNUC__ || __SUNPRO_CC || __IBMCPP__
+    /* ICC defines __GNUC__ and so is covered */
+    #define __TBB_ATTRIBUTE_ALIGNED_PRESENT 1
+#elif _MSC_VER && (_MSC_VER >= 1300 || __INTEL_COMPILER)
+    #define __TBB_DECLSPEC_ALIGN_PRESENT 1
+#endif
+
+#if (__TBB_GCC_VERSION >= 40102) && !defined(__INTEL_COMPILER)
+    /** built-in atomics available in GCC since 4.1.2 **/
+    #define __TBB_GCC_BUILTIN_ATOMICS_PRESENT 1
+#endif
+
+/** User controlled TBB features & modes **/
 
 #ifndef TBB_USE_DEBUG
 #ifdef TBB_DO_ASSERT
 #define TBB_USE_DEBUG TBB_DO_ASSERT
 #else
+#ifdef _DEBUG
+#define TBB_USE_DEBUG _DEBUG
+#else
 #define TBB_USE_DEBUG 0
+#endif
 #endif /* TBB_DO_ASSERT */
-#else
-#define TBB_DO_ASSERT TBB_USE_DEBUG
 #endif /* TBB_USE_DEBUG */
 
 #ifndef TBB_USE_ASSERT
@@ -91,6 +119,25 @@
     #endif
 #endif /* TBB_IMPLEMENT_CPP0X */
 
+#ifndef TBB_USE_CAPTURED_EXCEPTION
+    #if __TBB_EXCEPTION_PTR_PRESENT
+        #define TBB_USE_CAPTURED_EXCEPTION 0
+    #else
+        #define TBB_USE_CAPTURED_EXCEPTION 1
+    #endif
+#else /* defined TBB_USE_CAPTURED_EXCEPTION */
+    #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT
+        #error Current runtime does not support std::exception_ptr. Set TBB_USE_CAPTURED_EXCEPTION and make sure that your code is ready to catch tbb::captured_exception.
+    #endif
+#endif /* defined TBB_USE_CAPTURED_EXCEPTION */
+
+/** Check whether the request to use GCC atomics can be satisfied **/
+#if (TBB_USE_GCC_BUILTINS && !__TBB_GCC_BUILTIN_ATOMICS_PRESENT)
+    #error "GCC atomic built-ins are not supported."
+#endif
+
+/** Internal TBB features & modes **/
+
 #ifndef __TBB_DYNAMIC_LOAD_ENABLED
     #define __TBB_DYNAMIC_LOAD_ENABLED !__TBB_TASK_CPP_DIRECTLY_INCLUDED
 #elif !__TBB_DYNAMIC_LOAD_ENABLED
@@ -102,8 +149,6 @@
     #endif
 #endif
 
-/** Feature sets **/
-
 #ifndef __TBB_COUNT_TASK_NODES
     #define __TBB_COUNT_TASK_NODES TBB_USE_ASSERT
 #endif
@@ -112,78 +157,46 @@
     #define __TBB_TASK_GROUP_CONTEXT 1
 #endif /* __TBB_TASK_GROUP_CONTEXT */
 
+#if TBB_USE_EXCEPTIONS && !__TBB_TASK_GROUP_CONTEXT
+    #error TBB_USE_EXCEPTIONS requires __TBB_TASK_GROUP_CONTEXT to be enabled
+#endif
+
 #ifndef __TBB_SCHEDULER_OBSERVER
     #define __TBB_SCHEDULER_OBSERVER 1
 #endif /* __TBB_SCHEDULER_OBSERVER */
 
 #ifndef __TBB_TASK_PRIORITY
-    #define __TBB_TASK_PRIORITY __TBB_CPF_BUILD
+    #define __TBB_TASK_PRIORITY __TBB_TASK_GROUP_CONTEXT
 #endif /* __TBB_TASK_PRIORITY */
 
 #if __TBB_TASK_PRIORITY && !__TBB_TASK_GROUP_CONTEXT
     #error __TBB_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled
 #endif
 
-#ifdef TBB_PREVIEW_TASK_PRIORITY
-    #if TBB_PREVIEW_TASK_PRIORITY
-        #define __TBB_NO_IMPLICIT_LINKAGE 1
-        #if __TBB_BUILD && !__TBB_TASK_PRIORITY
-            #error TBB_PREVIEW_TASK_PRIORITY requires __TBB_TASK_PRIORITY to be enabled during TBB build
-        #elif !__TBB_TASK_GROUP_CONTEXT
-            #error TBB_PREVIEW_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled
-        #endif
-    #endif
-#else
-    #if __TBB_BUILD
-        #define TBB_PREVIEW_TASK_PRIORITY __TBB_TASK_PRIORITY
-    #endif
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
-
 #if !defined(__TBB_SURVIVE_THREAD_SWITCH) && (_WIN32 || _WIN64 || __linux__)
     #define __TBB_SURVIVE_THREAD_SWITCH 1
 #endif /* __TBB_SURVIVE_THREAD_SWITCH */
 
-
-/* TODO: The following condition should be extended as soon as new compilers/runtimes 
-         with std::exception_ptr support appear. */
-#define __TBB_EXCEPTION_PTR_PRESENT  (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && (__GNUC__==4 && __GNUC_MINOR__>=4))
-
-
-#ifndef TBB_USE_CAPTURED_EXCEPTION
-    #if __TBB_EXCEPTION_PTR_PRESENT
-        #define TBB_USE_CAPTURED_EXCEPTION 0
-    #else
-        #define TBB_USE_CAPTURED_EXCEPTION 1
-    #endif
-#else /* defined TBB_USE_CAPTURED_EXCEPTION */
-    #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT
-        #error Current runtime does not support std::exception_ptr. Set TBB_USE_CAPTURED_EXCEPTION and make sure that your code is ready to catch tbb::captured_exception.
-    #endif
-#endif /* defined TBB_USE_CAPTURED_EXCEPTION */
-
-
 #ifndef __TBB_DEFAULT_PARTITIONER
 #if TBB_DEPRECATED
 /** Default partitioner for parallel loop templates in TBB 1.0-2.1 */
 #define __TBB_DEFAULT_PARTITIONER tbb::simple_partitioner
 #else
-/** Default partitioner for parallel loop templates in TBB 2.2 */
+/** Default partitioner for parallel loop templates since TBB 2.2 */
 #define __TBB_DEFAULT_PARTITIONER tbb::auto_partitioner
-#endif /* TBB_DEFAULT_PARTITIONER */
+#endif /* TBB_DEPRECATED */
 #endif /* !defined(__TBB_DEFAULT_PARTITIONER */
 
-/** Workarounds presence **/
-
-#if __GNUC__==4 && __GNUC_MINOR__>=4 && !defined(__INTEL_COMPILER)
-    #define __TBB_GCC_WARNING_SUPPRESSION_ENABLED 1
-#endif
-
 /** Macros of the form __TBB_XXX_BROKEN denote known issues that are caused by
     the bugs in compilers, standard or OS specific libraries. They should be 
     removed as soon as the corresponding bugs are fixed or the buggy OS/compiler
     versions go out of the support list. 
 **/
 
+#if __GNUC__ && __TBB_x86_64 && __INTEL_COMPILER == 1200
+    #define __TBB_ICC_12_0_INL_ASM_FSTCW_BROKEN 1
+#endif
+
 #if _MSC_VER && __INTEL_COMPILER && (__INTEL_COMPILER<1110 || __INTEL_COMPILER==1110 && __INTEL_COMPILER_BUILD_DATE < 20091012)
     /** Necessary to avoid ICL error (or warning in non-strict mode): 
         "exception specification for implicitly declared virtual destructor is 
@@ -197,7 +210,7 @@
     #define __TBB_TEMPLATE_FRIENDS_BROKEN 1
 #endif
 
-#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__
+#if __GLIBC__==2 && __GLIBC_MINOR__==3 || __MINGW32__ || (__APPLE__ && __INTEL_COMPILER==1200 && !TBB_USE_DEBUG)
     //! Macro controlling EH usages in TBB tests
     /** Some older versions of glibc crash when exception handling happens concurrently. **/
     #define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1
@@ -240,4 +253,10 @@
     #define __TBB_ICC_ASM_VOLATILE_BROKEN 1
 #endif
 
+#if !__INTEL_COMPILER && (_MSC_VER || __GNUC__==3 && __GNUC_MINOR__<=2)
+    /** Bug in GCC 3.2 and MSVC compilers that sometimes return 0 for __alignof(T) 
+        when T has not yet been instantiated. **/
+    #define __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN 1
+#endif
+
 #endif /* __TBB_tbb_config_H */
diff --git a/include/tbb/tbb_machine.h b/include/tbb/tbb_machine.h
index bd38d0b..50636e5 100644
--- a/include/tbb/tbb_machine.h
+++ b/include/tbb/tbb_machine.h
@@ -29,29 +29,156 @@
 #ifndef __TBB_machine_H
 #define __TBB_machine_H
 
+/** This header provides basic platform abstraction layer by hooking up appropriate
+    architecture/OS/compiler specific headers from the /include/tbb/machine directory.
+    If a plug-in header does not implement all the required APIs, it must specify
+    the missing ones by setting one or more of the following macros:
+
+    __TBB_USE_GENERIC_PART_WORD_CAS
+    __TBB_USE_GENERIC_PART_WORD_FETCH_ADD
+    __TBB_USE_GENERIC_PART_WORD_FETCH_STORE
+    __TBB_USE_GENERIC_FETCH_ADD
+    __TBB_USE_GENERIC_FETCH_STORE
+    __TBB_USE_GENERIC_DWORD_FETCH_ADD
+    __TBB_USE_GENERIC_DWORD_FETCH_STORE
+    __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE
+    __TBB_USE_GENERIC_FULL_FENCED_LOAD_STORE
+    __TBB_USE_GENERIC_RELAXED_LOAD_STORE
+    __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE
+
+    In this case tbb_machine.h will add missing functionality based on a minimal set 
+    of APIs that are required to be implemented by all plug-n headers as described
+    futher.
+    Note that these generic implementations may be sub-optimal for a particular
+    architecture, and thus should be relied upon only after careful evaluation
+    or as the last resort.
+
+    Additionally __TBB_64BIT_ATOMICS can be set to 0 on a 32-bit architecture to
+    indicate that the port is not going to support double word atomics. It may also
+    be set to 1 explicitly, though normally this is not necessary as tbb_machine.h
+    will set it automatically.
+
+    Prerequisites for each architecture port
+    ----------------------------------------
+    The following functions have no generic implementation. Therefore they must be 
+    implemented in each machine architecture specific header either as a conventional
+    function or as a functional macro.
+
+    __TBB_Yield()
+        Signals OS that the current thread is willing to relinquish the remainder
+        of its time quantum.
+
+    __TBB_full_memory_fence()
+        Must prevent all memory operations from being reordered across it (both
+        by hardware and compiler). All such fences must be totally ordered (or
+        sequentially consistent).
+
+    __TBB_machine_cmpswp4( volatile void *ptr, int32_t value, int32_t comparand )
+        Must be provided if __TBB_USE_FENCED_ATOMICS is not set.
+
+    __TBB_machine_cmpswp8( volatile void *ptr, int32_t value, int64_t comparand )
+        Must be provided for 64-bit architectures if __TBB_USE_FENCED_ATOMICS is not set,
+        and for 32-bit architectures if __TBB_64BIT_ATOMICS is set
+
+    __TBB_machine_<op><S><fence>(...), where
+        <op> = {cmpswp, fetchadd, fetchstore}
+        <S> = {1, 2, 4, 8}
+        <fence> = {full_fence, acquire, release, relaxed}
+        Must be provided if __TBB_USE_FENCED_ATOMICS is set.
+
+    __TBB_control_consistency_helper()
+        Bridges the memory-semantics gap between architectures providing only
+        implicit C++0x "consume" semantics (like Power Architecture) and those
+        also implicitly obeying control dependencies (like Itanium).
+        It must be used only in conditional code where the condition is itself
+        data-dependent, and will then make subsequent code behave as if the
+        original data dependency were acquired.
+        It needs only an empty definition where implied by the architecture
+        either specifically (Itanium) or because generally stronger C++0x "acquire"
+        semantics are enforced (like x86).
+    
+    __TBB_acquire_consistency_helper(), __TBB_release_consistency_helper()
+        Must be provided if __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE is set.
+        Enforce acquire and release semantics in generic implementations of fenced
+        store and load operations. Depending on the particular architecture/compiler
+        combination they may be a hardware fence, a compiler fence, both or nothing.
+ **/
+
 #include "tbb_stddef.h"
 
+namespace tbb {
+namespace internal {
+
+////////////////////////////////////////////////////////////////////////////////
+// Overridable helpers declarations
+//
+// A machine/*.h file may choose to define these templates, otherwise it must
+// request default implementation by setting appropriate __TBB_USE_GENERIC_XXX macro(s).
+//
+template <typename T, std::size_t S>
+struct machine_load_store;
+
+template <typename T, std::size_t S>
+struct machine_load_store_relaxed;
+
+template <typename T, std::size_t S>
+struct machine_load_store_seq_cst;
+//
+// End of overridable helpers declarations
+////////////////////////////////////////////////////////////////////////////////
+
+template<size_t S> struct atomic_selector;
+
+template<> struct atomic_selector<1> {
+    typedef int8_t word;
+    inline static word fetch_store ( volatile void* location, word value );
+};
+
+template<> struct atomic_selector<2> {
+    typedef int16_t word;
+    inline static word fetch_store ( volatile void* location, word value );
+};
+
+template<> struct atomic_selector<4> {
+#if _MSC_VER && !_WIN64
+    // Work-around that avoids spurious /Wp64 warnings
+    typedef intptr_t word;
+#else
+    typedef int32_t word;
+#endif
+    inline static word fetch_store ( volatile void* location, word value );
+};
+
+template<> struct atomic_selector<8> {
+    typedef int64_t word;
+    inline static word fetch_store ( volatile void* location, word value );
+};
+
+}} // namespaces internal, tbb
+
 #if _WIN32||_WIN64
 
 #ifdef _MANAGED
 #pragma managed(push, off)
 #endif
 
-#if __MINGW64__
-#include "machine/linux_intel64.h"
-extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
-#define __TBB_Yield()  SwitchToThread()
-#elif __MINGW32__
-#include "machine/linux_ia32.h"
-extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
-#define __TBB_Yield()  SwitchToThread()
-#elif defined(_M_IX86)
-#include "machine/windows_ia32.h"
-#elif defined(_M_AMD64) 
-#include "machine/windows_intel64.h"
-#elif _XBOX 
-#include "machine/xbox360_ppc.h"
-#endif
+    #if __MINGW64__ || __MINGW32__
+        extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
+        #define __TBB_Yield()  SwitchToThread()
+        #if (TBB_USE_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT)
+            #include "machine/gcc_generic.h"
+        #elif __MINGW64__
+            #include "machine/linux_intel64.h"
+        #elif __MINGW32__
+            #include "machine/linux_ia32.h"
+        #endif
+    #elif defined(_M_IX86)
+        #include "machine/windows_ia32.h"
+    #elif defined(_M_X64) 
+        #include "machine/windows_intel64.h"
+    #elif _XBOX
+        #include "machine/xbox360_ppc.h"
+    #endif
 
 #ifdef _MANAGED
 #pragma managed(pop)
@@ -59,74 +186,95 @@ extern "C" __declspec(dllimport) int __stdcall SwitchToThread( void );
 
 #elif __linux__ || __FreeBSD__ || __NetBSD__
 
-#if __i386__
-#include "machine/linux_ia32.h"
-#elif __x86_64__
-#include "machine/linux_intel64.h"
-#elif __ia64__
-#include "machine/linux_ia64.h"
-#elif __powerpc__
-#include "machine/mac_ppc.h"
-#endif
-#include "machine/linux_common.h"
+    #if (TBB_USE_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT)
+        #include "machine/gcc_generic.h"
+    #elif __i386__
+        #include "machine/linux_ia32.h"
+    #elif __x86_64__
+        #include "machine/linux_intel64.h"
+    #elif __ia64__
+        #include "machine/linux_ia64.h"
+    #elif __powerpc__
+        #include "machine/mac_ppc.h"
+    #elif __TBB_GCC_BUILTIN_ATOMICS_PRESENT
+        #include "machine/gcc_generic.h"
+    #endif
+    #include "machine/linux_common.h"
 
 #elif __APPLE__
 
-#if __i386__
-#include "machine/linux_ia32.h"
-#elif __x86_64__
-#include "machine/linux_intel64.h"
-#elif __POWERPC__
-#include "machine/mac_ppc.h"
-#endif
-#include "machine/macos_common.h"
+    #if __i386__
+        #include "machine/linux_ia32.h"
+    #elif __x86_64__
+        #include "machine/linux_intel64.h"
+    #elif __POWERPC__
+        #include "machine/mac_ppc.h"
+    #endif
+    #include "machine/macos_common.h"
 
 #elif _AIX
 
-#include "machine/ibm_aix51.h"
+    #include "machine/ibm_aix51.h"
 
 #elif __sun || __SUNPRO_CC
 
-#define __asm__ asm 
-#define __volatile__ volatile
+    #define __asm__ asm
+    #define __volatile__ volatile
 
-#if __i386  || __i386__
-#include "machine/linux_ia32.h"
-#elif __x86_64__
-#include "machine/linux_intel64.h"
-#elif __sparc
-#include "machine/sunos_sparc.h"
-#endif
-#include <sched.h>
+    #if __i386  || __i386__
+        #include "machine/linux_ia32.h"
+    #elif __x86_64__
+        #include "machine/linux_intel64.h"
+    #elif __sparc
+        #include "machine/sunos_sparc.h"
+    #endif
+    #include <sched.h>
 
-#define __TBB_Yield() sched_yield()
+    #define __TBB_Yield() sched_yield()
 
-#endif /* Sun */
+#endif /* OS selection */
 
 #ifndef __TBB_64BIT_ATOMICS
-#define __TBB_64BIT_ATOMICS 1
+    #define __TBB_64BIT_ATOMICS 1
 #endif
 
-//! Prerequisites for each architecture port
-/** There are no generic implementation for these macros so they have to be implemented
-    in each machine architecture specific header.
-
-    __TBB_full_memory_fence must prevent all memory operations from being reordered 
-    across the fence. And all such fences must be totally ordered (or sequentially 
-    consistent). These fence must affect both compiler and hardware.
-    
-    __TBB_release_consistency_helper is used to enforce guarantees of acquire or 
-    release semantics in generic implementations of __TBB_load_with_acquire and 
-    __TBB_store_with_release below. Depending on the particular combination of
-    architecture+compiler it can be a hardware fence, a compiler fence, both or
-    nothing. **/
-#if    !defined(__TBB_CompareAndSwap4) \
-    || !defined(__TBB_CompareAndSwap8) && __TBB_64BIT_ATOMICS \
-    || !defined(__TBB_Yield)           \
-    || !defined(__TBB_full_memory_fence)    \
-    || !defined(__TBB_release_consistency_helper)
-#error Minimal requirements for tbb_machine.h not satisfied; platform is not supported.
-#endif
+// Special atomic functions
+#if __TBB_USE_FENCED_ATOMICS
+    #define __TBB_machine_cmpswp1   __TBB_machine_cmpswp1full_fence
+    #define __TBB_machine_cmpswp2   __TBB_machine_cmpswp2full_fence
+    #define __TBB_machine_cmpswp4   __TBB_machine_cmpswp4full_fence
+    #define __TBB_machine_cmpswp8   __TBB_machine_cmpswp8full_fence
+
+    #if __TBB_WORDSIZE==8
+        #define __TBB_machine_fetchadd8             __TBB_machine_fetchadd8full_fence
+        #define __TBB_machine_fetchstore8           __TBB_machine_fetchstore8full_fence
+        #define __TBB_FetchAndAddWrelease(P,V)      __TBB_machine_fetchadd8release(P,V)
+        #define __TBB_FetchAndIncrementWacquire(P)  __TBB_machine_fetchadd8acquire(P,1)
+        #define __TBB_FetchAndDecrementWrelease(P)  __TBB_machine_fetchadd8release(P,(-1))
+    #else
+        #error Define macros for 4-byte word, similarly to the above __TBB_WORDSIZE==8 branch.
+    #endif /* __TBB_WORDSIZE==4 */
+#else /* !__TBB_USE_FENCED_ATOMICS */
+    #define __TBB_FetchAndAddWrelease(P,V)      __TBB_FetchAndAddW(P,V)
+    #define __TBB_FetchAndIncrementWacquire(P)  __TBB_FetchAndAddW(P,1)
+    #define __TBB_FetchAndDecrementWrelease(P)  __TBB_FetchAndAddW(P,(-1))
+#endif /* !__TBB_USE_FENCED_ATOMICS */
+
+#if __TBB_WORDSIZE==4
+    #define __TBB_CompareAndSwapW(P,V,C)    __TBB_machine_cmpswp4(P,V,C)
+    #define __TBB_FetchAndAddW(P,V)         __TBB_machine_fetchadd4(P,V)
+    #define __TBB_FetchAndStoreW(P,V)       __TBB_machine_fetchstore4(P,V)
+#elif  __TBB_WORDSIZE==8
+    #if __TBB_USE_GENERIC_DWORD_LOAD_STORE || __TBB_USE_GENERIC_DWORD_FETCH_ADD || __TBB_USE_GENERIC_DWORD_FETCH_STORE
+        #error These macros should only be used on 32-bit platforms.
+    #endif
+
+    #define __TBB_CompareAndSwapW(P,V,C)    __TBB_machine_cmpswp8(P,V,C)
+    #define __TBB_FetchAndAddW(P,V)         __TBB_machine_fetchadd8(P,V)
+    #define __TBB_FetchAndStoreW(P,V)       __TBB_machine_fetchstore8(P,V)
+#else /* __TBB_WORDSIZE != 8 */
+    #error Unsupported machine word size.
+#endif /* __TBB_WORDSIZE */
 
 #ifndef __TBB_Pause
     inline void __TBB_Pause(int32_t) {
@@ -144,7 +292,7 @@ namespace internal {
 //! Class that implements exponential backoff.
 /** See implementation of spin_wait_while_eq for an example. */
 class atomic_backoff : no_copy {
-    //! Time delay, in units of "pause" instructions. 
+    //! Time delay, in units of "pause" instructions.
     /** Should be equal to approximately the number of "pause" instructions
         that take the same time as an context switch. */
     static const int32_t LOOPS_BEFORE_YIELD = 16;
@@ -215,8 +363,9 @@ inline T __TBB_MaskedCompareAndSwap (volatile T *ptr, T value, T comparand ) {
         result = *base; // reload the base value which might change during the pause
         uint32_t old_value = ( result & ~mask ) | ( comparand << bitoffset );
         uint32_t new_value = ( result & ~mask ) | ( value << bitoffset );
-        // __TBB_CompareAndSwap4 presumed to have full fence. 
-        result = __TBB_CompareAndSwap4( base, new_value, old_value );
+        // __TBB_CompareAndSwap4 presumed to have full fence.
+        // Cast shuts up /Wp64 warning
+        result = (uint32_t)__TBB_machine_cmpswp4( base, new_value, old_value );
         if(  result==old_value               // CAS succeeded
           || ((result^old_value)&mask)!=0 )  // CAS failed and the bits of interest have changed
             break;
@@ -227,37 +376,36 @@ inline T __TBB_MaskedCompareAndSwap (volatile T *ptr, T value, T comparand ) {
 }
 
 template<size_t S, typename T>
-inline T __TBB_CompareAndSwapGeneric (volatile void *ptr, T value, T comparand ) { 
-    return __TBB_CompareAndSwapW((T *)ptr,value,comparand);
-}
+inline T __TBB_CompareAndSwapGeneric (volatile void *ptr, T value, T comparand );
 
 template<>
 inline uint8_t __TBB_CompareAndSwapGeneric <1,uint8_t> (volatile void *ptr, uint8_t value, uint8_t comparand ) {
-#ifdef __TBB_CompareAndSwap1
-    return __TBB_CompareAndSwap1(ptr,value,comparand);
-#else
+#if __TBB_USE_GENERIC_PART_WORD_CAS
     return __TBB_MaskedCompareAndSwap<1,uint8_t>((volatile uint8_t *)ptr,value,comparand);
+#else
+    return __TBB_machine_cmpswp1(ptr,value,comparand);
 #endif
 }
 
 template<>
 inline uint16_t __TBB_CompareAndSwapGeneric <2,uint16_t> (volatile void *ptr, uint16_t value, uint16_t comparand ) {
-#ifdef __TBB_CompareAndSwap2
-    return __TBB_CompareAndSwap2(ptr,value,comparand);
-#else
+#if __TBB_USE_GENERIC_PART_WORD_CAS
     return __TBB_MaskedCompareAndSwap<2,uint16_t>((volatile uint16_t *)ptr,value,comparand);
+#else
+    return __TBB_machine_cmpswp2(ptr,value,comparand);
 #endif
 }
 
 template<>
-inline uint32_t __TBB_CompareAndSwapGeneric <4,uint32_t> (volatile void *ptr, uint32_t value, uint32_t comparand ) { 
-    return __TBB_CompareAndSwap4(ptr,value,comparand);
+inline uint32_t __TBB_CompareAndSwapGeneric <4,uint32_t> (volatile void *ptr, uint32_t value, uint32_t comparand ) {
+    // Cast shuts up /Wp64 warning
+    return (uint32_t)__TBB_machine_cmpswp4(ptr,value,comparand);
 }
 
 #if __TBB_64BIT_ATOMICS
 template<>
-inline uint64_t __TBB_CompareAndSwapGeneric <8,uint64_t> (volatile void *ptr, uint64_t value, uint64_t comparand ) { 
-    return __TBB_CompareAndSwap8(ptr,value,comparand);
+inline uint64_t __TBB_CompareAndSwapGeneric <8,uint64_t> (volatile void *ptr, uint64_t value, uint64_t comparand ) {
+    return __TBB_machine_cmpswp8(ptr,value,comparand);
 }
 #endif
 
@@ -267,8 +415,8 @@ inline T __TBB_FetchAndAddGeneric (volatile void *ptr, T addend) {
     T result;
     for(;;) {
         result = *reinterpret_cast<volatile T *>(ptr);
-        // __TBB_CompareAndSwapGeneric presumed to have full fence. 
-        if( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result ) 
+        // __TBB_CompareAndSwapGeneric presumed to have full fence.
+        if( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result )
             break;
         b.pause();
     }
@@ -282,59 +430,275 @@ inline T __TBB_FetchAndStoreGeneric (volatile void *ptr, T value) {
     for(;;) {
         result = *reinterpret_cast<volatile T *>(ptr);
         // __TBB_CompareAndSwapGeneric presumed to have full fence.
-        if( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result ) 
+        if( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result )
             break;
         b.pause();
     }
     return result;
 }
 
+#if __TBB_USE_GENERIC_PART_WORD_CAS
+#define __TBB_machine_cmpswp1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t>
+#define __TBB_machine_cmpswp2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t>
+#endif
+
+#if __TBB_USE_GENERIC_FETCH_ADD || __TBB_USE_GENERIC_PART_WORD_FETCH_ADD
+#define __TBB_machine_fetchadd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t>
+#define __TBB_machine_fetchadd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t>
+#endif
+
+#if __TBB_USE_GENERIC_FETCH_ADD 
+#define __TBB_machine_fetchadd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t>
+#endif
+
+#if __TBB_USE_GENERIC_FETCH_ADD || __TBB_USE_GENERIC_DWORD_FETCH_ADD
+#define __TBB_machine_fetchadd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t>
+#endif
+
+#if __TBB_USE_GENERIC_FETCH_STORE || __TBB_USE_GENERIC_PART_WORD_FETCH_STORE
+#define __TBB_machine_fetchstore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t>
+#define __TBB_machine_fetchstore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t>
+#endif
+
+#if __TBB_USE_GENERIC_FETCH_STORE 
+#define __TBB_machine_fetchstore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t>
+#endif
+
+#if __TBB_USE_GENERIC_FETCH_STORE || __TBB_USE_GENERIC_DWORD_FETCH_STORE
+#define __TBB_machine_fetchstore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_t>
+#endif
+
+#if __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE
+#define __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(S)                                             \
+    atomic_selector<S>::word atomic_selector<S>::fetch_store ( volatile void* location, word value ) {  \
+        return __TBB_machine_fetchstore##S( location, value );                                          \
+    }
+
+__TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(1)
+__TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(2)
+__TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(4)
+__TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(8)
+
+#undef __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE
+#endif /* __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */
+
+#if __TBB_USE_GENERIC_DWORD_LOAD_STORE
+inline void __TBB_machine_store8 (volatile void *ptr, int64_t value) {
+    for(;;) {
+        int64_t result = *(int64_t *)ptr;
+        if( __TBB_machine_cmpswp8(ptr,value,result)==result ) break;
+    }
+}
+
+inline int64_t __TBB_machine_load8 (const volatile void *ptr) {
+    // Comparand and new value may be anything, they only must be equal, and
+    // the value should have a low probability to be actually found in 'location'.
+    const int64_t anyvalue = 2305843009213693951;
+    return __TBB_machine_cmpswp8(const_cast<volatile void *>(ptr),anyvalue,anyvalue);
+}
+#endif /* __TBB_USE_GENERIC_DWORD_LOAD_STORE */
+
+#if __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE
+/** Fenced operations use volatile qualifier to prevent compiler from optimizing
+    them out, and on on architectures with weak memory ordering to induce compiler
+    to generate code with appropriate acquire/release semantics.
+    On architectures like IA32, Intel64 (and likely and Sparc TSO) volatile has
+    no effect on code gen, and consistency helpers serve as a compiler fence (the
+    latter being true for IA64/gcc as well to fix a bug in some gcc versions). **/
+template <typename T, size_t S>
+struct machine_load_store {
+    static T load_with_acquire ( const volatile T& location ) {
+        T to_return = location;
+        __TBB_acquire_consistency_helper();
+        return to_return;
+    }
+    static void store_with_release ( volatile T &location, T value ) {
+        __TBB_release_consistency_helper();
+        location = value;
+    }
+};
+
+#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS
+template <typename T>
+struct machine_load_store<T,8> {
+    static T load_with_acquire ( const volatile T& location ) {
+        return (T)__TBB_machine_load8( (const volatile void*)&location );
+    }
+    static void store_with_release ( volatile T& location, T value ) {
+        __TBB_machine_store8( (volatile void*)&location, (int64_t)value );
+    }
+};
+#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */
+#endif /* __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE */
+
+template <typename T, size_t S>
+struct machine_load_store_seq_cst {
+    static T load ( const volatile T& location ) {
+        __TBB_full_memory_fence();
+        return machine_load_store<T,S>::load_with_acquire( location );
+    }
+#if __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE
+    static void store ( volatile T &location, T value ) {
+        atomic_selector<S>::fetch_store( (volatile void*)&location, (typename atomic_selector<S>::word)value );
+    }
+#else /* !__TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */
+    static void store ( volatile T &location, T value ) {
+        machine_load_store<T,S>::store_with_release( location, value );
+        __TBB_full_memory_fence();
+    }
+#endif /* !__TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */
+};
+
+#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS
+/** The implementation does not use functions __TBB_machine_load8/store8 as they
+    are not required to be sequentially consistent. **/
+template <typename T>
+struct machine_load_store_seq_cst<T,8> {
+    static T load ( const volatile T& location ) {
+        // Comparand and new value may be anything, they only must be equal, and
+        // the value should have a low probability to be actually found in 'location'.
+        const int64_t anyvalue = 2305843009213693951ll;
+        return __TBB_machine_cmpswp8( (volatile void*)const_cast<volatile T*>(&location), anyvalue, anyvalue );
+    }
+    static void store ( volatile T &location, T value ) {
+        int64_t result = (volatile int64_t&)location;
+        while ( __TBB_machine_cmpswp8((volatile void*)&location, (int64_t)value, result) != result )
+            result = (volatile int64_t&)location;
+    }
+};
+#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */
+
+#if __TBB_USE_GENERIC_RELAXED_LOAD_STORE
+// Relaxed operations add volatile qualifier to prevent compiler from optimizing them out.
+/** Volatile should not incur any additional cost on IA32, Intel64, and Sparc TSO
+    architectures. However on architectures with weak memory ordering compiler may 
+    generate code with acquire/release semantics for operations on volatile data. **/
+template <typename T, size_t S>
+struct machine_load_store_relaxed {
+    static inline T load ( const volatile T& location ) {
+        return location;
+    }
+    static inline void store ( volatile T& location, T value ) {
+        location = value;
+    }
+};
+
+#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS
+template <typename T>
+struct machine_load_store_relaxed<T,8> {
+    static inline T load ( const volatile T& location ) {
+        return (T)__TBB_machine_load8( (const volatile void*)&location );
+    }
+    static inline void store ( volatile T& location, T value ) {
+        __TBB_machine_store8( (volatile void*)&location, (int64_t)value );
+    }
+};
+#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */
+#endif /* __TBB_USE_GENERIC_RELAXED_LOAD_STORE */
+
+template<typename T>
+inline T __TBB_load_with_acquire(const volatile T &location) {
+    return machine_load_store<T,sizeof(T)>::load_with_acquire( location );
+}
+template<typename T, typename V>
+inline void __TBB_store_with_release(volatile T& location, V value) {
+    machine_load_store<T,sizeof(T)>::store_with_release( location, T(value) );
+}
+//! Overload that exists solely to avoid /Wp64 warnings.
+inline void __TBB_store_with_release(volatile size_t& location, size_t value) {
+    machine_load_store<size_t,sizeof(size_t)>::store_with_release( location, value );
+}
+
+template<typename T>
+inline T __TBB_load_full_fence(const volatile T &location) {
+    return machine_load_store_seq_cst<T,sizeof(T)>::load( location );
+}
+template<typename T, typename V>
+inline void __TBB_store_full_fence(volatile T& location, V value) {
+    machine_load_store_seq_cst<T,sizeof(T)>::store( location, T(value) );
+}
+//! Overload that exists solely to avoid /Wp64 warnings.
+inline void __TBB_store_full_fence(volatile size_t& location, size_t value) {
+    machine_load_store_seq_cst<size_t,sizeof(size_t)>::store( location, value );
+}
+
+template<typename T>
+inline T __TBB_load_relaxed (const volatile T& location) {
+    return machine_load_store_relaxed<T,sizeof(T)>::load( const_cast<T&>(location) );
+}
+template<typename T, typename V>
+inline void __TBB_store_relaxed ( volatile T& location, V value ) {
+    machine_load_store_relaxed<T,sizeof(T)>::store( const_cast<T&>(location), T(value) );
+}
+//! Overload that exists solely to avoid /Wp64 warnings.
+inline void __TBB_store_relaxed ( volatile size_t& location, size_t value ) {
+    machine_load_store_relaxed<size_t,sizeof(size_t)>::store( const_cast<size_t&>(location), value );
+}
+
 // Macro __TBB_TypeWithAlignmentAtLeastAsStrict(T) should be a type with alignment at least as 
-// strict as type T.  Type type should have a trivial default constructor and destructor, so that
-// arrays of that type can be declared without initializers.  
+// strict as type T.  The type should have a trivial default constructor and destructor, so that
+// arrays of that type can be declared without initializers.
 // It is correct (but perhaps a waste of space) if __TBB_TypeWithAlignmentAtLeastAsStrict(T) expands
 // to a type bigger than T.
 // The default definition here works on machines where integers are naturally aligned and the
-// strictest alignment is 16.
+// strictest alignment is 64.
 #ifndef __TBB_TypeWithAlignmentAtLeastAsStrict
 
-#if __GNUC__ || __SUNPRO_CC || __IBMCPP__
-struct __TBB_machine_type_with_strictest_alignment {
-    int member[4];
-} __attribute__((aligned(16)));
-#elif _MSC_VER
-__declspec(align(16)) struct __TBB_machine_type_with_strictest_alignment {
-    int member[4];
+#if __TBB_ATTRIBUTE_ALIGNED_PRESENT
+
+#define __TBB_DefineTypeWithAlignment(PowerOf2)       \
+struct __TBB_machine_type_with_alignment_##PowerOf2 { \
+    uint32_t member[PowerOf2/sizeof(uint32_t)];       \
+} __attribute__((aligned(PowerOf2)));
+#define __TBB_alignof(T) __alignof__(T)
+
+#elif __TBB_DECLSPEC_ALIGN_PRESENT
+
+#define __TBB_DefineTypeWithAlignment(PowerOf2)       \
+__declspec(align(PowerOf2))                           \
+struct __TBB_machine_type_with_alignment_##PowerOf2 { \
+    uint32_t member[PowerOf2/sizeof(uint32_t)];       \
 };
-#else
-#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T) or __TBB_machine_type_with_strictest_alignment
+#define __TBB_alignof(T) __alignof(T)
+
+#else /* A compiler with unknown syntax for data alignment */
+#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T)
 #endif
 
-template<size_t N> struct type_with_alignment {__TBB_machine_type_with_strictest_alignment member;};
+/* Now declare types aligned to useful powers of two */
+// TODO: Is __TBB_DefineTypeWithAlignment(8) needed on 32 bit platforms?
+__TBB_DefineTypeWithAlignment(16)
+__TBB_DefineTypeWithAlignment(32)
+__TBB_DefineTypeWithAlignment(64)
+
+typedef __TBB_machine_type_with_alignment_64 __TBB_machine_type_with_strictest_alignment;
+
+// Primary template is a declaration of incomplete type so that it fails with unknown alignments
+template<size_t N> struct type_with_alignment;
+
+// Specializations for allowed alignments
 template<> struct type_with_alignment<1> { char member; };
 template<> struct type_with_alignment<2> { uint16_t member; };
 template<> struct type_with_alignment<4> { uint32_t member; };
 template<> struct type_with_alignment<8> { uint64_t member; };
+template<> struct type_with_alignment<16> {__TBB_machine_type_with_alignment_16 member; };
+template<> struct type_with_alignment<32> {__TBB_machine_type_with_alignment_32 member; };
+template<> struct type_with_alignment<64> {__TBB_machine_type_with_alignment_64 member; };
 
-#if _MSC_VER||defined(__GNUC__)&&__GNUC__==3 && __GNUC_MINOR__<=2  
+#if __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN  
 //! Work around for bug in GNU 3.2 and MSVC compilers.
 /** Bug is that compiler sometimes returns 0 for __alignof(T) when T has not yet been instantiated.
     The work-around forces instantiation by forcing computation of sizeof(T) before __alignof(T). */
-template<size_t Size, typename T> 
+template<size_t Size, typename T>
 struct work_around_alignment_bug {
-#if _MSC_VER
-    static const size_t alignment = __alignof(T);
-#else
-    static const size_t alignment = __alignof__(T);
-#endif
+    static const size_t alignment = __TBB_alignof(T);
 };
 #define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<tbb::internal::work_around_alignment_bug<sizeof(T),T>::alignment>
-#elif __GNUC__ || __SUNPRO_CC || __IBMCPP__
-#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__alignof__(T)>
 #else
-#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) __TBB_machine_type_with_strictest_alignment
-#endif
-#endif  /* ____TBB_TypeWithAlignmentAtLeastAsStrict */
+#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__TBB_alignof(T)>
+#endif  /* __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN */
+
+#endif  /* __TBB_TypeWithAlignmentAtLeastAsStrict */
 
 // Template class here is to avoid instantiation of the static data for modules that don't use it
 template<typename T>
@@ -366,262 +730,13 @@ const T reverse<T>::byte_table[256] = {
 } // namespace internal
 } // namespace tbb
 
-#ifndef __TBB_CompareAndSwap1
-#define __TBB_CompareAndSwap1 tbb::internal::__TBB_CompareAndSwapGeneric<1,uint8_t>
-#endif
-
-#ifndef __TBB_CompareAndSwap2 
-#define __TBB_CompareAndSwap2 tbb::internal::__TBB_CompareAndSwapGeneric<2,uint16_t>
-#endif
-
-#ifndef __TBB_CompareAndSwapW
-#define __TBB_CompareAndSwapW tbb::internal::__TBB_CompareAndSwapGeneric<sizeof(ptrdiff_t),ptrdiff_t>
-#endif
-
-#ifndef __TBB_FetchAndAdd1
-#define __TBB_FetchAndAdd1 tbb::internal::__TBB_FetchAndAddGeneric<1,uint8_t>
-#endif
-
-#ifndef __TBB_FetchAndAdd2
-#define __TBB_FetchAndAdd2 tbb::internal::__TBB_FetchAndAddGeneric<2,uint16_t>
-#endif
-
-#ifndef __TBB_FetchAndAdd4
-#define __TBB_FetchAndAdd4 tbb::internal::__TBB_FetchAndAddGeneric<4,uint32_t>
-#endif
-
-#ifndef __TBB_FetchAndAdd8
-#define __TBB_FetchAndAdd8 tbb::internal::__TBB_FetchAndAddGeneric<8,uint64_t>
-#endif
-
-#ifndef __TBB_FetchAndAddW
-#define __TBB_FetchAndAddW tbb::internal::__TBB_FetchAndAddGeneric<sizeof(ptrdiff_t),ptrdiff_t>
-#endif
-
-#ifndef __TBB_FetchAndStore1
-#define __TBB_FetchAndStore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,uint8_t>
-#endif
-
-#ifndef __TBB_FetchAndStore2
-#define __TBB_FetchAndStore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,uint16_t>
-#endif
-
-#ifndef __TBB_FetchAndStore4
-#define __TBB_FetchAndStore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,uint32_t>
-#endif
-
-#ifndef __TBB_FetchAndStore8
-#define __TBB_FetchAndStore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,uint64_t>
-#endif
-
-#ifndef __TBB_FetchAndStoreW
-#define __TBB_FetchAndStoreW tbb::internal::__TBB_FetchAndStoreGeneric<sizeof(ptrdiff_t),ptrdiff_t>
-#endif
-
-#if __TBB_DECL_FENCED_ATOMICS
+// Preserving access to legacy APIs
+using tbb::internal::__TBB_load_with_acquire;
+using tbb::internal::__TBB_store_with_release;
 
-#ifndef __TBB_CompareAndSwap1__TBB_full_fence
-#define __TBB_CompareAndSwap1__TBB_full_fence __TBB_CompareAndSwap1
-#endif 
-#ifndef __TBB_CompareAndSwap1acquire
-#define __TBB_CompareAndSwap1acquire __TBB_CompareAndSwap1__TBB_full_fence
-#endif 
-#ifndef __TBB_CompareAndSwap1release
-#define __TBB_CompareAndSwap1release __TBB_CompareAndSwap1__TBB_full_fence
-#endif 
-
-#ifndef __TBB_CompareAndSwap2__TBB_full_fence
-#define __TBB_CompareAndSwap2__TBB_full_fence __TBB_CompareAndSwap2
-#endif
-#ifndef __TBB_CompareAndSwap2acquire
-#define __TBB_CompareAndSwap2acquire __TBB_CompareAndSwap2__TBB_full_fence
-#endif
-#ifndef __TBB_CompareAndSwap2release
-#define __TBB_CompareAndSwap2release __TBB_CompareAndSwap2__TBB_full_fence
-#endif
-
-#ifndef __TBB_CompareAndSwap4__TBB_full_fence
-#define __TBB_CompareAndSwap4__TBB_full_fence __TBB_CompareAndSwap4
-#endif 
-#ifndef __TBB_CompareAndSwap4acquire
-#define __TBB_CompareAndSwap4acquire __TBB_CompareAndSwap4__TBB_full_fence
-#endif 
-#ifndef __TBB_CompareAndSwap4release
-#define __TBB_CompareAndSwap4release __TBB_CompareAndSwap4__TBB_full_fence
-#endif 
-
-#ifndef __TBB_CompareAndSwap8__TBB_full_fence
-#define __TBB_CompareAndSwap8__TBB_full_fence __TBB_CompareAndSwap8
-#endif
-#ifndef __TBB_CompareAndSwap8acquire
-#define __TBB_CompareAndSwap8acquire __TBB_CompareAndSwap8__TBB_full_fence
-#endif
-#ifndef __TBB_CompareAndSwap8release
-#define __TBB_CompareAndSwap8release __TBB_CompareAndSwap8__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndAdd1__TBB_full_fence
-#define __TBB_FetchAndAdd1__TBB_full_fence __TBB_FetchAndAdd1
-#endif
-#ifndef __TBB_FetchAndAdd1acquire
-#define __TBB_FetchAndAdd1acquire __TBB_FetchAndAdd1__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndAdd1release
-#define __TBB_FetchAndAdd1release __TBB_FetchAndAdd1__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndAdd2__TBB_full_fence
-#define __TBB_FetchAndAdd2__TBB_full_fence __TBB_FetchAndAdd2
-#endif
-#ifndef __TBB_FetchAndAdd2acquire
-#define __TBB_FetchAndAdd2acquire __TBB_FetchAndAdd2__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndAdd2release
-#define __TBB_FetchAndAdd2release __TBB_FetchAndAdd2__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndAdd4__TBB_full_fence
-#define __TBB_FetchAndAdd4__TBB_full_fence __TBB_FetchAndAdd4
-#endif
-#ifndef __TBB_FetchAndAdd4acquire
-#define __TBB_FetchAndAdd4acquire __TBB_FetchAndAdd4__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndAdd4release
-#define __TBB_FetchAndAdd4release __TBB_FetchAndAdd4__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndAdd8__TBB_full_fence
-#define __TBB_FetchAndAdd8__TBB_full_fence __TBB_FetchAndAdd8
-#endif
-#ifndef __TBB_FetchAndAdd8acquire
-#define __TBB_FetchAndAdd8acquire __TBB_FetchAndAdd8__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndAdd8release
-#define __TBB_FetchAndAdd8release __TBB_FetchAndAdd8__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndStore1__TBB_full_fence
-#define __TBB_FetchAndStore1__TBB_full_fence __TBB_FetchAndStore1
-#endif
-#ifndef __TBB_FetchAndStore1acquire
-#define __TBB_FetchAndStore1acquire __TBB_FetchAndStore1__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndStore1release
-#define __TBB_FetchAndStore1release __TBB_FetchAndStore1__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndStore2__TBB_full_fence
-#define __TBB_FetchAndStore2__TBB_full_fence __TBB_FetchAndStore2
-#endif
-#ifndef __TBB_FetchAndStore2acquire
-#define __TBB_FetchAndStore2acquire __TBB_FetchAndStore2__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndStore2release
-#define __TBB_FetchAndStore2release __TBB_FetchAndStore2__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndStore4__TBB_full_fence
-#define __TBB_FetchAndStore4__TBB_full_fence __TBB_FetchAndStore4
-#endif
-#ifndef __TBB_FetchAndStore4acquire
-#define __TBB_FetchAndStore4acquire __TBB_FetchAndStore4__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndStore4release
-#define __TBB_FetchAndStore4release __TBB_FetchAndStore4__TBB_full_fence
-#endif
-
-#ifndef __TBB_FetchAndStore8__TBB_full_fence
-#define __TBB_FetchAndStore8__TBB_full_fence __TBB_FetchAndStore8
-#endif
-#ifndef __TBB_FetchAndStore8acquire
-#define __TBB_FetchAndStore8acquire __TBB_FetchAndStore8__TBB_full_fence
-#endif
-#ifndef __TBB_FetchAndStore8release
-#define __TBB_FetchAndStore8release __TBB_FetchAndStore8__TBB_full_fence
-#endif
-
-#endif // __TBB_DECL_FENCED_ATOMICS
-
-// Special atomic functions
-#ifndef __TBB_FetchAndAddWrelease
-#define __TBB_FetchAndAddWrelease __TBB_FetchAndAddW
-#endif
-
-#ifndef __TBB_FetchAndIncrementWacquire
-#define __TBB_FetchAndIncrementWacquire(P) __TBB_FetchAndAddW(P,1)
-#endif
-
-#ifndef __TBB_FetchAndDecrementWrelease
-#define __TBB_FetchAndDecrementWrelease(P) __TBB_FetchAndAddW(P,(-1))
-#endif
-
-template <typename T, size_t S>
-struct __TBB_machine_load_store {
-    static inline T load_with_acquire(const volatile T& location) {
-        T to_return = location;
-        __TBB_release_consistency_helper();
-        return to_return;
-    }
-
-    static inline void store_with_release(volatile T &location, T value) {
-        __TBB_release_consistency_helper();
-        location = value;
-    }
-};
-
-#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS
-#if _MSC_VER
-using tbb::internal::int64_t;
-#endif
-// On 32-bit platforms, there should be definition of __TBB_Store8 and __TBB_Load8
-#ifndef __TBB_Store8
-inline void __TBB_Store8 (volatile void *ptr, int64_t value) {
-    for(;;) {
-        int64_t result = *(int64_t *)ptr;
-        if( __TBB_CompareAndSwap8(ptr,value,result)==result ) break;
-    }
-}
-#endif
-
-#ifndef __TBB_Load8
-inline int64_t __TBB_Load8 (const volatile void *ptr) {
-    const int64_t anyvalue = 3264; // Could be anything, just the same for comparand and new value
-    return __TBB_CompareAndSwap8(const_cast<volatile void *>(ptr),anyvalue,anyvalue);
-}
-#endif
-
-template <typename T>
-struct __TBB_machine_load_store<T,8> {
-    static inline T load_with_acquire(const volatile T& location) {
-        T to_return = (T)__TBB_Load8((const volatile void*)&location);
-        __TBB_release_consistency_helper();
-        return to_return;
-    }
-
-    static inline void store_with_release(volatile T& location, T value) {
-        __TBB_release_consistency_helper();
-        __TBB_Store8((volatile void *)&location,(int64_t)value);
-    }
-};
-#endif /* __TBB_WORDSIZE==4 */
-
-#ifndef __TBB_load_with_acquire
-template<typename T>
-inline T __TBB_load_with_acquire(const volatile T &location) {
-    return __TBB_machine_load_store<T,sizeof(T)>::load_with_acquire(location);
-}
-#endif
-
-#ifndef __TBB_store_with_release
-template<typename T, typename V>
-inline void __TBB_store_with_release(volatile T& location, V value) {
-    __TBB_machine_load_store<T,sizeof(T)>::store_with_release(location,T(value));
-}
-//! Overload that exists solely to avoid /Wp64 warnings.
-inline void __TBB_store_with_release(volatile size_t& location, size_t value) {
-    __TBB_machine_load_store<size_t,sizeof(size_t)>::store_with_release(location,value);
-}
-#endif
+// Mapping historically used names to the ones expected by atomic_load_store_traits
+#define __TBB_load_acquire  __TBB_load_with_acquire
+#define __TBB_store_release __TBB_store_with_release
 
 #ifndef __TBB_Log2
 inline intptr_t __TBB_Log2( uintptr_t x ) {
@@ -663,18 +778,19 @@ inline void __TBB_AtomicAND( volatile void *operand, uintptr_t addend ) {
 }
 #endif
 
-#ifndef __TBB_Byte
-typedef unsigned char __TBB_Byte;
+#ifndef __TBB_Flag
+typedef unsigned char __TBB_Flag;
 #endif
+typedef __TBB_atomic __TBB_Flag __TBB_atomic_flag;
 
 #ifndef __TBB_TryLockByte
-inline bool __TBB_TryLockByte( __TBB_Byte &flag ) {
-    return __TBB_CompareAndSwap1(&flag,1,0)==0;
+inline bool __TBB_TryLockByte( __TBB_atomic_flag &flag ) {
+    return __TBB_machine_cmpswp1(&flag,1,0)==0;
 }
 #endif
 
 #ifndef __TBB_LockByte
-inline uintptr_t __TBB_LockByte( __TBB_Byte& flag ) {
+inline __TBB_Flag __TBB_LockByte( __TBB_atomic_flag& flag ) {
     if ( !__TBB_TryLockByte(flag) ) {
         tbb::internal::atomic_backoff b;
         do {
@@ -694,8 +810,7 @@ inline unsigned char __TBB_ReverseByte(unsigned char src) {
 #endif
 
 template<typename T>
-T __TBB_ReverseBits(T src)
-{
+T __TBB_ReverseBits(T src) {
     T dst;
     unsigned char *original = (unsigned char *) &src;
     unsigned char *reversed = (unsigned char *) &dst;
diff --git a/include/tbb/tbb_stddef.h b/include/tbb/tbb_stddef.h
index 2e834ac..7b25555 100644
--- a/include/tbb/tbb_stddef.h
+++ b/include/tbb/tbb_stddef.h
@@ -30,11 +30,11 @@
 #define __TBB_tbb_stddef_H
 
 // Marketing-driven product version
-#define TBB_VERSION_MAJOR 3
+#define TBB_VERSION_MAJOR 4
 #define TBB_VERSION_MINOR 0
 
 // Engineering-focused interface version
-#define TBB_INTERFACE_VERSION 5006
+#define TBB_INTERFACE_VERSION 6000
 #define TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000
 
 // The oldest major interface version still supported
@@ -126,56 +126,65 @@
 // tbb_config.h should be included the first since it contains macro definitions used in other headers
 #include "tbb_config.h"
 
-#if _MSC_VER
-// define the parts of stdint.h that are needed, but put them inside tbb::internal
-namespace tbb {
-namespace internal {
-    typedef __int8 int8_t;
-    typedef __int16 int16_t;
-    typedef __int32 int32_t;
-    typedef __int64 int64_t;
-    typedef unsigned __int8 uint8_t;
-    typedef unsigned __int16 uint16_t;
-    typedef unsigned __int32 uint32_t;
-    typedef unsigned __int64 uint64_t;
-} // namespace internal
-} // namespace tbb
-#else
-#include <stdint.h>
-#endif /* _MSC_VER */
-
 #if _MSC_VER >=1400
-#define __TBB_EXPORTED_FUNC   __cdecl
-#define __TBB_EXPORTED_METHOD __thiscall
+    #define __TBB_EXPORTED_FUNC   __cdecl
+    #define __TBB_EXPORTED_METHOD __thiscall
 #else
-#define __TBB_EXPORTED_FUNC
-#define __TBB_EXPORTED_METHOD
+    #define __TBB_EXPORTED_FUNC
+    #define __TBB_EXPORTED_METHOD
 #endif
 
 #include <cstddef>      /* Need size_t and ptrdiff_t */
 
 #if _MSC_VER
-#define __TBB_tbb_windef_H
-#include "_tbb_windef.h"
-#undef __TBB_tbb_windef_H
+    #define __TBB_tbb_windef_H
+    #include "internal/_tbb_windef.h"
+    #undef __TBB_tbb_windef_H
+#else
+    #include <stdint.h>
 #endif
 
 //! The namespace tbb contains all components of the library.
 namespace tbb {
 
-using std::size_t; using std::ptrdiff_t;
+#if _MSC_VER
+    namespace internal {
+        typedef __int8 int8_t;
+        typedef __int16 int16_t;
+        typedef __int32 int32_t;
+        typedef __int64 int64_t;
+        typedef unsigned __int8 uint8_t;
+        typedef unsigned __int16 uint16_t;
+        typedef unsigned __int32 uint32_t;
+        typedef unsigned __int64 uint64_t;
+    } // namespace internal
+#else /* Posix */
+    namespace internal {
+        using ::int8_t;
+        using ::int16_t;
+        using ::int32_t;
+        using ::int64_t;
+        using ::uint8_t;
+        using ::uint16_t;
+        using ::uint32_t;
+        using ::uint64_t;
+    } // namespace internal
+#endif /* Posix */
+
+    using std::size_t;
+    using std::ptrdiff_t;
 
     //! Type for an assertion handler
     typedef void(*assertion_handler_type)( const char* filename, int line, const char* expression, const char * comment );
 
 #if TBB_USE_ASSERT
 
-//! Assert that x is true.
-/** If x is false, print assertion failure message.  
-    If the comment argument is not NULL, it is printed as part of the failure message.  
-    The comment argument has no other effect. */
-#define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))
-#define __TBB_ASSERT_EX __TBB_ASSERT
+    //! Assert that x is true.
+    /** If x is false, print assertion failure message.  
+        If the comment argument is not NULL, it is printed as part of the failure message.  
+        The comment argument has no other effect. */
+    #define __TBB_ASSERT(predicate,message) ((predicate)?((void)0):tbb::assertion_failure(__FILE__,__LINE__,#predicate,message))
+    #define __TBB_ASSERT_EX __TBB_ASSERT
 
     //! Set assertion handler and return previous value of it.
     assertion_handler_type __TBB_EXPORTED_FUNC set_assertion_handler( assertion_handler_type new_handler );
@@ -186,14 +195,14 @@ using std::size_t; using std::ptrdiff_t;
         Otherwise call the assertion handler. */
     void __TBB_EXPORTED_FUNC assertion_failure( const char* filename, int line, const char* expression, const char* comment );
 
-#else
+#else /* !TBB_USE_ASSERT */
 
-//! No-op version of __TBB_ASSERT.
-#define __TBB_ASSERT(predicate,comment) ((void)0)
-//! "Extended" version is useful to suppress warnings if a variable is only used with an assert
-#define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))
+    //! No-op version of __TBB_ASSERT.
+    #define __TBB_ASSERT(predicate,comment) ((void)0)
+    //! "Extended" version is useful to suppress warnings if a variable is only used with an assert
+    #define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))
 
-#endif /* TBB_USE_ASSERT */
+#endif /* !TBB_USE_ASSERT */
 
 //! The function returns the interface version of the TBB shared library being used.
 /**
@@ -222,6 +231,27 @@ namespace internal {
     @ingroup memory_allocation */
 const size_t NFS_MaxLineSize = 128;
 
+/** Label for data that may be accessed from different threads, and that may eventually become wrapped
+    in a formal atomic type.
+    
+    Note that no problems have yet been observed relating to the definition currently being empty,
+    even if at least "volatile" would seem to be in order to avoid data sometimes temporarily hiding
+    in a register (although "volatile" as a "poor man's atomic" lacks several other features of a proper
+    atomic, some of which are now provided instead through specialized functions).
+
+    Note that usage is intentionally compatible with a definition as qualifier "volatile",
+    both as a way to have the compiler help enforce use of the label and to quickly rule out
+    one potential issue.
+
+    Note however that, with some architecture/compiler combinations, e.g. on Itanium, "volatile" 
+    also has non-portable memory semantics that are needlessly expensive for "relaxed" operations.
+
+    Note that this must only be applied to data that will not change bit patterns when cast to/from
+    an integral type of the same length; tbb::atomic must be used instead for, e.g., floating-point types.
+
+    TODO: apply wherever relevant **/
+#define __TBB_atomic // intentionally empty, see above
+
 template<class T, int S>
 struct padded_base : T {
     char pad[NFS_MaxLineSize - sizeof(T) % NFS_MaxLineSize];
diff --git a/include/tbb/tbb_thread.h b/include/tbb/tbb_thread.h
index 41890e7..5e71132 100644
--- a/include/tbb/tbb_thread.h
+++ b/include/tbb/tbb_thread.h
@@ -63,7 +63,7 @@ namespace internal {
 
 } // namespace internal
 
-void swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 ); 
+inline void swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 ); 
 
 namespace internal {
 
diff --git a/index.html b/index.html
index c128a07..2dae025 100644
--- a/index.html
+++ b/index.html
@@ -33,10 +33,9 @@ To port TBB to a new platform, operating system or architecture, see the <A HREF
 <HR>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/src/Makefile b/src/Makefile
index 36aab05..24fd3d0 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -28,7 +28,7 @@ tbb_root?=..
 examples_root:=$(tbb_root)/examples
 include $(tbb_root)/build/common.inc
 
-.PHONY: all tbb tbbmalloc test test_no_depends release debug examples clean
+.PHONY: all tbb tbbmalloc tbbproxy test test_no_depends release debug examples clean
 
 all: release debug examples
 
@@ -36,17 +36,19 @@ tbb: tbb_release tbb_debug
 
 tbbmalloc: tbbmalloc_release tbbmalloc_debug
 
+tbbproxy: tbbproxy_release tbbproxy_debug
+
 rml: rml_release rml_debug
 
-test: tbbmalloc_test_release rml_test_release test_release tbbmalloc_test_debug rml_test_debug test_debug
+test: tbbmalloc_test_release $(if $(use_proxy),tbbproxy_test_release) rml_test_release test_release tbbmalloc_test_debug $(if $(use_proxy),tbbproxy_test_debug) rml_test_debug test_debug
 
-test_no_depends: tbbmalloc_test_release_no_depends test_release_no_depends tbbmalloc_test_debug_no_depends test_debug_no_depends
+test_no_depends: tbbmalloc_test_release_no_depends $(if $(use_proxy),tbbproxy_test_release_no_depends) test_release_no_depends tbbmalloc_test_debug_no_depends $(if $(use_proxy),tbbproxy_test_debug_no_depends) test_debug_no_depends
 	@echo done
 
-release: tbb_release tbbmalloc_release
+release: tbb_release tbbmalloc_release $(if $(use_proxy),tbbproxy_release)
 release: $(call cross_cfg,tbbmalloc_test_release) $(call cross_cfg,test_release)
 
-debug: tbb_debug tbbmalloc_debug
+debug: tbb_debug tbbmalloc_debug $(if $(use_proxy),tbbproxy_debug)
 debug: $(call cross_cfg,tbbmalloc_test_debug) $(call cross_cfg, test_debug)
 
 examples: tbb tbbmalloc examples_debug clean_examples examples_release
@@ -97,11 +99,11 @@ tbb_release: mkdir_release
 tbb_debug: mkdir_debug
 	$(MAKE) -C "$(work_dir)_debug"  -r -f $(tbb_root)/build/Makefile.tbb cfg=debug tbb_root=$(tbb_root)
 
-test_release: $(call cross_cfg,mkdir_release) $(call cross_cfg,tbb_release) test_release_no_depends
-test_release_no_depends: 
-	$(MAKE) -C "$(call cross_cfg,$(work_dir)_release)"  -r -f $(tbb_root)/build/Makefile.test cfg=release tbb_root=$(tbb_root) 
+test_release: $(call cross_cfg,mkdir_release) $(call cross_cfg,tbb_release) $(if $(use_proxy),$(call cross_cfg,tbbproxy_release)) test_release_no_depends
+test_release_no_depends:
+	$(MAKE) -C "$(call cross_cfg,$(work_dir)_release)"  -r -f $(tbb_root)/build/Makefile.test cfg=release tbb_root=$(tbb_root)
 
-test_debug: $(call cross_cfg,mkdir_debug) $(call cross_cfg,tbb_debug) test_debug_no_depends
+test_debug: $(call cross_cfg,mkdir_debug) $(call cross_cfg,tbb_debug) $(if $(use_proxy),$(call cross_cfg,tbbproxy_debug)) test_debug_no_depends
 test_debug_no_depends:
 	$(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)"  -r -f $(tbb_root)/build/Makefile.test cfg=debug tbb_root=$(tbb_root)
 
@@ -131,11 +133,30 @@ tbbmalloc_test: tbbmalloc_test_release tbbmalloc_test_debug
 
 tbbmalloc_test_release: $(call cross_cfg,mkdir_release) $(call cross_cfg,tbbmalloc_release) tbbmalloc_test_release_no_depends
 tbbmalloc_test_release_no_depends:
-	$(MAKE) -C "$(call cross_cfg,$(work_dir)_release)"  -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=release malloc_test tbb_root=$(tbb_root)
+	$(MAKE) -C "$(call cross_cfg,$(work_dir)_release)"  -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=release malloc_test_no_depends tbb_root=$(tbb_root)
 
 tbbmalloc_test_debug: $(call cross_cfg,mkdir_debug) $(call cross_cfg,tbbmalloc_debug) tbbmalloc_test_debug_no_depends
 tbbmalloc_test_debug_no_depends:
-	$(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)"  -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=debug malloc_test tbb_root=$(tbb_root)
+	$(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)"  -r -f $(tbb_root)/build/Makefile.tbbmalloc cfg=debug malloc_test_no_depends tbb_root=$(tbb_root)
+
+.PHONY: tbbproxy_release tbbproxy_debug
+.PHONY: tbbproxy_test tbbproxy_test_release tbbproxy_test_debug tbbproxy_test_release_no_depends tbbproxy_test_debug_no_depends
+
+tbbproxy_release: mkdir_release tbb_release
+	$(MAKE) -C "$(work_dir)_release" -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=release tbbproxy tbb_root=$(tbb_root)
+
+tbbproxy_debug: mkdir_debug tbb_debug
+	$(MAKE) -C "$(work_dir)_debug" -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=debug tbbproxy tbb_root=$(tbb_root)
+
+tbbproxy_test: tbbproxy_test_release tbbproxy_test_debug
+
+tbbproxy_test_release: $(call cross_cfg,mkdir_release) $(call cross_cfg,tbb_release) $(call cross_cfg,tbbproxy_release) tbbproxy_test_release_no_depends
+tbbproxy_test_release_no_depends:
+	$(MAKE) -C "$(call cross_cfg,$(work_dir)_release)" -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=release tbbproxy_test tbb_root=$(tbb_root)
+
+tbbproxy_test_debug: $(call cross_cfg,mkdir_debug) $(call cross_cfg,tbb_debug) $(call cross_cfg,tbbproxy_debug) tbbproxy_test_debug_no_depends
+tbbproxy_test_debug_no_depends:
+	$(MAKE) -C "$(call cross_cfg,$(work_dir)_debug)"   -r -f $(tbb_root)/build/Makefile.tbbproxy cfg=debug   tbbproxy_test tbb_root=$(tbb_root)
 
 .PHONY: rml_release rml_debug rml_test_release rml_test_debug
 .PHONY: rml_test_release_no_depends rml_test_debug_no_depends
diff --git a/src/index.html b/src/index.html
index a57588a..3a89fab 100644
--- a/src/index.html
+++ b/src/index.html
@@ -67,10 +67,9 @@ This directory contains the source code and unit tests for Threading Building Bl
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/src/old/concurrent_queue_v2.h b/src/old/concurrent_queue_v2.h
index bb1385a..994128f 100644
--- a/src/old/concurrent_queue_v2.h
+++ b/src/old/concurrent_queue_v2.h
@@ -52,21 +52,20 @@ class concurrent_queue_base: no_copy {
 
     friend class concurrent_queue_rep;
     friend struct micro_queue;
-#ifdef __IBMCPP__ 
-    // In C++ 2003, friend micro_queue's rights do not extend to pop_finalizer's
-    // nested class member variable my_page. So, strictly speaking, this assumes C++0x.
-    friend class micro_queue::pop_finalizer;
-#endif
     friend class concurrent_queue_iterator_rep;
     friend class concurrent_queue_iterator_base;
 
-protected:
+    // In C++ 1998/2003 (but quite likely not beyond), friend micro_queue's rights
+    // do not apply to the declaration of micro_queue::pop_finalizer::my_page,
+    // as a member of a class nested within that friend class, so...
+public:
     //! Prefix on a page
     struct page {
         page* next;
         uintptr_t mask; 
     };
 
+protected:
     //! Capacity of the queue
     ptrdiff_t my_capacity;
    
diff --git a/src/old/concurrent_vector_v2.h b/src/old/concurrent_vector_v2.h
index 2b44449..68f7547 100644
--- a/src/old/concurrent_vector_v2.h
+++ b/src/old/concurrent_vector_v2.h
@@ -97,11 +97,11 @@ namespace internal {
         struct segment_t {
             /** Declared volatile because in weak memory model, must have ld.acq/st.rel  */
             void* volatile array;
-#if TBB_DO_ASSERT
+#if TBB_USE_ASSERT
             ~segment_t() {
                 __TBB_ASSERT( !array, "should have been set to NULL by clear" );
             }
-#endif /* TBB_DO_ASSERT */
+#endif /* TBB_USE_ASSERT */
         };
 
         atomic<segment_t*> my_segment;
diff --git a/src/old/spin_rw_mutex_v2.h b/src/old/spin_rw_mutex_v2.h
index 23a4330..8bab4ae 100644
--- a/src/old/spin_rw_mutex_v2.h
+++ b/src/old/spin_rw_mutex_v2.h
@@ -72,12 +72,12 @@ public:
     //! Construct unacquired mutex.
     spin_rw_mutex() : state(0) {}
 
-#if TBB_DO_ASSERT
+#if TBB_USE_ASSERT
     //! Destructor asserts if the mutex is acquired, i.e. state is zero.
     ~spin_rw_mutex() {
         __TBB_ASSERT( !state, "destruction of an acquired mutex");
     };
-#endif /* TBB_DO_ASSERT */
+#endif /* TBB_USE_ASSERT */
 
     //! The scoped locking pattern
     /** It helps to avoid the common problem of forgetting to release lock.
@@ -123,11 +123,11 @@ public:
             spin_rw_mutex *m = mutex; 
             mutex = NULL;
             if( is_writer ) {
-#if TBB_DO_THREADING_TOOLS||TBB_DO_ASSERT
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
                 internal_release_writer(m);
 #else
                 m->state = 0; 
-#endif /* TBB_DO_THREADING_TOOLS||TBB_DO_ASSERT */
+#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */
             } else {
                 internal_release_reader(m);
             }
@@ -135,7 +135,7 @@ public:
 
         //! Downgrade writer to become a reader.
         bool downgrade_to_reader() {
-#if TBB_DO_THREADING_TOOLS||TBB_DO_ASSERT
+#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT
             __TBB_ASSERT( mutex, "lock is not acquired" );
             __TBB_ASSERT( is_writer, "not a writer" );
             internal_downgrade(mutex);
diff --git a/src/perf/perf.h b/src/perf/perf.h
index 0c13b9d..42ff1d1 100644
--- a/src/perf/perf.h
+++ b/src/perf/perf.h
@@ -26,7 +26,6 @@
     the GNU General Public License.
 */
 
-
 #ifndef __tbb_perf_h__
 #define __tbb_perf_h__
 
diff --git a/src/perf/time_hash_map.cpp b/src/perf/time_hash_map.cpp
index b3a5535..9b86ed1 100644
--- a/src/perf/time_hash_map.cpp
+++ b/src/perf/time_hash_map.cpp
@@ -60,7 +60,7 @@
 #include "tbb/spin_rw_mutex.h"
 #include "tbb/aligned_space.h"
 #include "tbb/atomic.h"
-#include "tbb/_concurrent_unordered_internal.h"
+#include "tbb/internal/_concurrent_unordered_impl.h"
 // for test
 #include "tbb/spin_mutex.h"
 #include "time_framework.h"
diff --git a/src/perf/time_hash_map_fill.cpp b/src/perf/time_hash_map_fill.cpp
index 01e1aa5..3d3996f 100644
--- a/src/perf/time_hash_map_fill.cpp
+++ b/src/perf/time_hash_map_fill.cpp
@@ -69,7 +69,7 @@ int MAX_TABLE_SIZE = 2000000;
 #include "tbb/spin_rw_mutex.h"
 #include "tbb/aligned_space.h"
 #include "tbb/atomic.h"
-#include "tbb/_concurrent_unordered_internal.h"
+#include "tbb/internal/_concurrent_unordered_impl.h"
 // for test
 #include "tbb/spin_mutex.h"
 #include "time_framework.h"
diff --git a/src/perf/time_hash_map_fill.html b/src/perf/time_hash_map_fill.html
index f5f1864..2f36d1e 100644
--- a/src/perf/time_hash_map_fill.html
+++ b/src/perf/time_hash_map_fill.html
@@ -111,10 +111,9 @@ In addition, a size of the source array correlates with input rates in order to
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/src/rml/client/index.html b/src/rml/client/index.html
index 8a22f54..4807347 100644
--- a/src/rml/client/index.html
+++ b/src/rml/client/index.html
@@ -32,10 +32,9 @@ This directory has source code that must be statically linked into an RML client
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/src/rml/include/index.html b/src/rml/include/index.html
index a580ac5..3de3a77 100644
--- a/src/rml/include/index.html
+++ b/src/rml/include/index.html
@@ -19,10 +19,9 @@ This directory has the include files for the Resource Management Layer (RML).
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/src/rml/index.html b/src/rml/index.html
index e390620..8a3f350 100644
--- a/src/rml/index.html
+++ b/src/rml/index.html
@@ -21,10 +21,9 @@ The subdirectories pertain to the Resource Management Layer (RML).
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/src/rml/server/index.html b/src/rml/server/index.html
index cb61e8e..27ea108 100644
--- a/src/rml/server/index.html
+++ b/src/rml/server/index.html
@@ -8,10 +8,9 @@ This directory has source code internal to the server.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/src/rml/server/thread_monitor.h b/src/rml/server/thread_monitor.h
index 9e690c9..c5d8467 100644
--- a/src/rml/server/thread_monitor.h
+++ b/src/rml/server/thread_monitor.h
@@ -45,6 +45,8 @@
 #endif 
 #include <stdio.h>
 #include "tbb/itt_notify.h"
+#include "tbb/atomic.h"
+#include "tbb/semaphore.h"
 
 // All platform-specific threading support is in this header.
 
@@ -70,8 +72,7 @@ namespace internal {
 
 #if DO_ITT_NOTIFY
 static const ::tbb::tchar *SyncType_RML = _T("%Constant");
-static const ::tbb::tchar *SyncObj_ThreadMonitorLock = _T("RML Lock"),
-                          *SyncObj_ThreadMonitor = _T("RML Thr Monitor");
+static const ::tbb::tchar *SyncObj_ThreadMonitor = _T("RML Thr Monitor");
 #endif /* DO_ITT_NOTIFY */
 
 //! Monitor with limited two-phase commit form of wait.  
@@ -80,10 +81,14 @@ class thread_monitor {
 public:
     class cookie {
         friend class thread_monitor;
-        unsigned long long my_version;
+        tbb::atomic<size_t> my_epoch;
     };
-    thread_monitor();
-    ~thread_monitor();
+    thread_monitor() : spurious(false) { 
+        my_cookie.my_epoch = 0; 
+        ITT_SYNC_CREATE(&my_sema, SyncType_RML, SyncObj_ThreadMonitor);
+        in_wait = false; 
+    }
+    ~thread_monitor() {}
 
     //! If a thread is waiting or started a two-phase wait, notify it.
     /** Can be called by any thread. */
@@ -119,14 +124,12 @@ public:
 
 private:
     cookie my_cookie;
-#if USE_WINTHREAD
-    CRITICAL_SECTION critical_section;
-    HANDLE event;
-#elif USE_PTHREAD
-    pthread_mutex_t my_mutex;
-    pthread_cond_t my_cond;
+    tbb::atomic<bool>   in_wait;
+    bool   spurious;
+    tbb::internal::binary_semaphore my_sema;
+#if USE_PTHREAD
     static void check( int error_code, const char* routine );
-#endif /* USE_PTHREAD */
+#endif
 };
 
 #if USE_WINTHREAD
@@ -155,47 +158,6 @@ inline void thread_monitor::launch( thread_routine_type thread_routine, void* ar
 inline void thread_monitor::yield() {
     SwitchToThread();
 }
-
-inline thread_monitor::thread_monitor() {
-    event = CreateEvent( NULL, /*manualReset=*/true, /*initialState=*/false, NULL );
-    InitializeCriticalSection( &critical_section );
-    ITT_SYNC_CREATE(&event, SyncType_RML, SyncObj_ThreadMonitor);
-    ITT_SYNC_CREATE(&critical_section, SyncType_RML, SyncObj_ThreadMonitorLock);
-    my_cookie.my_version = 0;
-}
-
-inline thread_monitor::~thread_monitor() {
-    // Fake prepare/acquired pair for Intel(R) Parallel Amplifier to correctly attribute the operations below
-    ITT_NOTIFY( sync_prepare, &event );
-    CloseHandle( event );
-    DeleteCriticalSection( &critical_section );
-    ITT_NOTIFY( sync_acquired, &event );
-}
-     
-inline void thread_monitor::notify() {
-    EnterCriticalSection( &critical_section );
-    ++my_cookie.my_version;
-    SetEvent( event );
-    LeaveCriticalSection( &critical_section );
-}
-
-inline void thread_monitor::prepare_wait( cookie& c ) {
-    EnterCriticalSection( &critical_section );
-    c = my_cookie;
-}
-
-inline void thread_monitor::commit_wait( cookie& c ) {
-    ResetEvent( event );
-    LeaveCriticalSection( &critical_section );
-    while( my_cookie.my_version==c.my_version ) {
-        WaitForSingleObject( event, INFINITE );
-        ResetEvent( event );
-    }
-}
-
-inline void thread_monitor::cancel_wait() {
-    LeaveCriticalSection( &critical_section );
-}
 #endif /* USE_WINTHREAD */
 
 #if USE_PTHREAD
@@ -212,9 +174,8 @@ inline void thread_monitor::launch( void* (*thread_routine)(void*), void* arg, s
     // grabbed as part of an OpenMP team. 
     pthread_attr_t s;
     check(pthread_attr_init( &s ), "pthread_attr_init");
-    if( stack_size>0 ) {
-        check(pthread_attr_setstacksize( &s, stack_size ),"pthread_attr_setstack_size");
-    }
+    if( stack_size>0 )
+        check(pthread_attr_setstacksize( &s, stack_size ), "pthread_attr_setstack_size" );
     pthread_t handle;
     check( pthread_create( &handle, &s, thread_routine, arg ), "pthread_create" );
     check( pthread_detach( handle ), "pthread_detach" );
@@ -223,43 +184,35 @@ inline void thread_monitor::launch( void* (*thread_routine)(void*), void* arg, s
 inline void thread_monitor::yield() {
     sched_yield();
 }
-
-inline thread_monitor::thread_monitor() {
-    check( pthread_cond_init(&my_cond,NULL), "pthread_cond_init" );
-    check( pthread_mutex_init(&my_mutex,NULL), "pthread_mutex_init" );
-    ITT_SYNC_CREATE(&my_cond, SyncType_RML, SyncObj_ThreadMonitor);
-    ITT_SYNC_CREATE(&my_mutex, SyncType_RML, SyncObj_ThreadMonitorLock);
-    my_cookie.my_version = 0;
-}
-
-inline thread_monitor::~thread_monitor() {
-    pthread_cond_destroy(&my_cond);
-    pthread_mutex_destroy(&my_mutex);
-}
+#endif /* USE_PTHREAD */
 
 inline void thread_monitor::notify() {
-    check( pthread_mutex_lock( &my_mutex ), "pthread_mutex_lock" );
-    ++my_cookie.my_version;
-    check( pthread_mutex_unlock( &my_mutex ), "pthread_mutex_unlock" );
-    check( pthread_cond_signal(&my_cond), "pthread_cond_signal" );
+    my_cookie.my_epoch = my_cookie.my_epoch + 1;
+    bool do_signal = in_wait.fetch_and_store( false );
+    if( do_signal )
+        my_sema.V();
 }
 
 inline void thread_monitor::prepare_wait( cookie& c ) {
-    check( pthread_mutex_lock( &my_mutex ), "pthread_mutex_lock" );
+    if( spurious ) {
+        spurious = false;
+        //  consumes a spurious posted signal. don't wait on my_sema.
+        my_sema.P();
+    }
     c = my_cookie;
+    in_wait = true;
+   __TBB_full_memory_fence();
 }
 
 inline void thread_monitor::commit_wait( cookie& c ) {
-    while( my_cookie.my_version==c.my_version ) {
-        pthread_cond_wait( &my_cond, &my_mutex );
-    }
-    check( pthread_mutex_unlock( &my_mutex ), "pthread_mutex_unlock" );
+    bool do_it = ( c.my_epoch == my_cookie.my_epoch);
+    if( do_it ) my_sema.P();
+    else        cancel_wait();
 }
 
 inline void thread_monitor::cancel_wait() {
-    check( pthread_mutex_unlock( &my_mutex ), "pthread_mutex_unlock" );
+    spurious = ! in_wait.fetch_and_store( false );
 }
-#endif /* USE_PTHREAD */
 
 } // namespace internal
 } // namespace rml
diff --git a/src/rml/test/test_thread_monitor.cpp b/src/rml/test/test_thread_monitor.cpp
index 747bda6..f486d6b 100644
--- a/src/rml/test/test_thread_monitor.cpp
+++ b/src/rml/test/test_thread_monitor.cpp
@@ -29,6 +29,7 @@
 #include "thread_monitor.h"
 #include "harness.h"
 #include "harness_memory.h"
+#include "tbb/semaphore.cpp"
 
 class ThreadState {
     void loop();
diff --git a/src/tbb/arena.cpp b/src/tbb/arena.cpp
index 5eff384..b9efae9 100644
--- a/src/tbb/arena.cpp
+++ b/src/tbb/arena.cpp
@@ -49,9 +49,7 @@ void arena::process( generic_scheduler& s ) {
     __TBB_ASSERT( is_alive(my_guard), NULL );
     __TBB_ASSERT( governor::is_set(&s), NULL );
     __TBB_ASSERT( !s.my_innermost_running_task, NULL );
-#if __TBB_TASK_PRIORITY
     __TBB_ASSERT( !s.my_dispatching_task, NULL );
-#endif /* __TBB_TASK_PRIORITY */
 
     __TBB_ASSERT( my_num_slots != 1, NULL );
     // Start search for an empty slot from the one we occupied the last time
@@ -97,12 +95,10 @@ void arena::process( generic_scheduler& s ) {
             // A side effect of receive_or_steal_task is that my_innermost_running_task can be set.
             // But for the outermost dispatch loop of a worker it has to be NULL.
             s.my_innermost_running_task = NULL;
-#if __TBB_TASK_PRIORITY
             __TBB_ASSERT( !s.my_dispatching_task, NULL );
-#endif /* __TBB_TASK_PRIORITY */
             s.local_wait_for_all(*s.my_dummy_task,t);
         }
-        __TBB_ASSERT ( my_slots[index].head == my_slots[index].tail, "Worker cannot leave arena while its task pool is not empty" );
+        __TBB_ASSERT ( __TBB_load_relaxed(my_slots[index].head) == __TBB_load_relaxed(my_slots[index].tail), "Worker cannot leave arena while its task pool is not empty" );
         __TBB_ASSERT( my_slots[index].task_pool == EmptyTaskPool, "Empty task pool is not marked appropriately" );
         // Revalidate quitting condition
         // This check prevents relinquishing more than necessary workers because 
@@ -135,9 +131,7 @@ void arena::process( generic_scheduler& s ) {
     s.my_inbox.detach();
     __TBB_ASSERT( s.my_inbox.is_idle_state(true), NULL );
     __TBB_ASSERT( !s.my_innermost_running_task, NULL );
-#if __TBB_TASK_PRIORITY
     __TBB_ASSERT( !s.my_dispatching_task, NULL );
-#endif /* __TBB_TASK_PRIORITY */
     __TBB_ASSERT( is_alive(my_guard), NULL );
 quit:
     // In contrast to earlier versions of TBB (before 3.0 U5) now it is possible
@@ -307,7 +301,7 @@ inline bool arena::may_have_tasks ( generic_scheduler* s, arena_slot& slot, bool
 bool arena::is_out_of_work() {
     // TODO: rework it to return at least a hint about where a task was found; better if the task itself.
     for(;;) {
-        pool_state_t snapshot = prefix().my_pool_state;
+        pool_state_t snapshot = my_pool_state;
         switch( snapshot ) {
             case SNAPSHOT_EMPTY:
                 return true;
@@ -315,7 +309,7 @@ bool arena::is_out_of_work() {
                 // Use unique id for "busy" in order to avoid ABA problems.
                 const pool_state_t busy = pool_state_t(this);
                 // Request permission to take snapshot
-                if( prefix().my_pool_state.compare_and_swap( busy, SNAPSHOT_FULL )==SNAPSHOT_FULL ) {
+                if( my_pool_state.compare_and_swap( busy, SNAPSHOT_FULL )==SNAPSHOT_FULL ) {
                     // Got permission. Take the snapshot.
                     // NOTE: This is not a lock, as the state can be set to FULL at 
                     //       any moment by a thread that spawns/enqueues new task.
@@ -330,9 +324,12 @@ bool arena::is_out_of_work() {
 #endif /* __TBB_TASK_PRIORITY */
                     size_t k; 
                     for( k=0; k<n; ++k ) {
-                        if( my_slots[k].task_pool != EmptyTaskPool && my_slots[k].head < my_slots[k].tail )
+                        if( my_slots[k].task_pool != EmptyTaskPool &&
+                            __TBB_load_relaxed(my_slots[k].head) < __TBB_load_relaxed(my_slots[k].tail) )
+                        {
                             // k-th primary task pool is nonempty and does contain tasks.
                             break;
+                        }
                     }
                     __TBB_ASSERT( k <= n, NULL );
                     bool work_absent = k == n;
@@ -379,7 +376,7 @@ bool arena::is_out_of_work() {
                     }
 #endif /* __TBB_TASK_PRIORITY */
                     // Test and test-and-set.
-                    if( prefix().my_pool_state==busy ) {
+                    if( my_pool_state==busy ) {
 #if __TBB_TASK_PRIORITY
                         bool no_fifo_tasks = my_task_stream[top_priority].empty();
                         work_absent = work_absent && (!dequeuing_possible || no_fifo_tasks)
@@ -394,7 +391,7 @@ bool arena::is_out_of_work() {
                                 if ( my_market->lower_arena_priority(*this, top_priority - 1, top_priority)
                                      && !my_task_stream[top_priority].empty() )
                                 {
-                                    atomic_update( my_skipped_fifo_priority, top_priority, std::less<uintptr_t>());
+                                    atomic_update( my_skipped_fifo_priority, top_priority, std::less<intptr_t>());
                                 }
                             }
                             else if ( !tasks_present && !my_orphaned_tasks && no_fifo_tasks ) {
@@ -402,7 +399,7 @@ bool arena::is_out_of_work() {
                                 // save current demand value before setting SNAPSHOT_EMPTY,
                                 // to avoid race with advertise_new_work.
                                 int current_demand = (int)my_max_num_workers;
-                                if( prefix().my_pool_state.compare_and_swap( SNAPSHOT_EMPTY, busy )==busy ) {
+                                if( my_pool_state.compare_and_swap( SNAPSHOT_EMPTY, busy )==busy ) {
                                     // This thread transitioned pool to empty state, and thus is 
                                     // responsible for telling RML that there is no other work to do.
                                     my_market->adjust_demand( *this, -current_demand );
@@ -431,7 +428,7 @@ bool arena::is_out_of_work() {
 #endif /* __TBB_TASK_PRIORITY */
                         }
                         // Undo previous transition SNAPSHOT_FULL-->busy, unless another thread undid it.
-                        prefix().my_pool_state.compare_and_swap( SNAPSHOT_FULL, busy );
+                        my_pool_state.compare_and_swap( SNAPSHOT_FULL, busy );
                     }
                 } 
                 return false;
diff --git a/src/tbb/arena.h b/src/tbb/arena.h
index acf783a..d4d0075 100644
--- a/src/tbb/arena.h
+++ b/src/tbb/arena.h
@@ -54,7 +54,6 @@ namespace internal {
 
 class governor;
 class arena;
-class generic_scheduler;
 template<typename SchedulerTraits> class custom_scheduler;
 
 //------------------------------------------------------------------------
@@ -182,8 +181,6 @@ private:
     //! Constructor
     arena ( market&, unsigned max_num_workers );
 
-    arena& prefix() const { return const_cast<arena&>(*this); }
-
     //! Allocate an instance of arena.
     static arena& allocate_arena( market&, unsigned max_num_workers );
 
@@ -210,7 +207,7 @@ private:
         __TBB_ASSERT( 0<id, "affinity id must be positive integer" );
         __TBB_ASSERT( id <= my_num_slots, "affinity id out of bounds" );
 
-        return ((mail_outbox*)&prefix())[-(int)id];
+        return ((mail_outbox*)this)[-(int)id];
     }
 
     //! Completes arena shutdown, destructs and deallocates it.
@@ -311,7 +308,7 @@ template<bool Spawned> void arena::advertise_new_work() {
         if( my_max_num_workers==0 ) {
             my_max_num_workers = 1;
             my_mandatory_concurrency = true;
-            prefix().my_pool_state = SNAPSHOT_FULL;
+            my_pool_state = SNAPSHOT_FULL;
             my_market->adjust_demand( *this, 1 );
             return;
         }
@@ -325,16 +322,16 @@ template<bool Spawned> void arena::advertise_new_work() {
     // fence might hurt overall performance more than it helps, because the fence would be executed 
     // on every task pool release, even when stealing does not occur.  Since TBB allows parallelism, 
     // but never promises parallelism, the missed wakeup is not a correctness problem.
-    pool_state_t snapshot = prefix().my_pool_state;
+    pool_state_t snapshot = my_pool_state;
     if( is_busy_or_empty(snapshot) ) {
         // Attempt to mark as full.  The compare_and_swap below is a little unusual because the 
         // result is compared to a value that can be different than the comparand argument.
-        if( prefix().my_pool_state.compare_and_swap( SNAPSHOT_FULL, snapshot )==SNAPSHOT_EMPTY ) {
+        if( my_pool_state.compare_and_swap( SNAPSHOT_FULL, snapshot )==SNAPSHOT_EMPTY ) {
             if( snapshot!=SNAPSHOT_EMPTY ) {
                 // This thread read "busy" into snapshot, and then another thread transitioned 
                 // my_pool_state to "empty" in the meantime, which caused the compare_and_swap above 
                 // to fail.  Attempt to transition my_pool_state from "empty" to "full".
-                if( prefix().my_pool_state.compare_and_swap( SNAPSHOT_FULL, SNAPSHOT_EMPTY )!=SNAPSHOT_EMPTY ) {
+                if( my_pool_state.compare_and_swap( SNAPSHOT_FULL, SNAPSHOT_EMPTY )!=SNAPSHOT_EMPTY ) {
                     // Some other thread transitioned my_pool_state from "empty", and hence became
                     // responsible for waking up workers.
                     return;
diff --git a/src/tbb/cilk-tbb-interop.h b/src/tbb/cilk-tbb-interop.h
index c13e40f..b50e5f1 100644
--- a/src/tbb/cilk-tbb-interop.h
+++ b/src/tbb/cilk-tbb-interop.h
@@ -26,6 +26,8 @@
     the GNU General Public License.
 */
 
+/* The API to enable interoperability between Intel(R) Cilk(tm) Plus and TBB. */
+
 #ifndef CILK_TBB_INTEROP_H
 #define CILK_TBB_INTEROP_H
 
@@ -63,8 +65,8 @@ typedef __cilk_tbb_retcode (*__cilk_tbb_pfn_unwatch_stacks)(void *data);
 /* Each thunk structure has two pointers: "routine" and "data".
    The caller of the thunk invokes *routine, passing "data" as the void* parameter. */
 
-/* Thunk invoked by Cilk when it changes the relationship between a stack and a thread.
-   It does not matter what stack the thunk runs on.
+/* Thunk invoked by Intel Cilk Plus runtime (cilkrts) when it changes the relationship
+   between a stack and a thread. It does not matter what stack the thunk runs on.
    The thread (not fiber) on which the thunk runs is important.
 
    CILK_TBB_STACK_ORPHAN
@@ -106,9 +108,9 @@ struct __cilk_tbb_unwatch_thunk {
     void* data;      
 };
 
-/* Called by TBB, defined by Cilk. 
-   Requests that callee invoke __cilk_tbb_stack_op_thunk when it orphans a stack. 
-   Callee sets *u to a thunk that TBB should call when it is no longer interested in watching the stack. */
+/* Defined by cilkrts, called by TBB.
+   Requests that cilkrts invoke __cilk_tbb_stack_op_thunk when it orphans a stack. 
+   cilkrts sets *u to a thunk that TBB should call when it is no longer interested in watching the stack. */
 CILK_EXPORT
 __cilk_tbb_retcode __cilkrts_watch_stack(struct __cilk_tbb_unwatch_thunk* u,
                                          struct __cilk_tbb_stack_op_thunk o);
diff --git a/src/tbb/concurrent_monitor.cpp b/src/tbb/concurrent_monitor.cpp
index 637d1b7..b155b6d 100644
--- a/src/tbb/concurrent_monitor.cpp
+++ b/src/tbb/concurrent_monitor.cpp
@@ -40,8 +40,8 @@ void concurrent_monitor::prepare_wait( thread_context& thr, void* ctx ) {
     thr.context = ctx;
     thr.in_waitset = true;
     {
-        tbb::spin_mutex::scoped_lock l( mutex_ec );
-        thr.epoch = epoch;
+        spin_mutex::scoped_lock l( mutex_ec );
+        __TBB_store_relaxed( thr.epoch, __TBB_load_relaxed(epoch) );
         waitset_ec.add( (waitset_t::node_t*)&thr );
     }
     atomic_fence();
@@ -65,31 +65,31 @@ void concurrent_monitor::cancel_wait( thread_context& thr ) {
 }
 
 void concurrent_monitor::notify_one_relaxed() {
-    if( waitset_ec.size()==0 )
+    if( waitset_ec.empty() )
         return;
     waitset_node_t* n;
     const waitset_node_t* end = waitset_ec.end();
     {
         tbb::spin_mutex::scoped_lock l( mutex_ec );
-        epoch = epoch + 1;
+        __TBB_store_relaxed( epoch, __TBB_load_relaxed(epoch) + 1 );
         n = waitset_ec.front();
         if( n!=end ) {
             waitset_ec.remove( *n );
             to_thread_context(n)->in_waitset = false;
         }
     }
-    if( n!=end ) 
+    if( n!=end )
         to_thread_context(n)->sema.V();
 }
 
 void concurrent_monitor::notify_all_relaxed() {
-    if( waitset_ec.size()==0 )
+    if( waitset_ec.empty() )
         return;
     dllist_t temp;
     const waitset_node_t* end;
     {
         tbb::spin_mutex::scoped_lock l( mutex_ec );
-        epoch = epoch + 1;
+        __TBB_store_relaxed( epoch, __TBB_load_relaxed(epoch) + 1 );
         waitset_ec.flush_to( temp );
         end = temp.end();
         for( waitset_node_t* n=temp.front(); n!=end; n=n->next )
diff --git a/src/tbb/concurrent_monitor.h b/src/tbb/concurrent_monitor.h
index e1fbdd9..0792e5f 100644
--- a/src/tbb/concurrent_monitor.h
+++ b/src/tbb/concurrent_monitor.h
@@ -32,67 +32,68 @@
 #include "tbb/tbb_stddef.h"
 #include "tbb/atomic.h"
 #include "tbb/spin_mutex.h"
+
 #include "semaphore.h"
 
 namespace tbb {
 namespace internal {
 
 //! Circular doubly-linked list with sentinel
-/** head.next points to the front and  head.prev points to the back */
+/** head.next points to the front and head.prev points to the back */
 class circular_doubly_linked_list_with_sentinel : no_copy {
-public:  
+public:
     struct node_t {
-        node_t* next;  
-        node_t* prev;  
-        node_t() : next(NULL), prev(NULL) {}
+        node_t* next;
+        node_t* prev;
+        explicit node_t() : next((node_t*)(uintptr_t)0xcdcdcdcd), prev((node_t*)(uintptr_t)0xcdcdcdcd) {}
     };
 
     // ctor
     circular_doubly_linked_list_with_sentinel() {clear();}
     // dtor
     ~circular_doubly_linked_list_with_sentinel() {__TBB_ASSERT( head.next==&head && head.prev==&head, "the list is not empty" );}
-    
-    inline size_t  size() const {return count;}
-    inline bool    empty()  const {return size()==0;}
-    inline node_t* front()  const {return head.next;}
-    inline node_t* last()   const {return head.prev;}
-    inline node_t* begin()  const {return front();}
+
+    inline size_t  size()  const {return count;}
+    inline bool    empty() const {return size()==0;}
+    inline node_t* front() const {return head.next;}
+    inline node_t* last()  const {return head.prev;}
+    inline node_t* begin() const {return front();}
     inline const node_t* end() const {return &head;}
 
     //! add to the back of the list
     inline void add( node_t* n ) {
-        count = count + 1;
-        n->prev = head.prev;  
-        n->next = &head;  
-        head.prev->next = n;  
+        __TBB_store_relaxed(count, __TBB_load_relaxed(count) + 1);
+        n->prev = head.prev;
+        n->next = &head;
+        head.prev->next = n;
         head.prev = n;
     }
-  
-    //! remove node 'n' from the 'this' list
+
+    //! remove node 'n'
     inline void remove( node_t& n ) {
-        count = count - 1;
+        __TBB_store_relaxed(count, __TBB_load_relaxed(count) - 1);
         n.prev->next = n.next;
         n.next->prev = n.prev;
-    }  
+    }
 
-    //! move all elements to 'lst' and initiallize the 'this' list
+    //! move all elements to 'lst' and initialize the 'this' list
     inline void flush_to( circular_doubly_linked_list_with_sentinel& lst ) {
-        if( count>0 ) {  
-            lst.count = count;
-            lst.head.next = head.next;  
+        if( const size_t l_count = __TBB_load_relaxed(count) ) {
+            __TBB_store_relaxed(lst.count, l_count);
+            lst.head.next = head.next;
             lst.head.prev = head.prev;
             head.next->prev = &lst.head;
             head.prev->next = &lst.head;
             clear();
         }
     }
-  
+
 #if !TBB_USE_DEBUG
-private:  
+private:
 #endif
-    atomic<size_t> count;
+    __TBB_atomic size_t count;
     node_t head;
-    void clear() {count = 0; head.next = &head; head.prev = &head;}
+    void clear() {head.next = &head; head.prev = &head;__TBB_store_relaxed(count, 0);}
 };
 
 typedef circular_doubly_linked_list_with_sentinel waitset_t;
@@ -112,23 +113,23 @@ public:
         thread_context() : spurious(false), context(NULL) {epoch = 0; in_waitset = false;}
         ~thread_context() { if( spurious ) sema.P(); }
     private:
-        semaphore   sema;
-        tbb::atomic<unsigned> epoch;
+        binary_semaphore   sema;
+        __TBB_atomic unsigned epoch;
         tbb::atomic<bool>     in_waitset;
         bool         spurious;
         void*        context;
     };
 
     //! ctor
-    concurrent_monitor() {epoch = 0;}
+    concurrent_monitor() {__TBB_store_relaxed(epoch, 0);}
 
     //! prepare wait by inserting 'thr' into the wailt queue
     void prepare_wait( thread_context& thr, void* ctx = 0 );
 
-    //! Commit wait if even count has not changed; otherwise, cancel wait.
-    /** Returns true of commited; false if canceled. */
+    //! Commit wait if event count has not changed; otherwise, cancel wait.
+    /** Returns true if committed, false if canceled. */
     inline bool commit_wait( thread_context& thr ) {
-        bool do_it = thr.epoch==epoch;
+        const bool do_it = thr.epoch == __TBB_load_relaxed(epoch);
         // this check is just an optimization
         if( do_it ) {
             thr.sema.P();
@@ -143,39 +144,39 @@ public:
 
     //! Notify one thread about the event
     void notify_one() {atomic_fence(); notify_one_relaxed();}
- 
+
     //! Notify one thread about the event. Relaxed version.
     void notify_one_relaxed();
 
     //! Notify all waiting threads of the event
     void notify_all() {atomic_fence(); notify_all_relaxed();}
- 
+
     //! Notify all waiting threads of the event; Relaxed version
     void notify_all_relaxed();
 
     //! Notify waiting threads of the event that satisfies the given predicate
     template<typename P> void notify( const P& predicate ) {atomic_fence(); notify_relaxed( predicate );}
- 
+
     //! Notify waiting threads of the event that satisfies the given predicate; Relaxed version
     template<typename P> void notify_relaxed( const P& predicate );
 
 private:
     tbb::spin_mutex mutex_ec;
     waitset_t       waitset_ec;
-    tbb::atomic<unsigned> epoch;
+    __TBB_atomic unsigned epoch;
     thread_context* to_thread_context( waitset_node_t* n ) { return static_cast<thread_context*>(n); }
 };
 
-template<typename P> 
+template<typename P>
 void concurrent_monitor::notify_relaxed( const P& predicate ) {
-        if( waitset_ec.size()==0 )
+        if( waitset_ec.empty() )
             return;
         dllist_t temp;
         waitset_node_t* nxt;
         const waitset_node_t* end = waitset_ec.end();
         {
             tbb::spin_mutex::scoped_lock l( mutex_ec );
-            epoch = epoch + 1;
+            __TBB_store_relaxed(epoch, __TBB_load_relaxed(epoch) + 1);
             for( waitset_node_t* n=waitset_ec.last(); n!=end; n=nxt ) {
                 nxt = n->prev;
                 thread_context* thr = to_thread_context( n );
@@ -186,7 +187,7 @@ void concurrent_monitor::notify_relaxed( const P& predicate ) {
                 }
             }
         }
-    
+
         end = temp.end();
         for( waitset_node_t* n=temp.front(); n!=end; n=nxt ) {
             nxt = n->next;
diff --git a/src/tbb/concurrent_queue.cpp b/src/tbb/concurrent_queue.cpp
index ae86be6..2923131 100644
--- a/src/tbb/concurrent_queue.cpp
+++ b/src/tbb/concurrent_queue.cpp
@@ -29,7 +29,9 @@
 #include "tbb/tbb_stddef.h"
 #include "tbb/tbb_machine.h"
 #include "tbb/tbb_exception.h"
-#include "tbb/_concurrent_queue_internal.h"
+// Define required to satisfy test in internal file.
+#define  __TBB_concurrent_queue_H
+#include "tbb/internal/_concurrent_queue_impl.h"
 #include "concurrent_monitor.h"
 #include "itt_notify.h"
 #include <new>
diff --git a/src/tbb/custom_scheduler.h b/src/tbb/custom_scheduler.h
index 47c5adc..2be052d 100644
--- a/src/tbb/custom_scheduler.h
+++ b/src/tbb/custom_scheduler.h
@@ -41,7 +41,7 @@ namespace internal {
     on the 32-way Altix and 4-way (*2 for HT) fxqlin04. */
 #if __TBB_ipf
 static const long PauseTime = 1500;
-#else 
+#else
 static const long PauseTime = 80;
 #endif
 
@@ -79,7 +79,7 @@ class custom_scheduler: private generic_scheduler {
     /*override*/
     void local_wait_for_all( task& parent, task* child );
 
-    //! Entry point from client code to the scheduler loop that dispatches tasks. 
+    //! Entry point from client code to the scheduler loop that dispatches tasks.
     /** The method is virtual, but the *this object is used only for sake of dispatching on the correct vtable,
         not necessarily the correct *this object.  The correct *this object is looked up in TLS. */
     /*override*/
@@ -103,6 +103,8 @@ class custom_scheduler: private generic_scheduler {
             if( __TBB_FetchAndDecrementWrelease(&p.ref_count) > 1 ) // more references exist
                 return;
         }
+        // Ordering on p.ref_count (superfluous if SchedulerTraits::has_slow_atomic)
+        __TBB_control_consistency_helper();
         __TBB_ASSERT(p.ref_count==0, "completion of task caused predecessor's reference count to underflow");
         if( SchedulerTraits::itt_possible )
             ITT_NOTIFY(sync_acquired, &p.ref_count);
@@ -127,7 +129,7 @@ public:
 
     //! Try getting a task from the mailbox or stealing from another scheduler.
     /** Returns the stolen task or NULL if all attempts fail. */
-    /* override */ task* receive_or_steal_task( reference_count&, bool );
+    /* override */ task* receive_or_steal_task( __TBB_atomic reference_count& completion_ref_count, bool return_if_no_work );
 
 }; // class custom_scheduler<>
 
@@ -136,10 +138,24 @@ public:
 //------------------------------------------------------------------------
 
 template<typename SchedulerTraits>
-task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( reference_count& completion_ref_count,
+task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( __TBB_atomic reference_count& completion_ref_count,
                                                                 bool return_if_no_work ) {
     task* t = NULL;
+    bool outermost_dispatch_level = return_if_no_work || master_outermost_level();
     my_inbox.set_is_idle( true );
+#if __TBB_TASK_PRIORITY
+    if ( return_if_no_work && my_arena->my_skipped_fifo_priority ) {
+        // This thread can dequeue FIFO tasks, and some priority levels of
+        // FIFO tasks have been bypassed (to prevent deadlock caused by
+        // dynamic priority changes in nested task group hierarchy).
+        intptr_t skipped_priority = my_arena->my_skipped_fifo_priority;
+        if ( my_arena->my_skipped_fifo_priority.compare_and_swap(0, skipped_priority) == skipped_priority &&
+             skipped_priority > my_arena->my_top_priority )
+        {
+            my_market->update_arena_priority( *my_arena, skipped_priority );
+        }
+    }
+#endif /* __TBB_TASK_PRIORITY */
     // The state "failure_count==-1" is used only when itt_possible is true,
     // and denotes that a sync_prepare has not yet been issued.
     for( int failure_count = -static_cast<int>(SchedulerTraits::itt_possible);; ++failure_count) {
@@ -153,13 +169,14 @@ task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( reference_count&
                 ITT_NOTIFY(sync_acquired, &completion_ref_count);
             }
             __TBB_ASSERT( !t, NULL );
+            __TBB_control_consistency_helper(); // on ref_count
             break; // exit stealing loop and return;
         }
         __TBB_ASSERT( my_arena->my_limit > 0, NULL );
         size_t n = my_arena->my_limit;
         __TBB_ASSERT( my_arena_index < n, NULL );
         if ( n > 1 ) {
-            // Check if the resource manager requires our arena to relinquish some threads 
+            // Check if the resource manager requires our arena to relinquish some threads
             if ( return_if_no_work && my_arena->my_num_workers_allotted < my_arena->num_workers_active() ) {
                 __TBB_ASSERT( is_worker(), NULL );
                 if( SchedulerTraits::itt_possible && failure_count != -1 )
@@ -172,7 +189,7 @@ task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( reference_count&
             }
             // Check if there are tasks in starvation-resistant stream.
             // Only allowed for workers with empty stack, which is identified by return_if_no_work.
-            else if ( return_if_no_work && (t=dequeue_task()) ) {
+            else if ( outermost_dispatch_level && (t = dequeue_task()) ) {
                 // just proceed with the obtained task
             }
 #if __TBB_TASK_PRIORITY
@@ -185,9 +202,9 @@ task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( reference_count&
                 // Try to steal a task from a random victim.
                 size_t k = my_random.get() % (n - 1);
                 arena_slot* victim = &my_arena->my_slots[k];
-                // The following condition excludes the master that might have 
+                // The following condition excludes the master that might have
                 // already taken our previous place in the arena from the list .
-                // of potential victims. But since such a situation can take 
+                // of potential victims. But since such a situation can take
                 // place only in case of significant oversubscription, keeping
                 // the checks simple seems to be preferable to complicating the code.
                 if( k >= my_arena_index )
@@ -195,8 +212,13 @@ task* custom_scheduler<SchedulerTraits>::receive_or_steal_task( reference_count&
                 t = steal_task( *victim );
                 if( !t ) goto fail;
                 if( is_proxy(*t) ) {
-                    t = strip_proxy((task_proxy*)t);
-                    if( !t ) goto fail;
+                    task_proxy &tp = *(task_proxy*)t;
+                    t = tp.extract_task<task_proxy::pool_bit>();
+                    if ( !t ) {
+                        // Proxy was empty, so it's our responsibility to free it
+                        free_task<small_task>(tp);
+                        goto fail;
+                    }
                     GATHER_STATISTIC( ++my_counters.proxies_stolen );
                 }
                 t->prefix().extra_state |= es_task_is_stolen;
@@ -256,7 +278,7 @@ fail:
                     task** link = NULL;
                     // Get local counter out of the way (we've just brought in external tasks)
                     my_local_reload_epoch = 0;
-                    t = reload_tasks( orphans, link, *my_ref_top_priority );
+                    t = reload_tasks( orphans, link, effective_reference_priority() );
                     if ( orphans ) {
                         *link = my_offloaded_tasks;
                         if ( !my_offloaded_tasks )
@@ -289,7 +311,7 @@ fail:
                 }
                 if ( my_offloaded_tasks ) {
                     // Safeguard against any sloppiness in managing reload epoch
-                    // counter (e.g. on the hot path bacause of performnace reasons).
+                    // counter (e.g. on the hot path bacause of performance reasons).
                     my_local_reload_epoch = 0;
                     // Break the deadlock caused by a higher priority dispatch loop
                     // stealing and offloading a lower priority task. Priority check
@@ -315,7 +337,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
     __TBB_ASSERT( governor::is_set(this), NULL );
     __TBB_ASSERT( parent.ref_count() >= (child && child->parent() == &parent ? 2 : 1), "ref_count is too small" );
     assert_task_pool_valid();
-    // Using parent's refcount in sync_prepare (in the stealing loop below) is 
+    // Using parent's refcount in sync_prepare (in the stealing loop below) is
     // a workaround for TP. We need to name it here to display correctly in Ampl.
     if( SchedulerTraits::itt_possible )
         ITT_SYNC_CREATE(&parent.prefix().ref_count, SyncType_Scheduler, SyncObj_TaskStealingLoop);
@@ -324,9 +346,9 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
 #endif /* __TBB_TASK_GROUP_CONTEXT */
     task* t = child;
     // Constant all_local_work_done is an unreacheable refcount value that prevents
-    // early quitting the dispatch loop. It is defined to be in the middle of the range 
+    // early quitting the dispatch loop. It is defined to be in the middle of the range
     // of negative values representable by the reference_count type.
-    static const reference_count 
+    static const reference_count
         // For normal dispatch loops
         parents_work_done = 1,
         // For termination dispatch loops in masters
@@ -338,11 +360,9 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
     // When entering nested parallelism level market level counter
     // must be replaced with the one local to this arena.
     volatile uintptr_t *old_ref_reload_epoch = my_ref_reload_epoch;
+#endif /* __TBB_TASK_PRIORITY */
     task* old_dispatching_task = my_dispatching_task;
     my_dispatching_task = my_innermost_running_task;
-#else /* !__TBB_TASK_PRIORITY */
-    task* old_innermost_running_task = my_innermost_running_task;
-#endif /* __TBB_TASK_PRIORITY */
     if( master_outermost_level() ) {
         // We are in the outermost task dispatch loop of a master thread,
         __TBB_ASSERT( !is_worker(), NULL );
@@ -370,7 +390,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
     for(;;) {
         // Middle loop retrieves tasks from the local task pool.
         do {
-            // Inner loop evaluates tasks coming from nesting loops and those returned 
+            // Inner loop evaluates tasks coming from nesting loops and those returned
             // by just executed tasks (bypassing spawn or enqueue calls).
             while(t) {
                 __TBB_ASSERT( my_inbox.is_idle_state(false), NULL );
@@ -378,7 +398,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
                 __TBB_ASSERT( t->prefix().owner, NULL );
                 assert_task_valid(*t);
 #if __TBB_TASK_GROUP_CONTEXT && TBB_USE_ASSERT
-                if ( !t->prefix().context->my_cancellation_requested ) 
+                if ( !t->prefix().context->my_cancellation_requested )
 #endif
                 __TBB_ASSERT( 1L<<t->state() & (1L<<task::allocated|1L<<task::ready|1L<<task::reexecute), NULL );
                 assert_task_pool_valid();
@@ -389,7 +409,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
                     if ( p != my_arena->my_top_priority ) {
                         my_market->update_arena_priority( *my_arena, p );
                     }
-                    if ( p < *my_ref_top_priority ) {
+                    if ( p < effective_reference_priority() ) {
                         if ( !my_offloaded_tasks ) {
                             my_offloaded_task_list_tail_link = &t->prefix().next_offloaded;
                             // Erase possible reference to the owner scheduler (next_offloaded is a union member)
@@ -402,7 +422,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
                                 continue;
                         }
                         else {
-                            // Mark arena as full to unlock arena priority level adjustment 
+                            // Mark arena as full to unlock arena priority level adjustment
                             // by arena::is_out_of_work(), and ensure worker's presence.
                             my_arena->advertise_new_work<false>();
                         }
@@ -440,7 +460,7 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
                     }
                 }
                 assert_task_pool_valid();
-                switch( task::state_type(t->prefix().state) ) {
+                switch( t->state() ) {
                     case task::executing: {
                         task* s = t->parent();
                         __TBB_ASSERT( my_innermost_running_task==t, NULL );
@@ -489,80 +509,53 @@ void custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task*
             } // end of scheduler bypass loop
 
             assert_task_pool_valid();
-            if ( parent.prefix().ref_count == quit_point )
-                break;
-            if ( in_arena() )
+            if ( parent.prefix().ref_count == quit_point ) {
+                __TBB_ASSERT( quit_point != all_local_work_done, NULL );
+                __TBB_control_consistency_helper(); // on ref_count
+                goto done;
+            }
+            if ( in_arena() ) {
                 t = get_task();
-            else
-                __TBB_ASSERT( my_arena_slot->head == 0 && my_arena_slot->tail == 0, NULL );
+            }
+            else {
+                __TBB_ASSERT( is_quiescent_local_task_pool_reset(), NULL );
+                break;
+            }
             __TBB_ASSERT(!t || !is_proxy(*t),"unexpected proxy");
             assert_task_pool_valid();
         } while( t ); // end of local task pool retrieval loop
 
 #if __TBB_TASK_PRIORITY
 stealing_ground:
-        task* &dispatching_task = my_dispatching_task;
-        if ( worker_outermost_level() && my_arena->my_skipped_fifo_priority ) {
-            // This thread can dequeue FIFO tasks, and some priority levels of 
-            // FIFO tasks have been bypassed (to prevent deadlock caused by 
-            // dynamic priority changes in nested task group hierarchy).
-            intptr_t skipped_priority = my_arena->my_skipped_fifo_priority;
-            if ( my_arena->my_skipped_fifo_priority.compare_and_swap(0, skipped_priority) == skipped_priority &&
-                 skipped_priority > my_arena->my_top_priority )
-            {
-                my_market->update_arena_priority( *my_arena, skipped_priority );
-            }
-        }
-#else /* !__TBB_TASK_PRIORITY */
-        task* &dispatching_task = old_innermost_running_task;
 #endif /* __TBB_TASK_PRIORITY */
         if ( quit_point == all_local_work_done ) {
-            __TBB_ASSERT( my_arena_slot == &my_dummy_slot
-                          && my_arena_slot->head == 0 && my_arena_slot->tail == 0, NULL );
-            my_innermost_running_task = dispatching_task;
-#if __TBB_TASK_PRIORITY
+            __TBB_ASSERT( !in_arena() && is_quiescent_local_task_pool_reset(), NULL );
+            my_innermost_running_task = my_dispatching_task;
             my_dispatching_task = old_dispatching_task;
+#if __TBB_TASK_PRIORITY
             my_ref_top_priority = old_ref_top_priority;
             my_ref_reload_epoch = old_ref_reload_epoch;
 #endif /* __TBB_TASK_PRIORITY */
             return;
         }
-        __TBB_ASSERT( my_arena->my_max_num_workers > 0 || my_market->my_ref_count > 1
-                      || parent.prefix().ref_count == 1, "deadlock detected" );
+        // The following assertion may be falsely triggered in the presence of enqueued tasks
+        //__TBB_ASSERT( my_arena->my_max_num_workers > 0 || my_market->my_ref_count > 1
+        //              || parent.prefix().ref_count == 1, "deadlock detected" );
+
         // Dispatching task pointer is NULL *iff* this is a worker thread in its outermost
         // dispatch loop (i.e. its execution stack is empty). In this case it should exit it
         // either when there is no more work in the current arena, or when revoked by the market.
-        t = receive_or_steal_task( parent.prefix().ref_count, !dispatching_task );
-        if (!t) {
-            my_innermost_running_task = dispatching_task;
-#if __TBB_TASK_PRIORITY
-            my_dispatching_task = old_dispatching_task;
-            my_ref_top_priority = old_ref_top_priority;
-            my_ref_reload_epoch = old_ref_reload_epoch;
-#endif /* __TBB_TASK_PRIORITY */
-            if ( !ConcurrentWaitsEnabled(parent) ) {
-                if ( parent.prefix().ref_count != parents_work_done ) {
-                    // This is a worker that was revoked by the market.
-                    __TBB_ASSERT( is_worker() && !dispatching_task,
-                                  "Worker thread exits nested dispatch loop prematurely" );
-                    return;
-                }
-                parent.prefix().ref_count = 0;
-            }
-#if TBB_USE_ASSERT
-            parent.prefix().extra_state &= ~es_ref_count_active;
-#endif /* TBB_USE_ASSERT */
+        t = receive_or_steal_task( parent.prefix().ref_count, !my_dispatching_task );
+        if ( !t )
             goto done;
-        }
-        __TBB_ASSERT(t,NULL);
         __TBB_ASSERT(!is_proxy(*t),"unexpected proxy");
     } // end of infinite stealing loop
-    __TBB_ASSERT( false, "Must never get here" );
 #if __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS
+    __TBB_ASSERT( false, "Must never get here" );
     } // end of try-block
     TbbCatchAll( t->prefix().context );
     // Complete post-processing ...
-    if( task::state_type(t->prefix().state) == task::recycle ) {
+    if( t->state() == task::recycle ) {
         // ... for tasks recycled with recycle_as_safe_continuation
         t->prefix().state = task::allocated;
         // for safe continuation, need to atomically decrement ref_count;
@@ -576,16 +569,34 @@ stealing_ground:
         }
     }
     } // end of infinite EH loop
-#endif /* __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS */
     __TBB_ASSERT( false, "Must never get here too" );
+#endif /* __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS */
 done:
+    my_innermost_running_task = my_dispatching_task;
+    my_dispatching_task = old_dispatching_task;
+#if __TBB_TASK_PRIORITY
+    my_ref_top_priority = old_ref_top_priority;
+    my_ref_reload_epoch = old_ref_reload_epoch;
+#endif /* __TBB_TASK_PRIORITY */
+    if ( !ConcurrentWaitsEnabled(parent) ) {
+        if ( parent.prefix().ref_count != parents_work_done ) {
+            // This is a worker that was revoked by the market.
+            __TBB_ASSERT( is_worker() && !my_dispatching_task,
+                "Worker thread exits nested dispatch loop prematurely" );
+            return;
+        }
+        parent.prefix().ref_count = 0;
+    }
+#if TBB_USE_ASSERT
+    parent.prefix().extra_state &= ~es_ref_count_active;
+#endif /* TBB_USE_ASSERT */
 #if __TBB_TASK_GROUP_CONTEXT
     __TBB_ASSERT(parent.prefix().context && default_context(), NULL);
     task_group_context* parent_ctx = parent.prefix().context;
     if ( parent_ctx->my_cancellation_requested ) {
         task_group_context::exception_container_type *pe = parent_ctx->my_exception;
         if ( master_outermost_level() && parent_ctx == default_context() ) {
-            // We are in the outermost task dispatch loop of a master thread, and 
+            // We are in the outermost task dispatch loop of a master thread, and
             // the whole task tree has been collapsed. So we may clear cancellation data.
             parent_ctx->my_cancellation_requested = 0;
             // TODO: Add assertion that master's dummy task context does not have children
@@ -594,9 +605,9 @@ done:
         if ( pe )
             pe->throw_self();
     }
-    __TBB_ASSERT(!is_worker() || !CancellationInfoPresent(*my_dummy_task), 
+    __TBB_ASSERT(!is_worker() || !CancellationInfoPresent(*my_dummy_task),
         "Worker's dummy task context modified");
-    __TBB_ASSERT(!master_outermost_level() || !CancellationInfoPresent(*my_dummy_task), 
+    __TBB_ASSERT(!master_outermost_level() || !CancellationInfoPresent(*my_dummy_task),
         "Unexpected exception or cancellation data in the master's dummy task");
 #endif /* __TBB_TASK_GROUP_CONTEXT */
     assert_task_pool_valid();
diff --git a/src/tbb/dynamic_link.cpp b/src/tbb/dynamic_link.cpp
index 7ea9197..e1b228c 100644
--- a/src/tbb/dynamic_link.cpp
+++ b/src/tbb/dynamic_link.cpp
@@ -215,16 +215,16 @@ void dynamic_unlink( dynamic_link_handle handle ) {
         dlclose( handle );
 #endif
         (void)handle;
-#endif /* !__TBB_DYNAMIC_LOAD_ENABLED */
+#endif /* __TBB_DYNAMIC_LOAD_ENABLED */
     }
 }
 
 #if __TBB_BUILD
 
-// Class handle_storage is used by dynamic_link routine to store handles of 
-// all loaded or pinned dynamic libraries. When TBB is shut down, it calls 
-// dynamic_unlink_all() that unloads modules referenced by handle_storage. 
-// This functionality is only used by TBB. It should not be used by other 
+// Class handle_storage is used by dynamic_link routine to store handles of
+// all loaded or pinned dynamic libraries. When TBB is shut down, it calls
+// dynamic_unlink_all() that unloads modules referenced by handle_storage.
+// This functionality is only used by TBB. It should not be used by other
 // libraries reusing this source file to avoid dependency on tbb::atomic<>.
 
 #define MAX_LOADED_MODULES 8 // The number of maximum possible modules which can be loaded
@@ -242,7 +242,6 @@ public:
         const size_t ind = my_size++;
         LIBRARY_ASSERT( ind < MAX_LOADED_MODULES, "Too many modules are loaded" );
         my_handles[ind] = handle;
-        
     }
 
     void free_handles() {
@@ -256,7 +255,9 @@ public:
 
 bool dynamic_link( const char* library, const dynamic_link_descriptor descriptors[], size_t n, size_t required, dynamic_link_handle *handle ) {
     // Get library handle in case it is already loaded into the current process
-#if _WIN32||_WIN64
+#if ! __TBB_DYNAMIC_LOAD_ENABLED
+    dynamic_link_handle library_handle = NULL;
+#elif _WIN32||_WIN64
     dynamic_link_handle library_handle = GetModuleHandle( library );
 #else
     dynamic_link_handle library_handle = dlopen( NULL, RTLD_LAZY );
@@ -320,8 +321,6 @@ bool dynamic_link( const char* library, const dynamic_link_descriptor descriptor
 #if __TBB_DYNAMIC_LOAD_ENABLED || __TBB_TASK_CPP_DIRECTLY_INCLUDED
     if ( !library_handle ) {
 #if _WIN32||_WIN64
-        // Prevent Windows from displaying silly message boxes if it fails to load library
-        // (e.g. because of MS runtime problems - one of those crazy manifest related ones)
 #if _XBOX
         library_handle = LoadLibrary (library);
 #else
@@ -331,6 +330,8 @@ bool dynamic_link( const char* library, const dynamic_link_descriptor descriptor
         char path[ len ];
         size_t rc = abs_path( library, path, len );
         if ( 0 < rc && rc < len ) {
+            // Prevent Windows from displaying silly message boxes if it fails to load library
+            // (e.g. because of MS runtime problems - one of those crazy manifest related ones)
             UINT prev_mode = SetErrorMode (SEM_FAILCRITICALERRORS);
             library_handle = LoadLibrary (path);
             SetErrorMode (prev_mode);
diff --git a/src/tbb/governor.cpp b/src/tbb/governor.cpp
index 3a6b0c0..5547c64 100644
--- a/src/tbb/governor.cpp
+++ b/src/tbb/governor.cpp
@@ -44,6 +44,7 @@ namespace internal {
 //------------------------------------------------------------------------
 
 #if __TBB_SURVIVE_THREAD_SWITCH
+// Suuport for interoperability with Intel(R) Cilk(tm) Plus.
 
 #if _WIN32
 #define CILKLIB_NAME "cilkrts20.dll"
@@ -68,7 +69,7 @@ static atomic<do_once_state> cilkrts_load_state;
 
 bool initialize_cilk_interop() {
     // Pinning can fail. This is a normal situation, and means that the current
-    // thread does not use Cilk and consequently does not need interop.
+    // thread does not use cilkrts and consequently does not need interop.
     return dynamic_link( CILKLIB_NAME, CilkLinkTable, 1 );
 }
 #endif /* __TBB_SURVIVE_THREAD_SWITCH */
@@ -84,7 +85,7 @@ void governor::acquire_resources () {
     int status = theTLS.create();
 #endif
     if( status )
-        handle_perror(status, "TBB failed to initialize TLS storage\n");
+        handle_perror(status, "TBB failed to initialize task scheduler TLS\n");
 
     ::rml::factory::status_type res = theRMLServerFactory.open(); 
     UsePrivateRML = res != ::rml::factory::st_success;
@@ -98,7 +99,7 @@ void governor::release_resources () {
 #endif
     int status = theTLS.destroy();
     if( status )
-        handle_perror(status, "TBB failed to destroy TLS storage");
+        handle_perror(status, "TBB failed to destroy task scheduler TLS");
     dynamic_unlink_all();
 }
 
@@ -120,16 +121,15 @@ rml::tbb_server* governor::create_rml_server ( rml::tbb_client& client ) {
 }
 
 void governor::sign_on(generic_scheduler* s) {
-    __TBB_ASSERT( !s->my_registered, NULL );  
-    s->my_registered = true;
+    __TBB_ASSERT( !theTLS.get(), NULL );
     theTLS.set(s);
 #if __TBB_SURVIVE_THREAD_SWITCH
-    __cilk_tbb_stack_op_thunk o;
-    o.routine = &stack_op_handler;
-    o.data = s;
     if( watch_stack_handler ) {
+        __cilk_tbb_stack_op_thunk o;
+        o.routine = &stack_op_handler;
+        o.data = s;
         if( (*watch_stack_handler)(&s->my_cilk_unwatch_thunk, o) ) {
-            // Failed to register with Cilk, make sure we are clean
+            // Failed to register with cilkrts, make sure we are clean
             s->my_cilk_unwatch_thunk.routine = NULL;
         }
 #if TBB_USE_ASSERT
@@ -141,16 +141,13 @@ void governor::sign_on(generic_scheduler* s) {
 }
 
 void governor::sign_off(generic_scheduler* s) {
-    if( s->my_registered ) {
-        __TBB_ASSERT( theTLS.get()==s || (!s->is_worker() && !theTLS.get()), "attempt to unregister a wrong scheduler instance" );
-        theTLS.set(NULL);
-        s->my_registered = false;
+    __TBB_ASSERT( theTLS.get()==s, "attempt to unregister a wrong scheduler instance" );
+    theTLS.set(NULL);
 #if __TBB_SURVIVE_THREAD_SWITCH
-        __cilk_tbb_unwatch_thunk &ut = s->my_cilk_unwatch_thunk;
-        if ( ut.routine )
-           (*ut.routine)(ut.data);
+    __cilk_tbb_unwatch_thunk &ut = s->my_cilk_unwatch_thunk;
+    if ( ut.routine )
+       (*ut.routine)(ut.data);
 #endif /* __TBB_SURVIVE_THREAD_SWITCH */
-    }
 }
 
 generic_scheduler* governor::init_scheduler( unsigned num_threads, stack_size_type stack_size, bool auto_init ) {
@@ -183,16 +180,12 @@ void governor::auto_terminate(void* arg){
     generic_scheduler* s = static_cast<generic_scheduler*>(arg);
     if( s && s->my_auto_initialized ) {
         if( !--(s->my_ref_count) ) {
-            if ( !theTLS.get() && !s->local_task_pool_empty() ) {
-                // This thread's TLS slot is already cleared. But in order to execute
-                // remaining tasks cleanup_master() will need TLS correctly set.
-                // So we temporarily restore its value.
+            // If the TLS slot is already cleared by OS or underlying concurrency
+            // runtime, restore its value.
+            if ( !theTLS.get() )
                 theTLS.set(s);
-                s->cleanup_master();
-                theTLS.set(NULL);
-            }
-            else
-                s->cleanup_master();
+            s->cleanup_master();
+            __TBB_ASSERT( !theTLS.get(), "cleanup_master has not cleared its TLS slot" );
         }
     }
 }
@@ -275,8 +268,8 @@ void task_scheduler_init::initialize( int number_of_threads ) {
 void task_scheduler_init::initialize( int number_of_threads, stack_size_type thread_stack_size ) {
 #if __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS
     uintptr_t new_mode = thread_stack_size & propagation_mode_mask;
-    thread_stack_size &= ~(stack_size_type)propagation_mode_mask;
 #endif
+    thread_stack_size &= ~(stack_size_type)propagation_mode_mask;
     if( number_of_threads!=deferred ) {
         __TBB_ASSERT( !my_scheduler, "task_scheduler_init already initialized" );
         __TBB_ASSERT( number_of_threads==-1 || number_of_threads>=1,
diff --git a/src/tbb/ia64-gas/ia64_misc.s b/src/tbb/ia64-gas/ia64_misc.s
index 77ca492..497918c 100644
--- a/src/tbb/ia64-gas/ia64_misc.s
+++ b/src/tbb/ia64-gas/ia64_misc.s
@@ -33,3 +33,75 @@ __TBB_get_bsp:
         mov r8=ar.bsp
         br.ret.sptk.many b0
     .endp __TBB_get_bsp#
+
+    .section .text
+    .align 16
+    .proc __TBB_machine_load8_relaxed#
+    .global __TBB_machine_load8_relaxed#
+__TBB_machine_load8_relaxed:
+        ld8 r8=[r32]
+        br.ret.sptk.many b0
+    .endp __TBB_machine_load8_relaxed#
+
+    .section .text
+    .align 16
+    .proc __TBB_machine_store8_relaxed#
+    .global __TBB_machine_store8_relaxed#
+__TBB_machine_store8_relaxed:
+        st8 [r32]=r33
+        br.ret.sptk.many b0
+    .endp __TBB_machine_store8_relaxed#
+
+    .section .text
+    .align 16
+    .proc __TBB_machine_load4_relaxed#
+    .global __TBB_machine_load4_relaxed#
+__TBB_machine_load4_relaxed:
+        ld4 r8=[r32]
+        br.ret.sptk.many b0
+    .endp __TBB_machine_load4_relaxed#
+
+    .section .text
+    .align 16
+    .proc __TBB_machine_store4_relaxed#
+    .global __TBB_machine_store4_relaxed#
+__TBB_machine_store4_relaxed:
+        st4 [r32]=r33
+        br.ret.sptk.many b0
+    .endp __TBB_machine_store4_relaxed#
+
+    .section .text
+    .align 16
+    .proc __TBB_machine_load2_relaxed#
+    .global __TBB_machine_load2_relaxed#
+__TBB_machine_load2_relaxed:
+        ld2 r8=[r32]
+        br.ret.sptk.many b0
+    .endp __TBB_machine_load2_relaxed#
+
+    .section .text
+    .align 16
+    .proc __TBB_machine_store2_relaxed#
+    .global __TBB_machine_store2_relaxed#
+__TBB_machine_store2_relaxed:
+        st2 [r32]=r33
+        br.ret.sptk.many b0
+    .endp __TBB_machine_store2_relaxed#
+
+    .section .text
+    .align 16
+    .proc __TBB_machine_load1_relaxed#
+    .global __TBB_machine_load1_relaxed#
+__TBB_machine_load1_relaxed:
+        ld1 r8=[r32]
+        br.ret.sptk.many b0
+    .endp __TBB_machine_load1_relaxed#
+
+    .section .text
+    .align 16
+    .proc __TBB_machine_store1_relaxed#
+    .global __TBB_machine_store1_relaxed#
+__TBB_machine_store1_relaxed:
+        st1 [r32]=r33
+        br.ret.sptk.many b0
+    .endp __TBB_machine_store1_relaxed#
diff --git a/src/tbb/ibm_aix51/atomic_support.c b/src/tbb/ibm_aix51/atomic_support.c
index ed128fc..e9cadfc 100644
--- a/src/tbb/ibm_aix51/atomic_support.c
+++ b/src/tbb/ibm_aix51/atomic_support.c
@@ -37,14 +37,14 @@
 int32_t __TBB_machine_cas_32 (volatile void* ptr, int32_t value, int32_t comparand) { 
     __asm__ __volatile__ ("sync\n");  /* memory release operation */
     compare_and_swap ((atomic_p) ptr, &comparand, value);
-    __asm__ __volatile__ ("sync\n");  /* memory acquire operation */
+    __asm__ __volatile__ ("isync\n");  /* memory acquire operation */
     return comparand;
 }
 
 int64_t __TBB_machine_cas_64 (volatile void* ptr, int64_t value, int64_t comparand) { 
     __asm__ __volatile__ ("sync\n");  /* memory release operation */
     compare_and_swaplp ((atomic_l) ptr, &comparand, value);
-    __asm__ __volatile__ ("sync\n");  /* memory acquire operation */
+    __asm__ __volatile__ ("isync\n");  /* memory acquire operation */
     return comparand;
 }
 
@@ -52,4 +52,12 @@ void __TBB_machine_flush () {
     __asm__ __volatile__ ("sync\n");
 }
 
+void __TBB_machine_lwsync () { 
+    __asm__ __volatile__ ("lwsync\n");
+}
+
+void __TBB_machine_isync () { 
+    __asm__ __volatile__ ("isync\n");
+}
+
 #endif /* __GNUC__ */
diff --git a/src/tbb/index.html b/src/tbb/index.html
index 5def5fe..c9dbfbe 100644
--- a/src/tbb/index.html
+++ b/src/tbb/index.html
@@ -22,10 +22,9 @@ This directory contains the source code of the TBB core components.
 <A HREF="../index.html">Up to parent directory</A>
 <p></p>
 Copyright © 2005-2011 Intel Corporation.  All Rights Reserved.
-<p></p>
-Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are 
-registered trademarks or trademarks of Intel Corporation or its 
-subsidiaries in the United States and other countries. 
+<P></P>
+Intel is a registered trademark or trademark of Intel Corporation
+or its subsidiaries in the United States and other countries.
 <p></p>
 * Other names and brands may be claimed as the property of others.
 </BODY>
diff --git a/src/tbb/itt_notify.h b/src/tbb/itt_notify.h
index 1c26792..3d4a041 100644
--- a/src/tbb/itt_notify.h
+++ b/src/tbb/itt_notify.h
@@ -102,7 +102,7 @@ namespace tbb {
 // const_cast<void*>() is necessary to cast off volatility
 #define ITT_NOTIFY(name,obj)            __itt_notify_##name(const_cast<void*>(static_cast<volatile void*>(obj)))
 #define ITT_THREAD_SET_NAME(name)       __itt_thread_set_name(name)
-#define ITT_SYNC_CREATE(obj, type, name) __itt_sync_create(obj, type, name, 2)
+#define ITT_SYNC_CREATE(obj, type, name) __itt_sync_create((void*)(obj), type, name, 2)
 #define ITT_SYNC_RENAME(obj, name)      __itt_sync_rename(obj, name)
 #define ITT_STACK_CREATE(obj)           obj = __itt_stack_caller_create()
 #if __TBB_TASK_GROUP_CONTEXT
diff --git a/src/tbb/lin64ipf-tbb-export.lst b/src/tbb/lin64ipf-tbb-export.lst
index ef25e8f..1facd71 100644
--- a/src/tbb/lin64ipf-tbb-export.lst
+++ b/src/tbb/lin64ipf-tbb-export.lst
@@ -381,5 +381,13 @@ __TBB_SYMBOL( __TBB_machine_lg )
 __TBB_SYMBOL( __TBB_machine_lockbyte )
 __TBB_SYMBOL( __TBB_machine_pause )
 __TBB_SYMBOL( __TBB_machine_trylockbyte )
+__TBB_SYMBOL( __TBB_machine_load8_relaxed )
+__TBB_SYMBOL( __TBB_machine_store8_relaxed )
+__TBB_SYMBOL( __TBB_machine_load4_relaxed )
+__TBB_SYMBOL( __TBB_machine_store4_relaxed )
+__TBB_SYMBOL( __TBB_machine_load2_relaxed )
+__TBB_SYMBOL( __TBB_machine_store2_relaxed )
+__TBB_SYMBOL( __TBB_machine_load1_relaxed )
+__TBB_SYMBOL( __TBB_machine_store1_relaxed )
 
 #undef __TBB_SYMBOL
diff --git a/src/tbb/mac32-tbb-export.lst b/src/tbb/mac32-tbb-export.lst
index 6294c0a..169e63f 100644
--- a/src/tbb/mac32-tbb-export.lst
+++ b/src/tbb/mac32-tbb-export.lst
@@ -74,6 +74,7 @@ __TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )
 #endif
 
 // Exception handling in task scheduler
+#if __TBB_TASK_GROUP_CONTEXT
 __TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEm )
 __TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE )
 __TBB_SYMBOL( _ZN3tbb4task12change_groupERNS_18task_group_contextE )
@@ -105,6 +106,7 @@ __TBB_SYMBOL( _ZTVN3tbb18captured_exceptionE )
 __TBB_SYMBOL( _ZTIN3tbb13tbb_exceptionE )
 __TBB_SYMBOL( _ZTSN3tbb13tbb_exceptionE )
 __TBB_SYMBOL( _ZTVN3tbb13tbb_exceptionE )
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
 // Symbols for exceptions thrown from TBB
 __TBB_SYMBOL( _ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev )
@@ -176,7 +178,9 @@ __TBB_SYMBOL( _ZN3tbb8pipeline10add_filterERNS_6filterE )
 __TBB_SYMBOL( _ZN3tbb8pipeline12inject_tokenERNS_4taskE )
 __TBB_SYMBOL( _ZN3tbb8pipeline13remove_filterERNS_6filterE )
 __TBB_SYMBOL( _ZN3tbb8pipeline3runEm )
+#if __TBB_TASK_GROUP_CONTEXT
 __TBB_SYMBOL( _ZN3tbb8pipeline3runEmRNS_18task_group_contextE )
+#endif
 __TBB_SYMBOL( _ZN3tbb8pipeline5clearEv )
 __TBB_SYMBOL( _ZN3tbb19thread_bound_filter12process_itemEv )
 __TBB_SYMBOL( _ZN3tbb19thread_bound_filter16try_process_itemEv )
diff --git a/src/tbb/mac64-tbb-export.lst b/src/tbb/mac64-tbb-export.lst
index 7232c84..660c5be 100644
--- a/src/tbb/mac64-tbb-export.lst
+++ b/src/tbb/mac64-tbb-export.lst
@@ -74,6 +74,7 @@ __TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )
 #endif
 
 // Exception handling in task scheduler
+#if __TBB_TASK_GROUP_CONTEXT
 __TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEm )
 __TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE )
 __TBB_SYMBOL( _ZN3tbb4task12change_groupERNS_18task_group_contextE )
@@ -105,6 +106,7 @@ __TBB_SYMBOL( _ZTVN3tbb18captured_exceptionE )
 __TBB_SYMBOL( _ZTIN3tbb13tbb_exceptionE )
 __TBB_SYMBOL( _ZTSN3tbb13tbb_exceptionE )
 __TBB_SYMBOL( _ZTVN3tbb13tbb_exceptionE )
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
 // Symbols for exceptions thrown from TBB
 __TBB_SYMBOL( _ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev )
@@ -172,7 +174,9 @@ __TBB_SYMBOL( _ZN3tbb8pipeline10add_filterERNS_6filterE )
 __TBB_SYMBOL( _ZN3tbb8pipeline12inject_tokenERNS_4taskE )
 __TBB_SYMBOL( _ZN3tbb8pipeline13remove_filterERNS_6filterE )
 __TBB_SYMBOL( _ZN3tbb8pipeline3runEm )
+#if __TBB_TASK_GROUP_CONTEXT
 __TBB_SYMBOL( _ZN3tbb8pipeline3runEmRNS_18task_group_contextE )
+#endif
 __TBB_SYMBOL( _ZN3tbb8pipeline5clearEv )
 __TBB_SYMBOL( _ZN3tbb19thread_bound_filter12process_itemEv )
 __TBB_SYMBOL( _ZN3tbb19thread_bound_filter16try_process_itemEv )
diff --git a/src/tbb/mailbox.h b/src/tbb/mailbox.h
index 18e3a0c..e0d4eae 100644
--- a/src/tbb/mailbox.h
+++ b/src/tbb/mailbox.h
@@ -37,11 +37,13 @@
 namespace tbb {
 namespace internal {
 
+class generic_scheduler;
 class mail_outbox;
 
 struct task_proxy : public task {
-    static const intptr_t pool_bit = 1;
-    static const intptr_t mailbox_bit = 2;
+    static const intptr_t      pool_bit = 1<<0;
+    static const intptr_t   mailbox_bit = 1<<1;
+    static const intptr_t location_mask = pool_bit | mailbox_bit;
     /* All but two low-order bits represent a (task*).
        Two low-order bits mean:
        1 = proxy is/was/will be in task pool
@@ -49,20 +51,57 @@ struct task_proxy : public task {
     intptr_t task_and_tag;
 
     //! Pointer to next task_proxy in a mailbox
-    task_proxy* next_in_mailbox;
+    task_proxy *__TBB_atomic next_in_mailbox;
 
     //! Mailbox to which this was mailed.
     mail_outbox* outbox;
-};
+
+    //! True if the proxy is stored both in its sender's pool and in the destination mailbox.
+    static bool is_shared ( intptr_t tat ) {
+        return (tat & location_mask) == location_mask;
+    }
+
+    //! Returns a pointer to the encapsulated task or NULL.
+    static task* task_ptr ( intptr_t tat ) {
+        return (task*)(tat & ~location_mask);
+    }
+
+    //! Returns a pointer to the encapsulated task or NULL, and frees proxy if necessary.
+    template<intptr_t from_bit>
+    inline task* extract_task () {
+        __TBB_ASSERT( prefix().extra_state == es_task_proxy, "Normal task misinterpreted as a proxy?" );
+        intptr_t tat = __TBB_load_with_acquire(task_and_tag);
+        __TBB_ASSERT( tat == from_bit || (is_shared(tat) && task_ptr(tat)),
+            "Proxy's tag cannot specify both locations if the proxy "
+            "was retrieved from one of its original locations" );
+        if ( tat != from_bit ) {
+            const intptr_t cleaner_bit = location_mask & ~from_bit;
+            // Attempt to transition the proxy to the "empty" state with
+            // cleaner_bit specifying entity responsible for its eventual freeing.
+            if ( __TBB_CompareAndSwapW( &task_and_tag, cleaner_bit, tat ) == tat ) {
+                // Successfully grabbed the task, and left new owner with the job of freeing the proxy
+                return task_ptr(tat);
+            }
+        }
+        // Proxied task has already been claimed from another proxy location.
+        __TBB_ASSERT( task_and_tag == from_bit, "Empty proxy cannot contain non-zero task pointer" );
+        poison_pointer(outbox);
+        poison_pointer(next_in_mailbox);
+        poison_value(task_and_tag);
+        return NULL;
+    }
+}; // struct task_proxy
 
 //! Internal representation of mail_outbox, without padding.
 class unpadded_mail_outbox {
 protected:
+    typedef task_proxy*__TBB_atomic proxy_ptr;
+
     //! Pointer to first task_proxy in mailbox, or NULL if box is empty. 
-    task_proxy* my_first;
+    proxy_ptr my_first;
 
     //! Pointer to pointer that will point to next item in the queue.  Never NULL.
-    task_proxy** my_last;
+    proxy_ptr* __TBB_atomic my_last;
 
     //! Owner of mailbox is not executing a task, and has drained its own task pool.
     bool my_is_idle;
@@ -70,33 +109,31 @@ protected:
 
 //! Class representing where mail is put.
 /** Padded to occupy a cache line. */
-class mail_outbox: unpadded_mail_outbox {
+class mail_outbox : unpadded_mail_outbox {
     char pad[NFS_MaxLineSize-sizeof(unpadded_mail_outbox)];
 
     task_proxy* internal_pop() {
-        //! No fence on load of my_first, because if it is NULL, there's nothing further to read from another thread.
-        task_proxy* first = my_first;
-        if( first ) {
-            // There is a first item in the mailbox.  See if there is a second.
-            if( task_proxy* second = __TBB_load_with_acquire(first->next_in_mailbox) ) {
-                // There are at least two items, so first item can be popped easily.
-                __TBB_store_with_release( my_first, second );
+        task_proxy* const first = __TBB_load_relaxed(my_first);
+        if( !first )
+            return NULL;
+        __TBB_control_consistency_helper(); // on my_first
+        // There is a first item in the mailbox.  See if there is a second.
+        if( task_proxy* second = first->next_in_mailbox ) {
+            // There are at least two items, so first item can be popped easily.
+            my_first = second;
+        } else {
+            // There is only one item.  Some care is required to pop it.
+            my_first = NULL;
+            if( (proxy_ptr*)__TBB_CompareAndSwapW(&my_last, (intptr_t)&my_first,
+                                (intptr_t)&first->next_in_mailbox) == &first->next_in_mailbox )
+            {
+                // Successfully transitioned mailbox from having one item to having none.
+                __TBB_ASSERT(!first->next_in_mailbox,NULL);
             } else {
-                // There is only one item.  Some care is required to pop it.
-                my_first = NULL;
-                if( (task_proxy**)__TBB_CompareAndSwapW(&my_last, (intptr_t)&my_first,
-                    (intptr_t)&first->next_in_mailbox)==&first->next_in_mailbox ) 
-                {
-                    // Successfully transitioned mailbox from having one item to having none.
-                    __TBB_ASSERT(!first->next_in_mailbox,NULL);
-                } else {
-                    // Some other thread updated my_last but has not filled in result->next_in_mailbox
-                    // Wait until first item points to second item.
-                    atomic_backoff backoff;
-                    while( !(second=const_cast<volatile task_proxy*>(first)->next_in_mailbox) ) 
-                        backoff.pause();
-                    my_first = second;
-                } 
+                // Some other thread updated my_last but has not filled in first->next_in_mailbox
+                // Wait until first item points to second item.
+                for( atomic_backoff backoff; !(second = first->next_in_mailbox); backoff.pause() );
+                my_first = second;
             }
         }
         return first;
@@ -109,15 +146,15 @@ public:
     void push( task_proxy& t ) {
         __TBB_ASSERT(&t, NULL);
         t.next_in_mailbox = NULL; 
-        task_proxy** link = (task_proxy**)__TBB_FetchAndStoreW(&my_last,(intptr_t)&t.next_in_mailbox);
+        proxy_ptr * const link = (proxy_ptr *)__TBB_FetchAndStoreW(&my_last,(intptr_t)&t.next_in_mailbox);
         // No release fence required for the next store, because there are no memory operations 
         // between the previous fully fenced atomic operation and the store.
-        *link = &t;
+        __TBB_store_relaxed(*link, &t);
     }
 
     //! Construct *this as a mailbox from zeroed memory.
-    /** Raise assertion if *this is not previously zeored, or sizeof(this) is wrong.
-        This method is provided instead of a full constructor since we know the objecxt
+    /** Raise assertion if *this is not previously zeroed, or sizeof(this) is wrong.
+        This method is provided instead of a full constructor since we know the object
         will be constructed in zeroed memory. */
     void construct() {
         __TBB_ASSERT( sizeof(*this)==NFS_MaxLineSize, NULL );
diff --git a/src/tbb/market.cpp b/src/tbb/market.cpp
index 9514f61..cb0e9dd 100644
--- a/src/tbb/market.cpp
+++ b/src/tbb/market.cpp
@@ -189,16 +189,19 @@ arena* market::arena_in_need ( arena_list_type &arenas, arena_list_type::iterato
 }
 
 void market::update_allotment ( arena_list_type& arenas, int workers_demand, int max_workers ) {
-    if ( !workers_demand )
-        return;
+    __TBB_ASSERT( workers_demand, NULL );
+    max_workers = min(workers_demand, max_workers);
     int carry = 0;
 #if TBB_USE_ASSERT
     int assigned = 0;
 #endif /* TBB_USE_ASSERT */
-    max_workers = min( max_workers, workers_demand );
     arena_list_type::iterator it = arenas.begin();
     for ( ; it != arenas.end(); ++it ) {
         arena& a = *it;
+        if ( a.my_num_workers_requested <= 0 ) {
+            __TBB_ASSERT( !a.my_num_workers_allotted, NULL );
+            continue;
+        }
         int tmp = a.my_num_workers_requested * max_workers + carry;
         int allotted = tmp / workers_demand;
         carry = tmp % workers_demand;
@@ -216,7 +219,15 @@ inline void market::update_global_top_priority ( intptr_t newPriority ) {
     GATHER_STATISTIC( ++governor::local_scheduler_if_initialized()->my_counters.market_prio_switches );
     my_global_top_priority = newPriority;
     my_priority_levels[newPriority].workers_available = my_max_num_workers;
-    __TBB_store_with_release( my_global_reload_epoch, my_global_reload_epoch + 1 );
+    advance_global_reload_epoch();
+}
+
+inline void market::reset_global_priority () {
+    my_global_bottom_priority = normalized_normal_priority;
+    update_global_top_priority(normalized_normal_priority);
+#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
+    my_lowest_populated_level = normalized_normal_priority;
+#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
 }
 
 arena* market::arena_in_need (
@@ -254,113 +265,107 @@ arena* market::arena_in_need (
 }
 
 void market::update_allotment ( intptr_t highest_affected_priority ) {
-    intptr_t i = highest_affected_priority; 
-    while ( i >= my_global_bottom_priority ) {
+    intptr_t i = highest_affected_priority;
+    int available = my_priority_levels[i].workers_available;
+#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
+    my_lowest_populated_level = my_global_bottom_priority;
+#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
+    for ( ; i >= my_global_bottom_priority; --i ) {
         priority_level_info &pl = my_priority_levels[i];
-        update_allotment( pl.arenas, pl.workers_requested, pl.workers_available );
-        int available = pl.workers_available - pl.workers_requested;
+        pl.workers_available = available;
+        if ( pl.workers_requested ) {
+            update_allotment( pl.arenas, pl.workers_requested, available );
+            available -= pl.workers_requested;
+            if ( available < 0 ) {
+                available = 0;
 #if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
-        if ( available <= 0 && pl.workers_available )
-            my_lowest_populated_level = i;
+                my_lowest_populated_level = i;
 #endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
-        if ( --i >= 0 )
-            my_priority_levels[i].workers_available = available;
+                break;
+            }
+        }
+    }
+    __TBB_ASSERT( i <= my_global_bottom_priority || !available, NULL );
+    for ( --i; i >= my_global_bottom_priority; --i ) {
+        priority_level_info &pl = my_priority_levels[i];
+        pl.workers_available = 0;
+        arena_list_type::iterator it = pl.arenas.begin();
+        for ( ; it != pl.arenas.end(); ++it ) {
+            __TBB_ASSERT( it->my_num_workers_requested || !it->my_num_workers_allotted, NULL );
+            it->my_num_workers_allotted = 0;
+        }
     }
 }
 #endif /* __TBB_TASK_PRIORITY */
 
-/** The balancing algorithm may be liable to data races. However the aberrations 
-    caused by the races are not fatal and generally only temporarily affect fairness 
-    of the workers distribution among arenas. **/
 void market::adjust_demand ( arena& a, int delta ) {
     __TBB_ASSERT( theMarket, "market instance was destroyed prematurely?" );
     if ( !delta )
         return;
     my_arenas_list_mutex.lock();
+    int prev_req = a.my_num_workers_requested;
     a.my_num_workers_requested += delta;
-    if ( a.my_num_workers_requested == 0 )
+    if ( a.my_num_workers_requested <= 0 ) {
         a.my_num_workers_allotted = 0;
+        if ( prev_req <= 0 ) {
+            my_arenas_list_mutex.unlock();
+            return;
+        }
+        delta = -prev_req;
+    }
+    __TBB_ASSERT( prev_req >= 0, "Part-size request to RML?" );
 #if __TBB_TASK_PRIORITY
     intptr_t p = a.my_top_priority;
     priority_level_info &pl = my_priority_levels[p];
     pl.workers_requested += delta;
-    if ( a.my_num_workers_requested == 0 ) {
+    __TBB_ASSERT( pl.workers_requested >= 0, NULL );
+    __TBB_ASSERT( a.my_num_workers_requested >= 0, NULL );
+    if ( a.my_num_workers_requested <= 0 ) {
         if ( a.my_top_priority != normalized_normal_priority ) {
             GATHER_STATISTIC( ++governor::local_scheduler_if_initialized()->my_counters.arena_prio_resets );
             update_arena_top_priority( a, normalized_normal_priority );
         }
         a.my_bottom_priority = normalized_normal_priority;
     }
-    if ( p > my_global_top_priority ) {
-        __TBB_ASSERT( a.my_num_workers_requested > 0, NULL );
-        update_global_top_priority(p);
-        a.my_num_workers_allotted = min( (int)my_max_num_workers, a.my_num_workers_requested );
-        my_priority_levels[p - 1].workers_available = my_max_num_workers - a.my_num_workers_allotted;
-        update_allotment( p - 1 );
-    }
-    else if ( p == my_global_top_priority ) {
-        // Requested number of workers may transitory drop below zero
-        if ( pl.workers_requested <= 0 ) {
+    if ( p == my_global_top_priority ) {
+        if ( !pl.workers_requested ) {
             while ( --p >= my_global_bottom_priority && !my_priority_levels[p].workers_requested )
                 continue;
-            if ( p < my_global_bottom_priority ) {
-                my_global_bottom_priority = normalized_normal_priority;
-                update_global_top_priority(normalized_normal_priority);
-#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
-                my_lowest_populated_level = normalized_normal_priority;
-#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
-            }
+            if ( p < my_global_bottom_priority )
+                reset_global_priority();
             else
                 update_global_top_priority(p);
         }
         update_allotment( my_global_top_priority );
     }
+    else if ( p > my_global_top_priority ) {
+        __TBB_ASSERT( pl.workers_requested > 0, NULL );
+        update_global_top_priority(p);
+        a.my_num_workers_allotted = min( (int)my_max_num_workers, a.my_num_workers_requested );
+        my_priority_levels[p - 1].workers_available = my_max_num_workers - a.my_num_workers_allotted;
+        update_allotment( p - 1 );
+    }
     else if ( p == my_global_bottom_priority ) {
-        // Requested number of workers may transitory drop below zero
-        if ( pl.workers_requested <= 0 ) {
+        if ( !pl.workers_requested ) {
             while ( ++p <= my_global_top_priority && !my_priority_levels[p].workers_requested )
                 continue;
-            if ( p < num_priority_levels ) {
-                TBB_TRACE(( "adjust_demand(%p, %d): change global bottom prio %ld -> %ld\n", &a, delta, (long)my_global_bottom_priority, (long)p ));
+            if ( p > my_global_top_priority )
+                reset_global_priority();
+            else {
                 my_global_bottom_priority = p;
 #if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
                 my_lowest_populated_level = max( my_lowest_populated_level, p );
 #endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
             }
-            else {
-                my_global_bottom_priority = normalized_normal_priority;
-                update_global_top_priority(normalized_normal_priority);
-#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
-                my_lowest_populated_level = normalized_normal_priority;
-#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
-            }
         }
         else
             update_allotment( p );
     }
     else if ( p < my_global_bottom_priority ) {
         __TBB_ASSERT( a.my_num_workers_requested > 0, NULL );
-        int available = my_priority_levels[my_global_bottom_priority].workers_available
-                        - my_priority_levels[my_global_bottom_priority].workers_requested;
-        if ( available > 0 ) {
-            do {
-                __TBB_ASSERT( (my_global_bottom_priority - 1 == p) || !my_priority_levels[my_global_bottom_priority - 1].workers_requested, NULL );
-                my_priority_levels[my_global_bottom_priority - 1].workers_available = available;
-            } while ( --my_global_bottom_priority > p );
-            __TBB_ASSERT( pl.workers_requested == a.my_num_workers_requested, NULL );
-            a.my_num_workers_allotted = min(available, pl.workers_requested);
-#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
-            my_lowest_populated_level = p;
-#endif
-        }
-        else {
-            __TBB_ASSERT( !a.my_num_workers_allotted, NULL );
-            do {
-                __TBB_ASSERT( !my_priority_levels[my_global_bottom_priority].workers_requested, NULL );
-                my_priority_levels[my_global_bottom_priority].workers_available = 0;
-            } while ( --my_global_bottom_priority > p );
-        }
-        __TBB_ASSERT( p == my_global_bottom_priority, NULL );
+        int prev_bottom = my_global_bottom_priority;
+        my_global_bottom_priority = p;
+        update_allotment( prev_bottom );
     }
     else {
         __TBB_ASSERT( my_global_bottom_priority < p && p < my_global_top_priority, NULL );
@@ -440,6 +445,7 @@ void market::update_arena_top_priority ( arena& a, intptr_t new_priority ) {
 #endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
     prev_level.workers_requested -= a.my_num_workers_requested;
     new_level.workers_requested += a.my_num_workers_requested;
+    __TBB_ASSERT( prev_level.workers_requested >= 0 && new_level.workers_requested >= 0, NULL );
 }
 
 bool market::lower_arena_priority ( arena& a, intptr_t new_priority, intptr_t old_priority ) {
@@ -449,23 +455,20 @@ bool market::lower_arena_priority ( arena& a, intptr_t new_priority, intptr_t ol
         return false;
     }
     __TBB_ASSERT( a.my_top_priority > new_priority, NULL );
+    __TBB_ASSERT( my_global_top_priority >= a.my_top_priority, NULL );
     intptr_t p = a.my_top_priority;
     update_arena_top_priority( a, new_priority );
-    if ( a.my_num_workers_requested ) {
+    if ( a.my_num_workers_requested > 0 ) {
         if ( my_global_bottom_priority > new_priority ) {
-            TBB_TRACE(( "    -> global bottom prio %ld -> %ld\n", (long)my_global_bottom_priority, (long)new_priority ));
             my_global_bottom_priority = new_priority;
         }
-        if ( p == my_global_top_priority && my_priority_levels[p].workers_requested <= 0 ) {
-            while ( --p >= my_global_bottom_priority && my_priority_levels[p].workers_requested <= 0 )
-                continue;
+        if ( p == my_global_top_priority && !my_priority_levels[p].workers_requested ) {
+            // Global top level became empty
+            for ( --p; !my_priority_levels[p].workers_requested; --p ) continue;
             __TBB_ASSERT( p >= my_global_bottom_priority, NULL );
             update_global_top_priority(p);
         }
-#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
-        if ( p >= my_lowest_populated_level )
-#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
-            update_allotment( p );
+        update_allotment( p );
     }
     assert_market_valid();
     return true;
@@ -478,32 +481,43 @@ bool market::update_arena_priority ( arena& a, intptr_t new_priority ) {
         return false;
     }
     else if ( a.my_top_priority > new_priority ) {
-        if ( a.my_bottom_priority > new_priority ) {
-            TBB_TRACE(( "    -> bottom prio %ld -> %ld)\n", (long)a.my_bottom_priority, (long)new_priority ));
+        if ( a.my_bottom_priority > new_priority )
             a.my_bottom_priority = new_priority;
-        }
         assert_market_valid();
         return false;
     }
+    intptr_t p = a.my_top_priority;
+    intptr_t highest_affected_level = max(p, new_priority);
     update_arena_top_priority( a, new_priority );
-    if ( a.my_num_workers_requested ) {
+    if ( a.my_num_workers_requested > 0 ) {
         if ( my_global_top_priority < new_priority ) {
             update_global_top_priority(new_priority);
         }
+        else if ( my_global_top_priority == new_priority ) {
+            advance_global_reload_epoch();
+        }
         else {
-            if ( my_global_top_priority == new_priority )
-                ++my_global_reload_epoch;
-            // Previous arena priority may have been at my_global_bottom_priority level,
-            // thus check if my_global_bottom_priority needs to be updated.
-            while ( !my_priority_levels[my_global_bottom_priority].workers_requested ) {
-                TBB_TRACE(( "    -> global bottom prio %ld -> %ld)\n", (long)my_global_bottom_priority, (long)my_global_bottom_priority + 1 ));
-                ++my_global_bottom_priority;
+            __TBB_ASSERT( new_priority < my_global_top_priority, NULL );
+            __TBB_ASSERT( new_priority > my_global_bottom_priority, NULL );
+            if ( p == my_global_top_priority && !my_priority_levels[p].workers_requested ) {
+                // Global top level became empty
+                __TBB_ASSERT( my_global_bottom_priority < p, NULL );
+                for ( --p; !my_priority_levels[p].workers_requested; --p ) continue;
+                __TBB_ASSERT( p >= new_priority, NULL );
+                update_global_top_priority(p);
+                highest_affected_level = p;
             }
         }
-#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION
-        if ( new_priority >= my_lowest_populated_level )
-#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */
-            update_allotment( new_priority );
+        if ( p == my_global_bottom_priority ) {
+            // Arena priority was increased from the global bottom level.
+            __TBB_ASSERT( p < new_priority, NULL );                     // n
+            __TBB_ASSERT( new_priority <= my_global_top_priority, NULL );
+            while ( !my_priority_levels[my_global_bottom_priority].workers_requested )
+                ++my_global_bottom_priority;
+            __TBB_ASSERT( my_global_bottom_priority <= new_priority, NULL );
+            __TBB_ASSERT( my_priority_levels[my_global_bottom_priority].workers_requested > 0, NULL );
+        }
+        update_allotment( highest_affected_level );
     }
     assert_market_valid();
     return true;
diff --git a/src/tbb/market.h b/src/tbb/market.h
index e3f229f..827149a 100644
--- a/src/tbb/market.h
+++ b/src/tbb/market.h
@@ -183,11 +183,19 @@ private:
         deviate from the calculated value. **/
     void update_allotment ( intptr_t highest_affected_priority );
 
-    //! Changes arena's top and bottom priority boundaries if necessary
+    //! Changes arena's top priority and updates affected priority levels info in the market.
     void update_arena_top_priority ( arena& a, intptr_t newPriority );
 
+    //! Changes market's global top priority and related settings.
     inline void update_global_top_priority ( intptr_t newPriority );
 
+    //! Resets empty market's global top and bottom priority to the normal level.
+    inline void reset_global_priority ();
+
+    inline void advance_global_reload_epoch () {
+        __TBB_store_with_release( my_global_reload_epoch, my_global_reload_epoch + 1 );
+    }
+
     void assert_market_valid () const {
         __TBB_ASSERT( (my_priority_levels[my_global_top_priority].workers_requested > 0
                            && !my_priority_levels[my_global_top_priority].arenas.empty())
@@ -200,7 +208,10 @@ private:
     //! Recalculates the number of workers assigned to each arena in the list.
     /** The actual number of workers servicing a particular arena may temporarily 
         deviate from the calculated value. **/
-    void update_allotment () { update_allotment( my_arenas, my_total_demand, (int)my_max_num_workers ); }
+    void update_allotment () {
+        if ( my_total_demand )
+            update_allotment( my_arenas, my_total_demand, (int)my_max_num_workers );
+    }
 
     //! Returns next arena that needs more workers, or NULL.
     arena* arena_in_need () {
diff --git a/src/tbb/queuing_mutex.cpp b/src/tbb/queuing_mutex.cpp
index 7c00337..5481f7f 100644
--- a/src/tbb/queuing_mutex.cpp
+++ b/src/tbb/queuing_mutex.cpp
@@ -53,7 +53,10 @@ void queuing_mutex::scoped_lock::acquire( queuing_mutex& m )
     scoped_lock* pred = m.q_tail.fetch_and_store<tbb::release>(this);
     if( pred ) {
         ITT_NOTIFY(sync_prepare, mutex);
+#if TBB_USE_ASSERT
+        __TBB_control_consistency_helper(); // on "m.q_tail"
         __TBB_ASSERT( !pred->next, "the predecessor has another successor!");
+#endif
         pred->next = this;
         spin_wait_while_eq( going, 0ul );
     }
@@ -74,20 +77,18 @@ bool queuing_mutex::scoped_lock::try_acquire( queuing_mutex& m )
     next  = NULL;
     going = 0;
 
-    if( m.q_tail ) return false;
     // The CAS must have release semantics, because we are
     // "sending" the fields initialized above to other processors.
-    scoped_lock* pred = m.q_tail.compare_and_swap<tbb::release>(this, NULL);
+    if( m.q_tail.compare_and_swap<tbb::release>(this, NULL) )
+        return false;
 
     // Force acquire so that user's critical section receives correct values
     // from processor that was previously in the user's critical section.
     // try_acquire should always have acquire semantic, even if failed.
     __TBB_load_with_acquire(going);
-    if( !pred ) {
-        mutex = &m;
-        ITT_NOTIFY(sync_acquired, mutex);
-        return true;
-    } else return false;
+    mutex = &m;
+    ITT_NOTIFY(sync_acquired, mutex);
+    return true;
 }
 
 //! A method to release queuing_mutex lock
diff --git a/src/tbb/queuing_rw_mutex.cpp b/src/tbb/queuing_rw_mutex.cpp
index 882bc6e..27eceb3 100644
--- a/src/tbb/queuing_rw_mutex.cpp
+++ b/src/tbb/queuing_rw_mutex.cpp
@@ -58,7 +58,7 @@ enum state_t_flags {
 
 const unsigned char RELEASED = 0;
 const unsigned char ACQUIRED = 1;
- 
+
 template<typename T>
 inline atomic<T>& as_atomic( T& t ) {
     return *(atomic<T>*)&t;
@@ -66,7 +66,7 @@ inline atomic<T>& as_atomic( T& t ) {
 
 inline bool queuing_rw_mutex::scoped_lock::try_acquire_internal_lock()
 {
-    return as_atomic(internal_lock).compare_and_swap<tbb::acquire>(ACQUIRED,RELEASED) == RELEASED;
+    return as_atomic(my_internal_lock).compare_and_swap<tbb::acquire>(ACQUIRED,RELEASED) == RELEASED;
 }
 
 inline void queuing_rw_mutex::scoped_lock::acquire_internal_lock()
@@ -80,12 +80,12 @@ inline void queuing_rw_mutex::scoped_lock::acquire_internal_lock()
 
 inline void queuing_rw_mutex::scoped_lock::release_internal_lock()
 {
-    __TBB_store_with_release(internal_lock,RELEASED);
+    __TBB_store_with_release(my_internal_lock,RELEASED);
 }
 
 inline void queuing_rw_mutex::scoped_lock::wait_for_release_of_internal_lock()
 {
-    spin_wait_until_eq(internal_lock, RELEASED);
+    spin_wait_until_eq(my_internal_lock, RELEASED);
 }
 
 inline void queuing_rw_mutex::scoped_lock::unblock_or_wait_on_internal_lock( uintptr_t flag ) {
@@ -105,7 +105,7 @@ inline void queuing_rw_mutex::scoped_lock::unblock_or_wait_on_internal_lock( uin
 template<typename T>
 class tricky_atomic_pointer: no_copy {
 public:
-    typedef typename atomic_rep<sizeof(T*)>::word word;
+    typedef typename atomic_selector<sizeof(T*)>::word word;
 
     template<memory_semantics M>
     static T* fetch_and_add( T* volatile * location, word addend ) {
@@ -145,8 +145,8 @@ typedef tricky_atomic_pointer<queuing_rw_mutex::scoped_lock> tricky_pointer;
 static const tricky_pointer::word FLAG = 0x1;
 
 inline
-uintptr_t get_flag( queuing_rw_mutex::scoped_lock* ptr ) { 
-    return uintptr_t(tricky_pointer(ptr)&FLAG);
+uintptr_t get_flag( queuing_rw_mutex::scoped_lock* ptr ) {
+    return uintptr_t(ptr) & FLAG;
 }
 
 //------------------------------------------------------------------------
@@ -155,29 +155,31 @@ uintptr_t get_flag( queuing_rw_mutex::scoped_lock* ptr ) {
 
 void queuing_rw_mutex::scoped_lock::acquire( queuing_rw_mutex& m, bool write )
 {
-    __TBB_ASSERT( !this->mutex, "scoped_lock is already holding a mutex");
+    __TBB_ASSERT( !my_mutex, "scoped_lock is already holding a mutex");
 
     // Must set all fields before the fetch_and_store, because once the
     // fetch_and_store executes, *this becomes accessible to other threads.
-    mutex = &m;
-    prev  = NULL;
-    next  = NULL;
-    going = 0;
-    state = state_t(write ? STATE_WRITER : STATE_READER);
-    internal_lock = RELEASED;
+    my_mutex = &m;
+    __TBB_store_relaxed(my_prev , (scoped_lock*)0);
+    __TBB_store_relaxed(my_next , (scoped_lock*)0);
+    __TBB_store_relaxed(my_going, 0);
+    my_state = state_t(write ? STATE_WRITER : STATE_READER);
+    my_internal_lock = RELEASED;
 
     queuing_rw_mutex::scoped_lock* pred = m.q_tail.fetch_and_store<tbb::release>(this);
 
     if( write ) {       // Acquiring for write
 
         if( pred ) {
-            ITT_NOTIFY(sync_prepare, mutex);
+            ITT_NOTIFY(sync_prepare, my_mutex);
             pred = tricky_pointer(pred) & ~FLAG;
-            __TBB_ASSERT( !( tricky_pointer(pred) & FLAG ), "use of corrupted pointer!" );
-            __TBB_ASSERT( !pred->next, "the predecessor has another successor!");
-            // ensure release semantics on IPF
-           __TBB_store_with_release(pred->next,this);
-            spin_wait_until_eq(going, 1);
+            __TBB_ASSERT( !( uintptr_t(pred) & FLAG ), "use of corrupted pointer!" );
+#if TBB_USE_ASSERT
+            __TBB_control_consistency_helper(); // on "m.q_tail"
+            __TBB_ASSERT( !__TBB_load_relaxed(pred->my_next), "the predecessor has another successor!");
+#endif
+           __TBB_store_with_release(pred->my_next,this);
+            spin_wait_until_eq(my_going, 1);
         }
 
     } else {            // Acquiring for read
@@ -186,135 +188,134 @@ void queuing_rw_mutex::scoped_lock::acquire( queuing_rw_mutex& m, bool write )
 #endif
         if( pred ) {
             unsigned short pred_state;
-            __TBB_ASSERT( !this->prev, "the predecessor is already set" );
-            if( tricky_pointer(pred)&FLAG ) {
+            __TBB_ASSERT( !__TBB_load_relaxed(my_prev), "the predecessor is already set" );
+            if( uintptr_t(pred) & FLAG ) {
                 /* this is only possible if pred is an upgrading reader and it signals us to wait */
                 pred_state = STATE_UPGRADE_WAITING;
                 pred = tricky_pointer(pred) & ~FLAG;
             } else {
-                // Load pred->state now, because once pred->next becomes
+                // Load pred->my_state now, because once pred->my_next becomes
                 // non-NULL, we must assume that *pred might be destroyed.
-                pred_state = pred->state.compare_and_swap<tbb::acquire>(STATE_READER_UNBLOCKNEXT, STATE_READER);
+                pred_state = pred->my_state.compare_and_swap<tbb::acquire>(STATE_READER_UNBLOCKNEXT, STATE_READER);
             }
-            this->prev = pred;
-            __TBB_ASSERT( !( tricky_pointer(pred) & FLAG ), "use of corrupted pointer!" );
-            __TBB_ASSERT( !pred->next, "the predecessor has another successor!");
-            // ensure release semantics on IPF
-           __TBB_store_with_release(pred->next,this);
+            __TBB_store_relaxed(my_prev, pred);
+            __TBB_ASSERT( !( uintptr_t(pred) & FLAG ), "use of corrupted pointer!" );
+#if TBB_USE_ASSERT
+            __TBB_control_consistency_helper(); // on "m.q_tail"
+            __TBB_ASSERT( !__TBB_load_relaxed(pred->my_next), "the predecessor has another successor!");
+#endif
+           __TBB_store_with_release(pred->my_next,this);
             if( pred_state != STATE_ACTIVEREADER ) {
 #if DO_ITT_NOTIFY
                 sync_prepare_done = true;
-                ITT_NOTIFY(sync_prepare, mutex);
+                ITT_NOTIFY(sync_prepare, my_mutex);
 #endif
-                spin_wait_until_eq(going, 1);
+                spin_wait_until_eq(my_going, 1);
             }
         }
-        unsigned short old_state = state.compare_and_swap<tbb::acquire>(STATE_ACTIVEREADER, STATE_READER);
+        unsigned short old_state = my_state.compare_and_swap<tbb::acquire>(STATE_ACTIVEREADER, STATE_READER);
         if( old_state!=STATE_READER ) {
 #if DO_ITT_NOTIFY
             if( !sync_prepare_done )
-                ITT_NOTIFY(sync_prepare, mutex);
+                ITT_NOTIFY(sync_prepare, my_mutex);
 #endif
             // Failed to become active reader -> need to unblock the next waiting reader first
-            __TBB_ASSERT( state==STATE_READER_UNBLOCKNEXT, "unexpected state" );
-            spin_wait_while_eq(next, (scoped_lock*)NULL);
-            /* state should be changed before unblocking the next otherwise it might finish
+            __TBB_ASSERT( my_state==STATE_READER_UNBLOCKNEXT, "unexpected state" );
+            spin_wait_while_eq(my_next, (scoped_lock*)NULL);
+            /* my_state should be changed before unblocking the next otherwise it might finish
                and another thread can get our old state and left blocked */
-            state = STATE_ACTIVEREADER;
-            // ensure release semantics on IPF
-           __TBB_store_with_release(next->going,1);
+            my_state = STATE_ACTIVEREADER;
+           __TBB_store_with_release(my_next->my_going,1);
         }
     }
 
-    ITT_NOTIFY(sync_acquired, mutex);
+    ITT_NOTIFY(sync_acquired, my_mutex);
 
     // Force acquire so that user's critical section receives correct values
     // from processor that was previously in the user's critical section.
-    __TBB_load_with_acquire(going);
+    __TBB_load_with_acquire(my_going);
 }
 
 bool queuing_rw_mutex::scoped_lock::try_acquire( queuing_rw_mutex& m, bool write )
 {
-    __TBB_ASSERT( !this->mutex, "scoped_lock is already holding a mutex");
+    __TBB_ASSERT( !my_mutex, "scoped_lock is already holding a mutex");
+
+    if( load<relaxed>(m.q_tail) )
+        return false; // Someone already took the lock
 
     // Must set all fields before the fetch_and_store, because once the
     // fetch_and_store executes, *this becomes accessible to other threads.
-    prev  = NULL;
-    next  = NULL;
-    going = 0;
-    state = state_t(write ? STATE_WRITER : STATE_ACTIVEREADER);
-    internal_lock = RELEASED;
+    __TBB_store_relaxed(my_prev, (scoped_lock*)0);
+    __TBB_store_relaxed(my_next, (scoped_lock*)0);
+    __TBB_store_relaxed(my_going, 0); // TODO: remove dead assignment?
+    my_state = state_t(write ? STATE_WRITER : STATE_ACTIVEREADER);
+    my_internal_lock = RELEASED;
 
-    if( m.q_tail ) return false;
     // The CAS must have release semantics, because we are
     // "sending" the fields initialized above to other processors.
-    queuing_rw_mutex::scoped_lock* pred = m.q_tail.compare_and_swap<tbb::release>(this, NULL);
-
+    if( m.q_tail.compare_and_swap<tbb::release>(this, NULL) )
+        return false; // Someone already took the lock
     // Force acquire so that user's critical section receives correct values
     // from processor that was previously in the user's critical section.
     // try_acquire should always have acquire semantic, even if failed.
-    __TBB_load_with_acquire(going);
-
-    if( !pred ) {
-        mutex = &m;
-        ITT_NOTIFY(sync_acquired, mutex);
-        return true;
-    } else return false;
-
+    __TBB_load_with_acquire(my_going);
+    my_mutex = &m;
+    ITT_NOTIFY(sync_acquired, my_mutex);
+    return true;
 }
 
 void queuing_rw_mutex::scoped_lock::release( )
 {
-    __TBB_ASSERT(this->mutex!=NULL, "no lock acquired");
+    __TBB_ASSERT(my_mutex!=NULL, "no lock acquired");
 
-    ITT_NOTIFY(sync_releasing, mutex);
+    ITT_NOTIFY(sync_releasing, my_mutex);
 
-    if( state == STATE_WRITER ) { // Acquired for write
+    if( my_state == STATE_WRITER ) { // Acquired for write
 
-        // The logic below is the same as "writerUnlock", but restructured to remove "return" in the middle of routine.
-        // In the statement below, acquire semantics of reading 'next' is required
-        // so that following operations with fields of 'next' are safe.
-        scoped_lock* n = __TBB_load_with_acquire(next);
+        // The logic below is the same as "writerUnlock", but elides
+        // "return" from the middle of the routine.
+        // In the statement below, acquire semantics of reading my_next is required
+        // so that following operations with fields of my_next are safe.
+        scoped_lock* n = __TBB_load_with_acquire(my_next);
         if( !n ) {
-            if( this == mutex->q_tail.compare_and_swap<tbb::release>(NULL, this) ) {
+            if( this == my_mutex->q_tail.compare_and_swap<tbb::release>(NULL, this) ) {
                 // this was the only item in the queue, and the queue is now empty.
                 goto done;
             }
-            spin_wait_while_eq( next, (scoped_lock*)NULL );
-            n = next;
+            spin_wait_while_eq( my_next, (scoped_lock*)NULL );
+            n = __TBB_load_with_acquire(my_next);
         }
-        n->going = 2; // protect next queue node from being destroyed too early
-        if( n->state==STATE_UPGRADE_WAITING ) {
+        __TBB_store_relaxed(n->my_going, 2); // protect next queue node from being destroyed too early
+        if( n->my_state==STATE_UPGRADE_WAITING ) {
             // the next waiting for upgrade means this writer was upgraded before.
             acquire_internal_lock();
-            queuing_rw_mutex::scoped_lock* tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->prev), NULL);
-            n->state = STATE_UPGRADE_LOSER;
-            __TBB_store_with_release(n->going,1);
+            queuing_rw_mutex::scoped_lock* tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->my_prev), NULL);
+            n->my_state = STATE_UPGRADE_LOSER;
+            __TBB_store_with_release(n->my_going,1);
             unblock_or_wait_on_internal_lock(get_flag(tmp));
         } else {
-            __TBB_ASSERT( state & (STATE_COMBINED_WAITINGREADER | STATE_WRITER), "unexpected state" );
-            __TBB_ASSERT( !( tricky_pointer(n->prev) & FLAG ), "use of corrupted pointer!" );
-            n->prev = NULL;
-            // ensure release semantics on IPF
-            __TBB_store_with_release(n->going,1);
+            __TBB_ASSERT( my_state & (STATE_COMBINED_WAITINGREADER | STATE_WRITER), "unexpected state" );
+            __TBB_ASSERT( !( uintptr_t(__TBB_load_relaxed(n->my_prev)) & FLAG ), "use of corrupted pointer!" );
+            __TBB_store_relaxed(n->my_prev, (scoped_lock*)0);
+            __TBB_store_with_release(n->my_going,1);
         }
 
     } else { // Acquired for read
 
         queuing_rw_mutex::scoped_lock *tmp = NULL;
 retry:
-        // Addition to the original paper: Mark this->prev as in use
-        queuing_rw_mutex::scoped_lock *pred = tricky_pointer::fetch_and_add<tbb::acquire>(&(this->prev), FLAG);
+        // Addition to the original paper: Mark my_prev as in use
+        queuing_rw_mutex::scoped_lock *pred = tricky_pointer::fetch_and_add<tbb::acquire>(&my_prev, FLAG);
 
         if( pred ) {
             if( !(pred->try_acquire_internal_lock()) )
             {
                 // Failed to acquire the lock on pred. The predecessor either unlinks or upgrades.
                 // In the second case, it could or could not know my "in use" flag - need to check
-                tmp = tricky_pointer::compare_and_swap<tbb::release>(&(this->prev), pred, tricky_pointer(pred)|FLAG );
-                if( !(tricky_pointer(tmp)&FLAG) ) {
-                    // Wait for the predecessor to change this->prev (e.g. during unlink)
-                    spin_wait_while_eq( this->prev, tricky_pointer(pred)|FLAG );
+                tmp = tricky_pointer::compare_and_swap<tbb::release>(&my_prev, pred, tricky_pointer(pred) | FLAG );
+                if( !(uintptr_t(tmp) & FLAG) ) {
+                    // Wait for the predecessor to change my_prev (e.g. during unlink)
+                    spin_wait_while_eq( my_prev, tricky_pointer(pred)|FLAG );
                     // Now owner of pred is waiting for _us_ to release its lock
                     pred->release_internal_lock();
                 }
@@ -323,178 +324,177 @@ retry:
                 tmp = NULL;
                 goto retry;
             }
-            __TBB_ASSERT(pred && pred->internal_lock==ACQUIRED, "predecessor's lock is not acquired");
-            this->prev = pred;
+            __TBB_ASSERT(pred && pred->my_internal_lock==ACQUIRED, "predecessor's lock is not acquired");
+            __TBB_store_relaxed(my_prev, pred);
             acquire_internal_lock();
 
-            __TBB_store_with_release(pred->next,reinterpret_cast<scoped_lock *>(NULL));
+            __TBB_store_with_release(pred->my_next,reinterpret_cast<scoped_lock *>(NULL));
 
-            if( !next && this != mutex->q_tail.compare_and_swap<tbb::release>(pred, this) ) {
-                spin_wait_while_eq( next, (void*)NULL );
+            if( !__TBB_load_relaxed(my_next) && this != my_mutex->q_tail.compare_and_swap<tbb::release>(pred, this) ) {
+                spin_wait_while_eq( my_next, (void*)NULL );
             }
-            __TBB_ASSERT( !get_flag(next), "use of corrupted pointer" );
+            __TBB_ASSERT( !get_flag(__TBB_load_relaxed(my_next)), "use of corrupted pointer" );
 
-            // ensure acquire semantics of reading 'next'
-            if( __TBB_load_with_acquire(next) ) { // I->next != nil
+            // ensure acquire semantics of reading 'my_next'
+            if( scoped_lock *const l_next = __TBB_load_with_acquire(my_next) ) { // I->next != nil, TODO: rename to n after clearing up and adapting the n in the comment two lines below
                 // Equivalent to I->next->prev = I->prev but protected against (prev[n]&FLAG)!=0
-                tmp = tricky_pointer::fetch_and_store<tbb::release>(&(next->prev), pred);
+                tmp = tricky_pointer::fetch_and_store<tbb::release>(&(l_next->my_prev), pred);
                 // I->prev->next = I->next;
-                __TBB_ASSERT(this->prev==pred, NULL);
-                __TBB_store_with_release(pred->next,next);
+                __TBB_ASSERT(__TBB_load_relaxed(my_prev)==pred, NULL);
+                __TBB_store_with_release(pred->my_next, my_next);
             }
             // Safe to release in the order opposite to acquiring which makes the code simplier
             pred->release_internal_lock();
 
         } else { // No predecessor when we looked
             acquire_internal_lock();  // "exclusiveLock(&I->EL)"
-            // ensure acquire semantics of reading 'next'
-            scoped_lock* n = __TBB_load_with_acquire(next);
+            scoped_lock* n = __TBB_load_with_acquire(my_next);
             if( !n ) {
-                if( this != mutex->q_tail.compare_and_swap<tbb::release>(NULL, this) ) {
-                    spin_wait_while_eq( next, (scoped_lock*)NULL );
-                    n = next;
+                if( this != my_mutex->q_tail.compare_and_swap<tbb::release>(NULL, this) ) {
+                    spin_wait_while_eq( my_next, (scoped_lock*)NULL );
+                    n = __TBB_load_relaxed(my_next);
                 } else {
                     goto unlock_self;
                 }
             }
-            n->going = 2; // protect next queue node from being destroyed too early
-            tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->prev), NULL);
-            // ensure release semantics on IPF
-            __TBB_store_with_release(n->going,1);
+            __TBB_store_relaxed(n->my_going, 2); // protect next queue node from being destroyed too early
+            tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->my_prev), NULL);
+            __TBB_store_with_release(n->my_going,1);
         }
 unlock_self:
         unblock_or_wait_on_internal_lock(get_flag(tmp));
     }
 done:
-    spin_wait_while_eq( going, 2 );
+    spin_wait_while_eq( my_going, 2 );
 
     initialize();
 }
 
 bool queuing_rw_mutex::scoped_lock::downgrade_to_reader()
 {
-    __TBB_ASSERT( state==STATE_WRITER, "no sense to downgrade a reader" );
+    __TBB_ASSERT( my_state==STATE_WRITER, "no sense to downgrade a reader" );
 
-    ITT_NOTIFY(sync_releasing, mutex);
+    ITT_NOTIFY(sync_releasing, my_mutex);
 
-    // ensure acquire semantics of reading 'next'
-    if( ! __TBB_load_with_acquire(next) ) {
-        state = STATE_READER;
-        if( this==mutex->q_tail ) {
-            unsigned short old_state = state.compare_and_swap<tbb::release>(STATE_ACTIVEREADER, STATE_READER);
+    if( ! __TBB_load_with_acquire(my_next) ) {
+        my_state = STATE_READER;
+        if( this==my_mutex->q_tail ) {
+            unsigned short old_state = my_state.compare_and_swap<tbb::release>(STATE_ACTIVEREADER, STATE_READER);
             if( old_state==STATE_READER ) {
-                goto downgrade_done;
+                // Downgrade completed
+                return true;
             }
         }
         /* wait for the next to register */
-        spin_wait_while_eq( next, (void*)NULL );
+        spin_wait_while_eq( my_next, (void*)NULL );
     }
-    __TBB_ASSERT( next, "still no successor at this point!" );
-    if( next->state & STATE_COMBINED_WAITINGREADER )
-        __TBB_store_with_release(next->going,1);
-    else if( next->state==STATE_UPGRADE_WAITING )
+    scoped_lock *const n = __TBB_load_relaxed(my_next);
+    __TBB_ASSERT( n, "still no successor at this point!" );
+    if( n->my_state & STATE_COMBINED_WAITINGREADER )
+        __TBB_store_with_release(n->my_going,1);
+    else if( n->my_state==STATE_UPGRADE_WAITING )
         // the next waiting for upgrade means this writer was upgraded before.
-        next->state = STATE_UPGRADE_LOSER;
-    state = STATE_ACTIVEREADER;
-
-downgrade_done:
+        n->my_state = STATE_UPGRADE_LOSER;
+    my_state = STATE_ACTIVEREADER;
     return true;
 }
 
 bool queuing_rw_mutex::scoped_lock::upgrade_to_writer()
 {
-    __TBB_ASSERT( state==STATE_ACTIVEREADER, "only active reader can be upgraded" );
+    __TBB_ASSERT( my_state==STATE_ACTIVEREADER, "only active reader can be upgraded" );
 
     queuing_rw_mutex::scoped_lock * tmp;
     queuing_rw_mutex::scoped_lock * me = this;
 
-    ITT_NOTIFY(sync_releasing, mutex);
-    state = STATE_UPGRADE_REQUESTED;
+    ITT_NOTIFY(sync_releasing, my_mutex);
+    my_state = STATE_UPGRADE_REQUESTED;
 requested:
-    __TBB_ASSERT( !( tricky_pointer(next) & FLAG ), "use of corrupted pointer!" );
+    __TBB_ASSERT( !(uintptr_t(__TBB_load_relaxed(my_next)) & FLAG), "use of corrupted pointer!" );
     acquire_internal_lock();
-    if( this != mutex->q_tail.compare_and_swap<tbb::release>(tricky_pointer(me)|FLAG, this) ) {
-        spin_wait_while_eq( next, (void*)NULL );
+    if( this != my_mutex->q_tail.compare_and_swap<tbb::release>(tricky_pointer(me)|FLAG, this) ) {
+        spin_wait_while_eq( my_next, (void*)NULL );
         queuing_rw_mutex::scoped_lock * n;
-        n = tricky_pointer::fetch_and_add<tbb::acquire>(&(this->next), FLAG);
-        unsigned short n_state = n->state;
+        n = tricky_pointer::fetch_and_add<tbb::acquire>(&my_next, FLAG);
+        unsigned short n_state = n->my_state;
         /* the next reader can be blocked by our state. the best thing to do is to unblock it */
         if( n_state & STATE_COMBINED_WAITINGREADER )
-            __TBB_store_with_release(n->going,1);
-        tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->prev), this);
+            __TBB_store_with_release(n->my_going,1);
+        tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->my_prev), this);
         unblock_or_wait_on_internal_lock(get_flag(tmp));
         if( n_state & (STATE_COMBINED_READER | STATE_UPGRADE_REQUESTED) ) {
             // save n|FLAG for simplicity of following comparisons
             tmp = tricky_pointer(n)|FLAG;
             atomic_backoff backoff;
-            while(next==tmp) {
-                if( state & STATE_COMBINED_UPGRADING ) {
-                    if( __TBB_load_with_acquire(next)==tmp )
-                        next = n;
+            while(__TBB_load_relaxed(my_next)==tmp) {
+                if( my_state & STATE_COMBINED_UPGRADING ) {
+                    if( __TBB_load_with_acquire(my_next)==tmp )
+                        __TBB_store_relaxed(my_next, n);
                     goto waiting;
                 }
                 backoff.pause();
             }
-            __TBB_ASSERT(next!=(tricky_pointer(n)|FLAG), NULL);
+            __TBB_ASSERT(__TBB_load_relaxed(my_next) != (tricky_pointer(n)|FLAG), NULL);
             goto requested;
         } else {
             __TBB_ASSERT( n_state & (STATE_WRITER | STATE_UPGRADE_WAITING), "unexpected state");
-            __TBB_ASSERT( (tricky_pointer(n)|FLAG)==next, NULL);
-            next = n;
+            __TBB_ASSERT( (tricky_pointer(n)|FLAG) == __TBB_load_relaxed(my_next), NULL);
+            __TBB_store_relaxed(my_next, n);
         }
     } else {
         /* We are in the tail; whoever comes next is blocked by q_tail&FLAG */
         release_internal_lock();
-    } // if( this != mutex->q_tail... )
-    state.compare_and_swap<tbb::acquire>(STATE_UPGRADE_WAITING, STATE_UPGRADE_REQUESTED);
+    } // if( this != my_mutex->q_tail... )
+    my_state.compare_and_swap<tbb::acquire>(STATE_UPGRADE_WAITING, STATE_UPGRADE_REQUESTED);
 
 waiting:
-    __TBB_ASSERT( !( tricky_pointer(next) & FLAG ), "use of corrupted pointer!" );
-    __TBB_ASSERT( state & STATE_COMBINED_UPGRADING, "wrong state at upgrade waiting_retry" );
+    __TBB_ASSERT( !( intptr_t(__TBB_load_relaxed(my_next)) & FLAG ), "use of corrupted pointer!" );
+    __TBB_ASSERT( my_state & STATE_COMBINED_UPGRADING, "wrong state at upgrade waiting_retry" );
     __TBB_ASSERT( me==this, NULL );
-    ITT_NOTIFY(sync_prepare, mutex);
-    /* if noone was blocked by the "corrupted" q_tail, turn it back */
-    mutex->q_tail.compare_and_swap<tbb::release>( this, tricky_pointer(me)|FLAG );
+    ITT_NOTIFY(sync_prepare, my_mutex);
+    /* if no one was blocked by the "corrupted" q_tail, turn it back */
+    my_mutex->q_tail.compare_and_swap<tbb::release>( this, tricky_pointer(me)|FLAG );
     queuing_rw_mutex::scoped_lock * pred;
-    pred = tricky_pointer::fetch_and_add<tbb::acquire>(&(this->prev), FLAG);
+    pred = tricky_pointer::fetch_and_add<tbb::acquire>(&my_prev, FLAG);
     if( pred ) {
         bool success = pred->try_acquire_internal_lock();
-        pred->state.compare_and_swap<tbb::release>(STATE_UPGRADE_WAITING, STATE_UPGRADE_REQUESTED);
+        pred->my_state.compare_and_swap<tbb::release>(STATE_UPGRADE_WAITING, STATE_UPGRADE_REQUESTED);
         if( !success ) {
-            tmp = tricky_pointer::compare_and_swap<tbb::release>(&(this->prev), pred, tricky_pointer(pred)|FLAG );
-            if( tricky_pointer(tmp)&FLAG ) {
-                spin_wait_while_eq(this->prev, pred);
-                pred = this->prev;
+            tmp = tricky_pointer::compare_and_swap<tbb::release>(&my_prev, pred, tricky_pointer(pred)|FLAG );
+            if( uintptr_t(tmp) & FLAG ) {
+                spin_wait_while_eq(my_prev, pred);
+                pred = __TBB_load_relaxed(my_prev);
             } else {
-                spin_wait_while_eq( this->prev, tricky_pointer(pred)|FLAG );
+                spin_wait_while_eq( my_prev, tricky_pointer(pred)|FLAG );
                 pred->release_internal_lock();
             }
         } else {
-            this->prev = pred;
+            __TBB_store_relaxed(my_prev, pred);
             pred->release_internal_lock();
-            spin_wait_while_eq(this->prev, pred);
-            pred = this->prev;
+            spin_wait_while_eq(my_prev, pred);
+            pred = __TBB_load_relaxed(my_prev);
         }
         if( pred )
             goto waiting;
     } else {
-        // restore the corrupted prev field for possible further use (e.g. if downgrade back to reader)
-        this->prev = pred;
+        // restore the corrupted my_prev field for possible further use (e.g. if downgrade back to reader)
+        __TBB_store_relaxed(my_prev, pred);
     }
-    __TBB_ASSERT( !pred && !this->prev, NULL );
+    __TBB_ASSERT( !pred && !__TBB_load_relaxed(my_prev), NULL );
 
     // additional lifetime issue prevention checks
     // wait for the successor to finish working with my fields
     wait_for_release_of_internal_lock();
     // now wait for the predecessor to finish working with my fields
-    spin_wait_while_eq( going, 2 );
-    // there is an acquire semantics statement in the end of spin_wait_while_eq.
+    spin_wait_while_eq( my_going, 2 );
+
+    // Acquire critical section indirectly from previous owner or directly from predecessor (TODO: not clear).
+    __TBB_control_consistency_helper(); // on either "my_mutex->q_tail" or "my_going" (TODO: not clear)
 
-    bool result = ( state != STATE_UPGRADE_LOSER );
-    state = STATE_WRITER;
-    going = 1;
+    bool result = ( my_state != STATE_UPGRADE_LOSER );
+    my_state = STATE_WRITER;
+    __TBB_store_relaxed(my_going, 1);
 
-    ITT_NOTIFY(sync_acquired, mutex);
+    ITT_NOTIFY(sync_acquired, my_mutex);
     return result;
 }
 
diff --git a/src/tbb/scheduler.cpp b/src/tbb/scheduler.cpp
index c6a0205..21874a8 100644
--- a/src/tbb/scheduler.cpp
+++ b/src/tbb/scheduler.cpp
@@ -39,10 +39,14 @@
 namespace tbb {
 namespace internal {
 
+//------------------------------------------------------------------------
+// Library initialization
+//------------------------------------------------------------------------
+
 /** Defined in tbb_main.cpp **/
 extern generic_scheduler* (*AllocateSchedulerPtr)( arena*, size_t index );
 
-inline generic_scheduler* allocate_scheduler ( arena* a, size_t index ) { 
+inline generic_scheduler* allocate_scheduler ( arena* a, size_t index ) {
     return AllocateSchedulerPtr(a, index);
 }
 
@@ -52,7 +56,7 @@ spin_mutex the_context_state_propagation_mutex;
 uintptr_t the_context_state_propagation_epoch = 0;
 
 //! Context to be associated with dummy tasks of worker threads schedulers.
-/** It is never used for its direct purpose, and is introduced solely for the sake 
+/** It is never used for its direct purpose, and is introduced solely for the sake
     of avoiding one extra conditional branch in the end of wait_for_all method. **/
 static task_group_context dummy_context(task_group_context::isolated);
 #endif /* __TBB_TASK_GROUP_CONTEXT */
@@ -80,7 +84,7 @@ scheduler::~scheduler( ) {}
 //------------------------------------------------------------------------
 
 #if _MSC_VER && !defined(__INTEL_COMPILER)
-    // Suppress overzealous compiler warning about using 'this' in base initializer list. 
+    // Suppress overzealous compiler warning about using 'this' in base initializer list.
     #pragma warning(push)
     #pragma warning(disable:4355)
 #endif
@@ -98,7 +102,6 @@ generic_scheduler::generic_scheduler( arena* a, size_t index )
     , my_dummy_task(NULL)
     , my_ref_count(1)
     , my_affinity_id(0)
-    , my_registered(false)
     , my_auto_initialized(false)
 #if __TBB_SCHEDULER_OBSERVER
     , my_local_last_observer_proxy(NULL)
@@ -111,8 +114,8 @@ generic_scheduler::generic_scheduler( arena* a, size_t index )
 #if __TBB_TASK_GROUP_CONTEXT
     , my_local_ctx_list_update(0)
 #endif /* __TBB_TASK_GROUP_CONTEXT */
-#if __TBB_TASK_PRIORITY
     , my_dispatching_task(NULL)
+#if __TBB_TASK_PRIORITY
     , my_ref_top_priority(NULL)
     , my_offloaded_tasks(NULL)
     , my_offloaded_task_list_tail_link(NULL)
@@ -129,7 +132,8 @@ generic_scheduler::generic_scheduler( arena* a, size_t index )
 {
     my_dummy_slot.task_pool = allocate_task_pool(min_task_pool_size);
     __TBB_ASSERT( my_task_pool_size == min_task_pool_size, NULL );
-    my_dummy_slot.head = my_dummy_slot.tail = 0;
+    __TBB_store_relaxed(my_dummy_slot.head, 0);
+    __TBB_store_relaxed(my_dummy_slot.tail, 0);
     my_dummy_task = &allocate_task( sizeof(task), __TBB_CONTEXT_ARG(NULL, NULL) );
 #if __TBB_TASK_GROUP_CONTEXT
     my_context_list_head.my_prev = &my_context_list_head;
@@ -154,27 +158,31 @@ void generic_scheduler::assert_task_pool_valid() const {
     acquire_task_pool();
     task** tp = my_dummy_slot.task_pool;
     __TBB_ASSERT( my_task_pool_size >= min_task_pool_size, NULL );
-    __TBB_ASSERT( my_arena_slot->head <= my_arena_slot->tail, NULL );
-    for ( size_t i = 0; i < my_arena_slot->head; ++i )
+    const size_t H = __TBB_load_relaxed(my_arena_slot->head); // mirror
+    const size_t T = __TBB_load_relaxed(my_arena_slot->tail); // mirror
+    __TBB_ASSERT( H <= T, NULL );
+    for ( size_t i = 0; i < H; ++i )
         __TBB_ASSERT( tp[i] == poisoned_ptr, "Task pool corrupted" );
-    for ( size_t i = my_arena_slot->head; i < my_arena_slot->tail; ++i ) {
+    for ( size_t i = H; i < T; ++i ) {
         __TBB_ASSERT( (uintptr_t)tp[i] + 1 > 1u, "nil or invalid task pointer in the deque" );
         __TBB_ASSERT( tp[i]->prefix().state == task::ready ||
                       tp[i]->prefix().extra_state == es_task_proxy, "task in the deque has invalid state" );
     }
-    for ( size_t i = my_arena_slot->tail; i < my_task_pool_size; ++i )
+    for ( size_t i = T; i < my_task_pool_size; ++i )
         __TBB_ASSERT( tp[i] == poisoned_ptr, "Task pool corrupted" );
     release_task_pool();
 }
+#endif /* TBB_USE_ASSERT > 1 */
 
+#if TBB_USE_ASSERT
 void generic_scheduler::fill_with_canary_pattern ( task** task_pool, size_t first, size_t last ) {
     for ( size_t i = first; i < last; ++i )
         poison_pointer(task_pool[i]);
 }
-#endif /* TBB_USE_ASSERT > 1 */
+#endif /* TBB_USE_ASSERT */
 
 void generic_scheduler::init_stack_info () {
-    // Stacks are growing top-down. Highest address is called "stack base", 
+    // Stacks are growing top-down. Highest address is called "stack base",
     // and the lowest is "stack limit".
     __TBB_ASSERT( !my_stealing_threshold, "Stealing threshold has already been calculated" );
     size_t  stack_size = my_market->worker_stack_size();
@@ -186,7 +194,7 @@ void generic_scheduler::init_stack_info () {
 #endif
     __TBB_ASSERT( &pteb < pteb->StackBase && &pteb > pteb->StackLimit, "invalid stack info in TEB" );
     __TBB_ASSERT( stack_size >0, "stack_size not initialized?" );
-    // When a thread is created with the attribute STACK_SIZE_PARAM_IS_A_RESERVATION, stack limit 
+    // When a thread is created with the attribute STACK_SIZE_PARAM_IS_A_RESERVATION, stack limit
     // in the TIB points to the committed part of the stack only. This renders the expression
     // "(uintptr_t)pteb->StackBase / 2 + (uintptr_t)pteb->StackLimit / 2" virtually useless.
     // Thus for worker threads we use the explicit stack size we used while creating them.
@@ -198,9 +206,9 @@ void generic_scheduler::init_stack_info () {
     else
         my_stealing_threshold = (uintptr_t)pteb->StackBase - MByte / 2;
 #else /* USE_PTHREAD */
-    // There is no portable way to get stack base address in Posix, so we use 
-    // non-portable method (on all modern Linux) or the simplified approach 
-    // based on the common sense assumptions. The most important assumption 
+    // There is no portable way to get stack base address in Posix, so we use
+    // non-portable method (on all modern Linux) or the simplified approach
+    // based on the common sense assumptions. The most important assumption
     // is that the main thread's stack size is not less than that of other threads.
     void    *stack_base = &stack_size;
 #if __TBB_ipf
@@ -231,7 +239,7 @@ void generic_scheduler::init_stack_info () {
                         stack_size = np_stack_size;
 #endif /* !__TBB_ipf */
                     }
-                    // We are either in the main thread or this thread stack 
+                    // We are either in the main thread or this thread stack
                     // is bigger that that of the main one. As we cannot discern
                     // these cases we fall back to the default (heuristic) values.
                 }
@@ -249,10 +257,11 @@ void generic_scheduler::init_stack_info () {
 #endif /* USE_PTHREAD */
 }
 
+#if __TBB_TASK_GROUP_CONTEXT
 /** The function uses synchronization scheme similar to the one in the destructor
     of task_group_context augmented with interlocked state change of each context
     object. The purpose of this algo is to prevent threads doing nonlocal context
-    destruction from accessing destroyed owner-scheduler instance still pointed to 
+    destruction from accessing destroyed owner-scheduler instance still pointed to
     by the context object. **/
 void generic_scheduler::cleanup_local_context_list () {
     // Detach contexts remaining in the local list
@@ -262,7 +271,7 @@ void generic_scheduler::cleanup_local_context_list () {
     {
         // This is just a definition. Actual lock is acquired only in case of conflict.
         spin_mutex::scoped_lock lock;
-        // Full fence prevents reordering of store to my_local_ctx_list_update with 
+        // Full fence prevents reordering of store to my_local_ctx_list_update with
         // load from my_nonlocal_ctx_list_update.
         atomic_fence();
         // Check for the conflict with concurrent destroyer or cancelation propagator
@@ -287,12 +296,10 @@ void generic_scheduler::cleanup_local_context_list () {
     if ( wait_for_concurrent_destroyers_to_leave )
         spin_wait_until_eq( my_nonlocal_ctx_list_update, 0u );
 }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
 void generic_scheduler::free_scheduler() {
-    if( in_arena() ) {
-        acquire_task_pool();
-        leave_arena();
-    }
+    __TBB_ASSERT( !in_arena(), NULL );
 #if __TBB_TASK_GROUP_CONTEXT
     cleanup_local_context_list();
 #endif /* __TBB_TASK_GROUP_CONTEXT */
@@ -306,7 +313,7 @@ void generic_scheduler::free_scheduler() {
             deallocate_task(*t);
             ++k;
         }
-        if( my_return_list==plugged_return_list() ) 
+        if( my_return_list==plugged_return_list() )
             break;
         my_free_list = (task*)__TBB_FetchAndStoreW( &my_return_list, (intptr_t)plugged_return_list() );
     }
@@ -322,7 +329,7 @@ void generic_scheduler::free_scheduler() {
         NFS_Free( this );
 }
 
-task& generic_scheduler::allocate_task( size_t number_of_bytes, 
+task& generic_scheduler::allocate_task( size_t number_of_bytes,
                                             __TBB_CONTEXT_ARG(task* parent, task_group_context* context) ) {
     GATHER_STATISTIC(++my_counters.active_tasks);
     task* t = my_free_list;
@@ -378,10 +385,10 @@ void generic_scheduler::free_nonlocal_small_task( task& t ) {
     __TBB_ASSERT( &s!=this, NULL );
     for(;;) {
         task* old = s.my_return_list;
-        if( old==plugged_return_list() ) 
+        if( old==plugged_return_list() )
             break;
         // Atomically insert t at head of s.my_return_list
-        t.prefix().next = old; 
+        t.prefix().next = old;
         ITT_NOTIFY( sync_releasing, &s.my_return_list );
         if( __TBB_CompareAndSwapW( &s.my_return_list, (intptr_t)&t, (intptr_t)old )==(intptr_t)old ) {
             GATHER_STATISTIC(++my_counters.free_list_length);
@@ -396,28 +403,44 @@ void generic_scheduler::free_nonlocal_small_task( task& t ) {
     }
 }
 
-void generic_scheduler::grow_task_pool( size_t new_size ) {
-    if ( new_size < 2 * my_task_pool_size )
-        new_size = 2 * my_task_pool_size;
-    task** new_pool = allocate_task_pool( new_size ); // updates my_task_pool_size
-    task** old_pool = my_dummy_slot.task_pool;
-    acquire_task_pool();    // requires the old my_dummy_slot.task_pool value
-    size_t new_tail = my_arena_slot->tail - my_arena_slot->head;
-    __TBB_ASSERT( my_arena_slot->tail <= my_task_pool_size, "new task pool is too short" );
-    memcpy( new_pool, old_pool + my_arena_slot->head, new_tail * sizeof(task*) );
-    my_arena_slot->head = 0;
-    my_dummy_slot.task_pool = new_pool;
-    // Tail is updated last to minimize probability of a thread making arena 
-    // snapshot being misguided into thinking that this task pool is empty.
-    my_arena_slot->tail = new_tail;
-    release_task_pool();    // updates the task pool pointer in our arena slot
-    free_task_pool( old_pool );
+size_t generic_scheduler::prepare_task_pool ( size_t num_tasks ) {
+    size_t T = __TBB_load_relaxed(my_arena_slot->tail); // mirror
+    if ( T + num_tasks <= my_task_pool_size )
+        return T;
+    acquire_task_pool();
+    // Below my_dummy_slot.task_pool is used as the lock on the task pool munges
+    // my_arena_slot->task_pool pointer
+    size_t H = __TBB_load_relaxed(my_arena_slot->head); // mirror
+    T -= H;
+    size_t new_size = T + num_tasks;
+    // If the free space at the beginning of the task pool is too short, we
+    // are likely facing a pathological single-producer-multiple-consumers
+    // scenario, and thus it's better to expand the task pool
+    if ( new_size <= my_task_pool_size - min_task_pool_size/4 ) {
+        // Relocate the busy part to the beginning of the deque
+        memmove( my_dummy_slot.task_pool, my_dummy_slot.task_pool + H, T * sizeof(task*) );
+        fill_with_canary_pattern( my_dummy_slot.task_pool, T, my_arena_slot->tail );
+        commit_relocated_tasks(T);
+    }
+    else {
+        // Grow task pool. As this operation is rare, and its cost is asymptotically
+        // amortizable, we can tolerate new task pool allocation done under the lock.
+        if ( new_size < 2 * my_task_pool_size )
+            new_size = 2 * my_task_pool_size;
+        task** old_pool = my_dummy_slot.task_pool;
+        my_dummy_slot.task_pool = allocate_task_pool( new_size ); // updates my_task_pool_size
+        __TBB_ASSERT( T <= my_task_pool_size, "new task pool is too short" );
+        memcpy( my_dummy_slot.task_pool, old_pool + H, T * sizeof(task*) );
+        commit_relocated_tasks(T);
+        free_task_pool( old_pool );
+    }
     assert_task_pool_valid();
+    return T;
 }
 
-/** ATTENTION: 
-    This method is mostly the same as generic_scheduler::lock_task_pool(), with 
-    a little different logic of slot state checks (slot is either locked or points 
+/** ATTENTION:
+    This method is mostly the same as generic_scheduler::lock_task_pool(), with
+    a little different logic of slot state checks (slot is either locked or points
     to our task pool).
     Thus if either of them is changed, consider changing the counterpart as well. **/
 inline void generic_scheduler::acquire_task_pool() const {
@@ -428,19 +451,19 @@ inline void generic_scheduler::acquire_task_pool() const {
     for(;;) {
 #if TBB_USE_ASSERT
         __TBB_ASSERT( my_arena_slot == my_arena->my_slots + my_arena_index, "invalid arena slot index" );
-        // Local copy of the arena slot task pool pointer is necessary for the next 
+        // Local copy of the arena slot task pool pointer is necessary for the next
         // assertion to work correctly to exclude asynchronous state transition effect.
         task** tp = my_arena_slot->task_pool;
         __TBB_ASSERT( tp == LockedTaskPool || tp == my_dummy_slot.task_pool, "slot ownership corrupt?" );
 #endif
-        if( my_arena_slot->task_pool != LockedTaskPool && 
-            __TBB_CompareAndSwapW( &my_arena_slot->task_pool, (intptr_t)LockedTaskPool, 
+        if( my_arena_slot->task_pool != LockedTaskPool &&
+            __TBB_CompareAndSwapW( &my_arena_slot->task_pool, (intptr_t)LockedTaskPool,
                                    (intptr_t)my_dummy_slot.task_pool ) == (intptr_t)my_dummy_slot.task_pool )
         {
             // We acquired our own slot
             ITT_NOTIFY(sync_acquired, my_arena_slot);
             break;
-        } 
+        }
         else if( !sync_prepare_done ) {
             // Start waiting
             ITT_NOTIFY(sync_prepare, my_arena_slot);
@@ -461,10 +484,10 @@ inline void generic_scheduler::release_task_pool() const {
     __TBB_store_with_release( my_arena_slot->task_pool, my_dummy_slot.task_pool );
 }
 
-/** ATTENTION: 
-    This method is mostly the same as generic_scheduler::acquire_task_pool(), 
-    with a little different logic of slot state checks (slot can be empty, locked 
-    or point to any task pool other than ours, and asynchronous transitions between 
+/** ATTENTION:
+    This method is mostly the same as generic_scheduler::acquire_task_pool(),
+    with a little different logic of slot state checks (slot can be empty, locked
+    or point to any task pool other than ours, and asynchronous transitions between
     all these states are possible).
     Thus if any of them is changed, consider changing the counterpart as well **/
 inline task** generic_scheduler::lock_task_pool( arena_slot* victim_arena_slot ) const {
@@ -482,8 +505,8 @@ inline task** generic_scheduler::lock_task_pool( arena_slot* victim_arena_slot )
                 ITT_NOTIFY(sync_cancel, victim_arena_slot);
             break;
         }
-        if( victim_task_pool != LockedTaskPool && 
-            __TBB_CompareAndSwapW( &victim_arena_slot->task_pool, 
+        if( victim_task_pool != LockedTaskPool &&
+            __TBB_CompareAndSwapW( &victim_arena_slot->task_pool,
                 (intptr_t)LockedTaskPool, (intptr_t)victim_task_pool ) == (intptr_t)victim_task_pool )
         {
             // We've locked victim's task pool
@@ -499,13 +522,13 @@ inline task** generic_scheduler::lock_task_pool( arena_slot* victim_arena_slot )
         // Someone else acquired a lock, so pause and do exponential backoff.
         backoff.pause();
     }
-    __TBB_ASSERT( victim_task_pool == EmptyTaskPool || 
-                  (victim_arena_slot->task_pool == LockedTaskPool && victim_task_pool != LockedTaskPool), 
+    __TBB_ASSERT( victim_task_pool == EmptyTaskPool ||
+                  (victim_arena_slot->task_pool == LockedTaskPool && victim_task_pool != LockedTaskPool),
                   "not really locked victim's task pool?" );
     return victim_task_pool;
 } // generic_scheduler::lock_task_pool
 
-inline void generic_scheduler::unlock_task_pool( arena_slot* victim_arena_slot, 
+inline void generic_scheduler::unlock_task_pool( arena_slot* victim_arena_slot,
                                                 task** victim_task_pool ) const {
     __TBB_ASSERT( victim_arena_slot, "empty victim arena slot pointer" );
     __TBB_ASSERT( victim_arena_slot->task_pool == LockedTaskPool, "victim arena slot is not locked" );
@@ -526,14 +549,16 @@ inline task* generic_scheduler::prepare_for_spawning( task* t ) {
     }
 #endif /* TBB_USE_ASSERT */
     affinity_id dst_thread = t->prefix().affinity;
-    __TBB_ASSERT( dst_thread == 0 || is_version_3_task(*t), "backwards compatibility to TBB 2.0 tasks is broken" );
+    __TBB_ASSERT( dst_thread == 0 || is_version_3_task(*t),
+                  "backwards compatibility to TBB 2.0 tasks is broken" );
     if( dst_thread != 0 && dst_thread != my_affinity_id ) {
-        task_proxy& proxy = (task_proxy&)allocate_task( sizeof(task_proxy), 
+        task_proxy& proxy = (task_proxy&)allocate_task( sizeof(task_proxy),
                                                       __TBB_CONTEXT_ARG(NULL, NULL) );
         // Mark as a proxy
         proxy.prefix().extra_state = es_task_proxy;
         proxy.outbox = &my_arena->mailbox(dst_thread);
-        proxy.task_and_tag = intptr_t(t)|3;
+        // Mark proxy as present in both locations (sender's task pool and destination mailbox)
+        proxy.task_and_tag = intptr_t(t) | task_proxy::location_mask;
 #if __TBB_TASK_PRIORITY
         proxy.prefix().context = t->prefix().context;
 #endif /* __TBB_TASK_PRIORITY */
@@ -549,12 +574,11 @@ inline task* generic_scheduler::prepare_for_spawning( task* t ) {
     But doing so would force us to publish class scheduler in the headers. */
 void generic_scheduler::local_spawn( task& first, task*& next ) {
     __TBB_ASSERT( governor::is_set(this), NULL );
-    assert_task_pool_valid();
     if ( &first.prefix().next == &next ) {
         // Single task is being spawned
-        prepare_task_pool( 1 );
-        my_dummy_slot.task_pool[my_arena_slot->tail] = prepare_for_spawning( &first );
-        commit_spawned_tasks( my_arena_slot->tail + 1 );
+        size_t T = prepare_task_pool( 1 );
+        my_dummy_slot.task_pool[T] = prepare_for_spawning( &first );
+        commit_spawned_tasks( T + 1 );
     }
     else {
         // Task list is being spawned
@@ -572,10 +596,9 @@ void generic_scheduler::local_spawn( task& first, task*& next ) {
                 break;
         }
         size_t num_tasks = tasks.size();
-        prepare_task_pool( num_tasks );
-        assert_task_pool_valid();
-        tasks.copy_memory( my_dummy_slot.task_pool + my_arena_slot->tail );
-        commit_spawned_tasks( my_arena_slot->tail + num_tasks );
+        size_t T = prepare_task_pool( num_tasks );
+        tasks.copy_memory( my_dummy_slot.task_pool + T );
+        commit_spawned_tasks( T + num_tasks );
     }
     if ( !in_arena() )
         enter_arena();
@@ -594,7 +617,7 @@ void generic_scheduler::local_spawn_root_and_wait( task& first, task*& next ) {
         t->prefix().parent = &dummy;
         if( &t->prefix().next==&next ) break;
 #if __TBB_TASK_GROUP_CONTEXT
-        __TBB_ASSERT( t->prefix().context == t->prefix().next->prefix().context, 
+        __TBB_ASSERT( t->prefix().context == t->prefix().next->prefix().context,
                     "all the root tasks in list must share the same context");
 #endif /* __TBB_TASK_GROUP_CONTEXT */
     }
@@ -606,43 +629,15 @@ void generic_scheduler::local_spawn_root_and_wait( task& first, task*& next ) {
 
 inline task* generic_scheduler::get_mailbox_task() {
     __TBB_ASSERT( my_affinity_id>0, "not in arena" );
-    task* result = NULL;
-    while( task_proxy* t = my_inbox.pop() ) {
-        intptr_t tat = __TBB_load_with_acquire(t->task_and_tag);
-        __TBB_ASSERT( tat==task_proxy::mailbox_bit || (tat==(tat|3)&&tat!=3), NULL );
-        if( tat!=task_proxy::mailbox_bit && __TBB_CompareAndSwapW( &t->task_and_tag, task_proxy::pool_bit, tat )==tat ) {
-            // Successfully grabbed the task, and left pool seeker with job of freeing the proxy.
+    while ( task_proxy* const tp = my_inbox.pop() ) {
+        if ( task* result = tp->extract_task<task_proxy::mailbox_bit>() ) {
             ITT_NOTIFY( sync_acquired, my_inbox.outbox() );
-            result = (task*)(tat & ~3);
-            result->prefix().extra_state |= es_task_is_stolen; // mark task as stolen
-            break;
+            result->prefix().extra_state |= es_task_is_stolen;
+            return result;
         }
-        free_task_proxy( *t );
+        // We have exclusive access to the proxy, and can destroy it.
+        free_task<small_task>(*tp);
     }
-    return result;
-}
-
-inline task* generic_scheduler::strip_proxy( task_proxy* tp ) {
-    __TBB_ASSERT( tp->prefix().extra_state==es_task_proxy, NULL );
-    intptr_t tat = __TBB_load_with_acquire(tp->task_and_tag);
-    if( (tat&3)==3 ) {
-        // proxy is shared by a pool and a mailbox.
-        // Attempt to transition it to "empty proxy in mailbox" state.
-        if( __TBB_CompareAndSwapW( &tp->task_and_tag, task_proxy::mailbox_bit, tat )==tat ) {
-            // Successfully grabbed the task, and left the mailbox with the job of freeing the proxy.
-            return (task*)(tat&~3);
-        }
-        __TBB_ASSERT( tp->task_and_tag==task_proxy::pool_bit, NULL );
-    } else {
-        // We have exclusive access to the proxy
-        __TBB_ASSERT( (tat&3)==task_proxy::pool_bit, "task did not come from pool?" );
-        __TBB_ASSERT ( !(tat&~3), "Empty proxy in the pool contains non-zero task pointer" );
-    }
-#if TBB_USE_ASSERT
-    tp->prefix().state = task::allocated;
-#endif
-    free_task_proxy( *tp );
-    // Another thread grabbed the underlying task via their mailbox
     return NULL;
 }
 
@@ -685,7 +680,6 @@ void generic_scheduler::local_enqueue( task& t
     if ( p != my_arena->my_top_priority )
         my_market->update_arena_priority( *my_arena, p );
 #endif /* __TBB_TASK_PRIORITY */
-    assert_task_pool_valid();
 }
 
 inline task* generic_scheduler::dequeue_task() {
@@ -713,58 +707,58 @@ task* generic_scheduler::winnow_task_pool () {
     GATHER_STATISTIC( ++my_counters.prio_winnowings );
     __TBB_ASSERT( in_arena(), NULL );
     __TBB_ASSERT( my_offloaded_tasks, "At least one task is expected to be already offloaded" );
-    // To eliminate possible sinking of the store to the indicator below the subsequent 
-    // store to my_arena_slot->tail, the stores should've either been separated 
-    // by full fence or both use release fences. And resetting indicator should've 
-    // been done with release fence. But since this is just an optimization, and 
-    // the corresponding checking sequence in arena::is_out_of_work() is not atomic 
+    // To eliminate possible sinking of the store to the indicator below the subsequent
+    // store to my_arena_slot->tail, the stores should've either been separated
+    // by full fence or both use release fences. And resetting indicator should've
+    // been done with release fence. But since this is just an optimization, and
+    // the corresponding checking sequence in arena::is_out_of_work() is not atomic
     // anyway, fences aren't used, so that not to penalize warmer path.
     auto_indicator indicator(my_pool_reshuffling_pending);
     // The purpose of the synchronization algorithm here is for the owner thread
     // to avoid locking task pool most of the time.
-    size_t orig_tail = my_arena_slot->tail;
-    my_arena_slot->tail = my_arena_slot->head - 1;
+    size_t T0 = __TBB_load_relaxed(my_arena_slot->tail);
+    __TBB_store_relaxed( my_arena_slot->tail, __TBB_load_relaxed(my_arena_slot->head) - 1 );
     atomic_fence();
-    size_t h = my_arena_slot->head;
-    __TBB_ASSERT( (intptr_t)my_arena_slot->tail <= (intptr_t)orig_tail, NULL);
-    __TBB_ASSERT( (intptr_t)h >= (intptr_t)my_arena_slot->tail
-                  || (h == orig_tail && my_arena_slot->tail == orig_tail), NULL );
+    size_t H = __TBB_load_relaxed(my_arena_slot->head);
+    size_t T = __TBB_load_relaxed(my_arena_slot->tail);
+    __TBB_ASSERT( (intptr_t)T <= (intptr_t)T0, NULL);
+    __TBB_ASSERT( (intptr_t)H >= (intptr_t)T || (H == T0 && T == T0), NULL );
     bool acquired = false;
-    if ( h == my_arena_slot->tail ) {
+    if ( H == T ) {
         // Either no contention with thieves during arbitration protocol execution or ...
-        if ( h >= orig_tail ) {
+        if ( H >= T0 ) {
             // ... the task pool got empty
             reset_deque_and_leave_arena( /*locked=*/false );
             return NULL;
         }
     }
     else {
-        // Contention with thieves detected. Now without taking lock it is impossible 
-        // to define the current head value because of its jitter caused by continuing 
+        // Contention with thieves detected. Now without taking lock it is impossible
+        // to define the current head value because of its jitter caused by continuing
         // stealing attempts (the pool is not locked so far).
         acquired = true;
         acquire_task_pool();
-        h = my_arena_slot->head;
-        if ( h >= orig_tail ) {
+        H = __TBB_load_relaxed(my_arena_slot->head);
+        if ( H >= T0 ) {
             reset_deque_and_leave_arena( /*locked=*/true );
             return NULL;
         }
     }
     size_t src,
-           dst = orig_tail;
-    // Find the first task to offload. 
-    for ( src = h; src < orig_tail; ++src ) {
+           dst = T0;
+    // Find the first task to offload.
+    for ( src = H; src < T0; ++src ) {
         task &t = *my_dummy_slot.task_pool[src];
         intptr_t p = priority(t);
         if ( p < *my_ref_top_priority ) {
-            // Position of the first offloaded task will be the starting point 
+            // Position of the first offloaded task will be the starting point
             // for relocation of subsequent tasks that survive winnowing.
             dst = src;
             offload_task( t, p );
             break;
         }
     }
-    for ( ++src; src < orig_tail; ++src ) {
+    for ( ++src; src < T0; ++src ) {
         task &t = *my_dummy_slot.task_pool[src];
         intptr_t p = priority(t);
         if ( p < *my_ref_top_priority )
@@ -772,24 +766,24 @@ task* generic_scheduler::winnow_task_pool () {
         else
             my_dummy_slot.task_pool[dst++] = &t;
     }
-    __TBB_ASSERT( orig_tail >= dst, NULL );
-    task *t = h < dst ? my_dummy_slot.task_pool[--dst] : NULL;
-    if ( h == dst ) {
+    __TBB_ASSERT( T0 >= dst, NULL );
+    task *t = H < dst ? my_dummy_slot.task_pool[--dst] : NULL;
+    if ( H == dst ) {
         // No tasks remain the primary pool
         reset_deque_and_leave_arena( acquired );
     }
     else if ( acquired ) {
-        __TBB_ASSERT( !is_poisoned(my_dummy_slot.task_pool[h]), NULL );
-        my_arena_slot->tail = dst;
+        __TBB_ASSERT( !is_poisoned(my_dummy_slot.task_pool[H]), NULL );
+        __TBB_store_relaxed( my_arena_slot->tail, dst );
         release_task_pool();
     }
     else {
-        __TBB_ASSERT( !is_poisoned(my_dummy_slot.task_pool[h]), NULL );
+        __TBB_ASSERT( !is_poisoned(my_dummy_slot.task_pool[H]), NULL );
         // Release fence is necessary to make sure possibly relocated task pointers
         // become visible to potential thieves
         __TBB_store_with_release( my_arena_slot->tail, dst );
     }
-    fill_with_canary_pattern( my_dummy_slot.task_pool, dst, orig_tail );
+    fill_with_canary_pattern( my_dummy_slot.task_pool, dst, T0 );
     assert_task_pool_valid();
     return t;
 }
@@ -832,16 +826,17 @@ task* generic_scheduler::reload_tasks ( task*& offloaded_tasks, task**& offloade
     size_t num_tasks = tasks.size();
     if ( num_tasks ) {
         GATHER_STATISTIC( ++my_counters.prio_tasks_reloaded );
-        prepare_task_pool( num_tasks );
-        tasks.copy_memory( my_dummy_slot.task_pool + my_arena_slot->tail );
+        size_t T = prepare_task_pool( num_tasks );
+        tasks.copy_memory( my_dummy_slot.task_pool + T );
         if ( --num_tasks ) {
-            commit_spawned_tasks( my_arena_slot->tail + num_tasks );
+            commit_spawned_tasks( T += num_tasks );
             enter_arena();
             my_arena->advertise_new_work</*Spawned=*/true>();
         }
-        __TBB_ASSERT( my_arena_slot->tail < my_task_pool_size, NULL );
-        t = my_dummy_slot.task_pool[my_arena_slot->tail];
-        poison_pointer(my_dummy_slot.task_pool[my_arena_slot->tail]);
+        __TBB_ASSERT( T == __TBB_load_relaxed(my_arena_slot->tail), NULL );
+        __TBB_ASSERT( T < my_task_pool_size, NULL );
+        t = my_dummy_slot.task_pool[T];
+        poison_pointer(my_dummy_slot.task_pool[T]);
         assert_task_pool_valid();
     }
     return t;
@@ -853,11 +848,11 @@ task* generic_scheduler::reload_tasks () {
     if ( my_local_reload_epoch == reload_epoch )
         return NULL;
     __TBB_ASSERT( my_offloaded_tasks, NULL );
-    intptr_t top_priority = *my_ref_top_priority;
+    intptr_t top_priority = effective_reference_priority();
     __TBB_ASSERT( (uintptr_t)top_priority < (uintptr_t)num_priority_levels, NULL );
     task *t = reload_tasks( my_offloaded_tasks, my_offloaded_task_list_tail_link, top_priority );
     if ( my_offloaded_tasks && (my_arena->my_bottom_priority >= top_priority || !my_arena->my_num_workers_requested) ) {
-        // Safeguard against deliberately relaxed synchronization while checking 
+        // Safeguard against deliberately relaxed synchronization while checking
         // for the presence of work in arena (so that not to impact hot paths).
         // Arena may be reset to empty state when offloaded low priority tasks
         // are still present. This results in both bottom and top priority bounds
@@ -878,37 +873,45 @@ task* generic_scheduler::reload_tasks () {
 inline task* generic_scheduler::get_task() {
     __TBB_ASSERT( in_arena(), NULL );
     task* result = NULL;
+    size_t T = __TBB_load_relaxed(my_arena_slot->tail); // mirror
 retry:
-    --my_arena_slot->tail;
+    __TBB_store_relaxed(my_arena_slot->tail, --T);
     atomic_fence();
-    if ( (intptr_t)my_arena_slot->head > (intptr_t)my_arena_slot->tail ) {
+    if ( (intptr_t)__TBB_load_relaxed(my_arena_slot->head) > (intptr_t)T ) {
         acquire_task_pool();
-        if ( (intptr_t)my_arena_slot->head <= (intptr_t)my_arena_slot->tail ) {
+        size_t H = __TBB_load_relaxed(my_arena_slot->head); // mirror
+        if ( (intptr_t)H <= (intptr_t)T ) {
             // The thief backed off - grab the task
-
-            // Task pool pointer from our arena slot is garbled by just acquired lock.
-            result = my_dummy_slot.task_pool[my_arena_slot->tail];
+            // Task pool pointer from our arena slot is garbled by above taken lock.
+            result = my_dummy_slot.task_pool[T];
             __TBB_ASSERT( !is_poisoned(result), NULL );
-            poison_pointer( my_dummy_slot.task_pool[my_arena_slot->tail] );
+            poison_pointer( my_dummy_slot.task_pool[T] );
         }
-        else
-            __TBB_ASSERT ( my_arena_slot->head == my_arena_slot->tail + 1, "victim/thief arbitration algorithm failure" );
-        if ( (intptr_t)my_arena_slot->head < (intptr_t)my_arena_slot->tail )
+        else {
+            __TBB_ASSERT ( H == __TBB_load_relaxed(my_arena_slot->head)
+                        && T == __TBB_load_relaxed(my_arena_slot->tail)
+                        && H == T + 1, "victim/thief arbitration algorithm failure" );
+        }
+        if ( (intptr_t)H < (intptr_t)T )
             release_task_pool();
         else
             reset_deque_and_leave_arena( /*locked=*/true );
     }
     else {
-        result = my_dummy_slot.task_pool[my_arena_slot->tail];
+        __TBB_control_consistency_helper(); // on my_arena_slot->head
+        result = my_dummy_slot.task_pool[T];
         __TBB_ASSERT( !is_poisoned(result), NULL );
-        poison_pointer( my_dummy_slot.task_pool[my_arena_slot->tail] );
+        poison_pointer( my_dummy_slot.task_pool[T] );
     }
     if( result && is_proxy(*result) ) {
-        result = strip_proxy((task_proxy*)result);
+        task_proxy &tp = *(task_proxy*)result;
+        result = tp.extract_task<task_proxy::pool_bit>();
         if( !result ) {
+            // Proxy was empty, so it's our responsibility to free it
+            free_task<small_task>(tp);
             if ( in_arena() )
                 goto retry;
-            __TBB_ASSERT( my_arena_slot->head == 0 && my_arena_slot->tail == 0, NULL );
+            __TBB_ASSERT( is_quiescent_local_task_pool_reset(), NULL );
             return NULL;
         }
         GATHER_STATISTIC( ++my_counters.proxies_executed );
@@ -918,7 +921,7 @@ retry:
         my_innermost_running_task = result;
         result->note_affinity(my_affinity_id);
     }
-    __TBB_ASSERT( result || my_arena_slot->head == 0 && my_arena_slot->tail == 0, NULL );
+    __TBB_ASSERT( result || is_quiescent_local_task_pool_reset(), NULL );
     return result;
 } // generic_scheduler::get_task
 
@@ -926,43 +929,49 @@ task* generic_scheduler::steal_task( arena_slot& victim_slot ) {
     task** victim_pool = lock_task_pool( &victim_slot );
     if ( !victim_pool )
         return NULL;
-    const size_t none = ~size_t(0);
-    size_t first_skipped_proxy = none;
     task* result = NULL;
+    size_t H = __TBB_load_relaxed(victim_slot.head); // mirror
+    const size_t H0 = H;
 retry:
-    ++victim_slot.head;
+    __TBB_store_relaxed( victim_slot.head, ++H );
     atomic_fence();
-    if ( (intptr_t)victim_slot.head > (intptr_t)victim_slot.tail ) {
+    if ( (intptr_t)H > (intptr_t)__TBB_load_relaxed(victim_slot.tail) ) {
+        // Stealing attempt failed, deque contents has not been changed by us
         GATHER_STATISTIC( ++my_counters.thief_backoffs );
-        --victim_slot.head;
+        __TBB_store_relaxed( victim_slot.head, /*dead: H = */ H0 );
+        __TBB_ASSERT ( !result, NULL );
     }
     else {
-        // If one of the supported architectures allows speculative execution
-        // of fences (as part of branch prediction mechanics), acquire fence
-        // should go up to the victim_slot.tail load.
-        result = victim_pool[__TBB_load_with_acquire(victim_slot.head) - 1];
+        __TBB_control_consistency_helper(); // on victim_slot.tail
+        result = victim_pool[H-1];
         __TBB_ASSERT( !is_poisoned(result), NULL );
         if( is_proxy(*result) ) {
             task_proxy& tp = *static_cast<task_proxy*>(result);
-            // If task will likely be grabbed by whom it was mailed to, skip it.
-            if( (tp.task_and_tag & 3) == 3 && tp.outbox->recipient_is_idle() ) {
+            // If mailed task is likely to be grabbed by its destination thread, skip it.
+            if ( task_proxy::is_shared(tp.task_and_tag) && tp.outbox->recipient_is_idle() )
+            {
                 GATHER_STATISTIC( ++my_counters.proxies_bypassed );
-                if ( first_skipped_proxy == none )
-                    first_skipped_proxy = victim_slot.head - 1;
                 result = NULL;
                 goto retry;
             }
         }
-        poison_pointer(victim_pool[victim_slot.head - 1]);
-    }
-    if ( first_skipped_proxy != none ) {
-        if ( result ) {
-            victim_pool[victim_slot.head - 1] = victim_pool[first_skipped_proxy];
-            poison_pointer( victim_pool[first_skipped_proxy] );
-            __TBB_store_with_release( victim_slot.head, first_skipped_proxy + 1 );
+        __TBB_ASSERT( result, NULL );
+        const size_t H1 = H0 + 1;
+        if ( H1 < H ) {
+            // Some proxies in the task pool have been bypassed. Need to close
+            // the hole left by the stolen task. The following variant:
+            //     victim_pool[H-1] = victim_pool[H0];
+            // is of constant time, but creates a potential for degrading stealing
+            // mechanism efficiency and growing owner's stack size too much because
+            // of moving earlier split off (and thus larger) chunks closer to owner's
+            // end of the deque (tail).
+            // So we use linear time variant that is likely to be amortized to be
+            // near-constant time, though, and preserves stealing efficiency premises.
+            // These changes in the deque must be released to the owner.
+            memmove( victim_pool + H1, victim_pool + H0, (H - H1) * sizeof(task*) );
+            __TBB_store_with_release( victim_slot.head, /*dead: H = */ H1 );
         }
-        else
-            __TBB_store_with_release( victim_slot.head, first_skipped_proxy );
+        poison_pointer( victim_pool[H0] );
     }
     unlock_task_pool( &victim_slot, victim_pool );
     return result;
@@ -970,20 +979,23 @@ retry:
 
 inline void generic_scheduler::do_enter_arena() {
     my_arena_slot = &my_arena->my_slots[my_arena_index];
-    __TBB_ASSERT ( my_arena_slot->head == my_arena_slot->tail, "task deque of a free slot must be empty" );
-    __TBB_ASSERT ( my_dummy_slot.head < my_dummy_slot.tail, "entering arena without tasks to share" );
-    my_arena_slot->head = my_dummy_slot.head;
-    my_arena_slot->tail = my_dummy_slot.tail;
+    __TBB_ASSERT ( is_quiescent_local_task_pool_empty(), "task deque of a free slot must be empty" );
+    const size_t H = __TBB_load_relaxed(my_dummy_slot.head); // mirror
+    const size_t T = __TBB_load_relaxed(my_dummy_slot.tail); // mirror
+    __TBB_ASSERT ( H < T, "entering arena without tasks to share" );
+    __TBB_store_relaxed(my_arena_slot->head, H);
+    __TBB_store_relaxed(my_arena_slot->tail, T);
     // Release signal on behalf of previously spawned tasks (when this thread was not in arena yet)
     ITT_NOTIFY(sync_releasing, my_arena_slot);
     __TBB_store_with_release( my_arena_slot->task_pool, my_dummy_slot.task_pool );
     // We'll leave arena only when it's empty, so clean up local instances of indices.
-    my_dummy_slot.head = my_dummy_slot.tail = 0;
+    __TBB_store_relaxed(my_dummy_slot.head, /*dead: H =*/ 0);
+    __TBB_store_relaxed(my_dummy_slot.tail, /*dead: T =*/ 0);
 }
 
 void generic_scheduler::enter_arena() {
     __TBB_ASSERT ( my_arena, "no arena: initialization not completed?" );
-    __TBB_ASSERT ( !in_arena(), "thread is already in arena?" );
+    __TBB_ASSERT ( !in_arena(), "Repeated entry into arena attempted" );
     __TBB_ASSERT ( my_arena_index < my_arena->my_num_slots, "arena slot index is out-of-bound" );
     __TBB_ASSERT ( my_arena->my_slots[my_arena_index].task_pool == EmptyTaskPool, "someone else grabbed my arena slot?" );
     do_enter_arena();
@@ -994,12 +1006,12 @@ void generic_scheduler::leave_arena() {
     // Do not reset my_arena_index. It will be used to (attempt to) re-acquire the slot next time
     __TBB_ASSERT( &my_arena->my_slots[my_arena_index] == my_arena_slot, "arena slot and slot index mismatch" );
     __TBB_ASSERT ( my_arena_slot->task_pool == LockedTaskPool, "Task pool must be locked when leaving arena" );
-    __TBB_ASSERT ( my_arena_slot->tail == my_arena_slot->head, "Cannot leave arena when the task pool is not empty" );
+    __TBB_ASSERT ( is_quiescent_local_task_pool_empty(), "Cannot leave arena when the task pool is not empty" );
     ITT_NOTIFY(sync_releasing, &my_arena->my_slots[my_arena_index]);
-    // No release fence is necessary here as this assignment precludes external 
+    // No release fence is necessary here as this assignment precludes external
     // accesses to the local task pool when becomes visible. Thus it is harmless
     // if it gets hoisted above preceding local bookkeeping manipulations.
-    my_arena_slot->task_pool = EmptyTaskPool;
+    __TBB_store_relaxed( my_arena_slot->task_pool, EmptyTaskPool );
     my_arena_slot = &my_dummy_slot;
 }
 
@@ -1023,17 +1035,15 @@ generic_scheduler* generic_scheduler::create_master( arena& a ) {
     generic_scheduler* s = allocate_scheduler( &a, 0 /*Master thread always occupies the first slot*/ );
     task& t = *s->my_dummy_task;
     s->my_innermost_running_task = &t;
-#if __TBB_TASK_PRIORITY
     s->my_dispatching_task = &t;
-#endif /* __TBB_TASK_PRIORITY */
     t.prefix().ref_count = 1;
     governor::sign_on(s);
     __TBB_ASSERT( &task::self()==&t, "governor::sign_on failed?" );
 #if __TBB_TASK_GROUP_CONTEXT
     // Context to be used by root tasks by default (if the user has not specified one).
-    // Allocation is done by NFS allocator because we cannot reuse memory allocated 
+    // Allocation is done by NFS allocator because we cannot reuse memory allocated
     // for task objects since the free list is empty at the moment.
-    t.prefix().context = a.my_master_default_ctx = 
+    t.prefix().context = a.my_master_default_ctx =
         new ( NFS_Allocate(sizeof(task_group_context), 1, NULL) ) task_group_context(task_group_context::isolated);
 #endif /* __TBB_TASK_GROUP_CONTEXT */
     s->my_market = a.my_market;
@@ -1052,8 +1062,8 @@ generic_scheduler* generic_scheduler::create_master( arena& a ) {
 #if __TBB_TASK_PRIORITY
     // In the current implementation master threads continue processing even when
     // there are other masters with higher priority. Only TBB worker threads are
-    // redistributed between arenas based on the latters' priority. Thus master 
-    // threads use arena's top priority as a reference point (in contrast to workers 
+    // redistributed between arenas based on the latters' priority. Thus master
+    // threads use arena's top priority as a reference point (in contrast to workers
     // that use my_market->my_global_top_priority).
     s->my_ref_top_priority = &s->my_arena->my_top_priority;
     s->my_ref_reload_epoch = &s->my_arena->my_reload_epoch;
@@ -1075,7 +1085,8 @@ void generic_scheduler::cleanup_worker( void* arg, bool is_worker ) {
     // When comparing "head" and "tail" indices ">=" is used because this worker's
     // task pool may still be published in the arena, and thieves can optimistically
     // bump "head" (and then roll back).
-    __TBB_ASSERT( s.my_arena_slot->task_pool == EmptyTaskPool || s.my_arena_slot->head >= s.my_arena_slot->tail, 
+    __TBB_ASSERT( s.my_arena_slot->task_pool == EmptyTaskPool
+                  || __TBB_load_relaxed(s.my_arena_slot->head) >= __TBB_load_relaxed(s.my_arena_slot->tail),
                   "worker has unfinished work at run down" );
     s.free_scheduler();
 }
@@ -1086,10 +1097,22 @@ void generic_scheduler::cleanup_master() {
 #if __TBB_SCHEDULER_OBSERVER
     s.notify_exit_observers(/*is_worker=*/false);
 #endif /* __TBB_SCHEDULER_OBSERVER */
-    if ( !local_task_pool_empty() ) {
-        __TBB_ASSERT ( governor::is_set(this), "TLS slot is cleared before the task pool cleanup" );
-        s.local_wait_for_all( *s.my_dummy_task, NULL );
-        __TBB_ASSERT ( governor::is_set(this), "Other thread reused our TLS key during the task pool cleanup" );
+    if( in_arena() ) {
+        acquire_task_pool();
+        if ( my_arena_slot->task_pool == EmptyTaskPool ||
+             __TBB_load_relaxed(my_arena_slot->head) >= __TBB_load_relaxed(my_arena_slot->tail) )
+        {
+            // Local task pool is empty
+            leave_arena();
+        }
+        else {
+            // Master's local task pool may e.g. contain proxies of affinitized tasks.
+            release_task_pool();
+            __TBB_ASSERT ( governor::is_set(this), "TLS slot is cleared before the task pool cleanup" );
+            s.local_wait_for_all( *s.my_dummy_task, NULL );
+            __TBB_ASSERT( !in_arena(), NULL );
+            __TBB_ASSERT ( governor::is_set(this), "Other thread reused our TLS key during the task pool cleanup" );
+        }
     }
 #if _WIN32|_WIN64
     __TBB_ASSERT( s.my_market, NULL );
@@ -1101,7 +1124,7 @@ void generic_scheduler::cleanup_master() {
 #endif /* __TBB_STATISTICS */
 #if __TBB_TASK_PRIORITY
     __TBB_ASSERT( a->my_slots[0].my_scheduler, NULL );
-    // Master's scheduler may be locked by a worker taking arena snapshot or by 
+    // Master's scheduler may be locked by a worker taking arena snapshot or by
     // a thread propagating task group state change across the context tree.
     while ( __TBB_CompareAndSwapW(&a->my_slots[0].my_scheduler, 0, (intptr_t)this) != (intptr_t)this )
         __TBB_Yield();
@@ -1112,7 +1135,7 @@ void generic_scheduler::cleanup_master() {
     s.free_scheduler();
     // Resetting arena to EMPTY state (as earlier TBB versions did) should not be
     // done here (or anywhere else in the master thread to that matter) because
-    // after introducing arena-per-master logic and fire-and-forget tasks doing 
+    // after introducing arena-per-master logic and fire-and-forget tasks doing
     // so can result either in arena's premature destruction (at least without
     // additional costly checks in workers) or in unnecessary arena state changes
     // (and ensuing workers migration).
@@ -1135,3 +1158,76 @@ void generic_scheduler::cleanup_master() {
 } // namespace internal
 } // namespace tbb
 
+/*
+    Comments:
+
+1.  The premise of the cancellation support implementation is that cancellations are
+    not part of the hot path of the program execution. Therefore all changes in its
+    implementation in order to reduce the overhead of the cancellation control flow
+    should be done only in ways that do not increase overhead of the normal execution.
+
+    In general contexts are used by all threads and their descendants are created in
+    different threads as well. In order to minimize impact of the cross-thread tree
+    maintenance (first of all because of the synchronization), the tree of contexts
+    is split into pieces, each of which is handled by the only thread. Such pieces
+    are represented as lists of contexts, members of which are contexts that were
+    bound to their parents in the given thread.
+
+    The context tree maintenance and cancellation propagation algorithms is designed
+    in such a manner that cross-thread access to a context list will take place only
+    when cancellation signal is sent (by user or when an exception happens), and
+    synchronization is necessary only then. Thus the normal execution flow (without
+    exceptions and cancellation) remains free from any synchronization done on
+    behalf of exception handling and cancellation support.
+
+2.  Consider parallel cancellations at the different levels of the context tree:
+
+        Ctx1 <- Cancelled by Thread1            |- Thread2 started processing
+         |                                      |
+        Ctx2                                    |- Thread1 started processing
+         |                                   T1 |- Thread2 finishes and syncs up local counters
+        Ctx3 <- Cancelled by Thread2            |
+         |                                      |- Ctx5 is bound to Ctx2
+        Ctx4                                    |
+                                             T2 |- Thread1 reaches Ctx2
+
+    Thread-propagator of each cancellation increments global counter. However the thread
+    propagating the cancellation from the outermost context (Thread1) may be the last
+    to finish. Which means that the local counters may be synchronized earlier (by Thread2,
+    at Time1) than it propagated cancellation into Ctx2 (at time Time2). If a new context
+    (Ctx5) is created and bound to Ctx2 between Time1 and Time2, checking its parent only
+    (Ctx2) may result in cancellation request being lost.
+
+    This issue is solved by doing the whole propagation under the lock.
+
+    If we need more concurrency while processing parallel cancellations, we could try
+    the following modification of the propagation algorithm:
+
+    advance global counter and remember it
+    for each thread:
+        scan thread's list of contexts
+    for each thread:
+        sync up its local counter only if the global counter has not been changed
+
+    However this version of the algorithm requires more analysis and verification.
+
+3.  There is no portable way to get stack base address in Posix, however
+    the modern Linux versions provide pthread_attr_np API that can be used
+    to obtain thread's stack size and base address. Unfortunately even this
+    function does not provide enough information for the main thread on IA64
+    (RSE spill area and memory stack are allocated as two separate discontinuous
+    chunks of memory), and there is no portable way to discern the main and
+    the secondary threads.
+    Thus for MacOS and IA64 Linux we use the TBB worker stack size for all
+    threads and use the current stack top as the stack base. This simplified
+    approach is based on the following assumptions:
+    1) If the default stack size is insufficient for the user app needs,
+       the required amount will be explicitly specified by the user at
+       the point of the TBB scheduler initialization (as an argument to
+       tbb::task_scheduler_init constructor).
+    2) When a master thread initializes the scheduler, it has enough space
+       on its stack. Here "enough" means "at least as much as worker threads
+       have".
+    3) If the user app strives to conserve the memory by cutting stack size,
+       it should do this for TBB workers too (as in the #1).
+*/
diff --git a/src/tbb/scheduler.h b/src/tbb/scheduler.h
index a85003d..a5f14f8 100644
--- a/src/tbb/scheduler.h
+++ b/src/tbb/scheduler.h
@@ -69,8 +69,8 @@ class task_scheduler_observer_v3;
 class observer_proxy;
 #endif /* __TBB_SCHEDULER_OBSERVER */
 
-//! Cilk-style task scheduler.
-/** None of the fields here are every read or written by threads other than
+//! Work stealing task scheduler.
+/** None of the fields here are ever read or written by threads other than
     the thread that creates the instance.
 
     Class generic_scheduler is an abstract base class that contains most of the scheduler,
@@ -116,11 +116,15 @@ class generic_scheduler: public scheduler, public ::rml::job {
 
     //! Pointer to the slot in the arena we own at the moment.
     /** When out of arena it points to this scheduler's my_dummy_slot. **/
-    mutable arena_slot* my_arena_slot;
+    arena_slot* my_arena_slot;
 
     inline bool in_arena () const;
 
-    inline bool local_task_pool_empty () const;
+    inline bool is_local_task_pool_quiescent () const;
+
+    inline bool is_quiescent_local_task_pool_empty () const;
+
+    inline bool is_quiescent_local_task_pool_reset () const;
 
     //! The market I am in
     market* my_market;
@@ -159,9 +163,6 @@ class generic_scheduler: public scheduler, public ::rml::job {
 
     /* A couple of bools can be located here because space is otherwise just padding after my_affinity_id. */
 
-    //! True if this is assigned to thread local storage by registering with governor.
-    bool my_registered;
-
     //! True if *this was created by automatic TBB initialization
     bool my_auto_initialized;
 
@@ -211,15 +212,21 @@ class generic_scheduler: public scheduler, public ::rml::job {
     inline void reset_deque_and_leave_arena ( bool locked );
 
     //! Locks victim's task pool, and returns pointer to it. The pointer can be NULL.
+    /** Garbles victim_arena_slot->task_pool for the duration of the lock. **/
     task** lock_task_pool( arena_slot* victim_arena_slot ) const;
 
     //! Unlocks victim's task pool
+    /** Restores victim_arena_slot->task_pool munged by lock_task_pool. **/
     void unlock_task_pool( arena_slot* victim_arena_slot, task** victim_task_pool ) const;
 
     //! Locks the local task pool
+    /** Garbles my_arena_slot->task_pool for the duration of the lock. Requires
+        correctly set my_dummy_slot.task_pool. **/
     void acquire_task_pool() const;
 
     //! Unlocks the local task pool
+    /** Restores my_arena_slot->task_pool munged by acquire_task_pool. Requires
+        correctly set my_dummy_slot.task_pool. **/
     void release_task_pool() const;
 
     //! Checks if t is affinitized to another thread, and if so, bundles it as proxy.
@@ -229,6 +236,10 @@ class generic_scheduler: public scheduler, public ::rml::job {
     //! Makes newly spawned tasks visible to thieves
     inline void commit_spawned_tasks( size_t new_tail );
 
+    //! Makes relocated tasks visible to thieves and releases the local task pool.
+    /** Obviously, the task pool must be locked when caaling this method. **/
+    inline void commit_relocated_tasks( size_t new_tail );
+
     //! Get a task from the local pool.
     /** Called only by the pool owner.
         Returns the pointer to the task or NULL if the pool is empty. 
@@ -236,10 +247,12 @@ class generic_scheduler: public scheduler, public ::rml::job {
     task* get_task();
 
     //! Attempt to get a task from the mailbox.
-    /** Called only by the thread that owns *this.
-        Gets a task only if there is one not yet executed by another thread.
-        If successful, unlinks the task and returns a pointer to it.
-        Otherwise returns NULL. */
+    /** Gets a task only if it has not been executed by its sender or a thief 
+        that has stolen it from the sender's task pool. Otherwise returns NULL.
+
+        This method is intended to be used only by the thread extracting the proxy 
+        from its mailbox. (In contrast to local task pool, mailbox can be read only
+        by its owner). **/
     task* get_mailbox_task();
 
     //! True if t is a task_proxy
@@ -247,10 +260,6 @@ class generic_scheduler: public scheduler, public ::rml::job {
         return t.prefix().extra_state==es_task_proxy;
     }
 
-    //! Extracts task pointer from task_proxy, and frees the proxy.
-    /** Return NULL if underlying task was claimed by mailbox. */
-    task* strip_proxy( task_proxy* result );
-
     //! Get a task from the starvation-resistant task stream of the current arena.
     /** Returns the pointer to the task, or NULL if the attempt was unsuccessful. 
         The latter case does not mean that the stream is drained, however. **/
@@ -273,11 +282,9 @@ class generic_scheduler: public scheduler, public ::rml::job {
     }
 
     //! Makes sure that the task pool can accommodate at least n more elements
-    /** If necessary relocates existing task pointers or grows the ready task deque. **/
-    inline void prepare_task_pool( size_t n );
-
-    //! Grow ready task deque to at least n elements.
-    void grow_task_pool( size_t n );
+    /** If necessary relocates existing task pointers or grows the ready task deque.
+        Returns (possible updated) tail index (not accounting for n). **/
+    size_t prepare_task_pool( size_t n );
 
     //! Initialize a scheduler for a master thread.
     static generic_scheduler* create_master( arena& a );
@@ -298,12 +305,16 @@ protected:
     //! Check that internal data structures are in consistent state.
     /** Raises __TBB_ASSERT failure if inconsistency is found. */
     void assert_task_pool_valid () const;
-    static void fill_with_canary_pattern ( task** task_pool, size_t first, size_t last );
 #else
     void assert_task_pool_valid() const {}
-    static void fill_with_canary_pattern ( task**, size_t, size_t ) {}
 #endif /* TBB_USE_ASSERT <= 1 */
 
+#if TBB_USE_ASSERT
+    static void fill_with_canary_pattern ( task** task_pool, size_t first, size_t last );
+#else
+    static void fill_with_canary_pattern ( task**, size_t, size_t ) {}
+#endif /* !TBB_USE_ASSERT */
+
 public:
     /*override*/ 
     inline void spawn( task& first, task*& next );
@@ -337,8 +348,6 @@ public:
     template<free_task_hint h>
     void free_task( task& t );
 
-    inline void free_task_proxy( task_proxy& tp );
-
     //! Return task object to the memory allocator.
     inline void deallocate_task( task& t );
 
@@ -351,6 +360,7 @@ public:
         dispatch loop (one of wait_for_all methods) invoked directly from that thread. **/
     inline bool master_outermost_level () const;
 
+#if __TBB_TASK_GROUP_CONTEXT
     //! Returns task group context used by this scheduler instance.
     /** This context is associated with root tasks created by a master thread 
         without explicitly specified context object outside of any running task.
@@ -358,6 +368,7 @@ public:
         Note that the default context of a worker thread is never accessed by
         user code (directly or indirectly). **/
     inline task_group_context* default_context ();
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
     //! Returns number of worker threads in the arena this thread belongs to.
     unsigned number_of_workers_in_my_arena();
@@ -375,9 +386,10 @@ public:
     //! List of small tasks that have been returned to this scheduler by other schedulers.
     task* my_return_list;
 
-    //! Try getting a task from the mailbox or stealing from another scheduler.
-    /** Redirects to a customization. */
-    virtual task* receive_or_steal_task( reference_count&, bool ) = 0; 
+    //! Try getting a task from other threads (via mailbox, stealing, FIFO queue, orphans adoption).
+    /** Returns obtained task or NULL if all attempts fail. */
+    virtual task* receive_or_steal_task( __TBB_atomic reference_count& completion_ref_count,
+                                         bool return_if_no_work ) = 0;
 
     //! Free a small task t that that was allocated by a different scheduler 
     void free_nonlocal_small_task( task& t ); 
@@ -407,14 +419,17 @@ public:
         lock-free. **/
     uintptr_t my_local_ctx_list_update;
 
+    //! Task, in the context of which the current TBB dispatch loop is running.
+    /** Outside of or in the outermost dispatch loop (not in a nested call to
+        wait_for_all) it is my_dummy_task for master threads, and NULL for workers. **/
+    task* my_dispatching_task;
+
 #if __TBB_TASK_PRIORITY
     //! True if the scheduler is on the outermost dispatch level in a worker thread.
     inline bool worker_outermost_level () const;
 
-    // Task, in the context of which the current TBB dispatch loop is running.
-    /** Outside of or in the outermost dispatch loop (not in a nested call to
-        wait_for_all) it is my_dummy_task for master threads, and NULL for workers. **/
-    task* my_dispatching_task;
+    //! Returns reference priority used to decide whether a task should be offloaded.
+    inline intptr_t effective_reference_priority () const;
 
     //! Latest known highest priority of tasks in the market or arena.
     /** Master threads currently tracks only tasks in their arenas, while workers
@@ -481,7 +496,7 @@ private:
 #if __TBB_SURVIVE_THREAD_SWITCH
     __cilk_tbb_unwatch_thunk my_cilk_unwatch_thunk;
 #if TBB_USE_ASSERT
-    //! State values used to check interface contract with Cilk runtime.
+    //! State values used to check interface contract with cilkrts.
     /** Names of cs_running...cs_freed derived from state machine diagram in cilk-tbb-interop.h */
     enum cilk_state_t {
         cs_none=0xF000, // Start at nonzero value so that we can detect use of zeroed memory.
@@ -532,17 +547,30 @@ inline bool generic_scheduler::in_arena () const {
     return my_arena_slot != &my_dummy_slot;
 }
 
-inline bool generic_scheduler::local_task_pool_empty () const {
-    return my_arena_slot->task_pool == EmptyTaskPool || my_arena_slot->head >= my_arena_slot->tail;
+inline bool generic_scheduler::is_local_task_pool_quiescent () const {
+    return !in_arena() || my_arena_slot->task_pool == EmptyTaskPool || my_arena_slot->task_pool == LockedTaskPool;
+}
+
+inline bool generic_scheduler::is_quiescent_local_task_pool_empty () const {
+    __TBB_ASSERT( is_local_task_pool_quiescent(), "Task pool is not quiescent" );
+    return __TBB_load_relaxed(my_arena_slot->head) == __TBB_load_relaxed(my_arena_slot->tail);
 }
 
+inline bool generic_scheduler::is_quiescent_local_task_pool_reset () const {
+    __TBB_ASSERT( is_local_task_pool_quiescent(), "Task pool is not quiescent" );
+    return __TBB_load_relaxed(my_arena_slot->head) == 0 && __TBB_load_relaxed(my_arena_slot->tail) == 0;
+}
+
+
 inline bool generic_scheduler::master_outermost_level () const {
-    return my_innermost_running_task == my_dummy_task;
+    return my_dispatching_task == my_dummy_task;
 }
 
+#if __TBB_TASK_GROUP_CONTEXT
 inline task_group_context* generic_scheduler::default_context () {
     return my_dummy_task->prefix().context;
 }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
 inline void generic_scheduler::attach_mailbox( affinity_id id ) {
     __TBB_ASSERT(id>0,NULL);
@@ -558,16 +586,7 @@ inline unsigned generic_scheduler::number_of_workers_in_my_arena() {
     return my_arena->my_max_num_workers;
 }
 
-inline void generic_scheduler::free_task_proxy( task_proxy& tp ) {
-#if TBB_USE_ASSERT
-    poison_pointer( tp.outbox );
-    poison_pointer( tp.next_in_mailbox );
-    tp.task_and_tag = 0xDEADBEEF;
-#endif /* TBB_USE_ASSERT */
-    free_task<small_task>(tp);
-}
-
-    //! Return task object to the memory allocator.
+//! Return task object to the memory allocator.
 inline void generic_scheduler::deallocate_task( task& t ) {
 #if TBB_USE_ASSERT
     task_prefix& p = t.prefix();
@@ -590,7 +609,8 @@ inline intptr_t generic_scheduler::get_task_node_count( bool count_arena_workers
 inline void generic_scheduler::reset_deque_and_leave_arena ( bool locked ) {
     if ( !locked )
         acquire_task_pool();
-    my_arena_slot->tail = my_arena_slot->head = 0;
+    __TBB_store_relaxed( my_arena_slot->tail, 0 );
+    __TBB_store_relaxed( my_arena_slot->head, 0 );
     leave_arena();
 }
 
@@ -604,30 +624,6 @@ inline task** generic_scheduler::allocate_task_pool( size_t n ) {
     return new_pool;
 }
 
-inline void generic_scheduler::prepare_task_pool( size_t num_tasks ) {
-    if ( my_arena_slot->tail + num_tasks <= my_task_pool_size )
-        return;
-    // 1 compensates for head possibly temporarily incremented by a thief
-    size_t new_size = my_arena_slot->tail - my_arena_slot->head + num_tasks + 1;
-    // If the free space at the beginning of the task pool is too short, we
-    // are likely facing a pathological single-producer-multiple-consumers
-    // scenario, and thus it's better to expand the task pool
-    if ( new_size <= my_task_pool_size - min_task_pool_size/4 ) {
-        // Relocate the busy part to the deque beginning
-        acquire_task_pool();
-        size_t new_tail = my_arena_slot->tail - my_arena_slot->head;
-        memmove( my_dummy_slot.task_pool, my_dummy_slot.task_pool + my_arena_slot->head, new_tail * sizeof(task*) );
-        fill_with_canary_pattern( my_dummy_slot.task_pool, new_tail, my_arena_slot->tail );
-        my_arena_slot->head = 0;
-        // Tail is updated last to minimize probability of a thread making arena 
-        // snapshot being misguided into thinking that this task pool is empty.
-        my_arena_slot->tail = new_tail;
-        release_task_pool();
-    }
-    else
-        grow_task_pool( my_task_pool_size + num_tasks );
-}
-
 inline void generic_scheduler::commit_spawned_tasks( size_t new_tail ) {
     __TBB_ASSERT ( new_tail <= my_task_pool_size, "task deque end was overwritten" );
     ITT_NOTIFY(sync_releasing, my_arena_slot);
@@ -636,6 +632,16 @@ inline void generic_scheduler::commit_spawned_tasks( size_t new_tail ) {
     __TBB_store_with_release( my_arena_slot->tail, new_tail );
 }
 
+void generic_scheduler::commit_relocated_tasks ( size_t new_tail ) {
+    __TBB_ASSERT( my_arena_slot == &my_dummy_slot || my_arena_slot->task_pool == LockedTaskPool,
+                  "Task pool must be locked when calling commit_relocated_tasks()" );
+    __TBB_store_relaxed( my_arena_slot->head, 0 );
+    // Tail is updated last to minimize probability of a thread making arena 
+    // snapshot being misguided into thinking that this task pool is empty.
+    __TBB_store_relaxed( my_arena_slot->tail, new_tail );
+    release_task_pool();
+}
+
 template<free_task_hint h>
 void generic_scheduler::free_task( task& t ) {
     GATHER_STATISTIC(--my_counters.active_tasks);
@@ -643,11 +649,9 @@ void generic_scheduler::free_task( task& t ) {
     // Verify that optimization hints are correct.
     __TBB_ASSERT( h!=small_local_task || p.origin==this, NULL );
     __TBB_ASSERT( !(h&small_task) || p.origin, NULL );
-#if TBB_USE_ASSERT
-    p.depth = 0xDEADBEEF;
-    p.ref_count = 0xDEADBEEF;
+    poison_value(p.depth);
+    poison_value(p.ref_count);
     poison_pointer(p.owner);
-#endif /* TBB_USE_ASSERT */
     __TBB_ASSERT( 1L<<t.state() & (1L<<task::executing|1L<<task::allocated), NULL );
     p.state = task::freed;
     if( h==small_local_task || p.origin==this ) {
@@ -667,6 +671,18 @@ inline bool generic_scheduler::worker_outermost_level () const {
     return !my_dispatching_task;
 }
 
+inline intptr_t generic_scheduler::effective_reference_priority () const {
+    // Workers on the outermost dispatch level (i.e. with empty stack) use market's
+    // priority as a reference point (to speedup discovering process level priority
+    // changes). But when there are enough workers to service (even if only partially)
+    // a lower priority arena, they should use arena's priority as a reference, lest
+    // be trapped in a futile spinning (because market's priority would prohibit
+    // executing ANY tasks in this arena).
+    return !worker_outermost_level() || 
+            my_arena->my_num_workers_allotted < my_arena->num_workers_active()
+            ? *my_ref_top_priority : my_arena->my_top_priority;
+}
+
 inline void generic_scheduler::offload_task ( task& t, intptr_t p ) {
     GATHER_STATISTIC( ++my_counters.prio_tasks_offloaded );
     __TBB_ASSERT( my_offloaded_task_list_tail_link && !*my_offloaded_task_list_tail_link, NULL );
diff --git a/src/tbb/scheduler_common.h b/src/tbb/scheduler_common.h
index d9d0e06..f5f089c 100644
--- a/src/tbb/scheduler_common.h
+++ b/src/tbb/scheduler_common.h
@@ -58,8 +58,8 @@
 #include "tbb/spin_mutex.h"
 #endif /* __TBB_TASK_GROUP_CONTEXT */
 
-// This macro is an attempt to get rid of ugly ifdefs in the shared parts of the code. 
-// It drops the second argument depending on whether the controlling macro is defined. 
+// This macro is an attempt to get rid of ugly ifdefs in the shared parts of the code.
+// It drops the second argument depending on whether the controlling macro is defined.
 // The first argument is just a convenience allowing to keep comma before the macro usage.
 #if __TBB_TASK_GROUP_CONTEXT
     #define __TBB_CONTEXT_ARG(arg1, context) arg1, context
@@ -76,7 +76,7 @@
 
 #if _MSC_VER && !defined(__INTEL_COMPILER)
     // Workaround for overzealous compiler warnings
-    // These particular warnings are so ubiquitous that no attempt is made to narrow 
+    // These particular warnings are so ubiquitous that no attempt is made to narrow
     // the scope of the warnings.
     #pragma warning (disable: 4100 4127 4312 4244 4267 4706)
 #endif
@@ -84,6 +84,8 @@
 namespace tbb {
 namespace internal {
 
+class generic_scheduler;
+
 #if __TBB_TASK_PRIORITY
 static const intptr_t num_priority_levels = 3;
 static const intptr_t normalized_normal_priority = (num_priority_levels - 1) / 2;
@@ -105,24 +107,26 @@ inline intptr_t& priority ( task& t ) {
 }
 #endif /* __TBB_TASK_PRIORITY */
 
+#if __TBB_TASK_GROUP_CONTEXT
 //! Task group state change propagation global epoch
-/** Together with generic_scheduler::my_context_state_propagation_epoch forms 
+/** Together with generic_scheduler::my_context_state_propagation_epoch forms
     cross-thread signaling mechanism that allows to avoid locking at the hot path
     of normal execution flow.
 
-    When a descendant task group context is registered or unregistered, the global 
+    When a descendant task group context is registered or unregistered, the global
     and local epochs are compared. If they differ, a state change is being propagated,
     and thus registration/deregistration routines take slower branch that may block
-    (at most one thread of the pool can be blocked at any moment). Otherwise the 
+    (at most one thread of the pool can be blocked at any moment). Otherwise the
     control path is lock-free and fast. **/
 extern uintptr_t the_context_state_propagation_epoch;
 
 //! Mutex guarding state change propagation across task groups forest.
 /** Also protects modification of related data structures. **/
 extern spin_mutex the_context_state_propagation_mutex;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
 //! Alignment for a task object
-const size_t task_alignment = 16;
+const size_t task_alignment = 32;
 
 //! Number of bytes reserved for a task prefix
 /** If not exactly sizeof(task_prefix), the extra bytes *precede* the task_prefix. */
@@ -144,14 +148,14 @@ enum task_extra_state {
 
 //! Optimization hint to free_task that enables it omit unnecessary tests and code.
 enum free_task_hint {
-    //! No hint 
+    //! No hint
     no_hint=0,
     //! Task is known to have been allocated by this scheduler
     local_task=1,
     //! Task is known to be a small task.
     /** Task should be returned to the free list of *some* scheduler, possibly not this scheduler. */
     small_task=2,
-    //! Bitwise-OR of local_task and small_task.  
+    //! Bitwise-OR of local_task and small_task.
     /** Task should be returned to free list of this scheduler. */
     small_local_task=3
 };
@@ -162,17 +166,16 @@ enum free_task_hint {
 
 #if TBB_USE_ASSERT
 
-static const uintptr_t venom = 
+static const uintptr_t venom =
 #if __TBB_WORDSIZE == 8
         0xDDEEAADDDEADBEEF;
 #else
         0xDEADBEEF;
 #endif
 
-
-/** In contrast to poison_pointer() and assert_task_valid() poison_value() is a macro 
-    because the variable used as its argument may be undefined in release builds. **/
-#define poison_value(g) (g = venom)
+/** Crazy conversion is necessary to shut up insane MS compiler. **/
+template <typename T>
+void poison_value ( T& val ) { val = *(T*)(uintptr_t*)&venom; }
 
 /** Expected to be used in assertions only, thus no empty form is defined. **/
 inline bool is_alive( uintptr_t v ) { return v != venom; }
@@ -188,6 +191,8 @@ inline void assert_task_valid( const task& task ) {
 
 #else /* !TBB_USE_ASSERT */
 
+/** In contrast to debug version poison_value() is a macro here because
+    the variable used as its argument may be undefined in release builds. **/
 #define poison_value(g) ((void)0)
 
 inline void assert_task_valid( const task& ) {}
@@ -198,6 +203,7 @@ inline void assert_task_valid( const task& ) {}
 // Helpers
 //------------------------------------------------------------------------
 
+#if __TBB_TASK_GROUP_CONTEXT
 inline bool ConcurrentWaitsEnabled ( task& t ) {
     return (t.prefix().context->my_version_and_traits & task_group_context::concurrent_wait) != 0;
 }
@@ -206,12 +212,11 @@ inline bool CancellationInfoPresent ( task& t ) {
     return t.prefix().context->my_cancellation_requested != 0;
 }
 
-#if __TBB_TASK_GROUP_CONTEXT
 #if TBB_USE_CAPTURED_EXCEPTION
     inline tbb_exception* TbbCurrentException( task_group_context*, tbb_exception* src) { return src->move(); }
     inline tbb_exception* TbbCurrentException( task_group_context*, captured_exception* src) { return src; }
 #else
-    // Using macro instead of an inline function here allows to avoid evaluation of the 
+    // Using macro instead of an inline function here allows to avoid evaluation of the
     // TbbCapturedException expression when exact propagation is enabled for the context.
     #define TbbCurrentException(context, TbbCapturedException) \
         context->my_version_and_traits & task_group_context::exact_exception    \
@@ -233,6 +238,11 @@ inline bool CancellationInfoPresent ( task& t ) {
     } catch ( ... ) {   \
         TbbRegisterCurrentException( context, captured_exception::allocate("...", "Unidentified exception") );\
     }
+
+#else /* !__TBB_TASK_GROUP_CONTEXT */
+
+inline bool ConcurrentWaitsEnabled ( task& t ) { return false; }
+
 #endif /* __TBB_TASK_GROUP_CONTEXT */
 
 //------------------------------------------------------------------------
@@ -248,18 +258,18 @@ struct arena_slot {
     /** Also is used to specify if the slot is empty or locked:
          0 - empty
         -1 - locked **/
-    task** task_pool;
+    task* *__TBB_atomic task_pool;
 
     //! Index of the first ready task in the deque.
     /** Modified by thieves, and by the owner during compaction/reallocation **/
-    size_t head;
+    __TBB_atomic size_t head;
 
     //! Padding to avoid false sharing caused by the thieves accessing this slot
     char pad1[NFS_MaxLineSize - sizeof(size_t) - sizeof(task**) - sizeof(generic_scheduler*)];
 
     //! Index of the element following the last ready task in the deque.
     /** Modified by the owner thread. **/
-    size_t tail;
+    __TBB_atomic size_t tail;
 
     //! Hints provided for operations with the container of starvation-resistant tasks.
     /** Modified by the owner thread (during these operations). **/
diff --git a/src/tbb/semaphore.cpp b/src/tbb/semaphore.cpp
new file mode 100644
index 0000000..f69af7f
--- /dev/null
+++ b/src/tbb/semaphore.cpp
@@ -0,0 +1,101 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#include "semaphore.h"
+#if _WIN32||_WIN64
+#if defined(RTL_SRWLOCK_INIT)
+#include "dynamic_link.h" // Refers to src/tbb, not include/tbb
+#include "tbb_misc.h"
+#endif
+#endif
+
+namespace tbb {
+namespace internal {
+
+#if _WIN32||_WIN64
+#if defined(RTL_SRWLOCK_INIT)
+
+static atomic<do_once_state> concmon_module_inited;
+
+void WINAPI init_binsem_using_event( SRWLOCK* h_ )
+{
+    srwl_or_handle* shptr = (srwl_or_handle*) h_;
+    shptr->h = CreateEvent( NULL, FALSE/*manual reset*/, FALSE/*not signalled initially*/, NULL);
+}
+
+void WINAPI acquire_binsem_using_event( SRWLOCK* h_ )
+{
+    srwl_or_handle* shptr = (srwl_or_handle*) h_;
+    WaitForSingleObject( shptr->h, INFINITE );
+}
+
+void WINAPI release_binsem_using_event( SRWLOCK* h_ )
+{
+    srwl_or_handle* shptr = (srwl_or_handle*) h_;
+    SetEvent( shptr->h );
+}
+
+static void (WINAPI *__TBB_init_binsem)( SRWLOCK* ) = (void (WINAPI *)(SRWLOCK*))&init_binsem_using_event;
+static void (WINAPI *__TBB_acquire_binsem)( SRWLOCK* ) = (void (WINAPI *)(SRWLOCK*))&acquire_binsem_using_event;
+static void (WINAPI *__TBB_release_binsem)( SRWLOCK* ) = (void (WINAPI *)(SRWLOCK*))&release_binsem_using_event;
+
+//! Table describing the how to link the handlers.
+static const dynamic_link_descriptor SRWLLinkTable[] = {
+    DLD(InitializeSRWLock,       __TBB_init_binsem),
+    DLD(AcquireSRWLockExclusive, __TBB_acquire_binsem),
+    DLD(ReleaseRWLockExclusive,  __TBB_release_binsem)
+};
+
+inline void init_concmon_module()
+{
+    __TBB_ASSERT( (uintptr_t)__TBB_init_binsem==(uintptr_t)&init_binsem_using_event, NULL );
+    dynamic_link( "Kernel32.dll", SRWLLinkTable, 3 );
+}
+
+binary_semaphore::binary_semaphore() {
+    atomic_do_once( &init_concmon_module, concmon_module_inited );
+
+    __TBB_init_binsem( &my_sem.lock ); 
+    if( (uintptr_t)__TBB_init_binsem!=(uintptr_t)&init_binsem_using_event )
+        P();
+}
+
+binary_semaphore::~binary_semaphore() {
+    if( (uintptr_t)__TBB_init_binsem==(uintptr_t)&init_binsem_using_event )
+        CloseHandle( my_sem.h );
+}
+
+void binary_semaphore::P() { __TBB_acquire_binsem( &my_sem.lock ); }
+
+void binary_semaphore::V() { __TBB_release_binsem( &my_sem.lock ); }
+
+#endif /* defined(RTL_SRWLOCK_INIT) */
+#endif /* _WIN32||_WIN64 */
+
+} // namespace internal
+} // namespace tbb
diff --git a/src/tbb/semaphore.h b/src/tbb/semaphore.h
index dc1d3e7..70d85e5 100644
--- a/src/tbb/semaphore.h
+++ b/src/tbb/semaphore.h
@@ -126,6 +126,134 @@ private:
 };
 #endif /* _WIN32||_WIN64 */
 
+
+//! for performance reasons, we want specialied binary_semaphore
+#if _WIN32||_WIN64
+#if !defined(RTL_SRWLOCK_INIT)
+//! binary_semaphore for concurrent_monitor
+class binary_semaphore : no_copy {
+public:
+    //! ctor
+    binary_semaphore() { my_sem = CreateEvent( NULL, FALSE/*manual reset*/, FALSE/*not signalled initially*/, NULL);  }
+    //! dtor
+    ~binary_semaphore() { CloseHandle( my_sem ); }
+    //! wait/acquire
+    void P() {WaitForSingleObject( my_sem, INFINITE ); }
+    //! post/release 
+    void V() {SetEvent( my_sem );}
+private:
+    HANDLE my_sem;
+};
+#else /* defined(RTL_SRWLOCK_INIT) */
+
+union srwl_or_handle {
+    SRWLOCK lock;
+    HANDLE  h;
+};
+
+//! binary_semaphore for concurrent_monitor
+class binary_semaphore : no_copy {
+public:
+    //! ctor
+    binary_semaphore();
+    //! dtor
+    ~binary_semaphore();
+    //! wait/acquire
+    void P();
+    //! post/release 
+    void V();
+private:
+    srwl_or_handle my_sem;
+};
+#endif /* !defined(RTL_SRWLOCK_INIT) */
+#elif __APPLE__
+//! binary_semaphore for concurrent monitor
+class binary_semaphore : no_copy {
+public:
+    //! ctor
+    binary_semaphore() : my_sem(0) {
+        kern_return_t ret = semaphore_create( mach_task_self(), &my_sem, SYNC_POLICY_FIFO, 0 );
+        __TBB_ASSERT_EX( ret==err_none, "failed to create a semaphore" );
+    }
+    //! dtor
+    ~binary_semaphore() {
+        kern_return_t ret = semaphore_destroy( mach_task_self(), my_sem );
+        __TBB_ASSERT_EX( ret==err_none, NULL );
+    }
+    //! wait/acquire
+    void P() { 
+        int ret;
+        do {
+            ret = semaphore_wait( my_sem );
+        } while( ret==KERN_ABORTED );
+        __TBB_ASSERT( ret==KERN_SUCCESS, "semaphore_wait() failed" );
+    }
+    //! post/release 
+    void V() { semaphore_signal( my_sem ); }
+private:
+    semaphore_t my_sem;
+};
+#else /* Linux/Unix */
+
+#if __TBB_USE_FUTEX
+class binary_semaphore : no_copy {
+public:
+    //! ctor
+    binary_semaphore() { my_sem = 1; }
+    //! dtor
+    ~binary_semaphore() {}
+    //! wait/acquire
+    void P() {
+        int s;
+        if( (s = my_sem.compare_and_swap( 1, 0 ))!=0 ) {
+            if( s!=2 )
+                s = my_sem.fetch_and_store( 2 );
+            while( s!=0 ) {
+                futex_wait( &my_sem, 2 );
+                s = my_sem.fetch_and_store( 2 );
+            }
+        }
+    }
+    //! post/release 
+    void V() { 
+        __TBB_ASSERT( my_sem>=1, "multiple V()'s in a row?" );
+        if( my_sem--!=1 ) {
+            //if old value was 2
+            my_sem = 0;
+            futex_wakeup_one( &my_sem );
+        }
+    }
+private:
+    atomic<int> my_sem;
+};
+#else
+typedef uint32_t sem_count_t;
+//! binary_semaphore for concurrent monitor
+class binary_semaphore : no_copy {
+public:
+    //! ctor
+    binary_semaphore() {
+        int ret = sem_init( &my_sem, /*shared among threads*/ 0, 0 );
+        __TBB_ASSERT_EX( !ret, NULL );
+    }
+    //! dtor
+    ~binary_semaphore() {
+        int ret = sem_destroy( &my_sem );
+        __TBB_ASSERT_EX( !ret, NULL );
+    }
+    //! wait/acquire
+    void P() {
+        while( sem_wait( &my_sem )!=0 )
+            __TBB_ASSERT( errno==EINTR, NULL );
+    }
+    //! post/release 
+    void V() { sem_post( &my_sem ); }
+private:
+    sem_t my_sem;
+};
+#endif /* __TBB_USE_FUTEX */
+#endif /* _WIN32||_WIN64 */
+
 } // namespace internal
 } // namespace tbb
 
diff --git a/src/tbb/spin_mutex.cpp b/src/tbb/spin_mutex.cpp
index 2dda139..6e6d38c 100644
--- a/src/tbb/spin_mutex.cpp
+++ b/src/tbb/spin_mutex.cpp
@@ -46,7 +46,7 @@ void spin_mutex::scoped_lock::internal_release() {
     __TBB_ASSERT( !(my_unlock_value&1), "corrupted scoped_lock?" );
 
     ITT_NOTIFY(sync_releasing, my_mutex);
-    __TBB_UnlockByte(my_mutex->flag, static_cast<__TBB_Byte>(my_unlock_value));
+    __TBB_UnlockByte(my_mutex->flag, my_unlock_value);
     my_mutex = NULL;
 }
 
diff --git a/src/tbb/task.cpp b/src/tbb/task.cpp
index 920ce4a..ffe797f 100644
--- a/src/tbb/task.cpp
+++ b/src/tbb/task.cpp
@@ -75,11 +75,11 @@ task& allocate_root_with_context_proxy::allocate( size_t size ) const {
     internal::generic_scheduler* s = governor::local_scheduler();
     __TBB_ASSERT( s, "Scheduler auto-initialization failed?" );
     task& t = s->allocate_task( size, __TBB_CONTEXT_ARG(NULL, &my_context) );
-    // Supported usage model prohibits concurrent initial binding. Thus we do not 
+    // Supported usage model prohibits concurrent initial binding. Thus we do not
     // need interlocked operations or fences to manipulate with my_context.my_kind
     if ( my_context.my_kind == task_group_context::binding_required ) {
-        // If we are in the outermost task dispatch loop of a master thread, then 
-        // there is nothing to bind this context to, and we skip the binding part 
+        // If we are in the outermost task dispatch loop of a master thread, then
+        // there is nothing to bind this context to, and we skip the binding part
         // treating the context as isolated.
         if ( s->my_innermost_running_task == s->my_dummy_task )
             my_context.my_kind = task_group_context::isolated;
@@ -177,7 +177,7 @@ void affinity_partitioner_base_v3::resize( unsigned factor ) {
             memset( my_array, 0, sizeof(affinity_id)*new_size );
             my_size = new_size;
         }
-    } 
+    }
 }
 
 } // namespace internal
@@ -218,7 +218,7 @@ bool task::is_owned_by_current_thread() const {
 }
 
 void interface5::internal::task_base::destroy( task& victim ) {
-    // 1 may be a guard reference for wait_for_all, which was not reset because 
+    // 1 may be a guard reference for wait_for_all, which was not reset because
     // of concurrent_wait mode or because prepared root task was not actually used
     // for spawning tasks (as in structured_task_group).
     __TBB_ASSERT( (intptr_t)victim.prefix().ref_count <= 1, "Task being destroyed must not have children" );
@@ -228,7 +228,7 @@ void interface5::internal::task_base::destroy( task& victim ) {
     if( parent ) {
         __TBB_ASSERT( parent->state()==task::allocated, "attempt to destroy child of running or corrupted parent?" );
         parent->internal_decrement_ref_count();
-        // Despite last reference to *parent removed, it should not be destroyed (documented behavior).
+        // Even if the last reference to *parent is removed, it should not be spawned (documented behavior).
     }
     governor::local_scheduler()->free_task<no_hint>( victim );
 }
@@ -244,7 +244,7 @@ void task::spawn_and_wait_for_all( task_list& list ) {
     s->local_wait_for_all( *this, t );
 }
 
-/** Defined out of line so that compiler does not replicate task's vtable. 
+/** Defined out of line so that compiler does not replicate task's vtable.
     It's pointless to define it inline anyway, because all call sites to it are virtual calls
     that the compiler is unlikely to optimize. */
 void task::note_affinity( affinity_id ) {
@@ -255,8 +255,8 @@ void task::change_group ( task_group_context& ctx ) {
     prefix().context = &ctx;
     if ( ctx.my_kind == task_group_context::binding_required ) {
         internal::generic_scheduler* s = governor::local_scheduler();
-        // If we are in the outermost task dispatch loop of a master thread, then 
-        // there is nothing to bind this context to, and we skip the binding part 
+        // If we are in the outermost task dispatch loop of a master thread, then
+        // there is nothing to bind this context to, and we skip the binding part
         // treating the context as isolated.
         if ( s->my_innermost_running_task == s->my_dummy_task )
             ctx.my_kind = task_group_context::isolated;
diff --git a/src/tbb/tbb_main.cpp b/src/tbb/tbb_main.cpp
index 3985f24..f2c2ccf 100644
--- a/src/tbb/tbb_main.cpp
+++ b/src/tbb/tbb_main.cpp
@@ -60,7 +60,7 @@ market::global_market_mutex_type market::theMarketMutex;
 //! Counter of references to global shared resources such as TLS.
 atomic<int> __TBB_InitOnce::count;
 
-__TBB_InitOnce::mutex_type __TBB_InitOnce::InitializationLock;
+__TBB_atomic_flag __TBB_InitOnce::InitializationLock;
 
 //! Flag that is set to true after one-time initializations are done.
 bool __TBB_InitOnce::InitializationDone;
diff --git a/src/tbb/tbb_main.h b/src/tbb/tbb_main.h
index ae165ef..759ba9a 100644
--- a/src/tbb/tbb_main.h
+++ b/src/tbb/tbb_main.h
@@ -59,14 +59,12 @@ class __TBB_InitOnce {
     //! Specifies if the one-time initializations has been done.
     static bool InitializationDone;
 
-    // Scenarios are possible when tools interop has to be initialized before the
-    // TBB itself. This imposes a requirement that the global initialization lock 
-    // has to support valid static initialization, and does not issue any tool
-    // notifications in any build mode.
-    typedef __TBB_Byte mutex_type;
-
-    // Global initialization lock
-    static mutex_type InitializationLock;
+    //! Global initialization lock
+    /** Scenarios are possible when tools interop has to be initialized before the
+        TBB itself. This imposes a requirement that the global initialization lock 
+        has to support valid static initialization, and does not issue any tool
+        notifications in any build mode. **/
+    static __TBB_atomic_flag InitializationLock;
 
 public:
     static void lock()   { __TBB_LockByte( InitializationLock ); }
diff --git a/src/tbb/tbb_misc.cpp b/src/tbb/tbb_misc.cpp
index b06a05c..955d47b 100644
--- a/src/tbb/tbb_misc.cpp
+++ b/src/tbb/tbb_misc.cpp
@@ -213,7 +213,7 @@ done:;
 extern "C" void __TBB_machine_store8_slow( volatile void *ptr, int64_t value ) {
     for( tbb::internal::atomic_backoff b;; b.pause() ) {
         int64_t tmp = *(int64_t*)ptr;
-        if( __TBB_CompareAndSwap8(ptr,value,tmp)==tmp ) 
+        if( __TBB_machine_cmpswp8(ptr,value,tmp)==tmp ) 
             break;
     }
 }
diff --git a/src/tbb/tbb_misc.h b/src/tbb/tbb_misc.h
index 403c86e..fa00b5d 100644
--- a/src/tbb/tbb_misc.h
+++ b/src/tbb/tbb_misc.h
@@ -157,10 +157,10 @@ public:
 //! Atomically replaces value of dst with newValue if they satisfy condition of compare predicate
 /** Return value semantics is the same as for CAS. **/
 template<typename T1, typename T2, class Pred> 
-T1 atomic_update ( tbb::atomic<T1>& dst, const T2& newValue, Pred compare ) {
+T1 atomic_update ( tbb::atomic<T1>& dst, T2 newValue, Pred compare ) {
     T1 oldValue = dst;
     while ( compare(oldValue, newValue) ) {
-        if ( dst.compare_and_swap(newValue, oldValue) == oldValue )
+        if ( dst.compare_and_swap((T1)newValue, oldValue) == oldValue )
             break;
         oldValue = dst;
     }
diff --git a/src/tbb/tbb_misc_ex.cpp b/src/tbb/tbb_misc_ex.cpp
index 0c463a0..2abd5db 100644
--- a/src/tbb/tbb_misc_ex.cpp
+++ b/src/tbb/tbb_misc_ex.cpp
@@ -43,6 +43,7 @@
 #include <sys/sysinfo.h>
 #include <string.h>
 #include <sched.h>
+#include <errno.h>
 #elif __sun
 #include <sys/sysinfo.h>
 #include <unistd.h>
@@ -121,8 +122,13 @@ static void initialize_hardware_concurrency_info () {
     int availableProcs = 0;
     int numMasks = 1;
 #if __linux__
-    int maxProcs = get_nprocs();
+#if __TBB_MAIN_THREAD_AFFINITY_BROKEN
+    int maxProcs = INT_MAX; // To check the entire mask.
+    int pid = 0; // Get the mask of the calling thread.
+#else
+    int maxProcs = sysconf(_SC_NPROCESSORS_ONLN);
     int pid = getpid();
+#endif
     cpu_set_t *processMask;
     const size_t BasicMaskSize =  sizeof(cpu_set_t);
     for (;;) {
@@ -166,10 +172,11 @@ static void initialize_hardware_concurrency_info () {
         process_mask = processMask;
     }
     else {
-        availableProcs = maxProcs;
+        availableProcs = (maxProcs == INT_MAX) ? sysconf(_SC_NPROCESSORS_ONLN) : maxProcs;
         delete[] processMask;
     }
     theNumProcs = availableProcs > 0 ? availableProcs : 1; // Fail safety strap
+    __TBB_ASSERT( theNumProcs <= sysconf(_SC_NPROCESSORS_ONLN), NULL );
 }
 
 int AvailableHwConcurrency() {
diff --git a/src/tbbmalloc/Customize.h b/src/tbbmalloc/Customize.h
index 51c2810..de458c3 100644
--- a/src/tbbmalloc/Customize.h
+++ b/src/tbbmalloc/Customize.h
@@ -69,17 +69,32 @@ extern "C" void mallocProcessShutdownNotification(void);
 
     There are no methods "acquire" or "release".  The scoped_lock must be used
     in a strict block-scoped locking pattern.  Omitting these methods permitted
-    further simplication. */
+    further simplification. */
 class MallocMutex : tbb::internal::no_copy {
-    __TBB_Byte value;
+    __TBB_atomic_flag value;
 
 public:
     class scoped_lock : tbb::internal::no_copy {
-        const __TBB_Byte unlock_value;
+        __TBB_Flag unlock_value;
         MallocMutex& mutex;
     public:
-        scoped_lock( MallocMutex& m ) : unlock_value( __TBB_LockByte(m.value)), mutex(m) {}
-        ~scoped_lock() { __TBB_UnlockByte(mutex.value, unlock_value); }
+        scoped_lock( MallocMutex& m ) : unlock_value(__TBB_LockByte(m.value)), mutex(m) {}
+        scoped_lock( MallocMutex& m, bool block, bool *locked ) : mutex(m) {
+            unlock_value = 1;
+            if (block) {
+                unlock_value = __TBB_LockByte(m.value);
+                if (locked) *locked = true;
+            } else {
+                if (bool res = __TBB_TryLockByte(m.value)) {
+                    unlock_value = 0;
+                    if (locked) *locked = true;
+                } else
+                    if (locked) *locked = false;
+            }
+        }
+        ~scoped_lock() {
+            if (!unlock_value) __TBB_UnlockByte(mutex.value, unlock_value);
+        }
     };
     friend class scoped_lock;
 };
@@ -88,7 +103,7 @@ inline intptr_t AtomicIncrement( volatile intptr_t& counter ) {
     return __TBB_FetchAndAddW( &counter, 1 )+1;
 }
 
-inline uintptr_t AtomicAdd( volatile uintptr_t& counter, uintptr_t value ) {
+inline uintptr_t AtomicAdd( volatile intptr_t& counter, intptr_t value ) {
     return __TBB_FetchAndAddW( &counter, value );
 }
 
@@ -104,6 +119,22 @@ inline void FencedStore( volatile intptr_t &location, intptr_t value ) {
     __TBB_store_with_release(location, value);
 }
 
+inline void SpinWaitWhileEq(const volatile intptr_t &location, const intptr_t value) {
+    tbb::internal::spin_wait_while_eq(location, value);
+}
+
+inline intptr_t BitScanRev(uintptr_t x) {
+    return !x? -1 : __TBB_Log2(x);
+}
+
+inline void AtomicOr(volatile void *operand, uintptr_t addend) {
+    __TBB_AtomicOR(operand, addend);
+}
+
+inline void AtomicAnd(volatile void *operand, uintptr_t addend) {
+    __TBB_AtomicAND(operand, addend);
+}
+
 #define USE_DEFAULT_MEMORY_MAPPING 1
 
 // To support malloc replacement with LD_PRELOAD
diff --git a/src/tbbmalloc/LifoList.h b/src/tbbmalloc/LifoList.h
deleted file mode 100644
index 45eb363..0000000
--- a/src/tbbmalloc/LifoList.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
-    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
-
-    This file is part of Threading Building Blocks.
-
-    Threading Building Blocks is free software; you can redistribute it
-    and/or modify it under the terms of the GNU General Public License
-    version 2 as published by the Free Software Foundation.
-
-    Threading Building Blocks is distributed in the hope that it will be
-    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Threading Building Blocks; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-    As a special exception, you may use this file as part of a free software
-    library without restriction.  Specifically, if other files instantiate
-    templates or use macros or inline functions from this file, or you compile
-    this file and link it with other files to produce an executable, this
-    file does not by itself cause the resulting executable to be covered by
-    the GNU General Public License.  This exception does not however
-    invalidate any other reasons why the executable file might be covered by
-    the GNU General Public License.
-*/
-
-#ifndef _itt_common_malloc_LifoList_H_
-#define _itt_common_malloc_LifoList_H_
-
-#include "TypeDefinitions.h"
-#include <string.h> // for memset()
-
-//! Checking the synchronization method
-/** FINE_GRAIN_LOCKS is the only variant for now; should be defined for LifoList */
-#ifndef FINE_GRAIN_LOCKS
-#define FINE_GRAIN_LOCKS
-#endif
-
-namespace rml {
-
-namespace internal {
-
-class LifoList {
-public:
-    inline LifoList();
-    inline void push(void** ptr);
-    inline void* pop(void);
-    inline void pushList(void **head, void **tail);
-
-private:
-    void * top;
-#ifdef FINE_GRAIN_LOCKS
-    MallocMutex lock;
-#endif /* FINE_GRAIN_LOCKS     */
-};
-
-#ifdef FINE_GRAIN_LOCKS
-/* LifoList assumes zero initialization so a vector of it can be created
- * by just allocating some space with no call to constructor.
- * On Linux, it seems to be necessary to avoid linking with C++ libraries.
- *
- * By usage convention there is no race on the initialization. */
-LifoList::LifoList( ) : top(NULL)
-{
-    // MallocMutex assumes zero initialization
-    memset(&lock, 0, sizeof(MallocMutex));
-}
-
-void LifoList::push( void **ptr )
-{   
-    MallocMutex::scoped_lock scoped_cs(lock);
-    *ptr = top;
-    top = ptr;
-}
-
-void LifoList::pushList( void **head, void **tail )
-{   
-    MallocMutex::scoped_lock scoped_cs(lock);
-    *tail = top;
-    top = head;
-}
-
-void * LifoList::pop( )
-{   
-    void **result=NULL;
-    if (!top) goto done;
-    {
-        MallocMutex::scoped_lock scoped_cs(lock);
-        if (!top) goto done;
-        result = (void **) top;
-        top = *result;
-    } 
-    *result = NULL;
-done:
-    return result;
-}
-
-#endif /* FINE_GRAIN_LOCKS     */
-
-} // namespace internal
-} // namespace rml
-
-#endif /* _itt_common_malloc_LifoList_H_ */
-
diff --git a/src/tbbmalloc/MapMemory.h b/src/tbbmalloc/MapMemory.h
index ee18082..8065a3c 100644
--- a/src/tbbmalloc/MapMemory.h
+++ b/src/tbbmalloc/MapMemory.h
@@ -29,6 +29,17 @@
 #ifndef _itt_shared_malloc_MapMemory_H
 #define _itt_shared_malloc_MapMemory_H
 
+#include <stdlib.h>
+
+void *ErrnoPreservingMalloc(size_t bytes)
+{
+    int prevErrno = errno;
+    void *ret = malloc( bytes );
+    if (!ret)
+        errno = prevErrno;
+    return ret;
+}
+
 #if __linux__ || __APPLE__ || __sun || __FreeBSD__
 
 #if __sun && !defined(_XPG4_2)
@@ -48,17 +59,24 @@
 void* MapMemory (size_t bytes)
 {
     void* result = 0;
+    int prevErrno = errno;
 #ifndef MAP_ANONYMOUS
 // Mac OS* X defines MAP_ANON, which is deprecated in Linux.
 #define MAP_ANONYMOUS MAP_ANON
 #endif /* MAP_ANONYMOUS */
-    result = mmap(result, bytes, (PROT_READ | PROT_WRITE), MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+    result = mmap(NULL, bytes, (PROT_READ | PROT_WRITE), MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+    if (result==MAP_FAILED)
+        errno = prevErrno;
     return result==MAP_FAILED? 0: result;
 }
 
 int UnmapMemory(void *area, size_t bytes)
 {
-    return munmap(area, bytes);
+    int prevErrno = errno;
+    int ret = munmap(area, bytes);
+    if (-1 == ret)
+        errno = prevErrno;
+    return ret;
 }
 
 #elif (_WIN32 || _WIN64) && !_XBOX
@@ -78,12 +96,11 @@ int UnmapMemory(void *area, size_t bytes)
 }
 
 #else
-#include <stdlib.h>
 
 #define MEMORY_MAPPING_USES_MALLOC 1
 void* MapMemory (size_t bytes)
 {
-    return malloc( bytes );
+    return ErrnoPreservingMalloc( bytes );
 }
 
 int UnmapMemory(void *area, size_t bytes)
diff --git a/src/tbbmalloc/backend.cpp b/src/tbbmalloc/backend.cpp
index 68e904a..8916fb1 100644
--- a/src/tbbmalloc/backend.cpp
+++ b/src/tbbmalloc/backend.cpp
@@ -26,23 +26,9 @@
     the GNU General Public License.
 */
 
-// intrin.h available since VS2005
-#if defined(_MSC_VER) && _MSC_VER >= 1400
-#define __TBB_HAS_INTRIN_H 1
-#else
-#define __TBB_HAS_INTRIN_H 0
-#endif
-
-#if __TBB_HAS_INTRIN_H
-#include <intrin.h>   /* for __cpuid */
-#endif
-
+#include <string.h>   /* for memset */
+#include <errno.h>
 #include "tbbmalloc_internal.h"
-//! Define the main synchronization method
-/** It should be specified before including LifoList.h */
-#define FINE_GRAIN_LOCKS
-#include "LifoList.h"
-
 
 namespace rml {
 namespace internal {
@@ -56,6 +42,16 @@ namespace internal {
 
 /*********** Code to acquire memory from the OS or other executive ****************/
 
+/*
+  syscall/malloc can set non-zero errno in case of failure,
+  but later allocator might be able to find memory to fulfil the request.
+  And we do not want changing of errno by successful scalable_malloc call.
+  To support this, restore old errno in (get|free)RawMemory, and set errno
+  in frontend just before returning to user code.
+  Please note: every syscall/libc call used inside scalable_malloc that
+  sets errno must be protected this way, not just memory allocation per se.
+*/
+
 #if USE_DEFAULT_MEMORY_MAPPING
 #include "MapMemory.h"
 #else
@@ -69,26 +65,32 @@ void* getRawMemory (size_t size, bool useMapMem = false)
 {
     void *object;
 
-    if (useMapMem) 
+    if (useMapMem)
         object = MapMemory(size);
     else
 #if MALLOC_CHECK_RECURSION
     if (RecursiveMallocCallProtector::noRecursion())
-        object = malloc(size);
-    else if ( rml::internal::original_malloc_found )
+        object = ErrnoPreservingMalloc(size);
+    else if ( rml::internal::original_malloc_found ) {
+        int prevErrno = errno;
         object = (*rml::internal::original_malloc_ptr)(size);
-    else
+        if (!object)
+            errno = prevErrno;
+    } else
         object = MapMemory(size);
 #else
-    object = malloc(size);
+    object = MallocNoErrno(size);
 #endif /* MALLOC_CHECK_RECURSION */
+
     return object;
 }
 
-void freeRawMemory (void *object, size_t size, bool useMapMem)
+bool freeRawMemory (void *object, size_t size, bool useMapMem)
 {
+    bool unmapFailed = false;
+
     if (useMapMem)
-        UnmapMemory(object, size);
+        unmapFailed = UnmapMemory(object, size);
     else
 #if MALLOC_CHECK_RECURSION
     if (RecursiveMallocCallProtector::noRecursion())
@@ -96,180 +98,919 @@ void freeRawMemory (void *object, size_t size, bool useMapMem)
     else if ( rml::internal::original_malloc_found )
         (*rml::internal::original_free_ptr)(object);
     else
-        UnmapMemory(object, size);
+        unmapFailed = UnmapMemory(object, size);
 #else
     free(object);
 #endif /* MALLOC_CHECK_RECURSION */
+
+    return unmapFailed;
 }
 
 #else /* USE_MALLOC_FOR_LARGE_OBJECT */
 
-void* getRawMemory (size_t size, bool = false) { return MapMemory(size); }
+void* getRawMemory (size_t size, bool = false) {
+    int myErr = errno;
+    void *ret = MapMemory(size);
+    errno = myErr;
+    return ret;
+}
 
-void freeRawMemory (void *object, size_t size, bool) {
-    UnmapMemory(object, size);
+bool freeRawMemory (void *object, size_t size, bool) {
+    return UnmapMemory(object, size);
 }
 
 #endif /* USE_MALLOC_FOR_LARGE_OBJECT */
 
+void *Backend::getRawMem(size_t &size, bool useMapMem) const
+{
+    if (extMemPool->userPool()) {
+        if (size_t rem = size % extMemPool->granularity) {
+            size += extMemPool->granularity - rem;
+        }
+        MALLOC_ASSERT(0 == size % extMemPool->granularity, ASSERT_TEXT);
+
+        return (*extMemPool->rawAlloc)(extMemPool->poolId, size);
+    }
+    return getRawMemory(size, useMapMem);
+}
+
+void Backend::freeRawMem(void *object, size_t size, bool useMapMem) const
+{
+    if (extMemPool->userPool())
+        (*extMemPool->rawFree)(extMemPool->poolId, object, size);
+    else
+        freeRawMemory(object, size, useMapMem);
+}
+
 /********* End memory acquisition code ********************************/
 
-static unsigned int getCPUid()
+// Protected object size. After successful locking returns size of locked block.
+// and releasing requires setting block size.
+class GuardedSize : tbb::internal::no_copy {
+    uintptr_t value;
+public:
+    enum State {
+        LOCKED,
+        COAL_BLOCK,        // block is coalescing now
+        MAX_LOCKED_VAL = COAL_BLOCK,
+        LAST_REGION_BLOCK, // used to mark last block in region
+        // values after this are "normal" block sizes
+        MAX_SPEC_VAL = LAST_REGION_BLOCK
+    };
+
+    void initLocked() { value = LOCKED; }
+    void makeCoalscing() {
+        MALLOC_ASSERT(value == LOCKED, ASSERT_TEXT);
+        value = COAL_BLOCK;
+    }
+    size_t tryLock(State state) {
+        size_t szVal, sz;
+        MALLOC_ASSERT(state <= MAX_LOCKED_VAL, ASSERT_TEXT);
+        for (;;) {
+            sz = FencedLoad((intptr_t&)value);
+            if (sz <= MAX_LOCKED_VAL)
+                break;
+            szVal = AtomicCompareExchange((intptr_t&)value, state, sz);
+
+            if (szVal==sz)
+                break;
+        }
+        return sz;
+    }
+    void unlock(size_t size) {
+        MALLOC_ASSERT(value <= MAX_LOCKED_VAL, "The lock is not locked");
+        MALLOC_ASSERT(size > MAX_LOCKED_VAL, ASSERT_TEXT);
+        FencedStore((intptr_t&)value, size);
+    }
+};
+
+struct MemRegion {
+    MemRegion *next,    // keep all regions in any pool to release all them on
+              *prev;    // pool destroying, 2-linked list to release individual
+                        // regions.
+    size_t     allocSz, // got from poll callback
+               blockSz; // initial and maximal inner block size
+};
+
+// this data must be unmodified while block is in use, so separate it
+class BlockMutexes {
+protected:
+    GuardedSize myL,   // lock for me
+                leftL; // lock for left neighbor
+};
+
+class FreeBlock : BlockMutexes {
+public:
+    static const size_t minBlockSize;
+
+    FreeBlock    *prev,       // in 2-linked list related to bin
+                 *next,
+                 *nextToFree; // used to form a queue during coalescing
+    // valid only when block is in processing, i.e. one is not free and not
+    size_t        sizeTmp;    // used outside of backend
+    int           myBin;      // bin that is owner of the block
+    bool          aligned;
+    bool          blockInBin; // this block in myBin already
+
+    FreeBlock *rightNeig(size_t sz) const {
+        MALLOC_ASSERT(sz, ASSERT_TEXT);
+        return (FreeBlock*)((uintptr_t)this+sz);
+    }
+    FreeBlock *leftNeig(size_t sz) const {
+        MALLOC_ASSERT(sz, ASSERT_TEXT);
+        return (FreeBlock*)((uintptr_t)this - sz);
+    }
+
+    void initHeader() { myL.initLocked(); leftL.initLocked(); }
+    void setMeFree(size_t size) { myL.unlock(size); }
+    size_t trySetMeUsed(GuardedSize::State s) { return myL.tryLock(s); }
+
+    void setLeftFree(size_t sz) { leftL.unlock(sz); }
+    size_t trySetLeftUsed(GuardedSize::State s) { return leftL.tryLock(s); }
+
+    size_t tryLockBlock() {
+        size_t rSz, sz = trySetMeUsed(GuardedSize::LOCKED);
+
+        if (sz <= GuardedSize::MAX_LOCKED_VAL)
+            return false;
+        rSz = rightNeig(sz)->trySetLeftUsed(GuardedSize::LOCKED);
+        if (rSz <= GuardedSize::MAX_LOCKED_VAL) {
+            setMeFree(sz);
+            return false;
+        }
+        MALLOC_ASSERT(rSz == sz, ASSERT_TEXT);
+        return sz;
+    }
+    void markCoalescing(size_t blockSz) {
+        myL.makeCoalscing();
+        rightNeig(blockSz)->leftL.makeCoalscing();
+        sizeTmp = blockSz;
+        nextToFree = NULL;
+    }
+    void markUsed() {
+        myL.initLocked();
+        rightNeig(sizeTmp)->leftL.initLocked();
+        nextToFree = NULL;
+    }
+    static void markBlocks(FreeBlock *fBlock, int num, size_t size) {
+        for (int i=1; i<num; i++) {
+            fBlock = (FreeBlock*)((uintptr_t)fBlock + size);
+            fBlock->initHeader();
+        }
+    }
+};
+
+// Last block in any region. Its "size" field is GuardedSize::LAST_REGION_BLOCK,
+// This kind of blocks used to find region header
+// and have a possibility to return region back to OS
+struct LastFreeBlock : public FreeBlock {
+    MemRegion *memRegion;
+};
+
+const size_t FreeBlock::minBlockSize = sizeof(FreeBlock);
+
+void CoalRequestQ::putBlock(FreeBlock *fBlock)
 {
-    unsigned int id;
-
-#if (__ARCH_x86_32||__ARCH_x86_64) && (__linux__||__APPLE__||__FreeBSD__||__NetBSD__||__sun||__MINGW32__)
-    int res;
- #if __ARCH_x86_32
-    /* EBX used for PIC support. Having EAX in output operands 
-       prevents ICC from crash like in __TBB_ICC_ASM_VOLATILE_BROKEN. */
-    int _eax, _ecx, _edx;
-    __asm__ ("xchgl %%ebx, %1\n\t"
-             "cpuid\n\t"
-             "xchgl %%ebx, %1\n\t"
-             : "=a" (_eax), "=r" (res)
-             : "a" (1) : "ecx", "edx");
- #else
-    __asm__ ("cpuid\n\t"
-             : "=b" (res)
-             : "a" (1) );
- #endif // __ARCH_x86_32
-    id = (res >> 24) & 0xff;
-#elif _WIN32 || _WIN64
- #if __TBB_HAS_INTRIN_H
-    int CPUInfo[4];
-    __cpuid(CPUInfo, 1);
-    id = (CPUInfo[1] >> 24) & 0xff;
- #else
-    int res;
-    _asm {
-        push ebx
-        push ecx
-        mov  eax,1
-        cpuid
-        mov  res,ebx
-        pop  ecx
-        pop  ebx
+    MALLOC_ASSERT(fBlock->sizeTmp >= FreeBlock::minBlockSize, ASSERT_TEXT);
+    fBlock->markUsed();
+
+    for (;;) {
+        FreeBlock *myBlToFree = (FreeBlock*)FencedLoad((intptr_t&)blocksToFree);
+
+        fBlock->nextToFree = myBlToFree;
+        if (myBlToFree ==
+            (FreeBlock*)AtomicCompareExchange((intptr_t&)blocksToFree,
+                                              (intptr_t)fBlock,
+                                              (intptr_t)myBlToFree))
+            return;
     }
-    id = (res >> 24) & 0xff;
- #endif
-# else
-    id = getThreadId();
-#endif
-    return id;
 }
 
+FreeBlock *CoalRequestQ::getAll()
+{
+    for (;;) {
+        FreeBlock *myBlToFree = (FreeBlock*)FencedLoad((intptr_t&)blocksToFree);
+
+        if (!myBlToFree)
+            return NULL;
+        else {
+            if (myBlToFree ==
+                (FreeBlock*)AtomicCompareExchange((intptr_t&)blocksToFree,
+                                                  0, (intptr_t)myBlToFree))
+                return myBlToFree;
+            else
+                continue;
+        }
+    }
+}
 
-/* 
- * To decrease contention for free blocks, free blocks are split, and access
- * to them is based on process number.
- */
-const int numOfFreeBlockLists = 4;
+// try to remove block from bin; if split result stay in the bin, not remove it
+// but split the block
+// alignedBin, if the bin is 16KB-aligned right side.
+FreeBlock *Backend::IndexedBins::getBlock(int binIdx, ProcBlocks *procBlocks,
+                size_t size, bool res16Kaligned, bool alignedBin, bool wait,
+                int *binLocked)
+{
+    Bin *b = &freeBins[binIdx];
+try_next:
+    FreeBlock *fBlock = NULL;
+    if (b->head) {
+        bool locked;
+        MallocMutex::scoped_lock scopedLock(b->tLock, wait, &locked);
+
+        if (!locked) {
+            if (binLocked) (*binLocked)++;
+            return NULL;
+        }
 
-/*
- * This is a LIFO linked list that one can init, push or pop from
- */
-static LifoList freeBlockList[numOfFreeBlockLists];
+        for (FreeBlock *curr = b->head; curr; curr = curr->next) {
+            size_t szBlock = curr->tryLockBlock();
+            if (!szBlock) {
+                goto try_next;
+            }
+
+            if (alignedBin || !res16Kaligned) {
+                size_t splitSz = szBlock - size;
+                // If we got a block as split result,
+                // it must have a room for control structures.
+                if (szBlock >= size && (splitSz >= FreeBlock::minBlockSize ||
+                                        !splitSz))
+                    fBlock = curr;
+            } else {
+                void *newB = alignUp(curr, blockSize);
+                uintptr_t rightNew = (uintptr_t)newB + size;
+                uintptr_t rightCurr = (uintptr_t)curr + szBlock;
+                // appropriate size, and left and right split results
+                // are either big enough or non-exitent
+                if (rightNew <= rightCurr
+                    && (newB==curr ||
+                        (uintptr_t)newB-(uintptr_t)curr >= FreeBlock::minBlockSize)
+                    && (rightNew==rightCurr ||
+                        rightCurr - rightNew >= FreeBlock::minBlockSize))
+                    fBlock = curr;
+            }
+            if (fBlock) {
+                // consume must be called before result of removing from a bin
+                // is visible externally.
+                procBlocks->consume();
+                if (alignedBin && res16Kaligned &&
+                    Backend::sizeToBin(szBlock-size) == Backend::sizeToBin(szBlock)) {
+                    // free remainder of fBlock stay in same bin,
+                    // so no need to remove it from the bin
+                    // TODO: add more "still here" cases
+                    FreeBlock *newFBlock = fBlock;
+                    // return block from right side of fBlock
+                    fBlock = (FreeBlock*)((uintptr_t)newFBlock + szBlock - size);
+                    MALLOC_ASSERT(isAligned(fBlock, blockSize), "Invalid free block");
+                    fBlock->initHeader();
+                    fBlock->setLeftFree(szBlock - size);
+                    newFBlock->setMeFree(szBlock - size);
+
+                    fBlock->sizeTmp = size;
+                } else {
+                    b->removeBlock(fBlock);
+                    if (freeBins[binIdx].empty())
+                        bitMask.set(binIdx, false);
+                    fBlock->sizeTmp = szBlock;
+                }
+                break;
+            } else { // block size is not valid, search for next block in the bin
+                curr->setMeFree(szBlock);
+                curr->rightNeig(szBlock)->setLeftFree(szBlock);
+            }
+        }
+    }
+    return fBlock;
+}
 
-FreeBlocks freeBlocks;
+void Backend::Bin::removeBlock(FreeBlock *fBlock)
+{
+    if (head == fBlock)
+        head = fBlock->next;
+    if (fBlock->prev)
+        fBlock->prev->next = fBlock->next;
+    if (fBlock->next)
+        fBlock->next->prev = fBlock->prev;
+}
 
-bool FreeBlocks::bootstrap(RawAlloc myAlloc, RawFree myFree, size_t /*myReqSize*/)
+void Backend::IndexedBins::addBlock(int binIdx, FreeBlock *fBlock, size_t blockSz)
 {
-    if (!myAlloc && !myFree) {
-        rawAlloc = getRawMemory;
-        rawFree = freeRawMemory;
-        // Get virtual memory in pieces of this size: 0x0100000 is 1 megabyte decimal
-        memReqSize = 0x0100000;
-    } else
-        MALLOC_ASSERT(0, "Not implemented yet.");
-    return mallocBigBlock();
+    Bin *b = &freeBins[binIdx];
+
+    fBlock->myBin = binIdx;
+    fBlock->aligned = toAlignedBin(fBlock, blockSz);
+    fBlock->prev = NULL;
+    MallocMutex::scoped_lock scopedLock(b->tLock);
+    fBlock->next = b->head;
+    b->head = fBlock;
+    if (fBlock->next)
+        fBlock->next->prev = fBlock;
+    bitMask.set(binIdx, true);
 }
 
-BlockI *FreeBlocks::get(bool startup)
+bool Backend::IndexedBins::tryAddBlock(int binIdx, FreeBlock *fBlock, size_t blockSz)
 {
-    BlockI *bigBlock;
-    // must not call getCPUid during malloc initialization 
-    // because getCPUid can call malloc
-    const unsigned myFreeList = startup? 0 : getCPUid()%numOfFreeBlockLists;
-    unsigned currListIdx = myFreeList;
-
-    do {
-        if (bigBlock = (BlockI *) freeBlockList[currListIdx].pop()) {
-            MALLOC_ITT_SYNC_ACQUIRED(freeBlockList+currListIdx);
-            break;
+    bool locked;
+    Bin *b = &freeBins[binIdx];
+
+    fBlock->myBin = binIdx;
+    fBlock->aligned = toAlignedBin(fBlock, blockSz);
+    fBlock->prev = NULL;
+
+    MallocMutex::scoped_lock scopedLock(b->tLock, /*wait=*/false, &locked);
+    if (!locked)
+        return false;
+    fBlock->next = b->head;
+    b->head = fBlock;
+    if (fBlock->next)
+        fBlock->next->prev = fBlock;
+    bitMask.set(binIdx, true);
+    return true;
+}
+
+void Backend::IndexedBins::reset()
+{
+    for (int i=0; i<Backend::freeBinsNum; i++)
+        freeBins[i].reset();
+    bitMask.reset();
+}
+
+void Backend::IndexedBins::lockRemoveBlock(int binIdx, FreeBlock *fBlock)
+{
+    MallocMutex::scoped_lock scopedLock(freeBins[binIdx].tLock);
+    freeBins[binIdx].removeBlock(fBlock);
+    if (freeBins[binIdx].empty())
+        bitMask.set(binIdx, false);
+}
+
+// try to allocate num blocks of size Bytes from particular "generic" bin
+// res16Kaligned is true if result must be 16KB alined
+FreeBlock *Backend::getFromBin(int binIdx, int num, size_t size, bool res16Kaligned,
+                               int *binLocked)
+{
+    FreeBlock *fBlock =
+        freeLargeBins.getBlock(binIdx, &procBlocks, num*size, res16Kaligned,
+                               /*alignedBin=*/false, /*wait=*/false, binLocked);
+    if (fBlock) {
+        if (res16Kaligned) {
+            size_t fBlockSz = fBlock->sizeTmp;
+            uintptr_t fBlockEnd = (uintptr_t)fBlock + fBlockSz;
+            FreeBlock *newB = alignUp(fBlock, blockSize);
+            FreeBlock *rightPart = (FreeBlock*)((uintptr_t)newB + num*size);
+
+            // Space to use is in the middle,
+            // ... return free right part
+            if ((uintptr_t)rightPart != fBlockEnd) {
+                rightPart->initHeader();  // to prevent coalescing rightPart with fBlock
+                coalescAndPut(rightPart, fBlockEnd - (uintptr_t)rightPart);
+            }
+            // ... and free left part
+            if (newB != fBlock) {
+                newB->initHeader(); // to prevent coalescing fBlock with newB
+                coalescAndPut(fBlock, (uintptr_t)newB - (uintptr_t)fBlock);
+            }
+
+            fBlock = newB;
+            MALLOC_ASSERT(isAligned(fBlock, blockSize), ASSERT_TEXT);
+        } else {
+            if (size_t splitSz = fBlock->sizeTmp - num*size) {
+                 // split block and return free right part
+                FreeBlock *splitB = (FreeBlock*)((uintptr_t)fBlock + num*size);
+                splitB->initHeader();
+                coalescAndPut(splitB, splitSz);
+            }
         }
-        currListIdx = (currListIdx+1) % numOfFreeBlockLists;
-    } while (currListIdx != myFreeList);
+        procBlocks.signal();
+        FreeBlock::markBlocks(fBlock, num, size);
+    }
 
-    while (!bigBlock) {
-        /* We are out of blocks so go to the OS and get another one */
-        if (!mallocBigBlock()) return NULL;
+    return fBlock;
+}
 
-        bigBlock = (BlockI *) freeBlockList[myFreeList].pop();
-        if (bigBlock)
-            MALLOC_ITT_SYNC_ACQUIRED(freeBlockList+myFreeList);
+// try to allocate size Byte block from any of 16KB-alined spaces.
+// res16Kaligned is true if result must be 16KN alined
+FreeBlock *Backend::getFromAlignedSpace(int binIdx, int num, size_t size,
+                                        bool res16Kaligned, bool wait, int *binLocked)
+{
+    FreeBlock *fBlock =
+        freeAlignedBins.getBlock(binIdx, &procBlocks, num*size, res16Kaligned,
+                                 /*alignedBin=*/true, wait, binLocked);
+
+    if (fBlock) {
+        if (fBlock->sizeTmp != num*size) { // i.e., need to split the block
+            FreeBlock *newAlgnd;
+            size_t newSz;
+
+            if (res16Kaligned) {
+                newAlgnd = fBlock;
+                fBlock = (FreeBlock*)((uintptr_t)newAlgnd + newAlgnd->sizeTmp
+                                      - num*size);
+                MALLOC_ASSERT(isAligned(fBlock, blockSize), "Invalid free block");
+                fBlock->initHeader();
+                newSz = newAlgnd->sizeTmp - num*size;
+            } else {
+                newAlgnd = (FreeBlock*)((uintptr_t)fBlock + num*size);
+                newSz = fBlock->sizeTmp - num*size;
+                newAlgnd->initHeader();
+            }
+            coalescAndPut(newAlgnd, newSz);
+        }
+        procBlocks.signal();
+        MALLOC_ASSERT(!res16Kaligned || isAligned(fBlock, blockSize), ASSERT_TEXT);
+        FreeBlock::markBlocks(fBlock, num, size);
     }
+    return fBlock;
+}
 
-    return bigBlock;
+void Backend::correctMaxRequestSize(size_t requestSize)
+{
+    if (requestSize < maxBinedSize) {
+        for (size_t oldMax = FencedLoad((intptr_t&)maxRequestedSize);
+             requestSize > oldMax; ) {
+            size_t val = AtomicCompareExchange((intptr_t&)maxRequestedSize,
+                                               requestSize, oldMax);
+            if (val == oldMax)
+                break;
+            oldMax = val;
+        }
+    }
 }
 
-void FreeBlocks::put(BlockI *ptr, bool startup)
+// try to allocate size Byte block in available bins
+// res16Kaligned is true if result must be 16KB aligned
+void *Backend::genericGetBlock(int num, size_t size, bool res16Kaligned, bool startup)
 {
-    unsigned myFreeList = startup? 0 : getCPUid()%numOfFreeBlockLists;
-    MALLOC_ITT_SYNC_RELEASING(freeBlockList+myFreeList);
-    freeBlockList[myFreeList].push((void **)ptr);
+    // after (soft|hard)CachesCleanup we can get memory in large bins,
+    // while after addNewRegion only in ALGN_SPACE_BIN. This flag
+    // is for large bins update status.
+    bool largeBinsUpdated = true;
+    void *block = NULL;
+    const size_t totalReqSize = num*size;
+    const int nativeBin = sizeToBin(totalReqSize);
+    // If we found 2 or less locked bins, it's time to ask more memory from OS.
+    // But nothing can be asked from fixed pool.
+    int lockedBinsThreshold = extMemPool->fixedSizePool()? 0 : 2;
+
+    correctMaxRequestSize(totalReqSize);
+    scanCoalescQ(/*forceCoalescQDrop=*/false);
+
+    for (;;) {
+        const intptr_t startModifiedCnt = procBlocks.getNumOfMods();
+        int numOfLockedBins;
+
+        for (;;) {
+            numOfLockedBins = 0;
+
+            // TODO: try different bin search order
+            if (res16Kaligned) {
+                if (!block)
+                    for (int i=freeAlignedBins.getMinNonemptyBin(nativeBin);
+                         i<freeBinsNum;
+                         i=freeAlignedBins.getMinNonemptyBin(i+1))
+                        if (block = getFromAlignedSpace(i, num, size, /*res16Kaligned=*/true, /*wait=*/false, &numOfLockedBins))
+                            break;
+                if (!block && largeBinsUpdated)
+                    for (int i=freeLargeBins.getMinNonemptyBin(nativeBin);
+                         i<freeBinsNum; i=freeLargeBins.getMinNonemptyBin(i+1))
+                        if (block = getFromBin(i, num, size, /*res16Kaligned=*/true, &numOfLockedBins))
+                            break;
+            } else {
+                if (largeBinsUpdated)
+                    for (int i=freeLargeBins.getMinNonemptyBin(nativeBin);
+                         i<freeBinsNum; i=freeLargeBins.getMinNonemptyBin(i+1))
+                        if (block = getFromBin(i, num, size, /*res16Kaligned=*/false, &numOfLockedBins))
+                            break;
+                if (!block)
+                    for (int i=freeAlignedBins.getMinNonemptyBin(nativeBin);
+                         i<freeBinsNum;
+                         i=freeAlignedBins.getMinNonemptyBin(i+1))
+                        if (block = getFromAlignedSpace(i, num, size, /*res16Kaligned=*/false, /*wait=*/false, &numOfLockedBins))
+                            break;
+            }
+            if (block || numOfLockedBins<=lockedBinsThreshold)
+                break;
+        }
+        if (block)
+            break;
+
+        largeBinsUpdated = scanCoalescQ(/*forceCoalescQDrop=*/true);
+        largeBinsUpdated = extMemPool->softCachesCleanup() || largeBinsUpdated;
+        if (!largeBinsUpdated) {
+            size_t maxBinSize = 0;
+
+            // Another thread is modifying backend while we can't get the block.
+            // Wait while it leaves
+            // and re-do the scan before other ways to extend the backend.
+            if (procBlocks.waitTillSignalled(startModifiedCnt)
+                // semaphore is protecting adding more more memory from OS
+                || memExtendingSema.wait())
+               continue;
+
+            if (startModifiedCnt != procBlocks.getNumOfMods()) {
+                memExtendingSema.signal();
+                continue;
+            }
+
+            // To keep objects below maxBinedSize, region must be larger then that.
+            // So trying to balance between too small regions (that leads to
+            // fragmentation) and too large ones (that leads to excessive address
+            // space consumption). If region is "quite large", allocate only one,
+            // to prevent fragmentation. It supposely doesn't hurt perfromance,
+            // because the object requested by user is large.
+            const size_t regSz_sizeBased =
+                alignUp(4*FencedLoad((intptr_t&)maxRequestedSize), 1024*1024);
+            if (size == blockSize || regSz_sizeBased < maxBinedSize) {
+                const size_t extendingRegionSize = maxBinedSize;
+                for (unsigned idx=0; idx<4; idx++) {
+                    size_t binSize =
+                        addNewRegion(extendingRegionSize);
+                    if (!binSize)
+                        break;
+                    if (binSize > maxBinSize)
+                        maxBinSize = binSize;
+                }
+            } else {
+                maxBinSize = addNewRegion(regSz_sizeBased);
+            }
+            memExtendingSema.signal();
+
+            // size can be >= maxBinedSize, when getRawMem failed
+            // for this allocation, and allocation in bins
+            // is our last chance to fulfil the request.
+            // Sadly, size is larger then max bin, so have to give up.
+            if (maxBinSize && maxBinSize < size)
+                return NULL;
+
+            if (!maxBinSize) { // no regions have been added, try to clean cache
+                if (extMemPool->hardCachesCleanup())
+                    largeBinsUpdated = true;
+                else {
+                    if (procBlocks.waitTillSignalled(startModifiedCnt))
+                        continue;
+                    // OS can't give us more memory, but we have some in locked bins
+                    if (lockedBinsThreshold && numOfLockedBins) {
+                        lockedBinsThreshold = 0;
+                        continue;
+                    }
+                    return NULL;
+                }
+            }
+        }
+    }
+    return block;
 }
 
-void FreeBlocks::putList(BlockI *head, BlockI *tail)
+LargeMemoryBlock *Backend::getLargeBlock(size_t size, bool startup)
 {
-    unsigned myFreeList = getCPUid()%numOfFreeBlockLists;
-    MALLOC_ITT_SYNC_RELEASING(freeBlockList+myFreeList);
-    freeBlockList[myFreeList].pushList((void**)head, (void**)tail);
+    bool directRawMemCall = false;
+    void *lmb;
+
+    if (size >= maxBinedSize && !extMemPool->fixedSizePool()) {
+        directRawMemCall = true;
+        if (! (lmb = getRawMem(size, /*useMapMem=*/true))) {
+            bool hardCleanupDone = false;
+
+            // try to clean caches, hoping to find memory after it
+            if (!extMemPool->softCachesCleanup()) {
+                if (!extMemPool->hardCachesCleanup())
+                    return NULL;
+                hardCleanupDone = true;
+            }
+            if (! (lmb = getRawMem(size, /*useMapMem=*/true))) {
+                if (hardCleanupDone || !extMemPool->hardCachesCleanup())
+                    return NULL;
+                if (! (lmb = getRawMem(size, /*useMapMem=*/true))) {
+                    // our last chance is to get the block from bins
+                    lmb = genericGetBlock(1, size, /*res16Kaligned=*/false,
+                                          startup);
+                    if (!lmb) return NULL;
+                    directRawMemCall = false;
+                }
+            }
+        }
+    } else
+        lmb = genericGetBlock(1, size, /*res16Kaligned=*/false, startup);
+
+    LargeMemoryBlock *res = (LargeMemoryBlock*)lmb;
+    if (res) {
+        res->directRawMemCall = directRawMemCall;
+        res->unalignedSize = size;
+    }
+    return res;
 }
 
-/*
- * Big Blocks are the blocks we get from the OS or some similar place using getMemory above.
- * They are placed on the freeBlockList once they are acquired.
- */
-bool FreeBlocks::mallocBigBlock()
+void Backend::removeBlockFromBin(FreeBlock *fBlock)
 {
-/* Divide the big block into smaller bigBlocks that hold that many blocks.
- * This is done since we really need a lot of blocks on the freeBlockList 
- * or there will be contention problems.
- */
-    const unsigned int blocksPerBigBlock = 16/numOfFreeBlockLists;
+    if (fBlock->myBin != Backend::NO_BIN)
+        if (fBlock->aligned)
+            freeAlignedBins.lockRemoveBlock(fBlock->myBin, fBlock);
+        else
+            freeLargeBins.lockRemoveBlock(fBlock->myBin, fBlock);
+}
 
-    void *unalignedBigBlock = (*rawAlloc)(memReqSize, /*useMapMem=*/true);
+void Backend::genericPutBlock(FreeBlock *fBlock, size_t blockSz,
+                              bool directRawMemCall)
+{
+    if (blockSz >= maxBinedSize && !extMemPool->fixedSizePool()
+        && directRawMemCall)
+        freeRawMem(fBlock, blockSz, /*useMapMem=*/true);
+    else {
+        procBlocks.consume();
+        coalescAndPut(fBlock, blockSz);
+        procBlocks.signal();
+    }
+}
 
-    if (!unalignedBigBlock) {
-        TRACEF(( "[ScalableMalloc trace] in mallocBigBlock, getMemory returns 0\n" ));
-        /* We can't get any more memory from the OS or executive */
-        return false;
+void Backend::releaseRegion(MemRegion *memRegion)
+{
+    {
+        MallocMutex::scoped_lock lock(regionListLock);
+        if (regionList == memRegion)
+            regionList = memRegion->next;
+        if (memRegion->next)
+            memRegion->next->prev = memRegion->prev;
+        if (memRegion->prev)
+            memRegion->prev->next = memRegion->next;
+    }
+    freeRawMem(memRegion, memRegion->allocSz, /*useMapMem=*/true);
+}
+
+// coalesce fBlock with its neighborhood
+FreeBlock *Backend::doCoalesc(FreeBlock *fBlock, MemRegion **mRegion)
+{
+    FreeBlock *resBlock = fBlock;
+    size_t resSize = fBlock->sizeTmp;
+    MemRegion *memRegion = NULL;
+
+    fBlock->markCoalescing(resSize);
+    resBlock->blockInBin = false;
+
+    // coalesing with left neighbor
+    size_t leftSz = fBlock->trySetLeftUsed(GuardedSize::COAL_BLOCK);
+    if (leftSz != GuardedSize::LOCKED) {
+        if (leftSz == GuardedSize::COAL_BLOCK) {
+            coalescQ.putBlock(fBlock);
+            return NULL;
+        } else {
+            FreeBlock *left = fBlock->leftNeig(leftSz);
+            size_t lSz = left->trySetMeUsed(GuardedSize::COAL_BLOCK);
+            if (lSz <= GuardedSize::MAX_LOCKED_VAL) {
+                fBlock->setLeftFree(leftSz); // rollback
+                coalescQ.putBlock(fBlock);
+                return NULL;
+            } else {
+                MALLOC_ASSERT(lSz == leftSz, "Invalid header");
+                left->blockInBin = true;
+                resBlock = left;
+                resSize += leftSz;
+                resBlock->sizeTmp = resSize;
+            }
+        }
+    }
+    // coalesing with right neighbor
+    FreeBlock *right = fBlock->rightNeig(fBlock->sizeTmp);
+    size_t rightSz = right->trySetMeUsed(GuardedSize::COAL_BLOCK);
+    if (rightSz != GuardedSize::LOCKED) {
+        // LastFreeBlock is on the right side
+        if (GuardedSize::LAST_REGION_BLOCK == rightSz) {
+            right->setMeFree(GuardedSize::LAST_REGION_BLOCK);
+            memRegion = static_cast<LastFreeBlock*>(right)->memRegion;
+        } else if (GuardedSize::COAL_BLOCK == rightSz) {
+            if (resBlock->blockInBin) {
+                resBlock->blockInBin = false;
+                removeBlockFromBin(resBlock);
+            }
+            coalescQ.putBlock(resBlock);
+            return NULL;
+        } else {
+            size_t rSz = right->rightNeig(rightSz)->
+                trySetLeftUsed(GuardedSize::COAL_BLOCK);
+            if (rSz <= GuardedSize::MAX_LOCKED_VAL) {
+                right->setMeFree(rightSz);  // rollback
+                if (resBlock->blockInBin) {
+                    resBlock->blockInBin = false;
+                    removeBlockFromBin(resBlock);
+                }
+                coalescQ.putBlock(resBlock);
+                return NULL;
+            } else {
+                MALLOC_ASSERT(rSz == rightSz, "Invalid header");
+                removeBlockFromBin(right);
+                resSize += rightSz;
+
+                // Is LastFreeBlock on the right side of right?
+                FreeBlock *nextRight = right->rightNeig(rightSz);
+                size_t nextRightSz = nextRight->
+                    trySetMeUsed(GuardedSize::COAL_BLOCK);
+                if (nextRightSz > GuardedSize::MAX_LOCKED_VAL) {
+                    if (nextRightSz == GuardedSize::LAST_REGION_BLOCK)
+                        memRegion = static_cast<LastFreeBlock*>(nextRight)->memRegion;
+
+                    nextRight->setMeFree(nextRightSz);
+                }
+            }
+        }
     }
+    if (memRegion) {
+        MALLOC_ASSERT((uintptr_t)memRegion + memRegion->allocSz >=
+                      (uintptr_t)right + sizeof(LastFreeBlock), ASSERT_TEXT);
+        MALLOC_ASSERT((uintptr_t)memRegion < (uintptr_t)resBlock, ASSERT_TEXT);
+        *mRegion = memRegion;
+    } else
+        *mRegion = NULL;
+    resBlock->sizeTmp = resSize;
+    return resBlock;
+}
+
+void Backend::coalescAndPutList(FreeBlock *list, bool forceCoalescQDrop, bool doStat)
+{
+    FreeBlock *helper;
+    MemRegion *memRegion;
+    int alignedSpaceIdx = -1;
+
+    for (;list; list = helper) {
+        helper = list->nextToFree;
+        FreeBlock *toRet = doCoalesc(list, &memRegion);
+        if (!toRet)
+            continue;
+
+        if (memRegion && memRegion->blockSz == toRet->sizeTmp
+            && !extMemPool->fixedSizePool()) {
+            // release the region, because there is no used blocks in it
+            if (toRet->blockInBin)
+                removeBlockFromBin(toRet);
+
+            releaseRegion(memRegion);
+        } else {
+            size_t currSz = toRet->sizeTmp;
+            int bin = sizeToBin(currSz);
+            bool toAligned = toAlignedBin(toRet, currSz);
+            bool needAddToBin = true;
+
+            if (toRet->blockInBin) {
+                // is it stay in same bin?
+                if (toRet->myBin == bin && toRet->aligned == toAligned)
+                    needAddToBin = false;
+                else {
+                    toRet->blockInBin = false;
+                    removeBlockFromBin(toRet);
+                }
+            }
+
+            // not stay in same bin, or bin-less, add it
+            if (needAddToBin) {
+                toRet->prev = toRet->next = toRet->nextToFree = NULL;
+                toRet->myBin = NO_BIN;
+                toRet->sizeTmp = 0;
+
+                // If the block is too small to fit in any bin, keep it bin-less.
+                // It's not a leak because the block later can be coalesced.
+                if (currSz >= minBinedSize) {
+                    if (!(toAligned?
+                          freeAlignedBins.tryAddBlock(bin, toRet, currSz) :
+                          freeLargeBins.tryAddBlock(bin, toRet, currSz))) {
+                        toRet->sizeTmp = currSz;
+                        coalescQ.putBlock(toRet);
+                        continue;
+                    }
+                }
+            }
+            // Free (possibly coalesced) free block.
+            // Adding to bin must be done before this point,
+            // because after a block is free it can be coalesced, and
+            // using its pointer became unsafe.
+            // Remember that coalescing is not done under any global lock.
+            toRet->setMeFree(currSz);
+            toRet->rightNeig(currSz)->setLeftFree(currSz);
+        }
+    }
+}
+
+// Coalesce fBlock and add it back to a bin;
+// processing delayed coalescing requests.
+void Backend::coalescAndPut(FreeBlock *fBlock, size_t blockSz)
+{
+    fBlock->sizeTmp = blockSz;
+    fBlock->nextToFree = NULL;
 
-    void *alignedBigBlock = alignUp(unalignedBigBlock, blockSize);
-    void *bigBlockCeiling = (void*)((uintptr_t)unalignedBigBlock + memReqSize);
+    coalescAndPutList(fBlock, /*forceCoalescQDrop=*/false, /*doStat=*/false);
+}
 
-    size_t bigBlockSplitSize = blocksPerBigBlock * blockSize;
+bool Backend::scanCoalescQ(bool forceCoalescQDrop)
+{
+    FreeBlock *currCoalescList = coalescQ.getAll();
 
-    BlockI *splitBlock = (BlockI*)alignedBigBlock;
+    if (currCoalescList)
+        coalescAndPutList(currCoalescList, forceCoalescQDrop, /*doStat=*/true);
+    return currCoalescList;
+}
 
-    // distribute alignedBigBlock between all freeBlockList elements
-    for (unsigned currListIdx = 0;
-         ((uintptr_t)splitBlock + blockSize) <= (uintptr_t)bigBlockCeiling;
-         currListIdx = (currListIdx+1) % numOfFreeBlockLists) {
-        void *splitEdge = (void*)((uintptr_t)splitBlock + bigBlockSplitSize);
-        if( splitEdge > bigBlockCeiling) {
-            splitEdge = alignDown(bigBlockCeiling, blockSize);
+size_t Backend::initRegion(MemRegion *region, size_t rawSize)
+{
+    FreeBlock *fBlock = (FreeBlock *)((uintptr_t)region + sizeof(MemRegion));
+    // right bound is 16KB-aligned, keep LastFreeBlock after it
+    size_t blockSz =
+        alignDown((uintptr_t)region + rawSize - sizeof(LastFreeBlock), blockSize)
+        - ((uintptr_t)region + sizeof(MemRegion));
+    if (blockSz < blockSize) return 0;
+    MALLOC_ASSERT(isAligned((uintptr_t)fBlock+blockSz, blockSize), ASSERT_TEXT);
+
+    fBlock->initHeader();
+    fBlock->setMeFree(blockSz);
+
+    LastFreeBlock *lastBl = static_cast<LastFreeBlock*>(fBlock->rightNeig(blockSz));
+    lastBl->initHeader();
+    lastBl->setMeFree(GuardedSize::LAST_REGION_BLOCK);
+    lastBl->setLeftFree(blockSz);
+    lastBl->myBin = NO_BIN;
+    lastBl->memRegion = region;
+
+    unsigned targetBin = sizeToBin(blockSz);
+    region->allocSz = rawSize;
+    region->blockSz = blockSz;
+    if (toAlignedBin(fBlock, blockSz)) {
+        freeAlignedBins.addBlock(targetBin, fBlock, blockSz);
+    } else {
+        freeLargeBins.addBlock(targetBin, fBlock, blockSz);
+    }
+    return blockSz;
+}
+
+size_t Backend::addNewRegion(size_t rawSize)
+{
+    size_t binSize;
+    // to guarantee that header is not overwritten in used blocks
+    MALLOC_ASSERT(sizeof(BlockMutexes) <= sizeof(BlockI), ASSERT_TEXT);
+    // to guarantee that block length is not conflicting with
+    // special values of GuardedSize
+    MALLOC_ASSERT(FreeBlock::minBlockSize > GuardedSize::MAX_SPEC_VAL, ASSERT_TEXT);
+
+    MemRegion *region = (MemRegion*)getRawMem(rawSize,  /*useMapMem=*/true);
+    // it's rough estimation, but enough to do correct check after alignment
+    if (!region || rawSize < sizeof(MemRegion)+blockSize) {
+        return 0;
+    }
+
+    {
+        region->prev = NULL;
+        MallocMutex::scoped_lock lock(regionListLock);
+        region->next = regionList;
+        regionList = region;
+        if (regionList->next)
+            regionList->next->prev = regionList;
+    }
+    if (! (binSize = initRegion(region, rawSize))) {
+        {
+            MallocMutex::scoped_lock lock(regionListLock);
+            if (regionList == region)
+                regionList = region->next;
+            if (region->next)
+                region->next->prev = region->prev;
+            if (region->prev)
+                region->prev->next = region->next;
         }
-        ((BlockI*)splitBlock)->initialize(splitEdge);
-        MALLOC_ITT_SYNC_RELEASING(freeBlockList+currListIdx);
-        freeBlockList[currListIdx].push((void**) splitBlock);
-        splitBlock = (BlockI*)splitEdge;
+        freeRawMem(region, rawSize, /*useMapMem=*/true);
+        return 0;
     }
+    procBlocks.pureSignal();
 
-    TRACEF(( "[ScalableMalloc trace] in mallocBigBlock returning 1\n" ));
+    return binSize;
+}
+
+bool Backend::reset()
+{
+    MemRegion *curr;
+
+    MALLOC_ASSERT(extMemPool->userPool(), "Only user pool can be reset.");
+
+    freeLargeBins.reset();
+    freeAlignedBins.reset();
+
+    for (curr = regionList; curr; curr = curr->next)
+        if (!initRegion(curr, curr->allocSz))
+            return false;
     return true;
 }
 
+bool Backend::destroy()
+{
+    MALLOC_ASSERT(extMemPool->userPool(), "Only user pool can be destroyed.");
+    while (regionList) {
+        MemRegion *helper = regionList->next;
+        (*extMemPool->rawFree)(extMemPool->poolId, regionList,
+                               regionList->allocSz);
+        regionList = helper;
+    }
+    return true;
+}
+
+size_t Backend::Bin::countFreeBlocks()
+{
+    size_t cnt = 0;
+    for (FreeBlock *fb = head; fb; fb = fb->next)
+        cnt++;
+    return cnt;
+}
+
+
 } } // namespaces
diff --git a/src/tbbmalloc/backref.cpp b/src/tbbmalloc/backref.cpp
index c20084f..f699e28 100644
--- a/src/tbbmalloc/backref.cpp
+++ b/src/tbbmalloc/backref.cpp
@@ -38,7 +38,7 @@ namespace internal {
 /* Each 16KB block and each large memory object header contains BackRefIdx 
  * that points out in some BackRefBlock which points back to this block or header.
  */
-struct BackRefBlock {
+struct BackRefBlock : public BlockI {
     BackRefBlock *nextForUse;     // the next in the chain of blocks with free items
     FreeObject   *bumpPtr;        // bump pointer moves from the end to the beginning of the block
     FreeObject   *freeList;
@@ -50,11 +50,12 @@ struct BackRefBlock {
     BackRefBlock(BackRefBlock *blockToUse, int myNum) :
         nextForUse(NULL), bumpPtr((FreeObject*)((uintptr_t)blockToUse + blockSize - sizeof(void*))),
         freeList(NULL), allocatedCount(0), myNum(myNum), addedToForUse(false) {
+        memset(&blockMutex, 0, sizeof(MallocMutex));
         // index in BackRefMaster must fit to uint16_t
-        MALLOC_ASSERT(!(myNum >> 16), ASSERT_TEXT); 
+        MALLOC_ASSERT(!(myNum >> 16), ASSERT_TEXT);
     }
 
-    // when BackRefMaster::findFreeBlock() calls getRawBlock, 
+    // when BackRefMaster::findFreeBlock() calls get16KBlock
     // BackRefBlock::bytes is used implicitly
     static const int bytes = blockSize;
 };
@@ -70,6 +71,7 @@ struct BackRefMaster {
     static const size_t bytes = 64*1024;
     static const int dataSz;
 
+    Backend       *backend;
     BackRefBlock  *active;         // if defined, use it for allocations
     BackRefBlock  *listForUse;     // the chain of data blocks with free items
     int            lastUsed;       // index of the last used block
@@ -86,13 +88,19 @@ const int BackRefMaster::dataSz
 static MallocMutex backRefMutex;
 static BackRefMaster *backRefMaster;
 
-bool initBackRefMaster()
+bool initBackRefMaster(Backend *backend)
 {
     // reserve space for master table and 4 leaves taking into account VirtualAlloc allocation granularity
     // MapMemory is forced because the function runs during startup.
     const int leaves = 4;
-    if (! (backRefMaster = (BackRefMaster*)getRawMemory(BackRefMaster::bytes+leaves*BackRefBlock::bytes, /*useMapMem=*/true)))
+    const size_t masterSize = BackRefMaster::bytes+leaves*BackRefBlock::bytes;
+
+    backRefMaster = (BackRefMaster*)getRawMemory(masterSize, /*useMapMem=*/true);
+    if (!backRefMaster)
+        backRefMaster = (BackRefMaster*)backend->getLargeBlock(masterSize, /*startup=*/true);
+    if (! backRefMaster)
         return false;
+    backRefMaster->backend = backend;
     backRefMaster->listForUse = NULL;
     for (int i=0; i<leaves; i++) {
         BackRefBlock *bl = (BackRefBlock *)((uintptr_t)backRefMaster + BackRefMaster::bytes + i*BackRefBlock::bytes);
@@ -115,7 +123,8 @@ void BackRefMaster::addBackRefBlockToList(BackRefBlock *bl)
 
 void BackRefMaster::addEmptyBackRefBlock(BackRefBlock *newBl)
 {
-    memset(newBl, 0, BackRefBlock::bytes);
+    memset((char*)newBl+sizeof(BackRefBlock), 0,
+           BackRefBlock::bytes-sizeof(BackRefBlock));
     new (newBl) BackRefBlock(newBl, lastUsed);
     backRefBl[lastUsed] = newBl;
 }
@@ -124,18 +133,20 @@ BackRefBlock *BackRefMaster::findFreeBlock()
 {
     if (active->allocatedCount < BR_MAX_CNT)
         return active;
-        
+
     if (listForUse) {                                   // use released list
         active = listForUse;
         listForUse = listForUse->nextForUse;
         MALLOC_ASSERT(active->addedToForUse, ASSERT_TEXT);
         active->addedToForUse = false;
     } else if (lastUsed-1 < backRefMaster->dataSz) {    // allocate new data node
-        // TODO: this block is never released, so can prevent re-using
-        // of the memory it belong to in the backend, 
-        // getRawMemory can be used instead.
-        BackRefBlock *newBl = 
-            (BackRefBlock*)BlockI::getRawBlock( /*startup=*/!isMallocInitializedExt() );
+        // This block is never released, so can prevent releasing of a region
+        // if it's received from the backend, so prefer getRawMemory using.
+        BackRefBlock *newBl = (BackRefBlock*)
+            getRawMemory(BackRefBlock::bytes,
+                         /*useMapMem=*/!isMallocInitializedExt());
+        if (!newBl)
+            newBl = (BackRefBlock*)backend->get16KBlock(1, /*startup=*/!isMallocInitializedExt());
         if (!newBl) return NULL;
         lastUsed++;
         backRefMaster->addEmptyBackRefBlock(newBl);
@@ -149,7 +160,7 @@ void *getBackRef(BackRefIdx backRefIdx)
 {
     // !backRefMaster means no initialization done, so it can't be valid memory
     if (!backRefMaster || backRefIdx.getMaster() > backRefMaster->lastUsed
-        || backRefIdx.getOffset() >= BR_MAX_CNT) 
+        || backRefIdx.getOffset() >= BR_MAX_CNT)
         return NULL;
     return *(void**)((uintptr_t)backRefMaster->backRefBl[backRefIdx.getMaster()]
                      + sizeof(BackRefBlock)+backRefIdx.getOffset()*sizeof(void*));
@@ -184,9 +195,13 @@ BackRefIdx BackRefIdx::newBackRef(bool largeObj)
             if (blockToUse->freeList) {
                 toUse = (void**)blockToUse->freeList;
                 blockToUse->freeList = blockToUse->freeList->next;
+                MALLOC_ASSERT(!blockToUse->freeList ||
+                              ((uintptr_t)blockToUse->freeList>=(uintptr_t)blockToUse
+                               && (uintptr_t)blockToUse->freeList <
+                               (uintptr_t)blockToUse + blockSize), ASSERT_TEXT);
             } else if (blockToUse->allocatedCount < BR_MAX_CNT) {
                 toUse = (void**)blockToUse->bumpPtr;
-                blockToUse->bumpPtr = 
+                blockToUse->bumpPtr =
                     (FreeObject*)((uintptr_t)blockToUse->bumpPtr - sizeof(void*));
                 if (blockToUse->allocatedCount == BR_MAX_CNT-1) {
                     MALLOC_ASSERT((uintptr_t)blockToUse->bumpPtr
@@ -200,7 +215,7 @@ BackRefIdx BackRefIdx::newBackRef(bool largeObj)
         } // end of lock scope
     } while (!toUse);
     res.master = blockToUse->myNum;
-    uintptr_t offset = 
+    uintptr_t offset =
         ((uintptr_t)toUse - ((uintptr_t)blockToUse + sizeof(BackRefBlock)))/sizeof(void*);
     // Is offset too big?
     MALLOC_ASSERT(!(offset >> 15), ASSERT_TEXT);
@@ -212,15 +227,22 @@ BackRefIdx BackRefIdx::newBackRef(bool largeObj)
 
 void removeBackRef(BackRefIdx backRefIdx)
 {
-    MALLOC_ASSERT(backRefIdx.getMaster()<=backRefMaster->lastUsed 
+    MALLOC_ASSERT(!backRefIdx.isInvalid(), ASSERT_TEXT);
+    MALLOC_ASSERT(backRefIdx.getMaster()<=backRefMaster->lastUsed
                   && backRefIdx.getOffset()<BR_MAX_CNT, ASSERT_TEXT);
     BackRefBlock *currBlock = backRefMaster->backRefBl[backRefIdx.getMaster()];
     FreeObject *freeObj = (FreeObject*)((uintptr_t)currBlock + sizeof(BackRefBlock)
                                         + backRefIdx.getOffset()*sizeof(void*));
+    MALLOC_ASSERT(((uintptr_t)freeObj>(uintptr_t)currBlock &&
+                   (uintptr_t)freeObj<(uintptr_t)currBlock + blockSize), ASSERT_TEXT);
     {
         MallocMutex::scoped_lock lock(currBlock->blockMutex);
 
         freeObj->next = currBlock->freeList;
+        MALLOC_ASSERT(!freeObj->next ||
+                      ((uintptr_t)freeObj->next > (uintptr_t)currBlock
+                       && (uintptr_t)freeObj->next <
+                       (uintptr_t)currBlock + blockSize), ASSERT_TEXT);
         currBlock->freeList = freeObj;
         currBlock->allocatedCount--;
     }
diff --git a/src/tbbmalloc/frontend.cpp b/src/tbbmalloc/frontend.cpp
index cb22139..4fa15e7 100644
--- a/src/tbbmalloc/frontend.cpp
+++ b/src/tbbmalloc/frontend.cpp
@@ -29,24 +29,21 @@
 
 #include "tbbmalloc_internal.h"
 #include <errno.h>
+#include <new>        /* for placement new */
+#include <string.h>   /* for memset */
 
 //! Define the main synchronization method
-/** It should be specified before including LifoList.h */
 #define FINE_GRAIN_LOCKS
-#include "LifoList.h"
 
 #if USE_PTHREAD
     #define TlsSetValue_func pthread_setspecific
     #define TlsGetValue_func pthread_getspecific
-    typedef pthread_key_t tls_key_t;
     #include <sched.h>
     inline void do_yield() {sched_yield();}
 
 #elif USE_WINTHREAD
-    #include "tbb/machine/windows_api.h"
     #define TlsSetValue_func TlsSetValue
     #define TlsGetValue_func TlsGetValue
-    typedef DWORD tls_key_t;
     inline void do_yield() {SwitchToThread();}
 
 #else
@@ -60,9 +57,11 @@
 void mallocThreadShutdownNotification(void* arg);
 
 namespace rml {
+class MemoryPool;
 namespace internal {
 
 class Block;
+class MemoryPool;
 
 #if MALLOC_CHECK_RECURSION
 
@@ -124,8 +123,9 @@ class BootStrapBlocks {
     Block      *bootStrapBlockUsed;
     FreeObject *bootStrapObjectList;
 public:
-    void *allocate(size_t size);
+    void *allocate(MemoryPool *memPool, size_t size);
     void free(void* ptr);
+    void reset();
 };
 
 class ThreadId {
@@ -176,6 +176,44 @@ bool operator==(const ThreadId &id1, const ThreadId &id2) {
 
 unsigned int getThreadId() { return ThreadId::get().id; }
 
+/*********** Code to provide thread ID and a thread-local void pointer **********/
+
+TLSKey::TLSKey()
+{
+#if USE_WINTHREAD
+    TLS_pointer_key = TlsAlloc();
+#else
+    int status = pthread_key_create( &TLS_pointer_key, mallocThreadShutdownNotification );
+    if ( status ) {
+        fprintf (stderr, "The memory manager cannot create tls key during initialization; exiting \n");
+        exit(1);
+    }
+#endif /* USE_WINTHREAD */
+}
+
+TLSKey::~TLSKey()
+{
+#if USE_WINTHREAD
+    TlsFree(TLS_pointer_key);
+#else
+    int status1 = pthread_key_delete(TLS_pointer_key);
+    if ( status1 ) {
+        fprintf (stderr, "The memory manager cannot delete tls key during; exiting \n");
+        exit(1);
+    }
+#endif /* USE_WINTHREAD */
+}
+
+inline TLSData* TLSKey::getThreadMallocTLS() const
+{
+    return (TLSData *)TlsGetValue_func( TLS_pointer_key );
+}
+
+inline void TLSKey::setThreadMallocTLS( TLSData * newvalue ) {
+    RecursiveMallocCallProtector scoped;
+    TlsSetValue_func( TLS_pointer_key, newvalue );
+}
+
 /* The 'next' field in the block header has to maintain some invariants:
  *   it needs to be on a 16K boundary and the first field in the block.
  *   Any value stored there needs to have the lower 14 bits set to 0
@@ -190,12 +228,82 @@ unsigned int getThreadId() { return ThreadId::get().id; }
  */
 class Bin;
 class StartupBlock;
-struct TLSData;
+class TLSData;
+
+class LifoList {
+public:
+    inline LifoList();
+    inline void push(Block *block);
+    inline Block *pop();
+
+private:
+    Block *top;
+#ifdef FINE_GRAIN_LOCKS
+    MallocMutex lock;
+#endif /* FINE_GRAIN_LOCKS     */
+};
+
+/*
+ * When a block that is not completely free is returned for reuse by other threads
+ * this is where the block goes.
+ *
+ * LifoList assumes zero initialization; so below its constructors are omitted,
+ * to avoid linking with C++ libraries on Linux.
+ */
+
+class OrphanedBlocks {
+    LifoList bins[numBlockBinLimit];
+public:
+    Block *get(Bin* bin, unsigned int size);
+    void put(Bin* bin, Block *block);
+    void reset();
+};
 
-class LocalBlockFields : public BlockI {
+class MemoryPool {
+    static MallocMutex  memPoolListLock;
+
+    MemoryPool();                  // deny
+public:
+#if USE_WINTHREAD
+    // list of all active pools is used under Windows to release
+    // all TLS data on thread termination
+    MemoryPool    *next,
+                  *prev;
+#endif
+    ExtMemoryPool  extMemPool;
+    OrphanedBlocks orphanedBlocks;
+    BootStrapBlocks bootStrapBlocks;
+
+    bool init(intptr_t poolId, const MemPoolPolicy* memPoolPolicy);
+    void reset();
+    void destroy();
+
+    void initTLS() { new (&extMemPool.tlsPointerKey) TLSKey(); }
+    TLSData *getTLS() { return extMemPool.tlsPointerKey.getThreadMallocTLS(); }
+    void clearTLS() { extMemPool.tlsPointerKey.setThreadMallocTLS(NULL); }
+    Bin *getAllocationBin(size_t size);
+    Block *getEmptyBlock(size_t size);
+    void returnEmptyBlock(Block *block, bool poolTheBlock);
+};
+
+MallocMutex  MemoryPool::memPoolListLock;
+static char defaultMemPool_space[sizeof(MemoryPool)];
+static MemoryPool *defaultMemPool = (MemoryPool *)defaultMemPool_space;
+
+// Block is 16KB-aligned. To prvent false sharing, separate locally-accessed
+// fields and fields commonly accessed by not owner threads.
+class GlobalBlockFields : public BlockI {
+protected:
+    FreeObject  *publicFreeList;
+    Block       *nextPrivatizable;
+};
+
+class LocalBlockFields : public GlobalBlockFields {
 protected:
-    Block       *next;            /* This field needs to be on a 16K boundary and the first field in the block
-                                     for LIFO lists to work. */
+    size_t       __pad_local_fields[(blockHeaderAlignment -
+                                     sizeof(GlobalBlockFields))/sizeof(size_t)];
+
+    Block       *next;
     Block       *previous;        /* Use double linked list to speed up removal */
     unsigned int objectSize;
     ThreadId     owner;
@@ -205,55 +313,58 @@ protected:
     unsigned int allocatedCount;  /* Number of objects allocated (obviously by the owning thread) */
     bool         isFull;
 
-    friend void *BootStrapBlocks::allocate(size_t size);
+    friend void *BootStrapBlocks::allocate(MemoryPool *memPool, size_t size);
     friend class FreeBlockPool;
     friend class StartupBlock;
-    friend void BlockI::initialize(void *bumpPtr);
+    friend class LifoList;
+    friend Block *MemoryPool::getEmptyBlock(size_t size);
 };
 
 class Block : public LocalBlockFields {
-    size_t       __pad_local_fields[(blockHeaderAlignment-sizeof(LocalBlockFields))/sizeof(size_t)];
-    FreeObject  *publicFreeList;
-    Block       *nextPrivatizable;
-    size_t       __pad_public_fields[(blockHeaderAlignment-2*sizeof(void*))/sizeof(size_t)];
-
+    size_t       __pad_public_fields[(2*blockHeaderAlignment -
+                                      sizeof(LocalBlockFields))/sizeof(size_t)];
 public:
-    static Block *getEmpty(size_t size);
-
     inline FreeObject* allocate();
     inline FreeObject *allocateFromFreeList();
     inline bool emptyEnoughToUse();
     bool freeListNonNull() { return freeList; }
     void freePublicObject(FreeObject *objectToFree);
-    inline void freeOwnObject(FreeObject *objectToFree);
-    void returnEmpty(bool poolTheBlock);
+    inline void freeOwnObject(MemoryPool *memPool, FreeObject *objectToFree);
+    void makeEmpty();
     void privatizePublicFreeList();
     void restoreBumpPtr();
     void privatizeOrphaned(Bin *bin);
     void shareOrphaned(const Bin *bin);
-    unsigned int getSize() const { return objectSize; }
+    unsigned int getSize() const {
+        MALLOC_ASSERT(isStartupAllocObject() || objectSize<minLargeObjectSize,
+                      "Invalid object size");
+        return objectSize;
+    }
     const BackRefIdx *getBackRefIdx() const { return &backRefIdx; }
     bool ownBlock() const { return owner.own(); }
     bool isStartupAllocObject() const { return objectSize == startupAllocObjSizeMark; }
     inline FreeObject *findObjectToFree(void *object) const;
-    bool checkFreePrecond() const { return allocatedCount>0; }
+    bool checkFreePrecond(void *object) const {
+        return allocatedCount>0
+            && allocatedCount <= (blockSize-sizeof(Block))/objectSize
+            && (!bumpPtr || object>bumpPtr);
+    }
     const BackRefIdx *getBackRef() const { return &backRefIdx; }
+    void initEmptyBlock(Bin* tlsBin, size_t size);
 
 protected:
-    static Block *getRaw(bool startup);
     void cleanBlockHeader();
 
 private:
     static const float emptyEnoughRatio; /* "Reactivate" a block if this share of its objects is free. */
 
     inline FreeObject *allocateFromBumpPtr();
-    void initEmptyBlock(size_t size);
     inline FreeObject *findAllocatedObject(const void *address) const;
     inline bool isProperlyPlaced(const void *object) const;
 
     friend class Bin;
     friend void ::mallocThreadShutdownNotification(void* arg);
-    friend BlockI *BlockI::getRawBlock(bool startup);
+    friend void MemoryPool::destroy();
 };
 
 const float Block::emptyEnoughRatio = 1.0 / 4.0;
@@ -263,21 +374,24 @@ class Bin {
     Block      *mailbox;
     MallocMutex mailLock;
 
-    static TLSData* createTLS();
 public:
-    static inline Bin* getAllocationBin(size_t size);
-
     inline Block* getActiveBlock() const { return activeBlk; }
+    bool activeBlockUnused() const { return activeBlk && !activeBlk->allocatedCount; }
     inline void setActiveBlock(Block *block);
     inline Block* setPreviousBlockActive();
     Block* getPublicFreeListBlock();
     void moveBlockToBinFront(Block *block);
-    void processLessUsedBlock(Block *block);
+    void processLessUsedBlock(MemoryPool *memPool, Block *block);
 
     void outofTLSBin (Block* block);
     void verifyTLSBin (size_t size) const;
     void pushTLSBin(Block* block);
 
+    void verifyInitState() const {
+        MALLOC_ASSERT( activeBlk == 0, ASSERT_TEXT );
+        MALLOC_ASSERT( mailbox == 0, ASSERT_TEXT );
+    }
+
     friend void ::mallocThreadShutdownNotification(void* arg);
     friend void Block::freePublicObject (FreeObject *objectToFree);
 };
@@ -329,46 +443,91 @@ const uint32_t numBlockBins = minFittingIndex+numFittingBins;
 const uint32_t minLargeObjectSize = fittingSize5 + 1;
 
 /*
- * When a block that is not completely free is returned for reuse by other threads
- * this is where the block goes.
- *
- * LifoList assumes zero initialization; so below its constructors are omitted,
- * to avoid linking with C++ libraries on Linux.
- */
-
-class OrphanedBlocks {
-    LifoList bins[numBlockBinLimit];
-public:
-    Block *get(Bin* bin, unsigned int size);
-    void put(Bin* bin, Block *block);
-};
-
-static char globalBinSpace[sizeof(LifoList)*numBlockBinLimit];
-static OrphanedBlocks *orphanedBlocks = (OrphanedBlocks*)globalBinSpace;
-
-/*
  * Per-thread pool of 16KB blocks. Idea behind it is to not share with other
  * threads memory that are likely in local cache(s) of our CPU.
  */
 class FreeBlockPool {
-    Block *head;
-    Block *tail;
-    int    size;
+    Block      *head;
+    Block      *tail;
+    int         size;
+    Backend    *backend;
+    bool        lastAccessMiss;
     void insertBlock(Block *block);
 public:
     static const int POOL_HIGH_MARK = 32;
     static const int POOL_LOW_MARK  = 8;
 
-    Block *getBlock();
+    class ResOfGet {
+        ResOfGet();
+    public:
+        Block* block;
+        bool   lastAccMiss;
+        ResOfGet(Block *b, bool lastAccMiss) : block(b), lastAccMiss(lastAccMiss) {}
+    };
+
+    // allocated in zero-initialized memory
+    FreeBlockPool(Backend *backend) : backend(backend) {}
+    ResOfGet getBlock();
     void returnBlock(Block *block);
-    void releaseAllBlocks();
+    bool releaseAllBlocks();
 };
 
-struct TLSData {
+class TLSData {
+#if USE_PTHREAD
+    MemoryPool   *memPool;
+#endif
+public:
     Bin           bin[numBlockBinLimit];
     FreeBlockPool pool;
+#if USE_PTHREAD
+    TLSData(MemoryPool *memPool, Backend *backend) : memPool(memPool), pool(backend) {}
+    MemoryPool *getMemPool() const { return memPool; }
+#else
+    TLSData(MemoryPool * /*memPool*/, Backend *backend) : pool(backend) {}
+#endif
 };
 
+TLSData *TLSKey::createTLS(MemoryPool *memPool, Backend *backend)
+{
+    MALLOC_ASSERT( sizeof(TLSData) >= sizeof(Bin) * numBlockBins + sizeof(FreeBlockPool), ASSERT_TEXT );
+    TLSData* tls = (TLSData*) memPool->bootStrapBlocks.allocate(memPool, sizeof(TLSData));
+    if ( !tls )
+        return NULL;
+    new(tls) TLSData(memPool, backend);
+    /* the block contains zeroes after bootStrapMalloc, so bins are initialized */
+#if MALLOC_DEBUG
+    for (uint32_t i = 0; i < numBlockBinLimit; i++)
+        tls->bin[i].verifyInitState();
+#endif
+    setThreadMallocTLS(tls);
+    return tls;
+}
+
+bool ExtMemoryPool::release16KBCaches()
+{
+    bool released = false;
+    TLSData *tlsData = tlsPointerKey.getThreadMallocTLS();
+
+    if (tlsData) {
+        released = tlsData->pool.releaseAllBlocks();
+
+        // active blocks can be not used, so return them to backend
+        for (int i=0; i<numBlockBinLimit; i++)
+            if (tlsData->bin[i].activeBlockUnused()) {
+                Block *block = tlsData->bin[i].getActiveBlock();
+                tlsData->bin[i].outofTLSBin(block);
+                // 16KB blocks in user's pools not have valid backRefIdx
+                if (!userPool())
+                    removeBackRef(*(block->getBackRefIdx()));
+                backend.put16KBlock(block, /*startup=*/false);
+
+                released = true;
+            }
+    }
+    return released;
+}
+
+
 #if MALLOC_CHECK_RECURSION
 MallocMutex RecursiveMallocCallProtector::rmc_mutex;
 pthread_t   RecursiveMallocCallProtector::owner_thread;
@@ -380,27 +539,12 @@ bool        RecursiveMallocCallProtector::canUsePthread;
 
 #endif
 
-/*********** Code to provide thread ID and a thread-local void pointer **********/
-
-static tls_key_t TLS_pointer_key;
-
-static inline TLSData* getThreadMallocTLS() {
-    TLSData *result;
-    result = (TLSData *)TlsGetValue_func( TLS_pointer_key );
-// The assert below is incorrect: with lazy initialization, it fails on the first call of the function.
-//    MALLOC_ASSERT( result, "Memory allocator not initialized" );
-    return result;
-}
-
-static inline void  setThreadMallocTLS( TLSData * newvalue ) {
-    RecursiveMallocCallProtector scoped;
-    TlsSetValue_func( TLS_pointer_key, newvalue );
-}
-
 /*********** End code to provide thread ID and a TLS pointer **********/
 
 static void *internalMalloc(size_t size);
-static void  internalFree(void *object);
+static void internalFree(void *object);
+static void *internalPoolMalloc(rml::MemoryPool* mPool, size_t size);
+static bool internalPoolFree(rml::MemoryPool *mPool, void *object);
 
 #if !MALLOC_DEBUG
 #if __INTEL_COMPILER || _MSC_VER
@@ -415,7 +559,6 @@ static void  internalFree(void *object);
 #endif
 
 static NOINLINE( void doInitialization() );
-
 ALWAYSINLINE( bool isMallocInitialized() );
 
 #undef ALWAYSINLINE
@@ -517,18 +660,8 @@ static unsigned int getObjectSize (unsigned int size)
     return getIndexOrObjectSize</*indexRequest*/false>(size);
 }
 
-/*
- * Initialization code.
- *
- */
-
-/*
- * Forward Refs
- */
-
-static BootStrapBlocks bootStrapBlocks;
 
-void *BootStrapBlocks::allocate(size_t size)
+void *BootStrapBlocks::allocate(MemoryPool *memPool, size_t size)
 {
     FreeObject *result;
 
@@ -542,7 +675,7 @@ void *BootStrapBlocks::allocate(size_t size)
             bootStrapObjectList = bootStrapObjectList->next;
         } else {
             if (!bootStrapBlock) {
-                bootStrapBlock = Block::getEmpty(size);
+                bootStrapBlock = memPool->getEmptyBlock(size);
                 if (!bootStrapBlock) return NULL;
             }
             result = bootStrapBlock->bumpPtr;
@@ -570,6 +703,12 @@ void BootStrapBlocks::free(void* ptr)
     } // Unlock with release
 }
 
+void BootStrapBlocks::reset()
+{
+    bootStrapBlock = bootStrapBlockUsed = NULL;
+    bootStrapObjectList = NULL;
+}
+
 #if !(FREELIST_NONBLOCKING)
 static MallocMutex publicFreeListLock; // lock for changes of publicFreeList
 #endif
@@ -586,18 +725,188 @@ inline bool isNotForUse( void* ptr )
 
 /********* End rough utility code  **************/
 
+#ifdef FINE_GRAIN_LOCKS
+/* LifoList assumes zero initialization so a vector of it can be created
+ * by just allocating some space with no call to constructor.
+ * On Linux, it seems to be necessary to avoid linking with C++ libraries.
+ *
+ * By usage convention there is no race on the initialization. */
+LifoList::LifoList( ) : top(NULL)
+{
+    // MallocMutex assumes zero initialization
+    memset(&lock, 0, sizeof(MallocMutex));
+}
+
+void LifoList::push(Block *block)
+{
+    MallocMutex::scoped_lock scoped_cs(lock);
+    block->next = top;
+    top = block;
+}
+
+Block *LifoList::pop()
+{
+    Block *block=NULL;
+    if (!top) goto done;
+    {
+        MallocMutex::scoped_lock scoped_cs(lock);
+        if (!top) goto done;
+        block = top;
+        top = block->next;
+    }
+done:
+    return block;
+}
+
+#endif /* FINE_GRAIN_LOCKS     */
+
 /********* Thread and block related code      *************/
 
+/*
+ * Return the bin for the given size. If the TLS bin structure is absent, create it.
+ */
+Bin* MemoryPool::getAllocationBin(size_t size)
+{
+    TLSData* tls = extMemPool.tlsPointerKey.getThreadMallocTLS();
+    if( !tls )
+        tls = extMemPool.tlsPointerKey.createTLS(this, &extMemPool.backend);
+    MALLOC_ASSERT( tls, ASSERT_TEXT );
+    return tls->bin + getIndex(size);
+}
+
+/* Return an empty uninitialized block in a non-blocking fashion. */
+Block *MemoryPool::getEmptyBlock(size_t size)
+{
+    FreeBlockPool::ResOfGet resOfGet(NULL, false);
+    Block *result = NULL, *b;
+    TLSData* tls = extMemPool.tlsPointerKey.getThreadMallocTLS();
+
+    if (tls)
+        resOfGet = tls->pool.getBlock();
+    if (resOfGet.block) {
+        result = resOfGet.block;
+    } else {
+        // if previous access missed pool, allocate 2 blocks in advance
+        static const int ALLOC_ON_MISS = 2;
+        int i, num = resOfGet.lastAccMiss? ALLOC_ON_MISS : 1;
+        BackRefIdx backRefIdx[ALLOC_ON_MISS];
+
+        if ( !(result = static_cast<Block*>(
+                   extMemPool.backend.get16KBlock(num, /*startup=*/false))) )
+            return NULL;
+        if (!extMemPool.userPool())
+            for (i=0; i<num; i++) {
+                backRefIdx[i] = BackRefIdx::newBackRef(/*largeObj=*/false);
+                if (backRefIdx[i].isInvalid()) {
+                    // roll back resource allocation
+                    for (int j=0; j<i; j++)
+                        removeBackRef(backRefIdx[j]);
+                    Block *b;
+                    for (b=result, i=0; i<num;
+                         b=(Block*)((uintptr_t)b+blockSize), i++)
+                        extMemPool.backend.put16KBlock(b, /*startup=*/false);
+                    return NULL;
+                }
+            }
+        // resources were allocated, register blocks
+        for (b=result, i=0; i<num; b=(Block*)((uintptr_t)b+blockSize), i++) {
+            // 16KB block in user's pool must have invalid backRefIdx
+            if (extMemPool.userPool()) {
+                new (&b->backRefIdx) BackRefIdx();
+            } else {
+                setBackRef(backRefIdx[i], b);
+                b->backRefIdx = backRefIdx[i];
+            }
+            // all but first one go to per-thread pool
+            if (i > 0) {
+                MALLOC_ASSERT(tls, ASSERT_TEXT);
+                tls->pool.returnBlock(b);
+            }
+        }
+    }
+    if (result) {
+        result->initEmptyBlock(tls? tls->bin : NULL, size);
+        STAT_increment(result->owner, getIndex(result->objectSize), allocBlockNew);
+    }
+    return result;
+}
+
+void MemoryPool::returnEmptyBlock(Block *block, bool poolTheBlock)
+{
+    block->makeEmpty();
+    if (poolTheBlock) {
+        extMemPool.tlsPointerKey.getThreadMallocTLS()->pool.returnBlock(block);
+    }
+    else {
+        // 16KB blocks in user's pools not have valid backRefIdx
+        if (!extMemPool.userPool())
+            removeBackRef(*(block->getBackRefIdx()));
+        extMemPool.backend.put16KBlock(block, /*startup=*/false);
+    }
+}
+
+bool MemoryPool::init(intptr_t poolId, const MemPoolPolicy* memPoolPolicy)
+{
+    initTLS();
+    extMemPool.poolId = poolId;
+    extMemPool.rawAlloc = memPoolPolicy->pAlloc;
+    extMemPool.rawFree = memPoolPolicy->pFree;
+    extMemPool.granularity = memPoolPolicy->granularity;
+    if (!extMemPool.backend.bootstrap(&extMemPool)) return false;
+
+#if USE_WINTHREAD
+    {
+        MallocMutex::scoped_lock lock(memPoolListLock);
+        next = defaultMemPool->next;
+        defaultMemPool->next = this;
+        prev = defaultMemPool;
+        if (next)
+            next->prev = this;
+    }
+#endif
+    return true;
+}
+
+void MemoryPool::reset()
+{
+    for (LargeMemoryBlock *lmb = extMemPool.loHead; lmb; ) {
+        removeBackRef(lmb->backRefIdx);
+        lmb = lmb->gNext;
+    }
+    extMemPool.loHead = NULL;
+    bootStrapBlocks.reset();
+    orphanedBlocks.reset();
+    extMemPool.reset();
+
+    initTLS();
+}
+
+void MemoryPool::destroy()
+{
+#if USE_WINTHREAD
+    {
+        MallocMutex::scoped_lock lock(memPoolListLock);
+        // remove itself from global pool list
+        if (prev)
+            prev->next = next;
+        if (next)
+            next->prev = prev;
+    }
+#endif
+    // 16KB blocks do not have backreferencies, only large objects do
+    for (LargeMemoryBlock *lmb = extMemPool.loHead; lmb; ) {
+        removeBackRef(lmb->backRefIdx);
+        lmb = lmb->gNext;
+    }
+    extMemPool.destroy();
+}
+
 void Bin::verifyTLSBin (size_t size) const
 {
 #if MALLOC_DEBUG
 /* The debug version verifies the TLSBin as needed */
-    Bin*   tlsBin = getThreadMallocTLS()->bin;
-    uint32_t index = getIndex(size);
     uint32_t objSize = getObjectSize(size);
 
-    MALLOC_ASSERT( this == tlsBin+index, ASSERT_TEXT );
-
     if (activeBlk) {
         MALLOC_ASSERT( activeBlk->owner.own(), ASSERT_TEXT );
         MALLOC_ASSERT( activeBlk->objectSize == objSize, ASSERT_TEXT );
@@ -686,34 +995,6 @@ void Bin::outofTLSBin(Block* block)
     verifyTLSBin(size);
 }
 
-TLSData* Bin::createTLS()
-{
-    MALLOC_ASSERT( sizeof(TLSData) >= sizeof(Bin) * numBlockBins + sizeof(FreeBlockPool), ASSERT_TEXT );
-    TLSData* tls = (TLSData*) bootStrapBlocks.allocate(sizeof(TLSData));
-    if ( !tls ) return NULL;
-    /* the block contains zeroes after bootStrapMalloc, so bins are initialized */
-#if MALLOC_DEBUG
-    for (uint32_t i = 0; i < numBlockBinLimit; i++) {
-        MALLOC_ASSERT( tls->bin[i].activeBlk == 0, ASSERT_TEXT );
-        MALLOC_ASSERT( tls->bin[i].mailbox == 0, ASSERT_TEXT );
-    }
-#endif
-    setThreadMallocTLS(tls);
-    return tls;
-}
-
-/*
- * Return the bin for the given size. If the TLS bin structure is absent, create it.
- */
-Bin* Bin::getAllocationBin(size_t size)
-{
-    TLSData* tls = getThreadMallocTLS();
-    if( !tls )
-        tls = createTLS();
-    MALLOC_ASSERT( tls, ASSERT_TEXT );
-    return tls->bin + getIndex(size);
-}
-
 Block* Bin::getPublicFreeListBlock()
 {
     Block* block;
@@ -739,10 +1020,6 @@ Block* Bin::getPublicFreeListBlock()
     return block;
 }
 
-BlockI *BlockI::getRawBlock(bool startup) { return Block::getRaw(startup); }
-
-void BlockI::initialize(void *ptr) { ((LocalBlockFields*)this)->bumpPtr = (FreeObject*)ptr; }
-
 bool Block::emptyEnoughToUse()
 {
     const float threshold = (blockSize - sizeof(Block)) * (1-emptyEnoughRatio);
@@ -777,24 +1054,25 @@ void Block::restoreBumpPtr()
     isFull = 0;
 }
 
-void Block::freeOwnObject(FreeObject *objectToFree)
+void Block::freeOwnObject(MemoryPool *memPool, FreeObject *objectToFree)
 {
     objectToFree->next = freeList;
     freeList = objectToFree;
     allocatedCount--;
     MALLOC_ASSERT( allocatedCount < (blockSize-sizeof(Block))/objectSize, ASSERT_TEXT );
 #if COLLECT_STATISTICS
-    if (getActiveBlock(getAllocationBin(block->objectSize)) != block)
+    if (getActiveBlock(memPool->getAllocationBin(block->objectSize)) != block)
         STAT_increment(myTid, getIndex(block->objectSize), freeToInactiveBlock);
     else
         STAT_increment(myTid, getIndex(block->objectSize), freeToActiveBlock);
 #endif
     if (isFull) {
         if (emptyEnoughToUse())
-            Bin::getAllocationBin(objectSize)->moveBlockToBinFront(this);
+            memPool->getAllocationBin(objectSize)->moveBlockToBinFront(this);
     } else {
         if (allocatedCount==0 && publicFreeList==NULL)
-            Bin::getAllocationBin(objectSize)->processLessUsedBlock(this);
+            memPool->getAllocationBin(objectSize)->
+                processLessUsedBlock(memPool, this);
     }
 }
 
@@ -961,13 +1239,12 @@ void Block::cleanBlockHeader()
     publicFreeList = NULL;
 }
 
-void Block::initEmptyBlock(size_t size)
+void Block::initEmptyBlock(Bin* tlsBin, size_t size)
 {
     // Having getIndex and getObjectSize called next to each other
     // allows better compiler optimization as they basically share the code.
     unsigned int index = getIndex(size);
     unsigned int objSz = getObjectSize(size);
-    Bin* tlsBin = getThreadMallocTLS()->bin;
 
     cleanBlockHeader();
     objectSize = objSz;
@@ -987,7 +1264,7 @@ Block *OrphanedBlocks::get(Bin* bin, unsigned int size)
     Block *result;
     MALLOC_ASSERT( bin, ASSERT_TEXT );
     unsigned int index = getIndex(size);
-    result = (Block *) bins[index].pop();
+    result = bins[index].pop();
     if (result) {
         MALLOC_ITT_SYNC_ACQUIRED(bins+index);
         result->privatizeOrphaned(bin);
@@ -1001,7 +1278,13 @@ void OrphanedBlocks::put(Bin* bin, Block *block)
     unsigned int index = getIndex(block->getSize());
     block->shareOrphaned(bin);
     MALLOC_ITT_SYNC_RELEASING(bins+index);
-    bins[index].push((void **)block);
+    bins[index].push(block);
+}
+
+void OrphanedBlocks::reset()
+{
+    for (uint32_t i=0; i<numBlockBinLimit; i++)
+        new (bins+i) LifoList();
 }
 
 void FreeBlockPool::insertBlock(Block *block)
@@ -1013,16 +1296,20 @@ void FreeBlockPool::insertBlock(Block *block)
         tail = block;
 }
 
-Block *FreeBlockPool::getBlock()
+FreeBlockPool::ResOfGet FreeBlockPool::getBlock()
 {
-    Block *result = head;
+    Block *b = head;
+
     if (head) {
         size--;
         head = head->next;
         if (!head)
             tail = NULL;
-    }
-    return result;
+        lastAccessMiss = false;
+    } else
+        lastAccessMiss = true;
+
+    return ResOfGet(b, lastAccessMiss);
 }
 
 void FreeBlockPool::returnBlock(Block *block)
@@ -1031,81 +1318,48 @@ void FreeBlockPool::returnBlock(Block *block)
     if (size == POOL_HIGH_MARK) {
         // release cold blocks and add hot one
         Block *headToFree = head,
-              *tailToFree = tail;
+              *helper;
         for (int i=0; i<POOL_LOW_MARK-2; i++)
             headToFree = headToFree->next;
         tail = headToFree;
         headToFree = headToFree->next;
         tail->next = NULL;
         size = POOL_LOW_MARK-1;
-        for (Block *currBl = headToFree; currBl; currBl = currBl->next)
-            removeBackRef(currBl->backRefIdx);
-        freeBlocks.putList(headToFree, tailToFree);
+        // 16KB blocks from user pools not have valid backreference
+        for (Block *currBl = headToFree; currBl; currBl = helper) {
+            helper = currBl->next;
+            if (!backend->inUserPool())
+                removeBackRef(currBl->backRefIdx);
+            backend->put16KBlock(currBl, /*startup=*/false);
+        }
     }
     insertBlock(block);
 }
 
-void FreeBlockPool::releaseAllBlocks()
-{
-    if (head) {
-        for (Block *currBl = head; currBl; currBl = currBl->next)
-            removeBackRef(currBl->backRefIdx);
-        freeBlocks.putList(head, tail);
-    }
-}
-
-/* Return an empty uninitialized block in a non-blocking fashion. */
-Block *Block::getRaw(bool startup)
+bool FreeBlockPool::releaseAllBlocks()
 {
-    Block *result = NULL;
-    Block *bigBlock;
-
-    if (! (bigBlock = static_cast<Block*>(freeBlocks.get(startup)))) return NULL;
+    Block *helper;
+    bool nonEmpty = size;
 
-    // check alignment
-    MALLOC_ASSERT( isAligned( bigBlock, blockSize ), ASSERT_TEXT );
-    MALLOC_ASSERT( isAligned( bigBlock->bumpPtr, blockSize ), ASSERT_TEXT );
-    // block should be at least as big as blockSize; otherwise the previous block can be damaged.
-    MALLOC_ASSERT( (uintptr_t)bigBlock->bumpPtr >= (uintptr_t)bigBlock + blockSize, ASSERT_TEXT );
-    bigBlock->bumpPtr = (FreeObject *)((uintptr_t)bigBlock->bumpPtr - blockSize);
-    result = (Block *)bigBlock->bumpPtr;
-    if ( result!=bigBlock ) {
-        TRACEF(( "[ScalableMalloc trace] Pushing partial rest of block back on.\n" ));
-        freeBlocks.put(bigBlock, startup);
+    for (Block *currBl = head; currBl; currBl=helper) {
+        helper = currBl->next;
+        // 16KB blocks in user's pools not have valid backRefIdx
+        if (!backend->inUserPool())
+            removeBackRef(currBl->backRefIdx);
+        backend->put16KBlock(currBl, /*startup=*/false);
     }
+    head = tail = NULL;
+    size = 0;
 
-    return result;
-}
-
-/* Return an empty uninitialized block in a non-blocking fashion. */
-Block *Block::getEmpty(size_t size)
-{
-    Block *result = NULL;
-    TLSData* tls = getThreadMallocTLS();
-    if (tls)
-        result = tls->pool.getBlock();
-    if (!result) {
-        BackRefIdx backRefIdx = BackRefIdx::newBackRef(/*largeObj=*/false);
-        if (backRefIdx.isInvalid() || !(result = getRaw(/*startup=*/false)))
-            return NULL;
-        setBackRef(backRefIdx, result);
-        result->backRefIdx = backRefIdx;
-    }
-    if (result) {
-        result->initEmptyBlock(size);
-        STAT_increment(result->owner, getIndex(result->objectSize), allocBlockNew);
-    }
-    return result;
+    return nonEmpty;
 }
 
 /* We have a block give it back to the malloc block manager */
-void Block::returnEmpty(bool poolTheBlock)
+void Block::makeEmpty()
 {
     // it is caller's responsibility to ensure no data is lost before calling this
     MALLOC_ASSERT( allocatedCount==0, ASSERT_TEXT );
     MALLOC_ASSERT( publicFreeList==NULL, ASSERT_TEXT );
-    MALLOC_ASSERT( !poolTheBlock || next == NULL, ASSERT_TEXT );
-    MALLOC_ASSERT( !poolTheBlock || previous == NULL, ASSERT_TEXT );
     STAT_increment(owner, getIndex(objectSize), freeBlockBack);
 
     cleanBlockHeader();
@@ -1116,14 +1370,6 @@ void Block::returnEmpty(bool poolTheBlock)
     owner.invalid();
     // for an empty block, bump pointer should point right after the end of the block
     bumpPtr = (FreeObject *)((uintptr_t)this + blockSize);
-    if (poolTheBlock) {
-        MALLOC_ASSERT(getThreadMallocTLS(), "Is TLS still not initialized?");
-        getThreadMallocTLS()->pool.returnBlock(this);
-    }
-    else {
-        removeBackRef(backRefIdx);
-        freeBlocks.put(this, /*startup=*/false);
-    }
 }
 
 inline void Bin::setActiveBlock (Block *block)
@@ -1171,6 +1417,7 @@ FreeObject *Block::findObjectToFree(void *object) const
 }
 
 #if MALLOC_CHECK_RECURSION
+// TODO: Use deducated heap for this
 
 /*
  * It's a special kind of allocation that can be used when malloc is
@@ -1201,7 +1448,8 @@ StartupBlock *StartupBlock::getBlock()
     BackRefIdx backRefIdx = BackRefIdx::newBackRef(/*largeObj=*/false);
     if (backRefIdx.isInvalid()) return NULL;
 
-    StartupBlock *block = (StartupBlock *)getRaw(/*startup=*/true);
+    StartupBlock *block = static_cast<StartupBlock*>(
+        defaultMemPool->extMemPool.backend.get16KBlock(1, /*startup=*/true));
     if (!block) return NULL;
 
     block->cleanBlockHeader();
@@ -1250,7 +1498,7 @@ FreeObject *StartupBlock::allocate(size_t size)
             (FreeObject *)((uintptr_t)firstStartupBlock->bumpPtr + reqSize);
     }
     if (newBlock && newBlockUnused)
-        newBlock->returnEmpty(/*poolTheBlock=*/false);
+        defaultMemPool->returnEmptyBlock(newBlock, /*poolTheBlock=*/false);
 
     // keep object size at the negative offset
     *((size_t*)result) = size;
@@ -1287,7 +1535,7 @@ void StartupBlock::free(void *ptr)
     }
     if (blockToRelease) {
         blockToRelease->previous = blockToRelease->next = NULL;
-        blockToRelease->returnEmpty(/*poolTheBlock=*/false);
+        defaultMemPool->returnEmptyBlock(blockToRelease, /*poolTheBlock=*/false);
     }
 }
 
@@ -1328,22 +1576,17 @@ static void initMemoryManager()
     MALLOC_ASSERT( 2*blockHeaderAlignment == sizeof(Block), ASSERT_TEXT );
     MALLOC_ASSERT( sizeof(FreeObject) == sizeof(void*), ASSERT_TEXT );
 
+    defaultMemPool->extMemPool.rawAlloc = NULL;
+    defaultMemPool->extMemPool.rawFree = NULL;
+    defaultMemPool->extMemPool.granularity = 4*1024; // i.e., page size
 // TODO: add error handling, and on error do something better than exit(1)
-    if (!initBackRefMaster() || !freeBlocks.bootstrap(NULL, NULL, 0)) {
+    if (!defaultMemPool->extMemPool.backend.bootstrap(&defaultMemPool->extMemPool)
+        || !initBackRefMaster(&defaultMemPool->extMemPool.backend)) {
         fprintf (stderr, "The memory manager cannot access sufficient memory to initialize; exiting \n");
         exit(1);
     }
-// Create keys for thread-local storage and for thread id
-#if USE_WINTHREAD
-    TLS_pointer_key = TlsAlloc();
-#else
-    int status1 = pthread_key_create( &TLS_pointer_key, mallocThreadShutdownNotification );
-    if ( status1 ) {
-        fprintf (stderr, "The memory manager cannot create tls key during initialization; exiting \n");
-        exit(1);
-    }
-#endif /* USE_WINTHREAD */
-    ThreadId::init();
+    defaultMemPool->initTLS();
+    ThreadId::init();      // Create keys for thread id
 #if COLLECT_STATISTICS
     initStatisticsCollection();
 #endif
@@ -1444,12 +1687,12 @@ void Bin::moveBlockToBinFront(Block *block)
     pushTLSBin(block);
 }
 
-void Bin::processLessUsedBlock(Block *block)
+void Bin::processLessUsedBlock(MemoryPool *memPool, Block *block)
 {
     if (block != activeBlk) {
         /* We are not actively using this block; return it to the general block pool */
         outofTLSBin(block);
-        block->returnEmpty(/*poolTheBlock=*/true);
+        memPool->returnEmptyBlock(block, /*poolTheBlock=*/true);
     } else {
         /* all objects are free - let's restore the bump pointer */
         block->restoreBumpPtr();
@@ -1468,13 +1711,15 @@ void Bin::processLessUsedBlock(Block *block)
  *       alignment plus minLargeObjectSize can't lead to wrapping.
  * 4. otherwise, aligned large object is allocated.
  */
-static void *allocateAligned(size_t size, size_t alignment)
+static void *allocateAligned(MemoryPool *memPool, size_t size, size_t alignment)
 {
     MALLOC_ASSERT( isPowerOfTwo(alignment), ASSERT_TEXT );
 
+    if (!isMallocInitialized()) doInitialization();
+
     void *result;
     if (size<=maxSegregatedObjectSize && alignment<=maxSegregatedObjectSize)
-        result = internalMalloc(alignUp(size? size: sizeof(size_t), alignment));
+        result = internalPoolMalloc((rml::MemoryPool*)memPool, alignUp(size? size: sizeof(size_t), alignment));
     else if (size<minLargeObjectSize) {
         if (alignment<=fittingAlignment)
             result = internalMalloc(size);
@@ -1490,15 +1735,17 @@ static void *allocateAligned(size_t size, size_t alignment)
         if (!isMallocInitialized())
             doInitialization();
         // take into account only alignment that are higher then natural
-        result = mallocLargeObject(size, largeObjectAlignment>alignment?
-                                         largeObjectAlignment: alignment);
+        result = mallocLargeObject(&memPool->extMemPool, size,
+                                   largeObjectAlignment>alignment?
+                                   largeObjectAlignment: alignment);
     }
 
     MALLOC_ASSERT( isAligned(result, alignment), ASSERT_TEXT );
     return result;
 }
 
-static void *reallocAligned(void *ptr, size_t size, size_t alignment = 0)
+static void *reallocAligned(MemoryPool *memPool, void *ptr,
+                            size_t size, size_t alignment = 0)
 {
     void *result;
     size_t copySize;
@@ -1511,7 +1758,8 @@ static void *reallocAligned(void *ptr, size_t size, size_t alignment = 0)
             return ptr;
         } else {
             copySize = lmb->objectSize;
-            result = alignment ? allocateAligned(size, alignment) : internalMalloc(size);
+            result = alignment ? allocateAligned(memPool, size, alignment) :
+                internalPoolMalloc((rml::MemoryPool*)memPool, size);
         }
     } else {
         Block* block = (Block *)alignDown(ptr, blockSize);
@@ -1519,12 +1767,13 @@ static void *reallocAligned(void *ptr, size_t size, size_t alignment = 0)
         if (size <= copySize && (0==alignment || isAligned(ptr, alignment))) {
             return ptr;
         } else {
-            result = alignment ? allocateAligned(size, alignment) : internalMalloc(size);
+            result = alignment ? allocateAligned(memPool, size, alignment) :
+                internalPoolMalloc((rml::MemoryPool*)memPool, size);
         }
     }
     if (result) {
         memcpy(result, ptr, copySize<size? copySize: size);
-        internalFree(ptr);
+        internalPoolFree((rml::MemoryPool*)memPool, ptr);
     }
     return result;
 }
@@ -1591,11 +1840,12 @@ static inline bool isRecognized (void* ptr)
     return isLargeObject(ptr) || isSmallObject(ptr);
 }
 
-static inline void freeSmallObject (void *object)
+static inline void freeSmallObject(MemoryPool *memPool, void *object)
 {
     /* mask low bits to get the block */
     Block *block = (Block *)alignDown(object, blockSize);
-    MALLOC_ASSERT( block->checkFreePrecond(), ASSERT_TEXT );
+    MALLOC_ASSERT( block->checkFreePrecond(object),
+                   "Possible double free or heap corruption." );
 
 #if MALLOC_CHECK_RECURSION
     if (block->isStartupAllocObject()) {
@@ -1606,50 +1856,36 @@ static inline void freeSmallObject (void *object)
     FreeObject *objectToFree = block->findObjectToFree(object);
 
     if (block->ownBlock())
-        block->freeOwnObject(objectToFree);
+        block->freeOwnObject(memPool, objectToFree);
     else /* Slower path to add to the shared list, the allocatedCount is updated by the owner thread in malloc. */
         block->freePublicObject(objectToFree);
 
 }
 
-static void *internalMalloc(size_t size)
+static void *internalPoolMalloc(rml::MemoryPool* mPool, size_t size)
 {
     Bin* bin;
     Block * mallocBlock;
     FreeObject *result = NULL;
+    rml::internal::MemoryPool* memPool = (rml::internal::MemoryPool*)mPool;
 
-    if (!size) size = sizeof(size_t);
-
-#if MALLOC_CHECK_RECURSION
-    if (RecursiveMallocCallProtector::sameThreadActive()) {
-        result = size<minLargeObjectSize? StartupBlock::allocate(size) :
-              (FreeObject*)mallocLargeObject(size, blockSize, /*startupAlloc=*/ true);
-        if (!result) errno = ENOMEM;
-        return result;
-    }
-#endif
+    if (!mPool) return NULL;
 
-    if (!isMallocInitialized())
-        doInitialization();
+    if (!size) size = sizeof(size_t);
 
     /*
      * Use Large Object Allocation
      */
-    if (size >= minLargeObjectSize) {
-        result = (FreeObject*)mallocLargeObject(size, largeObjectAlignment);
-        if (!result) errno = ENOMEM;
-        return result;
-    }
+    if (size >= minLargeObjectSize)
+        return mallocLargeObject(&memPool->extMemPool, size, largeObjectAlignment);
 
     /*
      * Get an element in thread-local array corresponding to the given size;
      * It keeps ptr to the active block for allocations of this size
      */
-    bin = Bin::getAllocationBin(size);
-    if ( !bin ) {
-        errno = ENOMEM;
+    bin = memPool->getAllocationBin(size);
+    if ( !bin )
         return NULL;
-    }
 
     /* Get the block of you want to try to allocate in. */
     mallocBlock = bin->getActiveBlock();
@@ -1677,26 +1913,26 @@ static void *internalMalloc(size_t size)
         }
         /* Else something strange happened, need to retry from the beginning; */
         TRACEF(( "[ScalableMalloc trace] Something is wrong: no objects in public free list; reentering.\n" ));
-        return internalMalloc(size);
+        return internalPoolMalloc(mPool, size);
     }
 
     /*
      * no suitable own blocks, try to get a partial block that some other thread has discarded.
      */
-    mallocBlock = orphanedBlocks->get(bin, size);
+    mallocBlock = memPool->orphanedBlocks.get(bin, size);
     while (mallocBlock) {
         bin->pushTLSBin(mallocBlock);
         bin->setActiveBlock(mallocBlock); // TODO: move under the below condition?
         if( (result = mallocBlock->allocate()) ) {
             return result;
         }
-        mallocBlock = orphanedBlocks->get(bin, size);
+        mallocBlock = memPool->orphanedBlocks.get(bin, size);
     }
 
     /*
      * else try to get a new empty block
      */
-    mallocBlock = Block::getEmpty(size);
+    mallocBlock = memPool->getEmptyBlock(size);
     if (mallocBlock) {
         bin->pushTLSBin(mallocBlock);
         bin->setActiveBlock(mallocBlock);
@@ -1705,26 +1941,48 @@ static void *internalMalloc(size_t size)
         }
         /* Else something strange happened, need to retry from the beginning; */
         TRACEF(( "[ScalableMalloc trace] Something is wrong: no objects in empty block; reentering.\n" ));
-        return internalMalloc(size);
+        return internalPoolMalloc(mPool, size);
     }
     /*
      * else nothing works so return NULL
      */
     TRACEF(( "[ScalableMalloc trace] No memory found, returning NULL.\n" ));
-    errno = ENOMEM;
     return NULL;
 }
 
-static void internalFree (void *object) {
-    if (!object)
-        return;
-
-    MALLOC_ASSERT(isRecognized(object), "Invalid pointer in scalable_free detected.");
+static bool internalPoolFree(rml::MemoryPool *mPool, void *object)
+{
+    if (!mPool || !object) return false;
 
+    rml::internal::MemoryPool* memPool = (rml::internal::MemoryPool*)mPool;
+    MALLOC_ASSERT(memPool->extMemPool.userPool() || isRecognized(object),
+                  "Invalid pointer in pool_free detected.");
     if (isLargeObject(object))
-        freeLargeObject(object);
+        freeLargeObject(&memPool->extMemPool, object);
     else
-        freeSmallObject(object);
+        freeSmallObject(memPool, object);
+    return true;
+}
+
+static void *internalMalloc(size_t size)
+{
+    if (!size) size = sizeof(size_t);
+
+#if MALLOC_CHECK_RECURSION
+    if (RecursiveMallocCallProtector::sameThreadActive())
+        return size<minLargeObjectSize? StartupBlock::allocate(size) :
+            (FreeObject*)mallocLargeObject(&defaultMemPool->extMemPool, size, blockSize, /*startupAlloc=*/ true);
+#endif
+
+    if (!isMallocInitialized())
+        doInitialization();
+
+    return internalPoolMalloc((rml::MemoryPool*)defaultMemPool, size);
+}
+
+static void internalFree(void *object)
+{
+    internalPoolFree((rml::MemoryPool*)defaultMemPool, object);
 }
 
 static size_t internalMsize(void* ptr)
@@ -1752,6 +2010,65 @@ static size_t internalMsize(void* ptr)
 }
 
 } // namespace internal
+
+using namespace rml::internal;
+
+rml::MemoryPool *pool_create(intptr_t pool_id, const MemPoolPolicy* memPoolPolicy)
+{
+    if (!isMallocInitialized())
+        doInitialization();
+    if (!memPoolPolicy->pAlloc) return NULL;
+
+    rml::internal::MemoryPool *memPool =
+        (rml::internal::MemoryPool*)internalMalloc((sizeof(rml::internal::MemoryPool)));
+    if (!memPool) return NULL;
+    memset(memPool, 0, sizeof(rml::internal::MemoryPool));
+    if (!memPool->init(pool_id, memPoolPolicy)) {
+        internalFree(memPool);
+        return NULL;
+    }
+
+    return (rml::MemoryPool*)memPool;
+}
+
+bool pool_destroy(rml::MemoryPool* memPool)
+{
+    if (!memPool) return false;
+    ((rml::internal::MemoryPool*)memPool)->destroy();
+    internalFree(memPool);
+
+    return true;
+}
+
+bool pool_reset(rml::MemoryPool* memPool)
+{
+    if (!memPool) return false;
+
+    ((rml::internal::MemoryPool*)memPool)->reset();
+    return true;
+}
+
+void *pool_malloc(rml::MemoryPool* mPool, size_t size)
+{
+    return internalPoolMalloc(mPool, size);
+}
+
+void *pool_realloc(rml::MemoryPool* mPool, void *object, size_t size)
+{
+    if (!object)
+        return internalPoolMalloc(mPool, size);
+    if (!size) {
+        internalPoolFree(mPool, object);
+        return NULL;
+    }
+    return reallocAligned((rml::internal::MemoryPool*)mPool, object, size, 0);
+}
+
+bool pool_free(rml::MemoryPool *mPool, void *object)
+{
+    return internalPoolFree(mPool, object);
+}
+
 } // namespace rml
 
 using namespace rml::internal;
@@ -1774,7 +2091,6 @@ static unsigned int threadGoingDownCount = 0;
 */
 extern "C" void mallocThreadShutdownNotification(void* arg)
 {
-    TLSData *tls;
     Block *threadBlock;
     Block *threadlessBlock;
     unsigned int index;
@@ -1784,45 +2100,53 @@ extern "C" void mallocThreadShutdownNotification(void* arg)
 
     TRACEF(( "[ScalableMalloc trace] Thread id %d blocks return start %d\n",
              getThreadId(),  threadGoingDownCount++ ));
-#ifdef USE_WINTHREAD
-    tls = getThreadMallocTLS();
+#if USE_WINTHREAD
+    // The routine is called once, need to walk through all pools on Windows
+    for (MemoryPool *memPool = defaultMemPool; memPool; memPool = memPool->next) {
+        TLSData *tls = memPool->getTLS();
 #else
-    tls = (TLSData*)arg;
+        // The routine is called for each memPool, just need to get its pointer from TLSData.
+        TLSData *tls = (TLSData*)arg;
+        MemoryPool *memPool = tls->getMemPool();
 #endif
-    if (tls) {
-        Bin *tlsBin = tls->bin;
-        tls->pool.releaseAllBlocks();
-
-        for (index = 0; index < numBlockBins; index++) {
-            if (tlsBin[index].activeBlk==NULL)
-                continue;
-            threadlessBlock = tlsBin[index].activeBlk->previous;
-            while (threadlessBlock) {
-                threadBlock = threadlessBlock->previous;
-                if (threadlessBlock->allocatedCount==0 && threadlessBlock->publicFreeList==NULL) {
-                    /* we destroy the thread, so not use its block pool */
-                    threadlessBlock->returnEmpty(/*poolTheBlock=*/false);
-                } else {
-                    orphanedBlocks->put(tlsBin+index, threadlessBlock);
+        if (tls) {
+            Bin *tlsBin = tls->bin;
+            tls->pool.releaseAllBlocks();
+
+            for (index = 0; index < numBlockBins; index++) {
+                if (tlsBin[index].activeBlk==NULL)
+                    continue;
+                threadlessBlock = tlsBin[index].activeBlk->previous;
+                while (threadlessBlock) {
+                    threadBlock = threadlessBlock->previous;
+                    if (threadlessBlock->allocatedCount==0 && threadlessBlock->publicFreeList==NULL) {
+                        /* we destroy the thread, so not use its block pool */
+                        memPool->returnEmptyBlock(threadlessBlock, /*poolTheBlock=*/false);
+                    } else {
+                        memPool->orphanedBlocks.put(tlsBin+index, threadlessBlock);
+                    }
+                    threadlessBlock = threadBlock;
                 }
-                threadlessBlock = threadBlock;
-            }
-            threadlessBlock = tlsBin[index].activeBlk;
-            while (threadlessBlock) {
-                threadBlock = threadlessBlock->next;
-                if (threadlessBlock->allocatedCount==0 && threadlessBlock->publicFreeList==NULL) {
-                    /* we destroy the thread, so not use its block pool */
-                    threadlessBlock->returnEmpty(/*poolTheBlock=*/false);
-                } else {
-                    orphanedBlocks->put(tlsBin+index, threadlessBlock);
+                threadlessBlock = tlsBin[index].activeBlk;
+                while (threadlessBlock) {
+                    threadBlock = threadlessBlock->next;
+                    if (threadlessBlock->allocatedCount==0 && threadlessBlock->publicFreeList==NULL) {
+                        /* we destroy the thread, so not use its block pool */
+                        memPool->returnEmptyBlock(threadlessBlock, /*poolTheBlock=*/false);
+                    } else {
+                        memPool->orphanedBlocks.put(tlsBin+index, threadlessBlock);
+                    }
+                    threadlessBlock = threadBlock;
                 }
-                threadlessBlock = threadBlock;
+                tlsBin[index].activeBlk = 0;
             }
-            tlsBin[index].activeBlk = 0;
+            memPool->bootStrapBlocks.free(tls);
+            memPool->clearTLS();
         }
-        bootStrapBlocks.free(tls);
-        setThreadMallocTLS(NULL);
-    }
+
+#if USE_WINTHREAD
+    } // for memPool (Windows only)
+#endif
 
     TRACEF(( "[ScalableMalloc trace] Thread id %d blocks return end\n", getThreadId() ));
 }
@@ -1838,11 +2162,12 @@ extern "C" void mallocProcessShutdownNotification(void)
 
 extern "C" void * scalable_malloc(size_t size)
 {
-    return internalMalloc(size);
+    void *ptr = internalMalloc(size);
+    if (!ptr) errno = ENOMEM;
+    return ptr;
 }
 
-extern "C" void scalable_free (void *object)
-{
+extern "C" void scalable_free (void *object) {
     internalFree(object);
 }
 
@@ -1858,9 +2183,9 @@ extern "C" void safer_scalable_free (void *object, void (*original_free)(void*))
     // must check 1st for large object, because small object check touches 4 pages on left,
     // and it can be unaccessable
     if (isLargeObject(object))
-        freeLargeObject(object);
+        freeLargeObject(&defaultMemPool->extMemPool, object);
     else if (isSmallObject(object))
-        freeSmallObject(object);
+        freeSmallObject(defaultMemPool, object);
     else if (original_free)
         original_free(object);
 }
@@ -1879,15 +2204,16 @@ extern "C" void safer_scalable_free (void *object, void (*original_free)(void*))
  */
 extern "C" void* scalable_realloc(void* ptr, size_t size)
 {
-    /* corner cases left out of reallocAligned to not deal with errno there */
-    if (!ptr) {
-        return internalMalloc(size);
-    }
-    if (!size) {
+    void *tmp;
+
+    if (!ptr)
+        tmp = internalMalloc(size);
+    else if (!size) {
         internalFree(ptr);
         return NULL;
-    }
-    void* tmp = reallocAligned(ptr, size, 0);
+    } else
+        tmp = reallocAligned(defaultMemPool, ptr, size, 0);
+
     if (!tmp) errno = ENOMEM;
     return tmp;
 }
@@ -1898,42 +2224,43 @@ extern "C" void* scalable_realloc(void* ptr, size_t size)
  */
 extern "C" void* safer_scalable_realloc (void* ptr, size_t sz, void* original_realloc)
 {
+    void *tmp;
+
     if (!ptr) {
-        return internalMalloc(sz);
-    }
-    if (isRecognized(ptr)) {
+        tmp = internalMalloc(sz);
+    } else if (isRecognized(ptr)) {
         if (!sz) {
             internalFree(ptr);
             return NULL;
+        } else {
+            tmp = reallocAligned(defaultMemPool, ptr, sz, 0);
         }
-        void* tmp = reallocAligned(ptr, sz, 0);
-        if (!tmp) errno = ENOMEM;
-        return tmp;
     }
 #if USE_WINTHREAD
     else if (original_realloc && sz) {
-            orig_ptrs *original_ptrs = static_cast<orig_ptrs*>(original_realloc);
-            if ( original_ptrs->orig_msize ){
-                size_t oldSize = original_ptrs->orig_msize(ptr);
-                void *newBuf = internalMalloc(sz);
-                if (newBuf) {
-                    memcpy(newBuf, ptr, sz<oldSize? sz : oldSize);
-                    if ( original_ptrs->orig_free ){
-                        original_ptrs->orig_free( ptr );
-                    }
+        orig_ptrs *original_ptrs = static_cast<orig_ptrs*>(original_realloc);
+        if ( original_ptrs->orig_msize ){
+            size_t oldSize = original_ptrs->orig_msize(ptr);
+            tmp = internalMalloc(sz);
+            if (tmp) {
+                memcpy(tmp, ptr, sz<oldSize? sz : oldSize);
+                if ( original_ptrs->orig_free ){
+                    original_ptrs->orig_free( ptr );
                 }
-                return newBuf;
-             }
+            }
+        } else
+            tmp = NULL;
     }
 #else
     else if (original_realloc) {
         typedef void* (*realloc_ptr_t)(void*,size_t);
         realloc_ptr_t original_realloc_ptr;
         (void *&)original_realloc_ptr = original_realloc;
-        return original_realloc_ptr(ptr,sz);
+        tmp = original_realloc_ptr(ptr,sz);
     }
 #endif
-    return NULL;
+    if (!tmp) errno = ENOMEM;
+    return tmp;
 }
 
 /********* End code for scalable_realloc   ***********/
@@ -1954,6 +2281,8 @@ extern "C" void * scalable_calloc(size_t nobj, size_t size)
     void* result = internalMalloc(arraySize);
     if (result)
         memset(result, 0, arraySize);
+    else
+        errno = ENOMEM;
     return result;
 }
 
@@ -1965,7 +2294,7 @@ extern "C" int scalable_posix_memalign(void **memptr, size_t alignment, size_t s
 {
     if ( !isPowerOfTwoMultiple(alignment, sizeof(void*)) )
         return EINVAL;
-    void *result = allocateAligned(size, alignment);
+    void *result = allocateAligned(defaultMemPool, size, alignment);
     if (!result)
         return ENOMEM;
     *memptr = result;
@@ -1978,28 +2307,27 @@ extern "C" void * scalable_aligned_malloc(size_t size, size_t alignment)
         errno = EINVAL;
         return NULL;
     }
-    void* tmp = allocateAligned(size, alignment);
-    if (!tmp)
-        errno = ENOMEM;
+    void *tmp = allocateAligned(defaultMemPool, size, alignment);
+    if (!tmp) errno = ENOMEM;
     return tmp;
 }
 
 extern "C" void * scalable_aligned_realloc(void *ptr, size_t size, size_t alignment)
 {
-    /* corner cases left out of reallocAligned to not deal with errno there */
     if (!isPowerOfTwo(alignment)) {
         errno = EINVAL;
         return NULL;
     }
-    if (!ptr) {
-        return allocateAligned(size, alignment);
-    }
-    if (!size) {
-        internalFree(ptr);
+    void *tmp;
+
+    if (!ptr)
+        tmp = allocateAligned(defaultMemPool, size, alignment);
+    else if (!size) {
+        scalable_free(ptr);
         return NULL;
-    }
+    } else
+        tmp = reallocAligned(defaultMemPool, ptr, size, alignment);
 
-    void* tmp = reallocAligned(ptr, size, alignment);
     if (!tmp) errno = ENOMEM;
     return tmp;
 }
@@ -2011,36 +2339,35 @@ extern "C" void * safer_scalable_aligned_realloc(void *ptr, size_t size, size_t
         errno = EINVAL;
         return NULL;
     }
+    void *tmp;
+
     if (!ptr) {
-        return allocateAligned(size, alignment);
-    }
-    if (isRecognized(ptr)) {
+        tmp = allocateAligned(defaultMemPool, size, alignment);
+    } else if (isRecognized(ptr)) {
         if (!size) {
             internalFree(ptr);
             return NULL;
+        } else {
+            tmp = reallocAligned(defaultMemPool, ptr, size, alignment);
         }
-        void* tmp = reallocAligned(ptr, size, alignment);
-        if (!tmp) errno = ENOMEM;
-        return tmp;
     }
 #if USE_WINTHREAD
     else {
         orig_ptrs *original_ptrs = static_cast<orig_ptrs*>(orig_function);
         if (size) {
+            // Without orig_msize, we can't do anything with this.
+            // Just keeping old pointer.
             if ( original_ptrs->orig_msize ){
                 size_t oldSize = original_ptrs->orig_msize(ptr);
-                void *newBuf = allocateAligned(size, alignment);
-                if (newBuf) {
-                    memcpy(newBuf, ptr, size<oldSize? size : oldSize);
+                tmp = allocateAligned(defaultMemPool, size, alignment);
+                if (tmp) {
+                    memcpy(tmp, ptr, size<oldSize? size : oldSize);
                     if ( original_ptrs->orig_free ){
                         original_ptrs->orig_free( ptr );
                     }
                 }
-                return newBuf;
-            }else{
-                //We can't do anything with this. Just keeping old pointer
-                return NULL;
-            }
+            } else
+                tmp = NULL;
         } else {
             if ( original_ptrs->orig_free ){
                 original_ptrs->orig_free( ptr );
@@ -2049,7 +2376,8 @@ extern "C" void * safer_scalable_aligned_realloc(void *ptr, size_t size, size_t
         }
     }
 #endif
-    return NULL;
+    if (!tmp) errno = ENOMEM;
+    return tmp;
 }
 
 extern "C" void scalable_aligned_free(void *ptr)
diff --git a/src/tbbmalloc/large_objects.cpp b/src/tbbmalloc/large_objects.cpp
index c26511e..51cf1d2 100644
--- a/src/tbbmalloc/large_objects.cpp
+++ b/src/tbbmalloc/large_objects.cpp
@@ -36,70 +36,59 @@ namespace internal {
 
 static struct LargeBlockCacheStat {
     uintptr_t age;
-    size_t cacheSize;
 } loCacheStat;
 
- /*
-  * The number of bins to cache large objects.
-  */
-const uint32_t numLargeBlockBins = 1024; // for 1024 max cached size is near 8MB
- 
-
-class CachedBlocksList {
-    LargeMemoryBlock *first,
-                     *last;
-    /* age of an oldest block in the list; equal to last->age, if last defined,
-       used for quick cheching it without acquiring the lock. */
-    uintptr_t     oldest;
-    /* currAge when something was excluded out of list because of the age,
-       not because of cache hit */
-    uintptr_t     lastCleanedAge;
-    /* Current threshold value for the blocks of a particular size. 
-       Set on cache miss. */
-    intptr_t      ageThreshold;
-
-    MallocMutex   lock;
-    /* CachedBlocksList should be placed in zero-initialized memory,
-       ctor not needed. */
-    CachedBlocksList();
-public:
-    inline void push(LargeMemoryBlock* ptr);
-    inline LargeMemoryBlock* pop();
-    void releaseLastIfOld(uintptr_t currAge, size_t size);
-};
-
-/*
- * Array of bins with lists of recently freed large objects cached for re-use.
- */
-static char globalCachedBlockBinsSpace[sizeof(CachedBlocksList)*numLargeBlockBins];
-static CachedBlocksList* globalCachedBlockBins = (CachedBlocksList*)globalCachedBlockBinsSpace;
-
-/*
- * Large Objects are the only objects in the system that begin 
- * on a 16K byte boundary since the blocks used for smaller objects 
- * have the Block structure at each 16K boundary.
- */
-static uintptr_t cleanupCacheIfNeed();
+static uintptr_t cleanupCacheIfNeed(ExtMemoryPool *extMemPool);
 
-void CachedBlocksList::push(LargeMemoryBlock *ptr)
+bool CachedLargeBlocksL::push(ExtMemoryPool *extMemPool, LargeMemoryBlock *ptr)
 {   
     ptr->prev = NULL;
-    ptr->age  = cleanupCacheIfNeed ();
+    ptr->age  = cleanupCacheIfNeed(extMemPool);
 
     MallocMutex::scoped_lock scoped_cs(lock);
-    ptr->next = first;
-    first = ptr;
-    if (ptr->next) ptr->next->prev = ptr;
-    if (!last) {
-        MALLOC_ASSERT(0 == oldest, ASSERT_TEXT);
-        oldest = ptr->age;
-        last = ptr;
+    if (lastCleanedAge) {
+        ptr->next = first;
+        first = ptr;
+        if (ptr->next) ptr->next->prev = ptr;
+        if (!last) {
+            MALLOC_ASSERT(0 == oldest, ASSERT_TEXT);
+            oldest = ptr->age;
+            last = ptr;
+        }
+        return true;
+    } else {
+        // 1st object of such size was released.
+        // Not cache it, and remeber when this occurs
+        // to take into account during cache miss.
+        lastCleanedAge = ptr->age;
+        return false;
     }
 }
 
-LargeMemoryBlock *CachedBlocksList::pop()
+void LargeMemoryBlock::registerInPool(ExtMemoryPool *extMemPool)
+{
+    MallocMutex::scoped_lock scoped_cs(extMemPool->largeObjLock);
+    gPrev = NULL;
+    gNext = extMemPool->loHead;
+    if (gNext)
+        gNext->gPrev = this;
+    extMemPool->loHead = this;
+}
+
+void LargeMemoryBlock::unregisterFromPool(ExtMemoryPool *extMemPool)
+{
+    MallocMutex::scoped_lock scoped_cs(extMemPool->largeObjLock);
+    if (extMemPool->loHead == this)
+        extMemPool->loHead = gNext;
+    if (gNext)
+        gNext->gPrev = gPrev;
+    if (gPrev)
+        gPrev->gNext = gNext;
+}
+
+LargeMemoryBlock *CachedLargeBlocksL::pop(ExtMemoryPool *extMemPool)
 {   
-    uintptr_t currAge = cleanupCacheIfNeed();
+    uintptr_t currAge = cleanupCacheIfNeed(extMemPool);
     LargeMemoryBlock *result=NULL;
     {
         MallocMutex::scoped_lock scoped_cs(lock);
@@ -121,9 +110,11 @@ LargeMemoryBlock *CachedBlocksList::pop()
     return result;
 }
 
-void CachedBlocksList::releaseLastIfOld(uintptr_t currAge, size_t size)
+bool CachedLargeBlocksL::releaseLastIfOld(ExtMemoryPool *extMemPool,
+                                        uintptr_t currAge)
 {
     LargeMemoryBlock *toRelease = NULL;
+    bool released = false;
  
     /* oldest may be more recent then age, that's why cast to signed type
        was used. age overflow is also processed correctly. */
@@ -145,19 +136,71 @@ void CachedBlocksList::releaseLastIfOld(uintptr_t currAge, size_t size)
             }
             MALLOC_ASSERT( toRelease, ASSERT_TEXT );
             lastCleanedAge = toRelease->age;
+        }
+        else 
+            return false;
+    }
+    released = toRelease;
+
+    while ( toRelease ) {
+        LargeMemoryBlock *helper = toRelease->next;
+        removeBackRef(toRelease->backRefIdx);
+        if (extMemPool->userPool())
+            toRelease->unregisterFromPool(extMemPool);
+        extMemPool->backend.putLargeBlock(toRelease);
+        toRelease = helper;
+    }
+    return released;
+}
+
+bool CachedLargeBlocksL::releaseAll(ExtMemoryPool *extMemPool)
+{
+    LargeMemoryBlock *toRelease = NULL;
+    bool released = false;
+ 
+    if (last) {
+        MallocMutex::scoped_lock scoped_cs(lock);
+        // double check
+        if (last) {
+            toRelease = first;
+            last = NULL;
+            first = NULL;
+            oldest = 0;
         } 
         else 
-            return;
+            return false;
     }
+    released = toRelease;
+
     while ( toRelease ) {
         LargeMemoryBlock *helper = toRelease->next;
         removeBackRef(toRelease->backRefIdx);
-        freeRawMemory(toRelease, size, toRelease->fromMapMemory);
+        if (extMemPool->userPool())
+            toRelease->unregisterFromPool(extMemPool);
+        extMemPool->backend.putLargeBlock(toRelease);
         toRelease = helper;
     }
+    return released;
+}
+
+// release from cache blocks that are older than ageThreshold
+bool ExtMemoryPool::doLOCacheCleanup(uintptr_t currAge)
+{
+    bool res = false;
+
+    for (int i = numLargeBlockBins-1; i >= 0; i--)
+        res |= cachedLargeBlocks[i].releaseLastIfOld(this, currAge);
+
+    return res;
 }
 
-static uintptr_t cleanupCacheIfNeed ()
+bool ExtMemoryPool::softCachesCleanup()
+{
+    // TODO: cleanup small objects as well
+    return doLOCacheCleanup(FencedLoad((intptr_t&)loCacheStat.age));
+}
+
+static uintptr_t cleanupCacheIfNeed(ExtMemoryPool *extMemPool)
 {
     /* loCacheStat.age overflow is OK, as we only want difference between 
      * its current value and some recent.
@@ -168,60 +211,53 @@ static uintptr_t cleanupCacheIfNeed ()
      */
     uintptr_t currAge = (uintptr_t)AtomicIncrement((intptr_t&)loCacheStat.age);
 
-    if ( 0 == currAge % cacheCleanupFreq ) {
-        size_t objSize;
-        int i;
-
-        for (i = numLargeBlockBins-1, 
-             objSize = (numLargeBlockBins-1)*largeBlockCacheStep+blockSize; 
-             i >= 0; 
-             i--, objSize-=largeBlockCacheStep) {
-            /* cached block size on iteration is
-             * i*largeBlockCacheStep+blockSize, it seems iterative
-             * computation of it improves performance.
-             */
-            // release from cache blocks that are older than ageThreshold
-            globalCachedBlockBins[i].releaseLastIfOld(currAge, objSize);
-        }
-    }
+    if ( 0 == currAge % cacheCleanupFreq )
+        extMemPool->doLOCacheCleanup(currAge);
+
     return currAge;
 }
 
-static LargeMemoryBlock* getCachedLargeBlock (size_t size)
+static LargeMemoryBlock* getCachedLargeBlock(ExtMemoryPool *extMemPool, size_t size)
 {
     MALLOC_ASSERT( size%largeBlockCacheStep==0, ASSERT_TEXT );
     LargeMemoryBlock *lmb = NULL;
     // blockSize is the minimal alignment and thus the minimal size of a large object.
     size_t idx = (size-minLargeObjectSize)/largeBlockCacheStep;
     if (idx<numLargeBlockBins) {
-        lmb = globalCachedBlockBins[idx].pop();
+        lmb = extMemPool->cachedLargeBlocks[idx].pop(extMemPool);
         if (lmb) {
-            MALLOC_ITT_SYNC_ACQUIRED(globalCachedBlockBins+idx);
+            MALLOC_ITT_SYNC_ACQUIRED(extMemPool->cachedLargeBlocks+idx);
             STAT_increment(getThreadId(), ThreadCommonCounters, allocCachedLargeBlk);
         }
     }
     return lmb;
 }
 
-void* mallocLargeObject (size_t size, size_t alignment, bool startupAlloc)
+void* mallocLargeObject(ExtMemoryPool *extMemPool, size_t size, size_t alignment,
+                        bool startupAlloc)
 {
     LargeMemoryBlock* lmb;
     size_t headersSize = sizeof(LargeMemoryBlock)+sizeof(LargeObjectHdr);
+    // TODO: take into account that they are already largeObjectAlignment-alinged
     size_t allocationSize = alignUp(size+headersSize+alignment, largeBlockCacheStep);
 
     if (allocationSize < size) // allocationSize is wrapped around after alignUp
         return NULL;
 
-    if (startupAlloc || !(lmb = getCachedLargeBlock(allocationSize))) {
+    if (startupAlloc || !(lmb = getCachedLargeBlock(extMemPool, allocationSize))) {
         BackRefIdx backRefIdx;
 
         if ((backRefIdx = BackRefIdx::newBackRef(/*largeObj=*/true)).isInvalid()) 
             return NULL;
-        lmb = (LargeMemoryBlock*)getRawMemory(allocationSize, /*useMapMem=*/startupAlloc);
-        if (!lmb) return NULL;
-        lmb->fromMapMemory = startupAlloc;
+        // unalignedSize is set in result
+        lmb = extMemPool->backend.getLargeBlock(allocationSize, startupAlloc);
+        if (!lmb) {
+            removeBackRef(backRefIdx);
+            return NULL;
+        }
         lmb->backRefIdx = backRefIdx;
-        lmb->unalignedSize = allocationSize;
+        if (extMemPool->userPool())
+            lmb->registerInPool(extMemPool);
         STAT_increment(getThreadId(), ThreadCommonCounters, allocNewLargeObj);
     }
 
@@ -237,39 +273,39 @@ void* mallocLargeObject (size_t size, size_t alignment, bool startupAlloc)
     return alignedArea;
 }
 
-static bool freeLargeObjectToCache (LargeMemoryBlock* largeBlock)
+static bool freeLargeObjectToCache(ExtMemoryPool *extMemPool, LargeMemoryBlock* largeBlock)
 {
     size_t size = largeBlock->unalignedSize;
     size_t idx = (size-minLargeObjectSize)/largeBlockCacheStep;
     if (idx<numLargeBlockBins) {
         MALLOC_ASSERT( size%largeBlockCacheStep==0, ASSERT_TEXT );
-        MALLOC_ITT_SYNC_RELEASING(globalCachedBlockBins+idx);
-        globalCachedBlockBins[idx].push(largeBlock);
-
-        STAT_increment(getThreadId(), ThreadCommonCounters, cacheLargeBlk);
-        return true;
+        MALLOC_ITT_SYNC_RELEASING(extMemPool->cachedLargeBlocks+idx);
+        if (extMemPool->cachedLargeBlocks[idx].push(extMemPool, largeBlock)) {
+            STAT_increment(getThreadId(), ThreadCommonCounters, cacheLargeBlk);
+            return true;
+        } else
+            return false;
     }
     return false;
 }
 
-void freeLargeObject (void *object)
+void freeLargeObject(ExtMemoryPool *extMemPool, void *object)
 {
     LargeObjectHdr *header = (LargeObjectHdr*)object - 1;
 
     // overwrite backRefIdx to simplify double free detection
     header->backRefIdx = BackRefIdx();
-    if (!freeLargeObjectToCache(header->memoryBlock)) {
+    if (!freeLargeObjectToCache(extMemPool, header->memoryBlock)) {
         removeBackRef(header->memoryBlock->backRefIdx);
-        freeRawMemory(header->memoryBlock, header->memoryBlock->unalignedSize, 
-                      /*useMapMem=*/ header->memoryBlock->fromMapMemory);
+        if (extMemPool->userPool())
+            header->memoryBlock->unregisterFromPool(extMemPool);
+        extMemPool->backend.putLargeBlock(header->memoryBlock);
         STAT_increment(getThreadId(), ThreadCommonCounters, freeLargeObj);
     }
 }
 
 /*********** End allocation of large objects **********/
 
-
-
 } // namespace internal
 } // namespace rml
 
diff --git a/src/tbbmalloc/lin-tbbmalloc-export.def b/src/tbbmalloc/lin32-tbbmalloc-export.def
similarity index 88%
copy from src/tbbmalloc/lin-tbbmalloc-export.def
copy to src/tbbmalloc/lin32-tbbmalloc-export.def
index 0fd7a05..5bfc767 100644
--- a/src/tbbmalloc/lin-tbbmalloc-export.def
+++ b/src/tbbmalloc/lin32-tbbmalloc-export.def
@@ -43,11 +43,18 @@ __TBB_internal_malloc;
 __TBB_internal_realloc;
 __TBB_internal_posix_memalign;
 scalable_msize;
+/* memory pool stuff */
+_ZN3rml10pool_resetEPNS_10MemoryPoolE;
+_ZN3rml11pool_createEiPKNS_13MemPoolPolicyE;
+_ZN3rml11pool_mallocEPNS_10MemoryPoolEj;
+_ZN3rml12pool_destroyEPNS_10MemoryPoolE;
+_ZN3rml9pool_freeEPNS_10MemoryPoolEPv;
+_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvj;
 
 local:
 
 /* TBB symbols */
-*3rml8internal*;
+*3rml*;
 *3tbb*;
 *__TBB*;
 __itt_*;
diff --git a/src/tbbmalloc/lin-tbbmalloc-export.def b/src/tbbmalloc/lin64-tbbmalloc-export.def
similarity index 88%
copy from src/tbbmalloc/lin-tbbmalloc-export.def
copy to src/tbbmalloc/lin64-tbbmalloc-export.def
index 0fd7a05..3501d70 100644
--- a/src/tbbmalloc/lin-tbbmalloc-export.def
+++ b/src/tbbmalloc/lin64-tbbmalloc-export.def
@@ -43,11 +43,18 @@ __TBB_internal_malloc;
 __TBB_internal_realloc;
 __TBB_internal_posix_memalign;
 scalable_msize;
+/* memory pool stuff */
+_ZN3rml11pool_createElPKNS_13MemPoolPolicyE;
+_ZN3rml10pool_resetEPNS_10MemoryPoolE;
+_ZN3rml11pool_mallocEPNS_10MemoryPoolEm;
+_ZN3rml12pool_destroyEPNS_10MemoryPoolE;
+_ZN3rml9pool_freeEPNS_10MemoryPoolEPv;
+_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm;
 
 local:
 
 /* TBB symbols */
-*3rml8internal*;
+*3rml*;
 *3tbb*;
 *__TBB*;
 __itt_*;
diff --git a/src/tbbmalloc/lin-tbbmalloc-export.def b/src/tbbmalloc/lin64ipf-tbbmalloc-export.def
similarity index 86%
rename from src/tbbmalloc/lin-tbbmalloc-export.def
rename to src/tbbmalloc/lin64ipf-tbbmalloc-export.def
index 0fd7a05..01a5b19 100644
--- a/src/tbbmalloc/lin-tbbmalloc-export.def
+++ b/src/tbbmalloc/lin64ipf-tbbmalloc-export.def
@@ -43,11 +43,19 @@ __TBB_internal_malloc;
 __TBB_internal_realloc;
 __TBB_internal_posix_memalign;
 scalable_msize;
+/* memory pool stuff */
+_ZN3rml10pool_resetEPNS_10MemoryPoolE;
+_ZN3rml11pool_createEiPKNS_13MemPoolPolicyE;
+_ZN3rml11pool_createElPKNS_13MemPoolPolicyE;
+_ZN3rml11pool_mallocEPNS_10MemoryPoolEm;
+_ZN3rml12pool_destroyEPNS_10MemoryPoolE;
+_ZN3rml9pool_freeEPNS_10MemoryPoolEPv;
+_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm;
 
 local:
 
 /* TBB symbols */
-*3rml8internal*;
+*3rml*;
 *3tbb*;
 *__TBB*;
 __itt_*;
diff --git a/src/tbbmalloc/mac32-tbbmalloc-export.def b/src/tbbmalloc/mac32-tbbmalloc-export.def
index 0e36795..eea06f7 100644
--- a/src/tbbmalloc/mac32-tbbmalloc-export.def
+++ b/src/tbbmalloc/mac32-tbbmalloc-export.def
@@ -18,7 +18,6 @@
     writing.
 */
 
-// MemoryAllocator.cpp
 _scalable_calloc
 _scalable_free
 _scalable_malloc
@@ -28,3 +27,10 @@ _scalable_aligned_malloc
 _scalable_aligned_realloc
 _scalable_aligned_free
 _scalable_msize
+/* memory pool stuff */
+__ZN3rml11pool_createElPKNS_13MemPoolPolicyE
+__ZN3rml10pool_resetEPNS_10MemoryPoolE
+__ZN3rml12pool_destroyEPNS_10MemoryPoolE
+__ZN3rml11pool_mallocEPNS_10MemoryPoolEm
+__ZN3rml9pool_freeEPNS_10MemoryPoolEPv
+__ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm
diff --git a/src/tbbmalloc/mac64-tbbmalloc-export.def b/src/tbbmalloc/mac64-tbbmalloc-export.def
index 0e36795..eea06f7 100644
--- a/src/tbbmalloc/mac64-tbbmalloc-export.def
+++ b/src/tbbmalloc/mac64-tbbmalloc-export.def
@@ -18,7 +18,6 @@
     writing.
 */
 
-// MemoryAllocator.cpp
 _scalable_calloc
 _scalable_free
 _scalable_malloc
@@ -28,3 +27,10 @@ _scalable_aligned_malloc
 _scalable_aligned_realloc
 _scalable_aligned_free
 _scalable_msize
+/* memory pool stuff */
+__ZN3rml11pool_createElPKNS_13MemPoolPolicyE
+__ZN3rml10pool_resetEPNS_10MemoryPoolE
+__ZN3rml12pool_destroyEPNS_10MemoryPoolE
+__ZN3rml11pool_mallocEPNS_10MemoryPoolEm
+__ZN3rml9pool_freeEPNS_10MemoryPoolEPv
+__ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm
diff --git a/src/tbbmalloc/tbb_function_replacement.cpp b/src/tbbmalloc/tbb_function_replacement.cpp
index 632987e..072b146 100644
--- a/src/tbbmalloc/tbb_function_replacement.cpp
+++ b/src/tbbmalloc/tbb_function_replacement.cpp
@@ -199,7 +199,7 @@ size_t compareStrings( const char *str1, const char *str2 )
 // Check function prologue with know prologues from the dictionary
 // opcodes - dictionary
 // inpAddr - pointer to function prologue
-// Dictionary contains opcodes for several full asm instrutions
+// Dictionary contains opcodes for several full asm instructions
 // + one opcode byte for the next asm instruction for safe address processing
 // RETURN: number of bytes for safe bytes replacement 
 // (matched_pattern/2-1)
diff --git a/src/tbbmalloc/tbbmalloc_internal.h b/src/tbbmalloc/tbbmalloc_internal.h
index c9c8956..c011c24 100644
--- a/src/tbbmalloc/tbbmalloc_internal.h
+++ b/src/tbbmalloc/tbbmalloc_internal.h
@@ -35,16 +35,23 @@
 #if USE_PTHREAD
     // Some pthreads documentation says that <pthreads.h> must be first header.
     #include <pthread.h>
+    typedef pthread_key_t tls_key_t;
+#elif USE_WINTHREAD
+    #include "tbb/machine/windows_api.h"
+    typedef DWORD tls_key_t;
+#else
+    #error Must define USE_PTHREAD or USE_WINTHREAD
 #endif
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <limits.h> // for CHAR_BIT
 #if MALLOC_CHECK_RECURSION
 #include <new>        /* for placement new */
 #endif
 
 #if __sun || __SUNPRO_CC
-#define __asm__ asm 
+#define __asm__ asm
 #endif
 
 extern "C" {
@@ -70,6 +77,20 @@ extern "C" {
 /********* End compile-time options        **************/
 
 namespace rml {
+
+#if !MEM_POLICY_DEFINED
+typedef void *(*rawAllocType)(intptr_t pool_id, size_t &bytes);
+typedef int   (*rawFreeType)(intptr_t pool_id, void* raw_ptr, size_t raw_bytes);
+
+struct MemPoolPolicy {
+    rawAllocType pAlloc;        // pAlloc and pFree must be thread-safe
+    rawFreeType  pFree;
+    size_t       granularity;   // granularity of pAlloc allocations
+    void        *pReserved;     // reserved for future extensions
+    size_t       szReserved;    // size of pReserved data
+};
+#endif
+
 namespace internal {
 
 /********** Various numeric parameters controlling allocations ********/
@@ -91,8 +112,56 @@ const uint32_t largeBlockCacheStep = 8*1024;
  */
 const unsigned cacheCleanupFreq = 256;
 
+ /*
+  * The number of bins to cache large objects.
+  */
+const uint32_t numLargeBlockBins = 1024; // for 1024 max cached size is near 8MB
+
 /********** End of numeric parameters controlling allocations *********/
 
+class BlockI;
+struct LargeMemoryBlock;
+struct ExtMemoryPool;
+struct MemRegion;
+class FreeBlock;
+class TLSData;
+class Backend;
+class MemoryPool;
+
+class TLSKey {
+    tls_key_t TLS_pointer_key;
+public:
+    TLSKey();
+   ~TLSKey();
+    TLSData* getThreadMallocTLS() const;
+    void setThreadMallocTLS( TLSData * newvalue );
+    TLSData* createTLS(MemoryPool *memPool, Backend *backend);
+};
+
+class CachedLargeBlocksL {
+    LargeMemoryBlock *first,
+                     *last;
+    /* age of an oldest block in the list; equal to last->age, if last defined,
+       used for quick cheching it without acquiring the lock. */
+    uintptr_t     oldest;
+    /* currAge when something was excluded out of list because of the age,
+       not because of cache hit */
+    uintptr_t     lastCleanedAge;
+    /* Current threshold value for the blocks of a particular size.
+       Set on cache miss. */
+    intptr_t      ageThreshold;
+
+    MallocMutex   lock;
+    /* CachedBlocksList should be placed in zero-initialized memory,
+       ctor not needed. */
+    CachedLargeBlocksL();
+public:
+    inline bool push(ExtMemoryPool *extMemPool, LargeMemoryBlock* ptr);
+    inline LargeMemoryBlock* pop(ExtMemoryPool *extMemPool);
+    bool releaseLastIfOld(ExtMemoryPool *extMemPool, uintptr_t currAge);
+    bool releaseAll(ExtMemoryPool *extMemPool);
+};
+
 class BackRefIdx { // composite index to backreference array
 private:
     uint16_t master;      // index in BackRefMaster
@@ -109,51 +178,322 @@ public:
     static BackRefIdx newBackRef(bool largeObj);
 };
 
-struct LargeMemoryBlock {
+// Block header is used during block coalescing
+// and must be preserved in used blocks.
+class BlockI {
+    intptr_t     blockState[2];
+};
+
+struct LargeMemoryBlock : public BlockI {
     LargeMemoryBlock *next,          // ptrs in list of cached blocks
-                     *prev;
+                     *prev,
+    // 2-linked list of pool's large objects
+    // Used to destroy backrefs on pool destroy/reset (backrefs are global).
+                     *gPrev,
+                     *gNext;
     uintptr_t         age;           // age of block while in cache
     size_t            objectSize;    // the size requested by a client
     size_t            unalignedSize; // the size requested from getMemory
-    bool              fromMapMemory;
+    // Is the block from getRawMem or from bin?
+    // It can't be detected reliable via size, because sometimes
+    // objects larger then Backend::maxBinedSize can be allocated from bins.
+    bool              directRawMemCall;
     BackRefIdx        backRefIdx;    // cached here, used copy is in LargeObjectHdr
+    void registerInPool(ExtMemoryPool *extMemPool);
+    void unregisterFromPool(ExtMemoryPool *extMemPool);
 };
 
-struct LargeObjectHdr {
-    LargeMemoryBlock *memoryBlock;
-    /* Backreference points to LargeObjectHdr. 
-       Duplicated in LargeMemoryBlock to reuse in subsequent allocations. */
-    BackRefIdx       backRefIdx;
+// global state of blocks currently in processing
+class ProcBlocks {
+    // number of blocks currently removed from one bin and not returned
+    intptr_t  blocksInProcessing;  // to another
+    intptr_t  binsModifications;   // incremented on every bin modification
+public:
+    void consume() { AtomicIncrement(blocksInProcessing); }
+    void pureSignal() { AtomicIncrement(binsModifications); }
+    void signal() {
+        MALLOC_ITT_SYNC_RELEASING(&blocksInProcessing);
+        AtomicIncrement(binsModifications);
+        intptr_t prev = AtomicAdd(blocksInProcessing, -1);
+        MALLOC_ASSERT(prev > 0, ASSERT_TEXT);
+    }
+    intptr_t getNumOfMods() const { return FencedLoad(binsModifications); }
+    // return true if need re-do the search
+    bool waitTillSignalled(intptr_t startModifiedCnt) {
+        intptr_t myBlocksNum = FencedLoad(blocksInProcessing);
+        if (!myBlocksNum) {
+            // no threads, but were bins modified since scanned?
+            return startModifiedCnt != getNumOfMods();
+        }
+        MALLOC_ITT_SYNC_PREPARE(&blocksInProcessing);
+        for (;;) {
+            SpinWaitWhileEq(blocksInProcessing, myBlocksNum);
+            if (myBlocksNum > blocksInProcessing)
+                break;
+            myBlocksNum = FencedLoad(blocksInProcessing);
+        }
+        MALLOC_ITT_SYNC_ACQUIRED(&blocksInProcessing);
+        return true;
+    }
 };
 
-struct FreeObject {
-    FreeObject  *next;
+class CoalRequestQ { // queue of free blocks that coalescing was delayed
+    FreeBlock *blocksToFree;
+public:
+    FreeBlock *getAll(); // return current list of blocks and make queue empty
+    void putBlock(FreeBlock *fBlock);
 };
 
-// interface class for external access to Block
-class BlockI {
+template<unsigned NUM>
+class BitMask {
+    static const int SZ = NUM/( CHAR_BIT*sizeof(uintptr_t)) + (NUM % sizeof(uintptr_t) ? 1:0);
+    uintptr_t mask[SZ];
+public:
+    void set(size_t idx, bool val) {
+        MALLOC_ASSERT(idx<NUM, ASSERT_TEXT);
+
+        size_t i = idx / (CHAR_BIT*sizeof(uintptr_t));
+        int pos = idx % (CHAR_BIT*sizeof(uintptr_t));
+        if (val)
+            AtomicOr(&mask[i], 1ULL << pos);
+        else
+            AtomicAnd(&mask[i], ~(1ULL << pos));
+    }
+    int getMinTrue(unsigned startIdx) const {
+        size_t idx = startIdx / (CHAR_BIT*sizeof(uintptr_t));
+        int pos = startIdx % (CHAR_BIT*sizeof(uintptr_t));
+        // clear bits before startIdx
+        uintptr_t curr = mask[idx] & ~((1ULL<<pos) - 1);
+
+        for (int i=idx; i<SZ; i++, curr=mask[i]) {
+            if (-1 != (pos = BitScanRev(curr)))
+                return i*sizeof(uintptr_t)*CHAR_BIT + pos;
+        }
+        return -1;
+    }
+    void reset() { for (int i=0; i<SZ; i++) mask[i] = 0; }
+};
+
+class MemExtendingSema {
+    intptr_t     active;
 public:
-    static BlockI *getRawBlock(bool startup);
-    void initialize(void *bumpPtr);
+    bool wait() {
+        bool rescanBins = false;
+        // up to 3 threads can add more memory from OS simultaneously,
+        // rest of threads have to wait
+        for (;;) {
+            intptr_t prevCnt = FencedLoad(active);
+            if (prevCnt < 3) {
+                intptr_t n = AtomicCompareExchange(active, prevCnt+1, prevCnt);
+                if (n == prevCnt)
+                    break;
+            } else {
+                SpinWaitWhileEq(active, prevCnt);
+                rescanBins = true;
+                break;
+            }
+        }
+        return rescanBins;
+    }
+    void signal() { AtomicAdd(active, -1); }
 };
 
-class FreeBlocks {
-    typedef void* (*RawAlloc) (size_t size, bool useMapMem);
-    typedef void (*RawFree) (void *object, size_t size, bool useMapMem);
+class Backend {
+public:
+    static const unsigned minPower2 = 3+10;
+    static const unsigned maxPower2 = 12+10;
+    // 2^13 B, i.e. 8KB
+    static const size_t minBinedSize = 1 << minPower2;
+    // 2^22 B, i.e. 4MB
+    static const size_t maxBinedSize = 1 << maxPower2;
+
+    static const int freeBinsNum =
+        (maxBinedSize-minBinedSize)/largeBlockCacheStep + 1;
+
+    // Bin keeps 2-linked list of free blocks. It must be 2-linked
+    // because during coalescing a block it's removed from a middle of the list.
+    struct Bin {
+        FreeBlock   *head;
+        MallocMutex  tLock;
+
+        void removeBlock(FreeBlock *fBlock);
+        void reset() { head = 0; }
+        size_t countFreeBlocks();
+        void verify();
+        bool empty() const { return !head; }
+    };
+
+    // array of bins accomplished bitmask for fast finding of non-empty bins
+    class IndexedBins {
+        BitMask<Backend::freeBinsNum> bitMask;
+        Bin                           freeBins[Backend::freeBinsNum];
+    public:
+        FreeBlock *getBlock(int binIdx, ProcBlocks *procBlocks, size_t size,
+                            bool res16Kaligned, bool alignedBin, bool wait,
+                            int *resLocked);
+        void lockRemoveBlock(int binIdx, FreeBlock *fBlock);
+        void addBlock(int binIdx, FreeBlock *fBlock, size_t blockSz);
+        bool tryAddBlock(int binIdx, FreeBlock *fBlock, size_t blockSz);
+        int getMinNonemptyBin(unsigned startBin) const {
+            int p = bitMask.getMinTrue(startBin);
+            return p == -1 ? Backend::freeBinsNum : p;
+        }
+        void reset();
+    };
 
-    RawAlloc rawAlloc;
-    RawFree rawFree;
-    size_t memReqSize;
+private:
+    ExtMemoryPool *extMemPool;
+    // used for release every region on pool destroying
+    MemRegion     *regionList;
+    MallocMutex    regionListLock;
+
+    CoalRequestQ   coalescQ; // queue of coalescing requests
+    ProcBlocks     procBlocks;
+    // semaphore protecting adding more more memory from OS
+    MemExtendingSema memExtendingSema;
+
+    // Using of maximal observed requested size allows descrease
+    // memory consumption for small requests and descrease fragmentation
+    // for workloads when small and large allocation requests are mixed.
+    // TODO: decrease, not only increase it
+    size_t         maxRequestedSize;
+    void correctMaxRequestSize(size_t requestSize);
+
+    size_t addNewRegion(size_t rawSize);
+    size_t initRegion(MemRegion *region, size_t rawSize);
+    void releaseRegion(MemRegion *region);
+
+    void *genericGetBlock(int num, size_t size, bool res16Kaligned, bool startup);
+    void genericPutBlock(FreeBlock *fBlock, size_t blockSz,
+                         bool directRawMemCall);
+    FreeBlock *getFromAlignedSpace(int binIdx, int num, size_t size, bool res16Kaligned, bool wait, int *locked);
+    FreeBlock *getFromBin(int binIdx, int num, size_t size, bool res16Kaligned, int *locked);
+
+    FreeBlock *doCoalesc(FreeBlock *fBlock, MemRegion **memRegion);
+    void coalescAndPutList(FreeBlock *head, bool forceCoalescQDrop, bool doStat);
+    bool scanCoalescQ(bool forceCoalescQDrop);
+    void coalescAndPut(FreeBlock *fBlock, size_t blockSz);
+
+    void removeBlockFromBin(FreeBlock *fBlock);
+
+    void *getRawMem(size_t &size, bool useMapMem) const;
+    void freeRawMem(void *object, size_t size, bool useMapMem) const;
 
-    bool mallocBigBlock();
 public:
-    bool bootstrap(RawAlloc myAlloc, RawFree myFree, size_t myReqSize);
-    BlockI *get(bool startup);
-    void put(BlockI *block, bool startup);
-    void putList(BlockI *head, BlockI *tail);
+    bool bootstrap(ExtMemoryPool *extMemoryPool) {
+        extMemPool = extMemoryPool;
+        return addNewRegion(2*1024*1024);
+    }
+    bool reset();
+    bool destroy();
+
+    BlockI *get16KBlock(int num, bool startup) {
+        BlockI *b = (BlockI*)
+            genericGetBlock(num, blockSize, /*res16Kaligned=*/true, startup);
+        MALLOC_ASSERT(isAligned(b, blockSize), ASSERT_TEXT);
+        return b;
+    }
+    void put16KBlock(BlockI *block, bool /*startup*/) {
+        genericPutBlock((FreeBlock *)block, blockSize,
+                        /*directRawMemCall=*/false);
+    }
+
+    bool inUserPool() const;
+
+    LargeMemoryBlock *getLargeBlock(size_t size, bool startup);
+    void putLargeBlock(LargeMemoryBlock *lmb) {
+        genericPutBlock((FreeBlock *)lmb, lmb->unalignedSize,
+                        lmb->directRawMemCall);
+    }
+
+    void reportStat();
+
+    enum {
+        NO_BIN = -1
+    };
+private:
+    static int sizeToBin(size_t size) {
+        if (size >= maxBinedSize)
+            return freeBinsNum-1;
+        else if (size < minBinedSize)
+            return NO_BIN;
+
+        int bin = (size - minBinedSize)/largeBlockCacheStep;
+
+        MALLOC_ASSERT(bin < freeBinsNum-1, "Invalid size.");
+        return bin;
+    }
+    static bool toAlignedBin(FreeBlock *block, size_t size) {
+        return isAligned((uintptr_t)block+size, blockSize) && size >= blockSize;
+    }
+
+    IndexedBins freeLargeBins,
+                freeAlignedBins;
+};
+
+struct ExtMemoryPool {
+    Backend           backend;
+
+    intptr_t          poolId;
+    // to find all large objects
+    MallocMutex       largeObjLock;
+    LargeMemoryBlock *loHead;
+    // Callbacks to be used instead of MapMemory/UnmapMemory.
+    rawAllocType      rawAlloc;
+    rawFreeType       rawFree;
+    size_t            granularity;
+    TLSKey            tlsPointerKey;  // per-pool TLS key
+
+    // bins with lists of recently freed large blocks cached for re-use
+    CachedLargeBlocksL cachedLargeBlocks[numLargeBlockBins];
+
+    bool doLOCacheCleanup(uintptr_t currAge);
+
+    // i.e., not system default pool for scalable_malloc/scalable_free
+    bool userPool() const { return rawAlloc; }
+
+    bool fixedSizePool() const { return userPool() && !rawFree; }
+
+     // true if something has beed released
+    bool softCachesCleanup();
+    bool release16KBCaches();
+    bool hardCachesCleanup() {
+        bool res = false;
+
+        for (int i = numLargeBlockBins-1; i >= 0; i--)
+            res |= cachedLargeBlocks[i].releaseAll(this);
+        // TODO: to release all thread's pools, not just current thread
+        res |= release16KBCaches();
+
+        return res;
+    }
+
+    void reset() {
+        // must reset LOC because all backrefs are cleaned,
+        // because backrefs in LOC are invalid already
+        hardCachesCleanup();
+        backend.reset();
+        tlsPointerKey.~TLSKey();
+    }
+    void destroy() {
+        if (rawFree)
+            backend.destroy();
+        tlsPointerKey.~TLSKey();
+    }
+};
+
+inline bool Backend::inUserPool() const { return extMemPool->userPool(); }
+
+struct LargeObjectHdr {
+    LargeMemoryBlock *memoryBlock;
+    /* Backreference points to LargeObjectHdr.
+       Duplicated in LargeMemoryBlock to reuse in subsequent allocations. */
+    BackRefIdx       backRefIdx;
 };
 
-extern FreeBlocks freeBlocks;
+struct FreeObject {
+    FreeObject  *next;
+};
 
 /******* A helper class to support overriding malloc with scalable_malloc *******/
 #if MALLOC_CHECK_RECURSION
@@ -168,7 +508,7 @@ class RecursiveMallocCallProtector {
    RecursiveMallocCallProtector can be before pthread initialized, pthread calls
    can't be used in 1st instance of RecursiveMallocCallProtector.
    RecursiveMallocCallProtector is used 1st time in checkInitialization(),
-   so there is a guarantee that on 2nd usage pthread is initialized. 
+   so there is a guarantee that on 2nd usage pthread is initialized.
    No such situation observed with other supported OSes.
  */
 #if __FreeBSD__
@@ -226,8 +566,8 @@ public:
     static void detectNaiveOverload() {
         if (!malloc_proxy) {
 #if __FreeBSD__
-/* If !canUsePthread, we can't call pthread_self() before, but now pthread 
-   is already on, so can do it. False positives here lead to silent switching 
+/* If !canUsePthread, we can't call pthread_self() before, but now pthread
+   is already on, so can do it. False positives here lead to silent switching
    from malloc to mmap for all large allocations with bad performance impact. */
             if (!canUsePthread) {
                 canUsePthread = true;
@@ -251,20 +591,19 @@ public:
 
 bool isMallocInitializedExt();
 
-void* getRawMemory (size_t size, bool useMapMem);
-void freeRawMemory (void *object, size_t size, bool useMapMem);
-
 extern const uint32_t minLargeObjectSize;
 bool isLargeObject(void *object);
-void* mallocLargeObject (size_t size, size_t alignment, bool startupAlloc = false);
-void freeLargeObject (void *object);
+void* mallocLargeObject(ExtMemoryPool *extMemPool, size_t size, size_t alignment, bool startupAlloc = false);
+void freeLargeObject(ExtMemoryPool *extMemPool, void *object);
 
 unsigned int getThreadId();
 
-bool initBackRefMaster();
+bool initBackRefMaster(Backend *backend);
 void removeBackRef(BackRefIdx backRefIdx);
 void setBackRef(BackRefIdx backRefIdx, void *newPtr);
 void *getBackRef(BackRefIdx backRefIdx);
+void* getRawMemory(size_t size, bool useMapMem);
+bool freeRawMemory(void *object, size_t size, bool useMapMem);
 
 } // namespace internal
 } // namespace rml
diff --git a/src/tbbmalloc/win-gcc-tbbmalloc-export.def b/src/tbbmalloc/win32-gcc-tbbmalloc-export.def
similarity index 86%
copy from src/tbbmalloc/win-gcc-tbbmalloc-export.def
copy to src/tbbmalloc/win32-gcc-tbbmalloc-export.def
index c6090ee..0c8cd0b 100644
--- a/src/tbbmalloc/win-gcc-tbbmalloc-export.def
+++ b/src/tbbmalloc/win32-gcc-tbbmalloc-export.def
@@ -41,5 +41,13 @@ safer_scalable_realloc;
 scalable_msize;
 safer_scalable_msize;
 safer_scalable_aligned_realloc;
+/* memory pool stuff */
+_ZN3rml10pool_resetEPNS_10MemoryPoolE;
+_ZN3rml11pool_createEiPKNS_13MemPoolPolicyE;
+_ZN3rml11pool_mallocEPNS_10MemoryPoolEj;
+_ZN3rml12pool_destroyEPNS_10MemoryPoolE;
+_ZN3rml9pool_freeEPNS_10MemoryPoolEPv;
+_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvj;
+
 local:*;
 };
diff --git a/src/tbbmalloc/win32-tbbmalloc-export.def b/src/tbbmalloc/win32-tbbmalloc-export.def
index 835722b..7a44ecb 100644
--- a/src/tbbmalloc/win32-tbbmalloc-export.def
+++ b/src/tbbmalloc/win32-tbbmalloc-export.def
@@ -26,7 +26,7 @@
 
 EXPORTS
 
-; MemoryAllocator.cpp
+; frontend.cpp
 scalable_calloc
 scalable_free
 scalable_malloc
@@ -40,3 +40,10 @@ safer_scalable_realloc
 scalable_msize
 safer_scalable_msize
 safer_scalable_aligned_realloc
+?pool_create at rml@@YAPAVMemoryPool at 1@HPBUMemPoolPolicy at 1@@Z
+?pool_destroy at rml@@YA_NPAVMemoryPool at 1@@Z
+?pool_malloc at rml@@YAPAXPAVMemoryPool at 1@I at Z
+?pool_free at rml@@YA_NPAVMemoryPool at 1@PAX at Z
+?pool_reset at rml@@YA_NPAVMemoryPool at 1@@Z
+?pool_realloc at rml@@YAPAXPAVMemoryPool at 1@PAXI at Z
+
diff --git a/src/tbbmalloc/win-gcc-tbbmalloc-export.def b/src/tbbmalloc/win64-gcc-tbbmalloc-export.def
similarity index 86%
rename from src/tbbmalloc/win-gcc-tbbmalloc-export.def
rename to src/tbbmalloc/win64-gcc-tbbmalloc-export.def
index c6090ee..c1455b6 100644
--- a/src/tbbmalloc/win-gcc-tbbmalloc-export.def
+++ b/src/tbbmalloc/win64-gcc-tbbmalloc-export.def
@@ -41,5 +41,13 @@ safer_scalable_realloc;
 scalable_msize;
 safer_scalable_msize;
 safer_scalable_aligned_realloc;
+/* memory pool stuff */
+_ZN3rml10pool_resetEPNS_10MemoryPoolE;
+_ZN3rml11pool_createExPKNS_13MemPoolPolicyE;
+_ZN3rml11pool_mallocEPNS_10MemoryPoolEy;
+_ZN3rml12pool_destroyEPNS_10MemoryPoolE;
+_ZN3rml9pool_freeEPNS_10MemoryPoolEPv;
+_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvy;
+
 local:*;
 };
diff --git a/src/tbbmalloc/win64-tbbmalloc-export.def b/src/tbbmalloc/win64-tbbmalloc-export.def
index 835722b..9a0566f 100644
--- a/src/tbbmalloc/win64-tbbmalloc-export.def
+++ b/src/tbbmalloc/win64-tbbmalloc-export.def
@@ -26,7 +26,7 @@
 
 EXPORTS
 
-; MemoryAllocator.cpp
+; frontend.cpp
 scalable_calloc
 scalable_free
 scalable_malloc
@@ -40,3 +40,10 @@ safer_scalable_realloc
 scalable_msize
 safer_scalable_msize
 safer_scalable_aligned_realloc
+; memory pool stuff
+?pool_create at rml@@YAPEAVMemoryPool at 1@_JPEBUMemPoolPolicy at 1@@Z
+?pool_destroy at rml@@YA_NPEAVMemoryPool at 1@@Z
+?pool_malloc at rml@@YAPEAXPEAVMemoryPool at 1@_K at Z
+?pool_free at rml@@YA_NPEAVMemoryPool at 1@PEAX at Z
+?pool_reset at rml@@YA_NPEAVMemoryPool at 1@@Z
+?pool_realloc at rml@@YAPEAXPEAVMemoryPool at 1@PEAX_K at Z
diff --git a/src/tbbproxy/tbbproxy-windows.asm b/src/tbbproxy/tbbproxy-windows.asm
new file mode 100644
index 0000000..465d53c
--- /dev/null
+++ b/src/tbbproxy/tbbproxy-windows.asm
@@ -0,0 +1,121 @@
+; Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+;
+; This file is part of Threading Building Blocks.
+;
+; Threading Building Blocks is free software; you can redistribute it
+; and/or modify it under the terms of the GNU General Public License
+; version 2 as published by the Free Software Foundation.
+;
+; Threading Building Blocks is distributed in the hope that it will be
+; useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+; of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with Threading Building Blocks; if not, write to the Free Software
+; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+;
+; As a special exception, you may use this file as part of a free software
+; library without restriction.  Specifically, if other files instantiate
+; templates or use macros or inline functions from this file, or you compile
+; this file and link it with other files to produce an executable, this
+; file does not by itself cause the resulting executable to be covered by
+; the GNU General Public License.  This exception does not however
+; invalidate any other reasons why the executable file might be covered by
+; the GNU General Public License.
+
+#include "tbb/tbb_config.h"
+
+// __TBB_STRING macro defined in "tbb_stddef.h". However, we cannot include "tbb_stddef.h"
+// because it contains a lot of C/C++ definitions. So, we have to define __TBB_STRING here:
+#define __TBB_STRING_AUX( x ) #x
+#define __TBB_STRING( x ) __TBB_STRING_AUX( x )
+
+// Eliminate difference between IA-32 and Intel 64: AWORD is a type of pointer, LANG is language
+// specification for extern directive.
+#ifdef ARCH_ia32
+    #define AWORD dword
+    #define LANG  c
+#else
+    #define AWORD qword
+    #define LANG
+#endif
+
+#ifdef ARCH_ia32
+    // These directives are required for IA32 architecture only.
+    .686
+    .model flat, syscall
+#endif
+
+/*
+    Symbol names.
+*/
+
+// Note: masm for IA-32 does not like symbols defined as "name:" in data sections,
+// so we have to define symbols with "name label type" directive instead.
+
+fname macro sym:req
+    align sizeof AWORD
+    Ln_&sym& label byte
+    byte "&sym&", 0
+endm
+
+.const        // Symbol names are constants.
+#define __TBB_SYMBOL( sym ) fname sym
+#include __TBB_STRING( __TBB_LST )
+
+/*
+    Symbol descriptors.
+*/
+
+extern LANG __tbb_internal_runtime_loader_stub : AWORD
+
+fsymbol macro sym:req
+    Ls_&sym& label AWORD
+    AWORD __tbb_internal_runtime_loader_stub
+    AWORD Ln_&sym&
+    dword sizeof AWORD
+    dword 1
+endm
+
+.data
+align sizeof AWORD
+public LANG __tbb_internal_runtime_loader_symbols
+__tbb_internal_runtime_loader_symbols label AWORD
+#define __TBB_SYMBOL( sym ) fsymbol sym
+#include __TBB_STRING( __TBB_LST )
+AWORD 0, 0        // Terminator of the __tbb_internal_runtime_loader_symbols array.
+dword 0, 0
+
+/*
+    Generate functions.
+*/
+
+// Helper assembler macro to handle different naming conventions on IA-32 and Intel 64:
+// IA-32: C++ names preserved, C names require leading underscore.
+// Intel 64: All names preserved.
+mangle  macro name:req
+    #ifdef ARCH_ia32
+        if @instr( 1, name, <?> )
+            exitm @catstr( name )
+        else
+            exitm @catstr( <_>, name )
+        endif
+    #else
+        exitm @catstr( name )
+    #endif
+endm
+
+function macro sym:req
+    mangle( sym )  proc
+        jmp AWORD ptr Ls_&sym&
+    mangle( sym )  endp
+endm
+
+.code
+#define __TBB_SYMBOL( sym ) function sym
+#include __TBB_STRING( __TBB_LST )
+
+end
+
+// end of file //
diff --git a/src/tbbproxy/tbbproxy.cpp b/src/tbbproxy/tbbproxy.cpp
new file mode 100644
index 0000000..544e5fa
--- /dev/null
+++ b/src/tbbproxy/tbbproxy.cpp
@@ -0,0 +1,616 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#define TBB_PREVIEW_RUNTIME_LOADER 1
+#include "tbb/runtime_loader.h"
+#include "tbb/tbb_stddef.h"
+
+// C standard headers.
+#include <cctype>            // isspace
+#include <cstdarg>           // va_list, etc.
+#include <cstdio>            // fprintf, stderr, etc.
+#include <cstdlib>           // malloc, free, abort.
+#include <cstring>           // strlen, etc.
+
+// C++ standard headers.
+#include <typeinfo>
+
+// OS-specific includes.
+#if _WIN32 || _WIN64
+    #include <windows.h>
+    #define snprintf _snprintf
+    #undef max
+#else
+    #include <dlfcn.h>    // dlopen, dlsym, dlclose, dlerror.
+#endif
+
+#if TBB_USE_ASSERT
+    // We cannot use __TBB_ASSERT as it is because it calls a function from tbb library which may
+    // be not yet loaded. Redefine __TBB_ASSERT not to call tbb functions.
+    #undef __TBB_ASSERT
+    #define __TBB_ASSERT( cond, msg ) {                                                            \
+        if ( ! (cond) ) {                                                                          \
+            say( "%s:%d: Assertion failed: %s.", __FILE__, __LINE__, (msg) );                      \
+        } /* if */                                                                                 \
+        /* TODO: abort? */                                                                         \
+    }
+#endif
+
+// Declare here, define at the bottom.
+extern "C" int __tbb_internal_runtime_loader_stub();
+
+namespace tbb {
+
+namespace interface6 {
+
+namespace internal {
+
+namespace runtime_loader {
+
+
+/*
+    ------------------------------------------------------------------------------------------------
+    User interaction utilities.
+    ------------------------------------------------------------------------------------------------
+*/
+
+
+// Print message to stderr. Do not call it directly, use say() or tell() instead.
+static void _say( char const * format, va_list args ) {
+    /*
+        On Linux Intel 64, vsnprintf() modifies args argument, so vsnprintf() crashes if it
+        is called for the second time with the same args. To prevent the crash, we have to
+        pass a fresh intact copy of args to vsnprintf() each time.
+
+        On Windows, unfortunately, standard va_copy() macro is not available. However, it
+        seems vsnprintf() does not modify args argument.
+    */
+    #if ! ( _WIN32 || _WIN64 )
+        va_list _args;
+        __va_copy( _args, args );  // Make copy of args.
+        #define args _args         // Substitute args with its copy, _args.
+    #endif
+    int len = vsnprintf( NULL, 0, format, args );
+    #if ! ( _WIN32 || _WIN64 )
+        #undef args                // Remove substitution.
+        va_end( _args );
+    #endif
+    char * buf = reinterpret_cast< char * >( malloc( len + 1 ) );
+    if ( buf == NULL ) {
+        abort();
+    } // if
+    vsnprintf( buf, len + 1, format, args );
+    fprintf( stderr, "TBB: %s\n", buf );
+    free( buf );
+} // _say
+
+
+// Debug/test/troubleshooting printing controlled by TBB_VERSION environment variable.
+// To enable printing, the variable must be set and not empty.
+// Do not call it directly, use tell() instead.
+static void _tell( char const * format, va_list args ) {
+    char const * var = getenv( "TBB_VERSION" );
+    if ( var != NULL && var[ 0 ] != 0 ) {
+        _say( format, args );
+    } // if
+} // _tell
+
+
+// Print message to stderr unconditinally.
+static void say( char const * format, ... ) {
+    va_list args;
+    va_start( args, format );
+    _say( format, args );
+    va_end( args );
+} // say
+
+
+// Debug/test/troubleshooting printing controlled by TBB_VERSION environment variable.
+// To enable printing, the variable must be set and not empty.
+static void tell( char const * format, ... ) {
+    va_list args;
+    va_start( args, format );
+    _tell( format, args );
+    va_end( args );
+} // tell
+
+
+// Error reporting utility. Behavior depends on mode.
+static tbb::runtime_loader::error_code error( tbb::runtime_loader::error_mode mode, tbb::runtime_loader::error_code err, char const * format, ... ) {
+    va_list args;
+    va_start( args, format );
+    if ( mode == tbb::runtime_loader::em_abort ) {
+        // In em_abort mode error message printed unconditionally.
+        _say( format, args );
+    } else {
+        // In other modes printing depends on TBB_VERSION environment variable.
+        _tell( format, args );
+    } // if
+    va_end( args );
+    switch ( mode ) {
+        case tbb::runtime_loader::em_abort : {
+            say( "Aborting..." );
+            #if TBB_USE_DEBUG && ( _WIN32 || _WIN64 )
+                DebugBreak();
+            #endif
+            abort();
+        } break;
+        case tbb::runtime_loader::em_throw : {
+            throw err;
+        } break;
+        case tbb::runtime_loader::em_status : {
+            // Do nothing.
+        } break;
+    } // switch
+    return err;
+} // error
+
+
+/*
+    ------------------------------------------------------------------------------------------------
+    General-purpose string manupulation utilities.
+    ------------------------------------------------------------------------------------------------
+*/
+
+
+// Delete character ch from string str in-place.
+static void strip( char * str, char ch ) {
+    int in  = 0;  // Input character index.
+    int out = 0;  // Output character index.
+    for ( ; ; ) {
+        if ( str[ in ] != ch ) {
+            str[ out ] = str[ in ];
+            ++ out;
+        } // if
+        if ( str[ in ] == 0 ) {
+            break;
+        } // if
+        ++ in;
+    } // forever
+} // func strip
+
+
+// Strip trailing whitespaces in-place.
+static void trim( char * str ) {
+    size_t len = strlen( str );
+    while ( len > 0 && isspace( str[ len - 1 ] ) ) {
+        -- len;
+    } // while
+    str[ len ] = 0;
+} // func trim
+
+
+#if _WIN32 || _WIN64
+    // "When specifying a path, be sure to use backslashes (\), not forward slashes (/)."
+    // (see http://msdn.microsoft.com/en-us/library/ms886736.aspx).
+    const char proper_slash = '\\';
+    inline char char_or_slash( char c ) { return c=='/'? '\\': c; }
+#else
+    const char proper_slash = '/';
+    inline char char_or_slash( char c ) { return c; }
+#endif
+
+// Concatenate name of directory and name of file.
+void cat_file( char const * dir, char const * file, char * buffer, size_t len ) {
+    size_t i = 0;
+    // Copy directory name
+    for( ; i<len && *dir; ++i, ++dir ) {
+        buffer[i] = char_or_slash(*dir);
+    }
+    // Append trailing slash if missed.
+    if( i>0 && i<len && buffer[i-1]!=proper_slash ) {
+        buffer[i++] = proper_slash;
+    }
+    // Copy file name
+    __TBB_ASSERT( char_or_slash(*file)!=proper_slash, "File name starts with a slash" );
+    for( ; i<len && *file; ++i, ++file ) {
+        buffer[i] = *file;
+    }
+    // Append null terminator
+    buffer[ i<len? i: len-1 ] = '\0';
+} // cat_file
+
+
+/*
+    ------------------------------------------------------------------------------------------------
+    Windows implementation of dlopen, dlclose, dlsym, dlerror.
+    ------------------------------------------------------------------------------------------------
+*/
+
+
+#if _WIN32 || _WIN64
+
+    // Implement Unix-like interface (dlopen, dlclose, dlsym, dlerror) via Win32 API functions.
+
+    // Type of dlopen result.
+    typedef HMODULE handle_t;
+
+    enum rtld_flags_t {
+        RTLD_NOW,
+        RTLD_GLOBAL
+    }; // enum rtld_flags_t
+
+    // Unix-like dlopen().
+    static handle_t dlopen( char const * name, rtld_flags_t ) {
+        return LoadLibrary( name );
+    } // dlopen
+
+    // Unix-like dlsym().
+    static void * dlsym( handle_t lib, char const * sym ) {
+        return (void*)GetProcAddress( lib, sym );
+    } // dlsym
+
+    // Unix-like dlclose().
+    static int dlclose( handle_t lib ) {
+        return ! FreeLibrary( lib );
+    } // dlclose
+
+    // The function mimics Unix dlerror() function.
+    // Note: Not thread-safe due to statically allocated buffer.
+    static char * dlerror() {
+
+        static char buffer[ 2048 ];  // Note: statically allocated buffer.
+
+        DWORD err = GetLastError();
+        if ( err == ERROR_SUCCESS ) {
+            return NULL;
+        } // if
+
+        DWORD rc;
+        rc =
+            FormatMessage(
+                FORMAT_MESSAGE_FROM_SYSTEM,
+                NULL,
+                err,
+                MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language.
+                reinterpret_cast< LPTSTR >( & buffer ),
+                sizeof( buffer ),
+                NULL
+            );
+        if ( rc == 0 ) {
+            // FormatMessage() failed to format system error message. Buffer to short or another issue.
+            snprintf( buffer, sizeof( buffer ), "System error %u.", err );
+        } else {
+            /*
+                FormatMessage() returns Windows-style end-of-lines, "\r\n". When string is printed,
+                printf() also replaces all the occurences of "\n" with "\r\n" (again!), so sequences
+                like "\r\r\r\n" appear in output. It is not too good. Stripping all "\r" normalizes
+                string and returns it to canonical form, so printf() will produce correct end-of-line
+                sequences.
+            */
+            strip( buffer, '\r' );   // Delete carriage returns if any.
+            trim( buffer );          // Delete trailing newlines and spaces.
+        } // if
+
+        return buffer;
+
+    } // dlerror
+
+#else
+
+    // Type of dlopen() result.
+    typedef void * handle_t;
+
+#endif
+
+
+/*
+    ------------------------------------------------------------------------------------------------
+    Runtime loader stuff.
+    ------------------------------------------------------------------------------------------------
+*/
+
+
+// Descriptor table declaration. It is defined in assembler file.
+enum symbol_type_t {
+    st_object   = 0,
+    st_function = 1
+}; // enum symbol_type_t
+struct symbol_t {
+    void *        addr;
+    char const *  name;
+    int           size;
+    symbol_type_t type;
+}; // symbol_t
+extern "C" symbol_t __tbb_internal_runtime_loader_symbols[];
+
+// Hooks for internal use (e. g. for testing).
+tbb::runtime_loader::error_mode stub_mode = tbb::runtime_loader::em_abort;
+
+static char const * tbb_dll_name = __TBB_STRING(__TBB_DLL_NAME);  // Name of TBB library.
+static handle_t     handle       = NULL;                          // Handle of loaded TBB library or NULL.
+static int          version      = 0;                             // Version of the loaded library.
+static int          counter      = 0;                             // Number of runtime_loader objects using the loaded library.
+
+#define ANOTHER_RTL "probably multiple runtime_loader objects work in parallel"
+
+
+// One attempt to load library (dll_name can be a full path or just a file name).
+static tbb::runtime_loader::error_code _load( char const * dll_name, int min_ver, int max_ver ) {
+
+    tbb::runtime_loader::error_mode mode = tbb::runtime_loader::em_status;
+    tbb::runtime_loader::error_code code = tbb::runtime_loader::ec_ok;
+
+    /*
+        If these variables declared at the first usage, Intel compiler (on Windows IA-32) isues
+        warning(s):
+            transfer of control [goto error] bypasses initialization of: ...
+        Declaring variables at the beginning of the function eliminates warnings.
+    */
+    typedef int (*int_func_t)( void );
+    char const * get_ver_name = "TBB_runtime_interface_version"; // Name of function.
+    int_func_t   get_ver_func = NULL;                            // Pointer to function.
+    handle_t     _handle      = NULL;
+    int          _version     = 0;
+    int          total        = 0;
+    int          not_found    = 0;
+
+    // This function should be called iff there is no loaded library.
+    __TBB_ASSERT( handle  == NULL, "Handle is invalid; "  ANOTHER_RTL );
+    __TBB_ASSERT( version == 0,    "Version is invalid; " ANOTHER_RTL );
+    __TBB_ASSERT( counter == 0,    "Counter is invalid; " ANOTHER_RTL );
+
+    tell( "Loading \"%s\"...", dll_name );
+
+    // First load the library.
+    _handle = dlopen( dll_name, RTLD_NOW );
+    if ( _handle == NULL ) {
+        char * msg = dlerror();
+        code = error( mode, tbb::runtime_loader::ec_no_lib, "Loading \"%s\" failed; system error: %s", dll_name, msg );
+        goto error;
+    } // if
+
+    // Then try to find out its version.
+    /*
+        g++ 3.4 issues error:
+            ISO C++ forbids casting between pointer-to-function and pointer-to-object
+        on reinterpret_cast<>. Thus, we have no choice but using C-style type cast.
+    */
+    get_ver_func = (int_func_t) dlsym( _handle, get_ver_name );
+    if ( get_ver_func == NULL ) {
+        code = error( mode, tbb::runtime_loader::ec_bad_lib, "Symbol \"%s\" not found; library rejected.", get_ver_name );
+        goto error;
+    } // if
+    _version = get_ver_func();
+    if ( ! ( min_ver <= _version && _version <= max_ver ) ) {
+        code = error( mode, tbb::runtime_loader::ec_bad_ver, "Version %d is out of requested range; library rejected.", _version );
+        goto error;
+    } // if
+
+    // Library is suitable. Mark it as loaded.
+    handle   = _handle;
+    version  = _version;
+    counter += 1;
+    __TBB_ASSERT( counter == 1, "Counter is invalid; " ANOTHER_RTL );
+
+    // Now search for all known symbols.
+    for ( int i = 0; __tbb_internal_runtime_loader_symbols[ i ].name != NULL; ++ i ) {
+        symbol_t & symbol = __tbb_internal_runtime_loader_symbols[ i ];
+        // Verify symbol descriptor.
+        __TBB_ASSERT( symbol.type == st_object || symbol.type == st_function, "Invalid symbol type" );
+        #if _WIN32 || _WIN64
+            __TBB_ASSERT( symbol.type == st_function, "Should not be symbols of object type on Windows" );
+        #endif
+        if ( symbol.type == st_object ) {
+            __TBB_ASSERT( symbol.addr != NULL, "Object address invalid" );
+            __TBB_ASSERT( symbol.size > 0, "Symbol size must be > 0" );
+            __TBB_ASSERT( symbol.size <= 0x1000, "Symbol size too big" );
+        } else {                     // Function
+            // __TBB_ASSERT( symbol.addr == reinterpret_cast< void * >( & stub ), "Invalid symbol address" );
+            __TBB_ASSERT( symbol.size == sizeof( void * ), "Invalid symbol size" );
+        } // if
+        void * addr = dlsym( _handle, symbol.name );
+        if ( addr != NULL ) {
+            if ( symbol.type == st_object ) {
+                if ( strncmp( symbol.name, "_ZTS", 4 ) == 0 ) {
+                    // If object name begins with "_ZTS", it is a string, mangled type name.
+                    // Its value must equal to name of symbol without "_ZTS" prefix.
+                    char const * name = static_cast< char const * >( addr );
+                    __TBB_ASSERT( strlen( name ) + 1 == size_t( symbol.size ), "Unexpected size of typeinfo name" );
+                    __TBB_ASSERT( strcmp( symbol.name + 4, name ) == 0, "Unexpected content of typeinfo name" );
+                    strncpy( reinterpret_cast< char * >( symbol.addr ), name, symbol.size );
+                    reinterpret_cast< char * >( symbol.addr )[ symbol.size - 1 ] = 0;
+                } else {
+                    #if TBB_USE_ASSERT
+                        // If object name begins with "_ZTI", it is an object of std::type_info class.
+                        // Its protected value must equal to name of symbol without "_ZTI" prefix.
+                        if ( strncmp( symbol.name, "_ZTI", 4 ) == 0 ) {
+                            std::type_info const * info = static_cast< std::type_info const * >( addr );
+                            __TBB_ASSERT( size_t( symbol.size ) >= sizeof( std::type_info ), "typeinfo size is too small" );
+                            // std::type_info::name is not a virtual method, it is safe to call it.
+                            __TBB_ASSERT( strcmp( symbol.name + 4, info->name() ) == 0, "Unexpected content of typeinfo" );
+                        } // if
+                    #endif
+                    // Copy object content from libtbb into runtime_loader.
+                    memcpy( symbol.addr, addr, symbol.size );
+                }; // if
+            } else {                     // Function
+                symbol.addr = addr;
+            } // if
+        } else {
+            char const * msg = dlerror();
+            tell( "Symbol \"%s\" not found; system error: %s", symbol.name, msg );
+            ++ not_found;
+        } // if
+        ++ total;
+    } // for i
+
+    if ( not_found > 0 ) {
+        tell( "%d of %d symbols not found.", not_found, total );
+    } // if
+
+    tell( "The library successfully loaded." );
+    return code;
+
+    error:
+        if ( _handle != NULL ) {
+            int rc = dlclose( _handle );
+            if ( rc != 0 ) {
+                // Error occured.
+                __TBB_ASSERT( rc != 0, "Unexpected error: dlclose() failed" );
+            } // if
+        } // if
+        _handle = NULL;
+        return code;
+
+} // _load
+
+
+static tbb::runtime_loader::error_code load( tbb::runtime_loader::error_mode mode, char const * path[], int min_ver, int max_ver ) {
+    // Check arguments first.
+    if ( min_ver <= 0 ) {
+        return error( mode, tbb::runtime_loader::ec_bad_arg, "tbb::runtime_loader::load(): Invalid value of min_ver argument: %d.", min_ver );
+    } // if
+    if ( max_ver <= 0 ) {
+        return error( mode, tbb::runtime_loader::ec_bad_arg, "tbb::runtime_loader::load(): Invalid value of max_ver argument: %d.", max_ver );
+    } // if
+    if ( min_ver > max_ver ) {
+        return error( mode, tbb::runtime_loader::ec_bad_arg, "tbb::runtime_loader::load(): min_ver and max_ver specify empty range: [%d, %d].", min_ver, max_ver );
+    } // if
+    if ( min_ver == max_ver ) {
+        tell( "Searching for \"%s\" version %d...", tbb_dll_name, min_ver );
+    } else if ( max_ver == INT_MAX ) {
+        tell( "Searching for \"%s\" version %d+...", tbb_dll_name, min_ver );
+    } else {
+        tell( "Searching for \"%s\" version in range [%d, %d]...", tbb_dll_name, min_ver, max_ver );
+    } // if
+    // Then check whether a library already loaded.
+    if ( handle != NULL ) {
+        // Library already loaded. Check whether the version is compatible.
+        __TBB_ASSERT( version > 0, "Version is invalid; " ANOTHER_RTL );
+        __TBB_ASSERT( counter > 0, "Counter is invalid; " ANOTHER_RTL );
+        if ( min_ver <= version && version <= max_ver ) {
+            // Version is ok, let us use this library.
+            tell( "Library version %d is already loaded.", version );
+            counter += 1;
+            return tbb::runtime_loader::ec_ok;
+        } else {
+            // Version is not suitable.
+            return error( mode, tbb::runtime_loader::ec_bad_ver, "Library version %d is already loaded.", version );
+        } // if
+    } // if
+    // There is no loaded library, try to load it using provided directories.
+    __TBB_ASSERT( version == 0, "Version is invalid; " ANOTHER_RTL );
+    __TBB_ASSERT( counter == 0, "Counter is invalid; " ANOTHER_RTL );
+    size_t namelen = strlen(tbb_dll_name);
+    size_t buflen = 0;
+    char * buffer = NULL;
+    for ( int i = 0; path[i] != NULL; ++ i ) {
+        size_t len = strlen(path[i]) + namelen + 2; // 1 for slash and 1 for null terminator
+        if( buflen<len ) {
+            free( buffer );
+            buflen = len;
+            buffer = (char*)malloc( buflen );
+        }
+        cat_file( path[i], tbb_dll_name, buffer, buflen );
+        __TBB_ASSERT(strstr(buffer,tbb_dll_name), "Name concatenation error");
+        tbb::runtime_loader::error_code ec = _load( buffer, min_ver, max_ver );
+        if ( ec == tbb::runtime_loader::ec_ok ) {
+            return ec;       // Success. Exiting...
+        } // if
+    } // for i
+    free( buffer );
+    return error( mode, tbb::runtime_loader::ec_no_lib, "No suitable library found." );
+} // load
+
+
+
+
+// Supress "defined but not used" compiler warnings.
+static void const * dummy[] = {
+    (void *) & strip,
+    (void *) & trim,
+    & dummy,
+    NULL
+};
+
+
+} // namespace runtime_loader
+
+} // namespace internal
+
+
+runtime_loader::runtime_loader( error_mode mode ) :
+    my_mode( mode ),
+    my_status( ec_ok ),
+    my_loaded( false )
+{
+} // ctor
+
+
+runtime_loader::runtime_loader( char const * path[], int min_ver, int max_ver, error_mode mode ) :
+    my_mode( mode ),
+    my_status( ec_ok ),
+    my_loaded( false )
+{
+    load( path, min_ver, max_ver );
+} // ctor
+
+
+runtime_loader::~runtime_loader() {
+} // dtor
+
+
+tbb::runtime_loader::error_code runtime_loader::load( char const * path[], int min_ver, int max_ver ) {
+    if ( my_loaded ) {
+        my_status = tbb::interface6::internal::runtime_loader::error( my_mode, ec_bad_call, "tbb::runtime_loader::load(): Library already loaded by this runtime_loader object." );
+    } else {
+        my_status = internal::runtime_loader::load( my_mode, path, min_ver, max_ver );
+        if ( my_status == ec_ok ) {
+            my_loaded = true;
+        } // if
+    } // if
+    return my_status;
+} // load
+
+
+
+
+tbb::runtime_loader::error_code runtime_loader::status() {
+    return my_status;
+} // status
+
+
+} // namespace interface6
+
+} // namespace tbb
+
+
+// Stub function replaces all TBB entry points when no library is loaded.
+int __tbb_internal_runtime_loader_stub() {
+    char const * msg = NULL;
+    if ( tbb::interface6::internal::runtime_loader::handle == NULL ) {
+        msg = "A function is called while TBB library is not loaded";
+    } else {
+        msg = "A function is called which is not present in loaded TBB library";
+    } // if
+    return tbb::interface6::internal::runtime_loader::error( tbb::interface6::internal::runtime_loader::stub_mode, tbb::runtime_loader::ec_no_lib, msg );
+} // stub
+
+
+// end of file //
diff --git a/src/test/harness.h b/src/test/harness.h
index c2c27cc..c4d318a 100644
--- a/src/test/harness.h
+++ b/src/test/harness.h
@@ -50,7 +50,7 @@ namespace Harness {
 /** It MUST be defined by the test application.
 
     If HARNESS_NO_PARSE_COMMAND_LINE macro was not explicitly set before including harness.h,
-    then global variables Verbose, MinThread, and MaxThread will be available and
+    then global variables MinThread, and MaxThread will be available and
     initialized when it is called.
 
     Returns Harness::Done when the tests passed successfully. When the test fail, it must
@@ -214,19 +214,70 @@ static void ParseCommandLine( int argc, char* argv[] ) {
 }
 #endif /* HARNESS_NO_PARSE_COMMAND_LINE */
 
+#if HARNESS_USE_PROXY
+    #define TBB_PREVIEW_RUNTIME_LOADER 1
+    #include "tbb/runtime_loader.h"
+    static char const * _path[] = { ".", NULL };
+    static tbb::runtime_loader _runtime_loader( _path );
+#endif // HARNESS_USE_PROXY
+
 #if !HARNESS_CUSTOM_MAIN
 
 
+#if __TBB_MPI_INTEROP
+#undef SEEK_SET
+#undef SEEK_CUR
+#undef SEEK_END
+#include "mpi.h"
+#endif
+
 HARNESS_EXPORT
 #if HARNESS_NO_PARSE_COMMAND_LINE
 int main() {
+#if __TBB_MPI_INTEROP
+    MPI_Init(NULL,NULL); 
+#endif
 #else
 int main(int argc, char* argv[]) {
     ParseCommandLine( argc, argv );
+#if __TBB_MPI_INTEROP
+    MPI_Init(&argc,&argv); 
+#endif
+#endif
+#if __TBB_MPI_INTEROP
+    // Simple TBB/MPI interoperability harness for most of tests
+    // Worker processes send blocking messages to the master process about their rank and group size
+    // Master process receives this info and print it in verbose mode
+    int rank, size, myrank;
+    MPI_Status status;
+    MPI_Comm_size(MPI_COMM_WORLD,&size); 
+    MPI_Comm_rank(MPI_COMM_WORLD,&myrank); 
+    if (myrank == 0) {
+#if !HARNESS_NO_PARSE_COMMAND_LINE
+        REMARK("Hello mpi world. I am %d of %d\n", myrank, size);
+#endif
+        for ( int i = 1; i < size; i++ ) {
+            MPI_Recv (&rank, 1, MPI_INT, i, 1, MPI_COMM_WORLD, &status);
+            MPI_Recv (&size, 1, MPI_INT, i, 1, MPI_COMM_WORLD, &status);
+#if !HARNESS_NO_PARSE_COMMAND_LINE
+            REMARK("Hello mpi world. I am %d of %d\n", rank, size);
+#endif
+        }
+    } else {
+        MPI_Send (&myrank, 1, MPI_INT, 0, 1, MPI_COMM_WORLD);
+        MPI_Send (&size, 1, MPI_INT, 0, 1, MPI_COMM_WORLD);
+    }
 #endif
     int res = TestMain ();
     ASSERT( res==Harness::Done || res==Harness::Skipped, "Wrong return code by TestMain");
+#if __TBB_MPI_INTEROP
+    if (myrank == 0) {
+        REPORT( res==Harness::Done ? "done\n" : "skip\n" );
+    }
+    MPI_Finalize();
+#else
     REPORT( res==Harness::Done ? "done\n" : "skip\n" );
+#endif
     return 0;
 }
 
@@ -308,6 +359,9 @@ public:
         int status = pthread_join( thread_id, NULL );
         ASSERT( !status, "pthread_join failed" );
 #endif
+#if HARNESS_NO_ASSERT
+        (void)status;
+#endif
     }
 
 private:
diff --git a/src/test/harness_allocator.h b/src/test/harness_allocator.h
index b31f34b..531fad4 100644
--- a/src/test/harness_allocator.h
+++ b/src/test/harness_allocator.h
@@ -87,6 +87,9 @@ public:
 
     static_counting_allocator() throw() { }
 
+    static_counting_allocator(const base_alloc_t& src) throw()
+    : base_alloc_t(src) { }
+
     static_counting_allocator(const static_counting_allocator& src) throw() 
     : base_alloc_t(src) { }
 
@@ -94,9 +97,6 @@ public:
     static_counting_allocator(const static_counting_allocator<U, C>& src) throw()
     : base_alloc_t(src) { }
 
-    bool operator==(const static_counting_allocator &a) const
-    { return true; }
-
     pointer allocate(const size_type n)
     {
         if(verbose) printf("\t+%d|", int(n));
diff --git a/src/test/harness_graph.h b/src/test/harness_graph.h
index 4fc2327..e56672e 100644
--- a/src/test/harness_graph.h
+++ b/src/test/harness_graph.h
@@ -34,10 +34,53 @@
 #define harness_graph_H
 
 #include "harness.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
 #include "tbb/null_rw_mutex.h"
 #include "tbb/atomic.h"
+#include "tbb/concurrent_unordered_map.h"
+
+// Needed conversion to and from continue_msg, but didn't want to add
+// conversion operators to the class, since we don't want it in general,
+// only in these tests.
+template<typename InputType, typename OutputType>
+struct convertor {
+    static OutputType convert_value(const InputType &i) {
+        return OutputType(i);
+    }
+};
+
+template<typename InputType>
+struct convertor<InputType,tbb::flow::continue_msg> {
+    static tbb::flow::continue_msg convert_value(const InputType &/*i*/) {
+        return tbb::flow::continue_msg(); 
+    }
+};
+
+template<typename OutputType>
+struct convertor<tbb::flow::continue_msg,OutputType> {
+    static OutputType convert_value(const tbb::flow::continue_msg &/*i*/) {
+        return OutputType();
+    }
+};
+
+// helper for multioutput_function_node tests.
+template<size_t N>
+struct mof_helper {
+    template<typename InputType, typename ports_type>
+    static inline void output_converted_value(const InputType &i, ports_type &p) {
+        std::get<N-1>(p).put(convertor<InputType,typename std::tuple_element<N-1,ports_type>::type::output_type>::convert_value(i));
+        output_converted_value<N-1>(i, p);
+    }
+};
+
+template<>
+struct mof_helper<1> {
+    template<typename InputType, typename ports_type>
+    static inline void output_converted_value(const InputType &i, ports_type &p) {
+        // just emit a default-constructed object
+        std::get<0>(p).put(convertor<InputType,typename std::tuple_element<0,ports_type>::type::output_type>::convert_value(i));
+    }
+};
 
 template< typename InputType, typename OutputType >
 struct harness_graph_default_functor {
@@ -47,25 +90,36 @@ struct harness_graph_default_functor {
 };
 
 template< typename OutputType >
-struct harness_graph_default_functor< tbb::continue_msg, OutputType > {
-    static OutputType construct( tbb::continue_msg ) {
+struct harness_graph_default_functor< tbb::flow::continue_msg, OutputType > {
+    static OutputType construct( tbb::flow::continue_msg ) {
         return OutputType();
     }
 };
 
 template< typename InputType >
-struct harness_graph_default_functor< InputType, tbb::continue_msg > {
-    static tbb::continue_msg construct( InputType ) {
-        return tbb::continue_msg();
+struct harness_graph_default_functor< InputType, tbb::flow::continue_msg > {
+    static tbb::flow::continue_msg construct( InputType ) {
+        return tbb::flow::continue_msg();
     }
 };
 
 template< >
-struct harness_graph_default_functor< tbb::continue_msg, tbb::continue_msg > {
-    static tbb::continue_msg construct( tbb::continue_msg ) {
-        return tbb::continue_msg();
+struct harness_graph_default_functor< tbb::flow::continue_msg, tbb::flow::continue_msg > {
+    static tbb::flow::continue_msg construct( tbb::flow::continue_msg ) {
+        return tbb::flow::continue_msg();
+    }
+};
+
+#if TBB_PREVIEW_GRAPH_NODES
+template<typename InputType, typename OutputSet>
+struct harness_graph_default_multioutput_functor {
+    static const int N = std::tuple_size<OutputSet>::value;
+    typedef typename tbb::flow::multioutput_function_node<InputType,OutputSet>::output_ports_type ports_type;
+    static void construct(const InputType &i, ports_type &p) {
+        mof_helper<N>::output_converted_value(i, p);
     }
 };
+#endif
 
 static tbb::atomic<size_t> current_executors;
 
@@ -91,11 +145,15 @@ struct harness_graph_executor {
     }
 
     struct functor {
-        OutputType operator()( InputType i ) const {
+        tbb::atomic<size_t> my_execute_count;
+        functor() { my_execute_count = 0; }
+        functor( const functor &f ) { my_execute_count = f.my_execute_count; }
+        OutputType operator()( InputType i ) {
            typename M::scoped_lock l( harness_graph_executor::mutex );
            size_t c = current_executors.fetch_and_increment();
            ASSERT( harness_graph_executor::max_executors == 0 || c <= harness_graph_executor::max_executors, NULL ); 
            ++execute_count;
+           my_execute_count.fetch_and_increment();
            OutputType v2 = (*harness_graph_executor::fptr)(i);
            current_executors.fetch_and_decrement();
            return v2; 
@@ -104,6 +162,49 @@ struct harness_graph_executor {
 
 };
 
+#if TBB_PREVIEW_GRAPH_NODES
+//! A multioutput executor that accepts InputType and has only one Output of OutputType.
+template< typename InputType, typename OutputTuple, typename M=tbb::null_rw_mutex >
+struct harness_graph_multioutput_executor {
+    typedef typename tbb::flow::multioutput_function_node<InputType,OutputTuple>::output_ports_type ports_type;
+    typedef typename std::tuple_element<0,OutputTuple>::type OutputType;
+
+    typedef void (*mfunction_ptr_type)( const InputType& v, ports_type &p );
+
+    static M mutex;
+    static mfunction_ptr_type fptr;
+    static tbb::atomic<size_t> execute_count;
+    static size_t max_executors;
+
+
+    static inline void func( const InputType &v, ports_type &p ) {
+        typename M::scoped_lock l( mutex );
+        size_t c = current_executors.fetch_and_increment();
+        ASSERT( max_executors == 0 || c <= max_executors, NULL ); 
+        ASSERT(std::tuple_size<OutputTuple>::value == 1, NULL);
+        ++execute_count;
+        (*fptr)(v,p);
+        current_executors.fetch_and_decrement();
+    }
+
+    struct functor {
+        tbb::atomic<size_t> my_execute_count;
+        functor() { my_execute_count = 0; }
+        functor( const functor &f ) { my_execute_count = f.my_execute_count; }
+        void operator()( const InputType &i, ports_type &p ) {
+           typename M::scoped_lock l( harness_graph_multioutput_executor::mutex );
+           size_t c = current_executors.fetch_and_increment();
+           ASSERT( harness_graph_multioutput_executor::max_executors == 0 || c <= harness_graph_multioutput_executor::max_executors, NULL ); 
+           ++execute_count;
+           my_execute_count.fetch_and_increment();
+           (*harness_graph_multioutput_executor::fptr)(i,p);
+           current_executors.fetch_and_decrement();
+        }
+    };
+
+};
+#endif //  TBB_PREVIEW_GRAPH_NODES
+
 template< typename InputType, typename OutputType, typename M >
 M harness_graph_executor<InputType, OutputType, M>::mutex;
 
@@ -117,27 +218,112 @@ typename harness_graph_executor<InputType, OutputType, M>::function_ptr_type har
 template< typename InputType, typename OutputType, typename M >
 size_t harness_graph_executor<InputType, OutputType, M>::max_executors = 0;
 
+#if TBB_PREVIEW_GRAPH_NODES
+// static vars for multioutput_function_node tests
+template< typename InputType, typename OutputTuple, typename M >
+M harness_graph_multioutput_executor<InputType, OutputTuple, M>::mutex;
+
+template< typename InputType, typename OutputTuple, typename M >
+tbb::atomic<size_t> harness_graph_multioutput_executor<InputType, OutputTuple, M>::execute_count;
+
+template< typename InputType, typename OutputTuple, typename M >
+typename harness_graph_multioutput_executor<InputType, OutputTuple, M>::mfunction_ptr_type harness_graph_multioutput_executor<InputType, OutputTuple, M>::fptr
+    = harness_graph_default_multioutput_functor< InputType, OutputTuple >::construct;
+
+template< typename InputType, typename OutputTuple, typename M >
+size_t harness_graph_multioutput_executor<InputType, OutputTuple, M>::max_executors = 0;
+#endif
+
 //! Counts the number of puts received
 template< typename T >
-struct harness_counting_receiver : public tbb::receiver<T>, NoCopy {
+struct harness_counting_receiver : public tbb::flow::receiver<T>, NoCopy {
 
     tbb::atomic< size_t > my_count;
+    T max_value;
+    size_t num_copies;
 
-    harness_counting_receiver() {
+    harness_counting_receiver() : num_copies(1) {
        my_count = 0;
     }
 
-    /* override */ bool try_put( T ) {
+    void initialize_map( const T& m, size_t c ) {
+       my_count = 0;
+       max_value = m;
+       num_copies = c;
+    }
+
+    /* override */ bool try_put( const T & ) {
       ++my_count;
       return true;
     }
+
+    void validate() {
+        size_t n = my_count;
+        ASSERT( n == num_copies*max_value, NULL );
+    }
+
+};
+
+//! Counts the number of puts received
+template< typename T >
+struct harness_mapped_receiver : public tbb::flow::receiver<T>, NoCopy {
+
+    tbb::atomic< size_t > my_count;
+    T max_value;
+    size_t num_copies;
+    typedef tbb::concurrent_unordered_map< T, tbb::atomic< size_t > > map_type;
+    map_type *my_map;
+
+    harness_mapped_receiver() : my_map(NULL) {
+       my_count = 0;
+    }
+
+    ~harness_mapped_receiver() {
+        if ( my_map ) delete my_map;
+    }
+
+    void initialize_map( const T& m, size_t c ) {
+       my_count = 0;
+       max_value = m;
+       num_copies = c;
+       if ( my_map ) delete my_map;
+       my_map = new map_type;
+    }
+
+    /* override */ bool try_put( const T &t ) {
+      if ( my_map ) {
+          tbb::atomic<size_t> a;
+          a = 1;
+          std::pair< typename map_type::iterator, bool > r =  (*my_map).insert( typename map_type::value_type( t, a ) );
+          if ( r.second == false ) {
+              size_t v = r.first->second.fetch_and_increment();
+              ASSERT( v < num_copies, NULL );
+          }
+      } else {
+          ++my_count;
+      }
+      return true;
+    }
+
+    void validate() {
+        if ( my_map ) {
+            for ( size_t i = 0; i < (size_t)max_value; ++i ) {
+                size_t n = (*my_map)[(int)i];
+                ASSERT( n == num_copies, NULL );
+            }
+        } else {
+            size_t n = my_count;
+            ASSERT( n == num_copies*max_value, NULL );
+        }
+    }
+
 };
 
 //! Counts the number of puts received
 template< typename T >
-struct harness_counting_sender : public tbb::sender<T>, NoCopy {
+struct harness_counting_sender : public tbb::flow::sender<T>, NoCopy {
 
-    typedef tbb::receiver<T> successor_type;
+    typedef tbb::flow::receiver<T> successor_type;
     tbb::atomic< successor_type * > my_receiver;
     tbb::atomic< size_t > my_count;
     tbb::atomic< size_t > my_received;
@@ -198,6 +384,16 @@ struct harness_counting_sender : public tbb::sender<T>, NoCopy {
         } 
     }
 
+    void try_put_until_limit() {
+        successor_type *s = my_receiver;
+
+        for ( int i = 0; i < (int)my_limit; ++i ) { 
+            ASSERT( s->try_put( T(i) ), NULL );
+            ++my_received;
+        } 
+        ASSERT( my_received == my_limit, NULL );
+    }
+
 };
 
 #endif
diff --git a/src/test/harness_inject_scheduler.h b/src/test/harness_inject_scheduler.h
index 019a3d4..10f2b6e 100644
--- a/src/test/harness_inject_scheduler.h
+++ b/src/test/harness_inject_scheduler.h
@@ -59,6 +59,7 @@
 #include "../tbb/spin_rw_mutex.cpp"
 #include "../tbb/spin_mutex.cpp"
 #include "../tbb/private_server.cpp"
+#include "../tbb/semaphore.cpp"
 #include "../rml/client/rml_tbb.cpp"
 
 #endif /* harness_inject_scheduler_H */
diff --git a/src/test/harness_iterator.h b/src/test/harness_iterator.h
index fbfd697..f553ecb 100644
--- a/src/test/harness_iterator.h
+++ b/src/test/harness_iterator.h
@@ -103,6 +103,31 @@ public:
     RandomIterator operator+ (difference_type n) {return RandomIterator(my_ptr + n);}
 };
 
+template <class T>
+class ConstRandomIterator {
+    const T * my_ptr;
+#if !HARNESS_EXTENDED_STD_COMPLIANCE
+    typedef typename std::allocator<T>::difference_type difference_type;
+#endif
+
+public:
+#if HARNESS_EXTENDED_STD_COMPLIANCE
+    typedef std::random_access_iterator_tag iterator_category;
+    typedef T value_type;
+    typedef typename std::allocator<T>::const_pointer pointer;
+    typedef typename std::allocator<T>::const_reference reference;
+    typedef typename std::allocator<T>::difference_type difference_type;
+#endif /* HARNESS_EXTENDED_STD_COMPLIANCE */
+
+    explicit ConstRandomIterator ( const T * ptr ) : my_ptr(ptr){}
+    ConstRandomIterator ( const ConstRandomIterator& r ) : my_ptr(r.my_ptr){}
+    const T& operator* () { return *my_ptr; }
+    ConstRandomIterator& operator++ () { ++my_ptr; return *this; }
+    bool operator== ( const ConstRandomIterator& r ) { return my_ptr == r.my_ptr; }
+    difference_type operator- (const ConstRandomIterator &r) {return my_ptr - r.my_ptr;}
+    ConstRandomIterator operator+ (difference_type n) {return ConstRandomIterator(my_ptr + n);}
+};
+
 } // namespace Harness
 
 #if !HARNESS_EXTENDED_STD_COMPLIANCE
@@ -111,18 +136,28 @@ namespace std {
     struct iterator_traits< Harness::InputIterator<T> > {
         typedef std::input_iterator_tag iterator_category;
         typedef T value_type;
+        typedef value_type& reference;
     };
 
     template<typename T>
     struct iterator_traits< Harness::ForwardIterator<T> > {
         typedef std::forward_iterator_tag iterator_category;
         typedef T value_type;
+        typedef value_type& reference;
     };
 
     template<typename T>
     struct iterator_traits< Harness::RandomIterator<T> > {
         typedef std::random_access_iterator_tag iterator_category;
         typedef T value_type;
+        typedef value_type& reference;
+    };
+
+    template<typename T>
+    struct iterator_traits< Harness::ConstRandomIterator<T> > {
+        typedef std::random_access_iterator_tag iterator_category;
+        typedef T value_type;
+        typedef const value_type& reference;
     };
 } // namespace std
 #endif /* !HARNESS_EXTENDED_STD_COMPLIANCE */
diff --git a/src/test/harness_m128.h b/src/test/harness_m128.h
index 931bafc..5a1a15a 100644
--- a/src/test/harness_m128.h
+++ b/src/test/harness_m128.h
@@ -26,56 +26,87 @@
     the GNU General Public License.
 */
 
-// Header that sets HAVE_m128 if we have type __m128
+// Header that sets HAVE_m128/HAVE_m256 if vector types (__m128/__m256) are available
 
-#if (__SSE__||_M_IX86) && !defined(__sun)
-#include <xmmintrin.h>
-#define HAVE_m128 1
-
-//! Class for testing safety of using __m128
-/** Uses circuitous logic forces compiler to put __m128 objects on stack while
+//! Class for testing safety of using vector types.
+/** Uses circuitous logic forces compiler to put __m128/__m256 objects on stack while
     executing various methods, and thus tempt it to use aligned loads and stores
     on the stack. */
 //  Do not create file-scope objects of the class, because MinGW (as of May 2010)
 //  did not always provide proper stack alignment in destructors of such objects.
-class ClassWithSSE {
+
+template<typename __Mvec>
+class ClassWithVectorType {
     static const int n = 16;
-    __m128 field[n];
+    static const int F = sizeof(__Mvec)/sizeof(float);
+    __Mvec field[n];
     void init( int start );
 public:
-    ClassWithSSE() {init(-n);} 
-    ClassWithSSE( int i ) {init(i);}
-    void operator=( const ClassWithSSE& src ) {
-        __m128 stack[n];
+    ClassWithVectorType() {init(-n);} 
+    ClassWithVectorType( int i ) {init(i);}
+    void operator=( const ClassWithVectorType& src ) {
+        __Mvec stack[n];
         for( int i=0; i<n; ++i )
             stack[i^5] = src.field[i];
         for( int i=0; i<n; ++i )
             field[i^5] = stack[i];
     }
-    ~ClassWithSSE() {init(-2*n);}
-    friend bool operator==( const ClassWithSSE& x, const ClassWithSSE& y ) {
-        for( int i=0; i<4*n; ++i )
+    ~ClassWithVectorType() {init(-2*n);}
+    friend bool operator==( const ClassWithVectorType& x, const ClassWithVectorType& y ) {
+        for( int i=0; i<F*n; ++i )
             if( ((const float*)x.field)[i]!=((const float*)y.field)[i] )
                 return false;
         return true;
     }
-    friend bool operator!=( const ClassWithSSE& x, const ClassWithSSE& y ) {
+    friend bool operator!=( const ClassWithVectorType& x, const ClassWithVectorType& y ) {
         return !(x==y);
     }
 };
 
-void ClassWithSSE::init( int start ) {
-    __m128 stack[n];
+template<typename __Mvec>
+void ClassWithVectorType<__Mvec>::init( int start ) {
+    __Mvec stack[n];
     for( int i=0; i<n; ++i ) {
         // Declaring value as a one-element array instead of a scalar quites 
         // gratuitous warnings about possible use of "value" before it was set.
-        __m128 value[1];
-        for( int j=0; j<4; ++j )
-            ((float*)value)[j] = float(n*start+4*i+j);
+        __Mvec value[1];
+        for( int j=0; j<F; ++j )
+            ((float*)value)[j] = float(n*start+F*i+j);
         stack[i^5] = value[0];
     }
     for( int i=0; i<n; ++i )
         field[i^5] = stack[i];
 }
 
-#endif /* __SSE__||_M_IX86 */
+#if (__AVX__ || (_MSC_VER>=1600 && _M_X64)) && !defined(__sun)
+#include <immintrin.h>
+#define HAVE_m256 1
+typedef ClassWithVectorType<__m256> ClassWithAVX;
+#if _MSC_VER
+#include <intrin.h> // for __cpuid
+#endif
+bool have_AVX() {
+    bool result = false;
+    const int avx_mask = 1<<28;
+#if _MSC_VER || __INTEL_COMPILER
+    int info[4] = {0,0,0,0};
+    const int ECX = 2;
+    __cpuid(info, 1);
+    result = (info[ECX] & avx_mask)!=0;
+#elif __GNUC__
+    int ECX;
+    __asm__( "cpuid"
+             : "=c"(ECX)
+             : "a" (1)
+             : "ebx", "edx" );
+    result = (ECX & avx_mask);
+#endif
+    return result;
+}
+#endif /* __AVX__ etc */
+
+#if (__SSE__ || _M_IX86_FP || _M_X64) && !defined(__sun)
+#include <xmmintrin.h>
+#define HAVE_m128 1
+typedef ClassWithVectorType<__m128> ClassWithSSE;
+#endif
diff --git a/examples/task_priority/fractal/fractal_video.h b/src/test/harness_task.h
similarity index 58%
copy from examples/task_priority/fractal/fractal_video.h
copy to src/test/harness_task.h
index 6608ba9..ea6bc41 100644
--- a/examples/task_priority/fractal/fractal_video.h
+++ b/src/test/harness_task.h
@@ -26,49 +26,38 @@
     the GNU General Public License.
 */
 
-#ifndef FRACTAL_VIDEO_H_
-#define FRACTAL_VIDEO_H_
-
-#include "../../common/gui/video.h"
-#include "fractal.h"
-
-extern video *v;
-extern bool single;
-
-class fractal_video : public video
-{
-    fractal_group *fg;
-
-private:
-    void on_mouse( int x, int y, int key ) {
-        if( key == 1 ) {
-            if ( fg ) {
-                fg->mouse_click( x, y );
+#include "tbb/task.h"
+#include "harness.h"
+
+//! Helper for verifying that old use cases of spawn syntax still work.
+tbb::task* GetTaskPtr( int& counter ) {
+    ++counter;
+    return NULL;
+}
+ 
+class TaskGenerator: public tbb::task {
+    int m_ChildCount;
+    int m_Depth;
+    
+public:
+    TaskGenerator( int child_count, int _depth ) : m_ChildCount(child_count), m_Depth(_depth) {}
+    ~TaskGenerator( ) { m_ChildCount = m_Depth = -125; }
+
+    /*override*/ tbb::task* execute() {
+        ASSERT( m_ChildCount>=0 && m_Depth>=0, NULL );
+        if( m_Depth>0 ) {
+            recycle_as_safe_continuation();
+            set_ref_count( m_ChildCount+1 );
+            int k=0; 
+            for( int j=0; j<m_ChildCount; ++j ) {
+                tbb::task& t = *new( allocate_child() ) TaskGenerator(m_ChildCount/2,m_Depth-1);
+                GetTaskPtr(k)->spawn(t);
             }
+            ASSERT(k==m_ChildCount,NULL);
+            --m_Depth;
+            __TBB_Yield();
+            ASSERT( state()==recycle && ref_count()>0, NULL);
         }
-    }
-
-    void on_key( int key ) {
-        switch ( key&0xff ) {
-        case 27: running = false;
-        }
-    }
-
-    void on_process() {
-        if ( fg ) {
-            fg->run( !single );
-        }
-    }
-
-public:
-    fractal_video() :fg(0) {
-        title = "Fractal Example";
-        v = this;
-    }
-
-    void set_fractal_group( fractal_group &_fg ) {
-        fg = &_fg;
+        return NULL;
     }
 };
-
-#endif /* FRACTAL_VIDEO_H_ */
diff --git a/src/test/harness_tbb_independence.h b/src/test/harness_tbb_independence.h
index 2716d5e..0d69873 100644
--- a/src/test/harness_tbb_independence.h
+++ b/src/test/harness_tbb_independence.h
@@ -52,8 +52,29 @@ int32_t __TBB_machine_fetchadd4__TBB_full_fence (volatile void *ptr, int32_t val
     return result;
 }
 
+int64_t __TBB_machine_fetchadd8__TBB_full_fence (volatile void *ptr, int64_t value)
+{
+    pthread_mutex_lock(&counter_mutex);
+    int32_t result = *(int32_t*)ptr;
+    *(int32_t*)ptr = result + value;
+    pthread_mutex_unlock(&counter_mutex);
+    return result;
+}
+
 void __TBB_machine_pause(int32_t /*delay*/) {  __TBB_Yield(); }
 
+pthread_mutex_t cas_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+extern "C" int64_t __TBB_machine_cmpswp8__TBB_full_fence(volatile void *ptr, int64_t value, int64_t comparand)
+{
+    pthread_mutex_lock(&cas_mutex);
+    int64_t result = *(int64_t*)ptr;
+    if (result == comparand)
+        *(int64_t*)ptr = value;
+    pthread_mutex_unlock(&cas_mutex);
+    return result;
+}
+
 #elif _WIN64 && defined(_M_X64) && !__MINGW64__
 
 #define __TBB_NO_IMPLICIT_LINKAGE 1
@@ -67,4 +88,6 @@ void __TBB_machine_pause(__int32 /*delay*/ ) { __TBB_Yield(); }
 
 #endif /* _WIN64 */
 
+extern "C" void ITT_DoOneTimeInitialization() { }
+
 #endif // harness_tbb_independence_H
diff --git a/src/test/test_ScalableAllocator.cpp b/src/test/test_ScalableAllocator.cpp
index a43f4aa..46bcad1 100644
--- a/src/test/test_ScalableAllocator.cpp
+++ b/src/test/test_ScalableAllocator.cpp
@@ -28,17 +28,59 @@
 
 // Test whether scalable_allocator complies with the requirements in 20.1.5 of ISO C++ Standard (1998).
 
-#define HARNESS_NO_PARSE_COMMAND_LINE 1
+#define __TBB_EXTRA_DEBUG 1 // enables additional checks
+#define TBB_PREVIEW_MEMORY_POOL 1
 
+#include "harness_assert.h"
+#if __linux__  && __ia64__
+// Currently pools high-level interface has dependency to TBB library
+// to get atomics. For sake of testing add rudementary implementation of them.
+#include "harness_tbb_independence.h"
+#endif
+#include "tbb/memory_pool.h"
 #include "tbb/scalable_allocator.h"
 
 // the actual body of the test is there:
 #include "test_allocator.h"
+#include "harness_allocator.h"
 
 #if _MSC_VER
 #include "tbb/machine/windows_api.h"
 #endif /* _MSC_VER */
 
+typedef static_counting_allocator<tbb::memory_pool_allocator<char> > cnt_alloc_t;
+typedef local_counting_allocator<std::allocator<char> > cnt_provider_t;
+class MinimalAllocator : cnt_provider_t {
+public:
+    typedef char value_type;
+    MinimalAllocator() {
+        REMARK("%p::ctor\n", this);
+    }
+    MinimalAllocator(const MinimalAllocator&s) : cnt_provider_t(s) {
+        REMARK("%p::ctor(%p)\n", this, &s);
+    }
+    ~MinimalAllocator() {
+        REMARK("%p::dtor: alloc=%u/%u free=%u/%u\n", this,
+            unsigned(items_allocated),unsigned(allocations),
+            unsigned(items_freed), unsigned(frees) );
+        ASSERT(allocations==frees && items_allocated==items_freed,0);
+        if( allocations ) { // non-temporal copy
+            // TODO: describe consumption requirements
+            ASSERT(items_allocated>cnt_alloc_t::items_allocated, 0);
+        }
+    }
+    void *allocate(size_t sz) {
+        void *p = cnt_provider_t::allocate(sz);
+        REMARK("%p::allocate(%u) = %p\n", this, unsigned(sz), p);
+        return p;
+    }
+    void deallocate(void *p, size_t sz) {
+        ASSERT(allocations>frees,0);
+        REMARK("%p::deallocate(%p, %u)\n", this, p, unsigned(sz));
+        cnt_provider_t::deallocate(cnt_provider_t::pointer(p), sz);
+    }
+};
+
 int TestMain () {
 #if _MSC_VER && !__TBBMALLOC_NO_IMPLICIT_LINKAGE
     #ifdef _DEBUG
@@ -50,6 +92,36 @@ int TestMain () {
     #endif
 #endif /* _MSC_VER && !__TBBMALLOC_NO_IMPLICIT_LINKAGE */
     int result = TestMain<tbb::scalable_allocator<void> >();
+    {
+        tbb::memory_pool<tbb::scalable_allocator<int> > pool;
+        result += TestMain(tbb::memory_pool_allocator<void>(pool) );
+    }{
+        tbb::memory_pool<MinimalAllocator> pool;
+        cnt_alloc_t alloc(( tbb::memory_pool_allocator<char>(pool) )); // double parentheses to avoid function declaration
+        result += TestMain(alloc);
+    }{
+        static char buf[1024*1024*4];
+        tbb::fixed_pool pool(buf, sizeof(buf));
+        const char *text = "this is a test";// 15 bytes
+        char *p1 = (char*)pool.malloc( 16 );
+        ASSERT(p1, NULL);
+        strcpy(p1, text);
+        char *p2 = (char*)pool.realloc( p1, 15 );
+        ASSERT( p2 && !strcmp(p2, text), "realloc broke memory" );
+        
+        result += TestMain(tbb::memory_pool_allocator<void>(pool) );
+        
+        // try allocate almost entire buf keeping some reasonable space for internals
+        char *p3 = (char*)pool.realloc( p2, sizeof(buf)-128*1024 );
+        ASSERT( p3, "defragmentation failed" );
+        ASSERT( !strcmp(p3, text), "realloc broke memory" );
+        for( size_t sz = 10; sz < sizeof(buf); sz *= 2) {
+            ASSERT( pool.malloc( sz ), NULL);
+            pool.recycle();
+        }
+
+        result += TestMain(tbb::memory_pool_allocator<void>(pool) );
+    }
     ASSERT( !result, NULL );
     return Harness::Done;
 }
diff --git a/src/test/test_ScalableAllocator_STL.cpp b/src/test/test_ScalableAllocator_STL.cpp
index 3d89a3e..051f48a 100644
--- a/src/test/test_ScalableAllocator_STL.cpp
+++ b/src/test/test_ScalableAllocator_STL.cpp
@@ -29,6 +29,16 @@
 // Test whether scalable_allocator works with some of the host's STL containers.
 
 #define HARNESS_NO_PARSE_COMMAND_LINE 1
+#define __TBB_EXTRA_DEBUG 1 // enables additional checks
+#define TBB_PREVIEW_MEMORY_POOL 1
+
+#include "harness_assert.h"
+#if __linux__  && __ia64__
+// Currently pools high-level interface has dependency to TBB library
+// to get atomics. For sake of testing add rudementary implementation of them.
+#include "harness_tbb_independence.h"
+#endif
+#include "tbb/memory_pool.h"
 #include "tbb/scalable_allocator.h"
 
 // The actual body of the test is there:
@@ -36,5 +46,10 @@
 
 int TestMain () {
     TestAllocatorWithSTL<tbb::scalable_allocator<void> >();
+    tbb::memory_pool<tbb::scalable_allocator<int> > mpool;
+    TestAllocatorWithSTL(tbb::memory_pool_allocator<void>(mpool) );
+    static char buf[1024*1024*4];
+    tbb::fixed_pool fpool(buf, sizeof(buf));
+    TestAllocatorWithSTL(tbb::memory_pool_allocator<void>(fpool) );
     return Harness::Done;
 }
diff --git a/src/test/test_aligned_space.cpp b/src/test/test_aligned_space.cpp
index 99d346d..85ace49 100644
--- a/src/test/test_aligned_space.cpp
+++ b/src/test/test_aligned_space.cpp
@@ -28,7 +28,7 @@
 
 #include "tbb/tbb_config.h"
 
-#if __TBB_GCC_WARNING_SUPPRESSION_ENABLED
+#if __TBB_GCC_WARNING_SUPPRESSION_PRESENT
 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
 #endif
 
@@ -109,7 +109,10 @@ int TestMain () {
     TestAlignedSpace<size_t>();
 #if HAVE_m128
     TestAlignedSpace<__m128>();
-#endif /* HAVE_m128 */
+#endif
+#if HAVE_m256
+    if (have_AVX()) TestAlignedSpace<__m256>();
+#endif
     return Harness::Done;
 }
 
diff --git a/src/test/test_allocator.h b/src/test/test_allocator.h
index 7d04163..a694950 100644
--- a/src/test/test_allocator.h
+++ b/src/test/test_allocator.h
@@ -127,13 +127,6 @@ void TestBasic( A& a ) {
     // number of bytes for such an allocation would overflow size_type.
     ASSERT( a.max_size()*typename A::size_type(sizeof(T))>=a.max_size(), "max_size larger than reasonable" ); 
 
-    // Test "a1==a2"
-    A a1, a2;
-    ASSERT( a1==a2, NULL );
-
-    // Test "a1!=a2"
-    ASSERT( !(a1!=a2), NULL );
-
     // Test "a.construct(p,t)"
     int n = NumberOfFoo;
     typename A::pointer p = a.allocate(1);
@@ -164,8 +157,9 @@ struct Body: NoAssign {
         ASSERT(array[i] == 0, NULL);
         size_t size = i * (i&3);
         array[i] = i&1 ? a.allocate(size, array[i>>3]) : a.allocate(size);
+        ASSERT(array[i] != 0, "allocator returned null");
         char* s = reinterpret_cast<char*>(reinterpret_cast<void*>(array[i]));
-        for( size_t j=0; j<size*sizeof(A); ++j ) {
+        for( size_t j=0; j<size*sizeof(typename A::value_type); ++j ) {
             if(is_zero_filling<typename A::template rebind<void>::other>::value)
                 ASSERT( !s[j], NULL);
             s[j] = PseudoRandomValue(i, t);
@@ -177,7 +171,7 @@ struct Body: NoAssign {
         ASSERT(array[i] != 0, NULL);
         size_t size = i * (i&3);
         char* s = reinterpret_cast<char*>(reinterpret_cast<void*>(array[i]));
-        for( size_t j=0; j<size*sizeof(A); ++j )
+        for( size_t j=0; j<size*sizeof(typename A::value_type); ++j )
             ASSERT( s[j] == PseudoRandomValue(i, t), "Thread safety test failed" );
         a.deallocate(array[i], size);
         array[i] = 0;
@@ -200,27 +194,27 @@ struct Body: NoAssign {
 };
 
 // A is an allocator for some type, and U is another type
-template<typename A, typename U>
-void Test() {
-    typename A::template rebind<U>::other b;
+template<typename U, typename A>
+void Test(A &a) {
+    typename A::template rebind<U>::other b(a);
     TestBasic<U>(b);
-
-    A a(b);
     TestBasic<typename A::value_type>(a);
 
     // thread safety
-    int n = NumberOfFoo;
     NativeParallelFor( 4, Body<A>(a) );
-    ASSERT( NumberOfFoo==n, "Allocate/deallocate count mismatched" );
+    ASSERT( NumberOfFoo==0, "Allocate/deallocate count mismatched" );
  
     ASSERT( a==b, NULL );
     ASSERT( !(a!=b), NULL );
 }
 
 template<typename Allocator>
-int TestMain() {
-    Test<typename Allocator::template rebind<Foo<char,1> >::other, Foo<int,17> >();
-    Test<typename Allocator::template rebind<Foo<double,1> >::other, Foo<float,23> >();
+int TestMain(const Allocator &a = Allocator() ) {
+    NumberOfFoo = 0;
+    typename Allocator::template rebind<Foo<char,1> >::other a1(a);
+    typename Allocator::template rebind<Foo<double,1> >::other a2(a);
+    Test<Foo<int,17> >( a1 );
+    Test<Foo<float,23> >( a2 );
     return 0;
 }
 
diff --git a/src/test/test_allocator_STL.h b/src/test/test_allocator_STL.h
index b146298..e0a2644 100644
--- a/src/test/test_allocator_STL.h
+++ b/src/test/test_allocator_STL.h
@@ -31,8 +31,8 @@
 #include "harness.h"
 
 template<typename Container>
-void TestSequence() {
-    Container c;
+void TestSequence(const typename Container::allocator_type &a) {
+    Container c(a);
     for( int i=0; i<1000; ++i )
         c.push_back(i*i);    
     typename Container::const_iterator p = c.begin();
@@ -43,8 +43,8 @@ void TestSequence() {
 }
 
 template<typename Set>
-void TestSet() {
-    Set s;
+void TestSet(const typename Set::allocator_type &a) {
+    Set s(typename Set::key_compare(), a);
     typedef typename Set::value_type value_type;
     for( int i=0; i<100; ++i ) 
         s.insert(value_type(3*i));
@@ -54,8 +54,8 @@ void TestSet() {
 }
 
 template<typename Map>
-void TestMap() {
-    Map m;
+void TestMap(const typename Map::allocator_type &a) {
+    Map m(typename Map::key_compare(), a);
     typedef typename Map::value_type value_type;
     for( int i=0; i<100; ++i ) 
         m.insert(value_type(i,i*i));
@@ -80,35 +80,35 @@ void TestMap() {
 #endif
 
 template<typename Allocator>
-void TestAllocatorWithSTL() {
+void TestAllocatorWithSTL(const Allocator &a = Allocator() ) {
     typedef typename Allocator::template rebind<int>::other Ai;
     typedef typename Allocator::template rebind<const int>::other Aci;
     typedef typename Allocator::template rebind<std::pair<const int, int> >::other Acii;
     typedef typename Allocator::template rebind<std::pair<int, int> >::other Aii;
 
     // Sequenced containers
-    TestSequence<std::deque <int,Ai> >();
-    TestSequence<std::list  <int,Ai> >();
-    TestSequence<std::vector<int,Ai> >();
+    TestSequence<std::deque <int,Ai> >(a);
+    TestSequence<std::list  <int,Ai> >(a);
+    TestSequence<std::vector<int,Ai> >(a);
 
     // Associative containers
-    TestSet<std::set     <int, std::less<int>, Ai> >();
-    TestSet<std::multiset<int, std::less<int>, Ai> >();
-    TestMap<std::map     <int, int, std::less<int>, Acii> >();
-    TestMap<std::multimap<int, int, std::less<int>, Acii> >();
+    TestSet<std::set     <int, std::less<int>, Ai> >(a);
+    TestSet<std::multiset<int, std::less<int>, Ai> >(a);
+    TestMap<std::map     <int, int, std::less<int>, Acii> >(a);
+    TestMap<std::multimap<int, int, std::less<int>, Acii> >(a);
 
 #if _MSC_VER
     // Test compatibility with Microsoft's implementation of std::allocator for some cases that
     // are undefined according to the ISO standard but permitted by Microsoft.
-    TestSequence<std::deque <const int,Aci> >();
+    TestSequence<std::deque <const int,Aci> >(a);
 #if _CPPLIB_VER>=500
-    TestSequence<std::list  <const int,Aci> >();
+    TestSequence<std::list  <const int,Aci> >(a);
 #endif
-    TestSequence<std::vector<const int,Aci> >();
-    TestSet<std::set<const int, std::less<int>, Aci> >();
-    TestMap<std::map<int, int, std::less<int>, Aii> >();
-    TestMap<std::map<const int, int, std::less<int>, Acii> >();
-    TestMap<std::multimap<int, int, std::less<int>, Aii> >();
-    TestMap<std::multimap<const int, int, std::less<int>, Acii> >();
+    TestSequence<std::vector<const int,Aci> >(a);
+    TestSet<std::set<const int, std::less<int>, Aci> >(a);
+    TestMap<std::map<int, int, std::less<int>, Aii> >(a);
+    TestMap<std::map<const int, int, std::less<int>, Acii> >(a);
+    TestMap<std::multimap<int, int, std::less<int>, Aii> >(a);
+    TestMap<std::multimap<const int, int, std::less<int>, Acii> >(a);
 #endif /* _MSC_VER */
 }
diff --git a/src/test/test_assembly.cpp b/src/test/test_assembly.cpp
index 43a88f7..e471466 100644
--- a/src/test/test_assembly.cpp
+++ b/src/test/test_assembly.cpp
@@ -89,9 +89,9 @@ static void TestAtomicCounter() {
 
 static void TestTinyLock() {
     REMARK("testing __TBB_LockByte\n");
-    __TBB_Byte flags[16];
+    __TBB_atomic_flag flags[16];
     for( unsigned int i=0; i<16; ++i )
-        flags[i] = (__TBB_Byte)i;
+        flags[i] = (__TBB_Flag)i;
 #if __TBB_GCC_OPTIMIZER_ORDERING_BROKEN
     __TBB_store_with_release( flags[8], 0 );
 #else
diff --git a/src/test/test_atomic.cpp b/src/test/test_atomic.cpp
index a2258c1..565cf0a 100644
--- a/src/test/test_atomic.cpp
+++ b/src/test/test_atomic.cpp
@@ -43,13 +43,24 @@ int TestMain() {
 #include <string.h> // memcmp
 
 #if _MSC_VER && !defined(__INTEL_COMPILER)
-    // unary minus operator applied to unsigned type, result still unsigned
-    #pragma warning( push )
-    #pragma warning( disable: 4310 )
+    // Unary minus operator applied to unsigned type, result still unsigned
+    // Constant conditional expression
+    #pragma warning( disable: 4127 4310 )
 #endif
 
+enum LoadStoreExpression {
+    UseOperators,
+    UseImplicitAcqRel,
+    UseExplicitFullyFenced,
+    UseExplicitAcqRel,
+    UseExplicitRelaxed,
+    UseGlobalHelperFullyFenced,
+    UseGlobalHelperAcqRel,
+    UseGlobalHelperRelaxed
+};
+
 //! Structure that holds an atomic<T> and some guard bytes around it.
-template<typename T>
+template<typename T, LoadStoreExpression E = UseOperators>
 struct TestStruct {
     typedef unsigned char byte_type;
     T prefix;
@@ -61,7 +72,12 @@ struct TestStruct {
             reinterpret_cast<byte_type*>(&prefix)[j]             = byte_type(0x11*(j+1));
             reinterpret_cast<byte_type*>(&suffix)[sizeof(T)-j-1] = byte_type(0x11*(j+1));
         }
-        counter = i;
+        if ( E == UseOperators )
+            counter = i;
+        else if ( E == UseExplicitRelaxed )
+            counter.template store<tbb::relaxed>(i);
+        else
+            tbb::store<tbb::full_fence>( counter, i );
     }
     ~TestStruct() {
         // Check for writes outside the counter.
@@ -74,20 +90,11 @@ struct TestStruct {
 };
 
 // A global variable of type tbb::atomic<>
-template<typename T> tbb::atomic<T> TestStruct<T>::gCounter;
-
-#if _MSC_VER && !defined(__INTEL_COMPILER)
-    #pragma warning( pop )
-#endif
-
-#if defined(__INTEL_COMPILER)
-    // reference to EBX in a function requiring stack alignment
-    #pragma warning( disable: 998 )
-#endif
+template<typename T, LoadStoreExpression E> tbb::atomic<T> TestStruct<T, E>::gCounter;
 
 //! Test compare_and_swap template members of class atomic<T> for memory_semantics=M
 template<typename T,tbb::memory_semantics M>
-void TestCompareAndSwapAcquireRelease( T i, T j, T k ) {
+void TestCompareAndSwapWithExplicitOrdering( T i, T j, T k ) {
     ASSERT( i!=k, "values must be distinct" ); 
     // Test compare_and_swap that should fail
     TestStruct<T> x(i);
@@ -103,7 +110,7 @@ void TestCompareAndSwapAcquireRelease( T i, T j, T k ) {
 //! i, j, k must be different values
 template<typename T>
 void TestCompareAndSwap( T i, T j, T k ) {
-    ASSERT( i!=k, "values must be distinct" ); 
+    ASSERT( i!=k, "values must be distinct" );
     // Test compare_and_swap that should fail
     TestStruct<T> x(i);
     T old = x.counter.compare_and_swap( j, k );
@@ -114,7 +121,7 @@ void TestCompareAndSwap( T i, T j, T k ) {
     ASSERT( old==i, NULL );
     if( x.counter==i ) {
         ASSERT( x.counter==j, "value not updated?" );
-    } else {    
+    } else {
         ASSERT( x.counter==j, "value trashed" );
     }
     // Check that atomic global variables work
@@ -122,14 +129,16 @@ void TestCompareAndSwap( T i, T j, T k ) {
     old = TestStruct<T>::gCounter.compare_and_swap( j, i );
     ASSERT( old==i, NULL );
     ASSERT( TestStruct<T>::gCounter==j, "value not updated?" );
-    TestCompareAndSwapAcquireRelease<T,tbb::acquire>(i,j,k);
-    TestCompareAndSwapAcquireRelease<T,tbb::release>(i,j,k);
+    TestCompareAndSwapWithExplicitOrdering<T,tbb::full_fence>(i,j,k);
+    TestCompareAndSwapWithExplicitOrdering<T,tbb::acquire>(i,j,k);
+    TestCompareAndSwapWithExplicitOrdering<T,tbb::release>(i,j,k);
+    TestCompareAndSwapWithExplicitOrdering<T,tbb::relaxed>(i,j,k);
 }
 
 //! memory_semantics variation on TestFetchAndStore
 template<typename T, tbb::memory_semantics M>
-void TestFetchAndStoreAcquireRelease( T i, T j ) {
-    ASSERT( i!=j, "values must be distinct" ); 
+void TestFetchAndStoreWithExplicitOrdering( T i, T j ) {
+    ASSERT( i!=j, "values must be distinct" );
     TestStruct<T> x(i);
     T old = x.counter.template fetch_and_store<M>( j );
     ASSERT( old==i, NULL );
@@ -139,7 +148,7 @@ void TestFetchAndStoreAcquireRelease( T i, T j ) {
 //! i and j must be different values
 template<typename T>
 void TestFetchAndStore( T i, T j ) {
-    ASSERT( i!=j, "values must be distinct" ); 
+    ASSERT( i!=j, "values must be distinct" );
     TestStruct<T> x(i);
     T old = x.counter.fetch_and_store( j );
     ASSERT( old==i, NULL );
@@ -149,20 +158,21 @@ void TestFetchAndStore( T i, T j ) {
     old = TestStruct<T>::gCounter.fetch_and_store( j );
     ASSERT( old==i, NULL );
     ASSERT( TestStruct<T>::gCounter==j, "value not updated?" );
-    TestFetchAndStoreAcquireRelease<T,tbb::acquire>(i,j);
-    TestFetchAndStoreAcquireRelease<T,tbb::release>(i,j);
+    TestFetchAndStoreWithExplicitOrdering<T,tbb::full_fence>(i,j);
+    TestFetchAndStoreWithExplicitOrdering<T,tbb::acquire>(i,j);
+    TestFetchAndStoreWithExplicitOrdering<T,tbb::release>(i,j);
+    TestFetchAndStoreWithExplicitOrdering<T,tbb::relaxed>(i,j);
 }
 
 #if _MSC_VER && !defined(__INTEL_COMPILER)
     // conversion from <bigger integer> to <smaller integer>, possible loss of data
     // the warning seems a complete nonsense when issued for e.g. short+=short
-    #pragma warning( push )
     #pragma warning( disable: 4244 )
 #endif
 
 //! Test fetch_and_add members of class atomic<T> for memory_semantics=M
 template<typename T,tbb::memory_semantics M>
-void TestFetchAndAddAcquireRelease( T i ) {
+void TestFetchAndAddWithExplicitOrdering( T i ) {
     TestStruct<T> x(i);
     T actual;
     T expected = i;
@@ -235,15 +245,12 @@ void TestFetchAndAdd( T i ) {
     expected = i+42;
     ASSERT( value==i, NULL );
     ASSERT( TestStruct<T>::gCounter==expected, "value not updated?" );
-
-    TestFetchAndAddAcquireRelease<T,tbb::acquire>(i);
-    TestFetchAndAddAcquireRelease<T,tbb::release>(i);
+    TestFetchAndAddWithExplicitOrdering<T,tbb::full_fence>(i);
+    TestFetchAndAddWithExplicitOrdering<T,tbb::acquire>(i);
+    TestFetchAndAddWithExplicitOrdering<T,tbb::release>(i);
+    TestFetchAndAddWithExplicitOrdering<T,tbb::relaxed>(i);
 }
 
-#if _MSC_VER && !defined(__INTEL_COMPILER)
-    #pragma warning( pop )
-#endif // warning 4244 is back
-
 //! A type with unknown size.
 class IncompleteType;
 
@@ -259,11 +266,17 @@ void TestFetchAndAdd( bool ) {
 }
 
 template<typename T>
-void TestConst( T i ) { 
-    // Try const 
+void TestConst( T i ) {
+    // Try const
     const TestStruct<T> x(i);
-    ASSERT( memcmp( &i, &x.counter, sizeof(T) )==0, "write to atomic<T> broken?" );;
+    ASSERT( memcmp( &i, &x.counter, sizeof(T) )==0, "write to atomic<T> broken?" );
     ASSERT( x.counter==i, "read of atomic<T> broken?" );
+    const TestStruct<T, UseExplicitRelaxed> y(i);
+    ASSERT( memcmp( &i, &y.counter, sizeof(T) )==0, "relaxed write to atomic<T> broken?" );
+    ASSERT( tbb::load<tbb::relaxed>(y.counter) == i, "relaxed read of atomic<T> broken?" );
+    const TestStruct<T, UseGlobalHelperFullyFenced> z(i);
+    ASSERT( memcmp( &i, &z.counter, sizeof(T) )==0, "sequentially consistent write to atomic<T> broken?" );
+    ASSERT( z.counter.template load<tbb::full_fence>() == i, "sequentially consistent read of atomic<T> broken?" );
 }
 
 template<typename T>
@@ -288,7 +301,6 @@ struct AlignmentChecker {
 
 #if _MSC_VER && !defined(__INTEL_COMPILER)
     // unary minus operator applied to unsigned type, result still unsigned
-    #pragma warning( push )
     #pragma warning( disable: 4146 )
 #endif
 
@@ -315,24 +327,18 @@ void TestAtomicInteger( const char* name ) {
     TestParallel<T>( name );
 }
 
-#if _MSC_VER && !defined(__INTEL_COMPILER)
-    #pragma warning( pop )
-#endif
-
-
 template<typename T>
 struct Foo {
     T x, y, z;
 };
 
-
 template<typename T>
 void TestIndirection() {
     Foo<T> item;
     tbb::atomic<Foo<T>*> pointer;
     pointer = &item;
     for( int k=-10; k<=10; ++k ) {
-        // Test various syntaxes for indirection to fields with non-zero offset.   
+        // Test various syntaxes for indirection to fields with non-zero offset.
         T value1=T(), value2=T();
         for( size_t j=0; j<sizeof(T); ++j ) {
             *(char*)&value1 = char(k^j);
@@ -393,17 +399,11 @@ const int numMaskedOperations = 100000;
 const int testSpaceSize = 8;
 int prime[testSpaceSize] = {3,5,7,11,13,17,19,23};
 
-#if _MSC_VER && !defined(__INTEL_COMPILER)
-    // "possible loss of data" warning suppressed again
-    #pragma warning( push )
-    #pragma warning( disable: 4244 )
-#endif
-
 template<typename T>
 class TestMaskedCAS_Body: NoAssign {
     T*  test_space_uncontended;
     T*  test_space_contended;
-public:   
+public:
     TestMaskedCAS_Body( T* _space1, T* _space2 ) : test_space_uncontended(_space1), test_space_contended(_space2) {}
     void operator()( int my_idx ) const {
         using tbb::internal::__TBB_MaskedCompareAndSwap;
@@ -471,10 +471,6 @@ intptr_t getCorrectContendedValue() {
     return slot.result;
 }
 
-#if _MSC_VER && !defined(__INTEL_COMPILER)
-    #pragma warning( pop )
-#endif // warning 4244 is back again
-
 template<typename T>
 void TestMaskedCAS() {
     REMARK("testing masked CAS<%d>\n",int(sizeof(T)));
@@ -497,6 +493,78 @@ void TestMaskedCAS() {
     }
 }
 
+template <typename T>
+class TestRelaxedLoadStorePlainBody {
+    static T s_turn,
+             s_ready;
+
+public:
+    static unsigned s_count1,
+                    s_count2;
+
+    void operator() ( int id ) const {
+        using tbb::internal::__TBB_load_relaxed;
+        using tbb::internal::__TBB_store_relaxed;
+
+        if ( id == 0 ) {
+            while ( !__TBB_load_relaxed(s_turn) ) {
+                ++s_count1;
+                __TBB_store_relaxed(s_ready, 1);
+            }
+        }
+        else {
+            while ( !__TBB_load_relaxed(s_ready) ) {
+                ++s_count2;
+                continue;
+            }
+            __TBB_store_relaxed(s_turn, 1);
+        }
+    }
+}; // class TestRelaxedLoadStorePlainBody<T>
+
+template <typename T> T TestRelaxedLoadStorePlainBody<T>::s_turn = 0;
+template <typename T> T TestRelaxedLoadStorePlainBody<T>::s_ready = 0;
+template <typename T> unsigned TestRelaxedLoadStorePlainBody<T>::s_count1 = 0;
+template <typename T> unsigned TestRelaxedLoadStorePlainBody<T>::s_count2 = 0;
+
+template <typename T>
+class TestRelaxedLoadStoreAtomicBody {
+    static tbb::atomic<T> s_turn,
+                          s_ready;
+
+public:
+    static unsigned s_count1,
+                    s_count2;
+
+    void operator() ( int id ) const {
+        if ( id == 0 ) {
+            while ( s_turn.template load<tbb::relaxed>() == 0 ) {
+                ++s_count1;
+                s_ready.template store<tbb::relaxed>(1);
+            }
+        }
+        else {
+            while ( s_ready.template load<tbb::relaxed>() == 0 ) {
+                ++s_count2;
+                continue;
+            }
+            s_turn.template store<tbb::relaxed>(1);
+        }
+    }
+}; // class TestRelaxedLoadStoreAtomicBody<T>
+
+template <typename T> tbb::atomic<T> TestRelaxedLoadStoreAtomicBody<T>::s_turn;
+template <typename T> tbb::atomic<T> TestRelaxedLoadStoreAtomicBody<T>::s_ready;
+template <typename T> unsigned TestRelaxedLoadStoreAtomicBody<T>::s_count1 = 0;
+template <typename T> unsigned TestRelaxedLoadStoreAtomicBody<T>::s_count2 = 0;
+
+template <typename T>
+void TestRegisterPromotionSuppression () {
+    REMARK("testing register promotion suppression (size=%d)\n", (int)sizeof(T));
+    NativeParallelFor( 2, TestRelaxedLoadStorePlainBody<T>() );
+    NativeParallelFor( 2, TestRelaxedLoadStoreAtomicBody<T>() );
+}
+
 template<unsigned N>
 class ArrayElement {
     char item[N];
@@ -508,7 +576,6 @@ int TestMain () {
     TestAtomicInteger<long long>("long long");
     #else
     REPORT("64-bit atomics not supported\n");
-    // TODO: advise about possibility to have 64-bit atomics on 64-bit PowerPC hardware even for 32-bit build?
     ASSERT(sizeof(long long)==8, "type long long is not 64 bits");
     #endif
     TestAtomicInteger<unsigned long>("unsigned long");
@@ -544,6 +611,12 @@ int TestMain () {
     ASSERT( !ParallelError, NULL );
     TestMaskedCAS<unsigned char>();
     TestMaskedCAS<unsigned short>();
+#if __TBB_64BIT_ATOMICS
+    TestRegisterPromotionSuppression<tbb::internal::int64_t>();
+#endif
+    TestRegisterPromotionSuppression<tbb::internal::int32_t>();
+    TestRegisterPromotionSuppression<tbb::internal::int16_t>();
+    TestRegisterPromotionSuppression<tbb::internal::int8_t>();
     return Harness::Done;
 }
 
@@ -554,7 +627,7 @@ struct FlagAndMessage {
     /** Force flag and message to be on distinct cache lines for machines with cache line size <= 4096 bytes */
     char pad[4096/sizeof(T)];
     //! Non-zero if message is ready
-    T message;    
+    T message;
 };
 
 // A special template function used for summation.
@@ -586,9 +659,65 @@ bool special_sum<bool>(intptr_t arg1, intptr_t arg2) {
 }
 
 volatile int One = 1;
- 
-template<typename T>
+
+inline bool IsRelaxed ( LoadStoreExpression e ) {
+    return e == UseExplicitRelaxed || e == UseGlobalHelperRelaxed;
+}
+
+template <typename T, LoadStoreExpression E>
+struct LoadStoreTraits;
+
+template <typename T>
+struct LoadStoreTraits<T, UseOperators> {
+    static void load ( T& dst, const tbb::atomic<T>& src ) { dst = src; }
+    static void store ( tbb::atomic<T>& dst, const T& src ) { dst = src; }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseImplicitAcqRel> {
+    static void load ( T& dst, const tbb::atomic<T>& src ) { dst = src.load(); }
+    static void store ( tbb::atomic<T>& dst, const T& src ) { dst.store(src); }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseExplicitFullyFenced> {
+    static void load ( T& dst, const tbb::atomic<T>& src ) { dst = src.template load<tbb::full_fence>(); }
+    static void store ( tbb::atomic<T>& dst, const T& src ) { dst.template store<tbb::full_fence>(src); }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseExplicitAcqRel> {
+    static void load ( T& dst, const tbb::atomic<T>& src ) { dst = src.template load<tbb::acquire>(); }
+    static void store ( tbb::atomic<T>& dst, const T& src ) { dst.template store<tbb::release>(src); }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseExplicitRelaxed> {
+    static void load ( T& dst, const tbb::atomic<T>& src ) { dst = src.template load<tbb::relaxed>(); }
+    static void store ( tbb::atomic<T>& dst, const T& src ) { dst.template store<tbb::relaxed>(src); }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseGlobalHelperFullyFenced> {
+    static void load ( T& dst, const tbb::atomic<T>& src ) { dst = tbb::load<tbb::full_fence>(src); }
+    static void store ( tbb::atomic<T>& dst, const T& src ) { tbb::store<tbb::full_fence>(dst, src); }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseGlobalHelperAcqRel> {
+    static void load ( T& dst, const tbb::atomic<T>& src ) { dst = tbb::load<tbb::acquire>(src); }
+    static void store ( tbb::atomic<T>& dst, const T& src ) { tbb::store<tbb::release>(dst, src); }
+};
+
+template <typename T>
+struct LoadStoreTraits<T, UseGlobalHelperRelaxed> {
+    static void load ( T& dst, const tbb::atomic<T>& src ) { dst = tbb::load<tbb::relaxed>(src); }
+    static void store ( tbb::atomic<T>& dst, const T& src ) { tbb::store<tbb::relaxed>(dst, src); }
+};
+
+template<typename T, LoadStoreExpression E>
 class HammerLoadAndStoreFence: NoAssign {
+    typedef LoadStoreTraits<T, E> trait;
     FlagAndMessage<T>* fam;
     const int n;
     const int p;
@@ -602,22 +731,22 @@ public:
         FlagAndMessage<T>* s = fam+k;
         FlagAndMessage<T>* s_next = fam + (k+1)%p;
         for( int i=0; i<n; ++i ) {
-            // The inner for loop is a spin-wait loop, which is normally considered very bad style. 
+            // The inner for loop is a spin-wait loop, which is normally considered very bad style.
             // But we must use it here because we are interested in examining subtle hardware effects.
             for(unsigned short cnt=1; ; ++cnt) {
-                if( !cnt ) // to help 1-core systems complete the test, yield every 2^16 iterations
+                if( !(cnt%1024) ) // to help 1-core or oversubscribed systems complete the test, yield every 2^10 iterations
                     __TBB_Yield();
                 // Compilers typically generate non-trivial sequence for division by a constant.
                 // The expression here is dependent on the loop index i, so it cannot be hoisted.
-#define COMPLICATED_ZERO (i*(one-1)/100)
+                #define COMPLICATED_ZERO (i*(one-1)/100)
                 // Read flag and then the message
                 T flag, message;
-                if( trial&1 ) { 
+                if( trial&1 ) {
                     // COMPLICATED_ZERO here tempts compiler to hoist load of message above reading of flag.
-                    flag = (s+COMPLICATED_ZERO)->flag;
+                    trait::load( flag, (s+COMPLICATED_ZERO)->flag );
                     message = s->message;
                 } else {
-                    flag = s->flag;
+                    trait::load( flag, s->flag );
                     message = s->message;
                 }
                 if( flag ) {
@@ -625,20 +754,29 @@ public:
                         REPORT("ERROR: flag!=(T)-1 k=%d i=%d trial=%x type=%s (atomicity problem?)\n", k, i, trial, name );
                         ParallelError = true;
                     } 
-                    if( message!=(T)-1 ) {
-                        REPORT("ERROR: message!=(T)-1 k=%d i=%d trial=%x type=%s (memory fence problem?)\n", k, i, trial, name );
+                    if( !IsRelaxed(E) && message!=(T)-1 ) {
+                        REPORT("ERROR: message!=(T)-1 k=%d i=%d trial=%x type=%s mode=%d (memory fence problem?)\n", k, i, trial, name, E );
                         ParallelError = true;
                     }
-                    s->message = T(0); 
-                    s->flag = T(0);
+                    s->message = T(0);
+                    trait::store( s->flag, T(0) );
+                    // Prevent deadlock possible in relaxed mode because of store(0)
+                    // to the first thread's flag being reordered after the last
+                    // thread's store(-1) into it.
+                    if ( IsRelaxed(E) ) {
+                        while( s_next->flag.template load<tbb::relaxed>() != 0 )
+                            __TBB_Yield();
+                    }
+                    else
+                        ASSERT( s_next->flag == 0, NULL );
                     // Set message and then the flag
                     if( trial&2 ) {
                         // COMPLICATED_ZERO here tempts compiler to sink store below setting of flag
                         s_next->message = special_sum<T>(-1, COMPLICATED_ZERO);
-                        s_next->flag = (T)-1;
+                        trait::store( s_next->flag, (T)-1 );
                     } else {
                         s_next->message = (T)-1;
-                        s_next->flag = (T)-1;
+                        trait::store( s_next->flag, (T)-1 );
                     }
                     break;
                 } else {
@@ -651,22 +789,24 @@ public:
 };
 
 //! Test that atomic<T> has acquire semantics for loads and release semantics for stores.
-/** Test performs round-robin passing of message among p processors, 
+/** Test performs round-robin passing of message among p processors,
     where p goes from MinThread to MaxThread. */
-template<typename T>
+template<typename T, LoadStoreExpression E>
 void TestLoadAndStoreFences( const char* name ) {
     for( int p=MinThread<2 ? 2 : MinThread; p<=MaxThread; ++p ) {
         FlagAndMessage<T>* fam = new FlagAndMessage<T>[p];
-        // Each of four trials excercise slightly different expresion pattern within the test.
-        // See occurrences of COMPLICATED_ZERO for details. 
+        // Each of four trials exercise slightly different expression pattern within the test.
+        // See occurrences of COMPLICATED_ZERO for details.
         for( int trial=0; trial<4; ++trial ) {
             memset( fam, 0, p*sizeof(FlagAndMessage<T>) );
             fam->message = (T)-1;
             fam->flag = (T)-1;
-            NativeParallelFor( p, HammerLoadAndStoreFence<T>( fam, 100, p, name, trial ) );
-            for( int k=0; k<p; ++k ) {
-                ASSERT( fam[k].message==(k==0 ? (T)-1 : 0), "incomplete round-robin?" ); 
-                ASSERT( fam[k].flag==(k==0 ? (T)-1 : 0), "incomplete round-robin?" ); 
+            NativeParallelFor( p, HammerLoadAndStoreFence<T, E>( fam, 100, p, name, trial ) );
+            if ( !IsRelaxed(E) ) {
+                for( int k=0; k<p; ++k ) {
+                    ASSERT( fam[k].message==(k==0 ? (T)-1 : 0), "incomplete round-robin?" );
+                    ASSERT( fam[k].flag==(k==0 ? (T)-1 : 0), "incomplete round-robin?" );
+                }
             }
         }
         delete[] fam;
@@ -674,7 +814,7 @@ void TestLoadAndStoreFences( const char* name ) {
 }
 
 //! Sparse set of values of integral type T.
-/** Set is designed so that if a value is read or written non-atomically, 
+/** Set is designed so that if a value is read or written non-atomically,
     the resulting intermediate value is likely to not be a member of the set. */
 template<typename T>
 class SparseValueSet {
@@ -686,17 +826,17 @@ public:
         // 2. The bytes are typically different.
         // 3. When multiplied by any value <=127, the product does not overflow.
         factor = T(0);
-        for( unsigned i=0; i<sizeof(T)*8-7; i+=7 ) 
+        for( unsigned i=0; i<sizeof(T)*8-7; i+=7 )
             factor = T(factor | T(1)<<i);
      }
      //! Get ith member of set
      T get( int i ) const {
          // Create multiple of factor.  The & prevents overflow of the product.
          return T((i&0x7F)*factor);
-     }        
+     }
      //! True if set contains x
      bool contains( T x ) const {
-         // True if 
+         // True if
          return (x%factor)==0;
      }
 };
@@ -706,12 +846,12 @@ template<typename T>
 class SparseValueSet<T*> {
     SparseValueSet<ptrdiff_t> my_set;
 public:
-    T* get( int i ) const {return reinterpret_cast<T*>(my_set.get(i));} 
+    T* get( int i ) const {return reinterpret_cast<T*>(my_set.get(i));}
     bool contains( T* x ) const {return my_set.contains(reinterpret_cast<ptrdiff_t>(x));}
 };
 
-//! Specialization for bool.  
-/** Checking bool for atomic read/write is pointless in practice, because 
+//! Specialization for bool.
+/** Checking bool for atomic read/write is pointless in practice, because
     there is no way to *not* atomically read or write a bool value. */
 template<>
 class SparseValueSet<bool> {
@@ -746,8 +886,8 @@ public:
             int j = int(1/x+T(0.5));
             if( 0<j && j<=128 ) {
                 T error = x*T(j)-T(1);
-                // In the calculation above, if x was indeed generated by method get, the error should be 
-                // at most epsilon, because x is off by at most 1/2 ulp from its infinitely precise value, 
+                // In the calculation above, if x was indeed generated by method get, the error should be
+                // at most epsilon, because x is off by at most 1/2 ulp from its infinitely precise value,
                 // j is exact, and the multiplication incurs at most another 1/2 ulp of round-off error.
                 if( -epsilon<=error && error<=epsilon ) {
                     return true;
@@ -760,10 +900,10 @@ public:
     };
 };
 
-template<> 
+template<>
 class SparseValueSet<float>: public SparseFloatSet<float> {};
 
-template<> 
+template<>
 class SparseValueSet<double>: public SparseFloatSet<double> {};
 
 template<typename T>
@@ -771,7 +911,7 @@ class HammerAssignment: NoAssign {
     tbb::atomic<T>& x;
     const char* name;
     SparseValueSet<T> set;
-public:   
+public:
     HammerAssignment( tbb::atomic<T>& x_, const char* name_ ) : x(x_), name(name_) {}
     void operator()( int k ) const {
         const int n = 1000000;
@@ -790,7 +930,7 @@ public:
         } else {
             tbb::atomic<T> y;
             for( int i=0; i<n; ++i ) {
-                // Get pseudo-random value. 
+                // Get pseudo-random value.
                 y = set.get(i);
                 // Write y atomically into x.
                 x = y;
@@ -804,9 +944,7 @@ public:
 template<typename T> void TestAssignmentSignature( T& (T::*)(const T&) ) {}
 
 #if _MSC_VER && !defined(__INTEL_COMPILER)
-    // Suppress "conditional expression is constant" warning.
-    #pragma warning( push )
-    #pragma warning( disable: 4127 )
+    #pragma warning( disable: 4355 4800 )
 #endif
 
 template<typename T>
@@ -817,17 +955,17 @@ void TestAssignment( const char* name ) {
     NativeParallelFor( 2, HammerAssignment<T>( x, name ) );
 #if __TBB_x86_32 && (__linux__ || __FreeBSD__ || _WIN32)
     if( sizeof(T)==8 ) {
-        // Some compilers for IA-32 fail to provide 8-byte alignment of objects on the stack, 
-        // even if the object specifies 8-byte alignment.  On such platforms, the IA-32 implementation 
-        // of atomic<long long> and atomic<unsigned long long> use different tactics depending upon 
+        // Some compilers for IA-32 fail to provide 8-byte alignment of objects on the stack,
+        // even if the object specifies 8-byte alignment.  On such platforms, the IA-32 implementation
+        // of atomic<long long> and atomic<unsigned long long> use different tactics depending upon
         // whether the object is properly aligned or not.  The following abusive test ensures that we
-        // cover both the proper and improper alignment cases, one with the x above and the other with 
+        // cover both the proper and improper alignment cases, one with the x above and the other with
         // the y below, perhaps not respectively.
 
         // Allocate space big enough to always contain 8-byte locations that are aligned and misaligned.
         char raw_space[15];
         // Set delta to 0 if x is aligned, 4 otherwise.
-        uintptr_t delta = ((reinterpret_cast<uintptr_t>(&x)&7) ? 0 : 4); 
+        uintptr_t delta = ((reinterpret_cast<uintptr_t>(&x)&7) ? 0 : 4);
         // y crosses 8-byte boundary if and only if x does not cross.
         tbb::atomic<T>& y = *reinterpret_cast<tbb::atomic<T>*>((reinterpret_cast<uintptr_t>(&raw_space[7+delta])&~7u) - delta);
         // Assertion checks that y really did end up somewhere inside "raw_space".
@@ -839,14 +977,104 @@ void TestAssignment( const char* name ) {
 #endif /* __TBB_x86_32 && (__linux__ || __FreeBSD__ || _WIN32) */
 }
 
-#if _MSC_VER && !defined(__INTEL_COMPILER)
-    #pragma warning( pop )
-#endif
+static const unsigned Primes[] = {
+    0x9e3779b1, 0xffe6cc59, 0x2109f6dd, 0x43977ab5, 0xba5703f5, 0xb495a877, 0xe1626741, 0x79695e6b,
+    0xbc98c09f, 0xd5bee2b3, 0x287488f9, 0x3af18231, 0x9677cd4d, 0xbe3a6929, 0xadc6a877, 0xdcf0674b,
+    0xbe4d6fe9, 0x5f15e201, 0x99afc3fd, 0xf3f16801, 0xe222cfff, 0x24ba5fdb, 0x0620452d, 0x79f149e3,
+    0xc8b93f49, 0x972702cd, 0xb07dd827, 0x6c97d5ed, 0x085a3d61, 0x46eb5ea7, 0x3d9910ed, 0x2e687b5b,
+    0x29609227, 0x6eb081f1, 0x0954c4e1, 0x9d114db9, 0x542acfa9, 0xb3e6bd7b, 0x0742d917, 0xe9f3ffa7,
+    0x54581edb, 0xf2480f45, 0x0bb9288f, 0xef1affc7, 0x85fa0ca7, 0x3ccc14db, 0xe6baf34b, 0x343377f7,
+    0x5ca19031, 0xe6d9293b, 0xf0a9f391, 0x5d2e980b, 0xfc411073, 0xc3749363, 0xb892d829, 0x3549366b,
+    0x629750ad, 0xb98294e5, 0x892d9483, 0xc235baf3, 0x3d2402a3, 0x6bdef3c9, 0xbec333cd, 0x40c9520f
+};
+
+class FastRandom {
+    unsigned x, a;
+public:
+    unsigned short get() {
+        unsigned short r = (unsigned short)(x>>16);
+        x = x*a+1;
+        return r;
+    }
+    FastRandom( unsigned seed ) {
+        x = seed;
+        a = Primes[seed % (sizeof(Primes)/sizeof(Primes[0]))];
+    }
+};
+
+template <typename T, LoadStoreExpression E>
+class ArbitrationBody : NoAssign, Harness::NoAfterlife {
+    typedef LoadStoreTraits<T, E> trait;
+
+    mutable FastRandom my_rand;
+    static const unsigned short c_rand_ceil = 10;
+
+    static tbb::atomic<T> s_ready[2];
+    static tbb::atomic<T> s_turn;
+    static volatile bool s_inside;
+
+public:
+    void operator() ( int id ) const {
+        const int me = id;
+        const T other = (T)(uintptr_t)(1 - id),
+                cleared = T(0),
+                signaled = T(1);
+        for ( int i = 0; i < 100000; ++i ) {
+            trait::store( s_ready[me], signaled );
+            trait::store( s_turn, other );
+            T r, t;
+            for ( int j = 0; ; ++j ) {
+                trait::load(r, s_ready[(uintptr_t)other]);
+                trait::load(t, s_turn);
+                if ( r != signaled || t != other )
+                    break;
+                __TBB_Pause(1);
+                if ( j == 2<<12 ) {
+                    j = 0;
+                    __TBB_Yield();
+                }
+            }
+            // Entered critical section
+            ASSERT( !s_inside, "Peterson lock is broken - some fences are missing" );
+            s_inside = true;
+            unsigned short spin = my_rand.get() % c_rand_ceil;
+            for ( volatile int j = 0; j < spin; ++j )
+                continue;
+            s_inside = false;
+            ASSERT( !s_inside, "Peterson lock is broken - some fences are missing" );
+            // leaving critical section
+            trait::store( s_ready[me], cleared );
+            spin = my_rand.get() % c_rand_ceil;
+            for ( volatile int j = 0; j < spin; ++j )
+                continue;
+        }
+    }
+
+    ArbitrationBody () : my_rand((unsigned)(uintptr_t)this) {}
+};
+
+template<typename T, LoadStoreExpression E> tbb::atomic<T> ArbitrationBody<T, E>::s_ready[2];
+template<typename T, LoadStoreExpression E> tbb::atomic<T> ArbitrationBody<T, E>::s_turn;
+template<typename T, LoadStoreExpression E> volatile bool ArbitrationBody<T, E>::s_inside = false;
+
+template <typename T, LoadStoreExpression E>
+void TestDekkerArbitration () {
+    NativeParallelFor( 2, ArbitrationBody<T, E>() );
+}
 
 template<typename T>
 void TestParallel( const char* name ) {
-    TestLoadAndStoreFences<T>(name);
+    TestLoadAndStoreFences<T, UseOperators>(name);
+    TestLoadAndStoreFences<T, UseImplicitAcqRel>(name);
+    TestLoadAndStoreFences<T, UseExplicitFullyFenced>(name);
+    TestLoadAndStoreFences<T, UseExplicitAcqRel>(name);
+    TestLoadAndStoreFences<T, UseExplicitRelaxed>(name);
+    TestLoadAndStoreFences<T, UseGlobalHelperFullyFenced>(name);
+    TestLoadAndStoreFences<T, UseGlobalHelperAcqRel>(name);
+    TestLoadAndStoreFences<T, UseGlobalHelperRelaxed>(name);
     TestAssignment<T>(name);
+    TestDekkerArbitration<T, UseExplicitFullyFenced>();
+    TestDekkerArbitration<T, UseGlobalHelperFullyFenced>();
 }
 
 #endif // __TBB_TEST_PIC && !__PIC__
diff --git a/src/test/test_broadcast_node.cpp b/src/test/test_broadcast_node.cpp
index 7556b61..47e5eb3 100644
--- a/src/test/test_broadcast_node.cpp
+++ b/src/test/test_broadcast_node.cpp
@@ -27,8 +27,7 @@
 */
 
 #include "harness.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
 
 #include "tbb/atomic.h"
 
@@ -42,13 +41,13 @@ class int_convertable_type : private NoAssign {
 public:
 
    int_convertable_type( int v ) : my_value(v) {}
-   operator int() { return my_value; }
+   operator int() const { return my_value; }
 
 };
 
 
 template< typename T >
-class counting_array_receiver : public tbb::receiver<T> {
+class counting_array_receiver : public tbb::flow::receiver<T> {
 
     tbb::atomic<size_t> my_counters[N];
 
@@ -64,7 +63,7 @@ public:
         return v;
     }
 
-    /* override */ bool try_put( T v ) {
+    /* override */ bool try_put( const T &v ) {
         ++my_counters[(int)v];
         return true;
     }
@@ -74,13 +73,13 @@ public:
 template< typename T >
 void test_serial_broadcasts() {
 
-    tbb::broadcast_node<T> b;
+    tbb::flow::broadcast_node<T> b;
     
     for ( int num_receivers = 1; num_receivers < R; ++num_receivers ) {
         counting_array_receiver<T> *receivers = new counting_array_receiver<T>[num_receivers];
 
         for ( int r = 0; r < num_receivers; ++r ) {
-            ASSERT( b.register_successor( receivers[r] ), NULL );
+            tbb::flow::make_edge( b, receivers[r] );
         } 
 
         for (int n = 0; n < N; ++n ) {
@@ -91,7 +90,7 @@ void test_serial_broadcasts() {
             for (int n = 0; n < N; ++n ) {
                 ASSERT( receivers[r][n] == 1, NULL );
             }
-            ASSERT( b.remove_successor( receivers[r] ), NULL );
+            tbb::flow::remove_edge( b, receivers[r] );
         } 
         ASSERT( b.try_put( (T)0 ), NULL );
         for ( int r = 0; r < num_receivers; ++r ) 
@@ -106,11 +105,11 @@ void test_serial_broadcasts() {
 template< typename T >
 class native_body : private NoAssign {
  
-   tbb::broadcast_node<T> &my_b;
+   tbb::flow::broadcast_node<T> &my_b;
 
 public:
 
-    native_body( tbb::broadcast_node<T> &b ) : my_b(b) {} 
+    native_body( tbb::flow::broadcast_node<T> &b ) : my_b(b) {} 
 
     void operator()(int) const {
         for (int n = 0; n < N; ++n ) {
@@ -121,15 +120,12 @@ public:
 };
 
 template< typename T >
-void test_parallel_broadcasts(int p) {
-
-    tbb::broadcast_node<T> b;
-    
+void run_parallel_broadcasts(int p, tbb::flow::broadcast_node<T>& b) {
     for ( int num_receivers = 1; num_receivers < R; ++num_receivers ) {
         counting_array_receiver<T> *receivers = new counting_array_receiver<T>[num_receivers];
 
         for ( int r = 0; r < num_receivers; ++r ) {
-            ASSERT( b.register_successor( receivers[r] ), NULL );
+            tbb::flow::make_edge( b, receivers[r] );
         } 
 
         NativeParallelFor( p, native_body<T>( b ) );
@@ -138,16 +134,26 @@ void test_parallel_broadcasts(int p) {
             for (int n = 0; n < N; ++n ) {
                 ASSERT( (int)receivers[r][n] == p, NULL );
             }
-            ASSERT( b.remove_successor( receivers[r] ), NULL );
+            tbb::flow::remove_edge( b, receivers[r] );
         } 
         ASSERT( b.try_put( (T)0 ), NULL );
         for ( int r = 0; r < num_receivers; ++r ) 
-            ASSERT( (int)receivers[0][0] == p, NULL ) ;
+            ASSERT( (int)receivers[r][0] == p, NULL ) ;
 
         delete [] receivers;
 
     }
+}
+
+template< typename T >
+void test_parallel_broadcasts(int p) {
 
+    tbb::flow::broadcast_node<T> b;
+    run_parallel_broadcasts(p, b);
+    
+    // test copy constructor
+    tbb::flow::broadcast_node<T> b_copy(b);
+    run_parallel_broadcasts(p, b_copy);
 }
 
 int TestMain() { 
@@ -166,6 +172,4 @@ int TestMain() {
        test_parallel_broadcasts<int_convertable_type>(p);
    }
    return Harness::Done;
-
 }
-
diff --git a/src/test/test_buffer_node.cpp b/src/test/test_buffer_node.cpp
index 81a9e2f..29b4f99 100644
--- a/src/test/test_buffer_node.cpp
+++ b/src/test/test_buffer_node.cpp
@@ -27,8 +27,7 @@
 */
 
 #include "harness.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
 #include "tbb/task_scheduler_init.h"
 #include "tbb/tick_count.h"
 
@@ -38,7 +37,7 @@
 #define C 10
 
 template< typename T >
-void spin_try_get( tbb::buffer_node<T> &b, T &value ) {
+void spin_try_get( tbb::flow::buffer_node<T> &b, T &value ) {
     while ( b.try_get(value) != true ) {}
 }
 
@@ -50,9 +49,9 @@ void check_item( T* count_value, T &value ) {
 template< typename T >
 struct parallel_puts : NoAssign {
 
-    tbb::buffer_node<T> &my_b;
+    tbb::flow::buffer_node<T> &my_b;
 
-    parallel_puts( tbb::buffer_node<T> &b ) : my_b(b) {}
+    parallel_puts( tbb::flow::buffer_node<T> &b ) : my_b(b) {}
 
     void operator()(int i) const {
         for (int j = 0; j < N; ++j) {
@@ -103,10 +102,10 @@ struct touches {
 template< typename T >
 struct parallel_gets : NoAssign {
 
-    tbb::buffer_node<T> &my_b;
+    tbb::flow::buffer_node<T> &my_b;
     touches<T> &my_touches;
 
-    parallel_gets( tbb::buffer_node<T> &b, touches<T> &t) : my_b(b), my_touches(t) {}
+    parallel_gets( tbb::flow::buffer_node<T> &b, touches<T> &t) : my_b(b), my_touches(t) {}
 
     void operator()(int) const {
         for (int j = 0; j < N; ++j) {
@@ -121,10 +120,10 @@ struct parallel_gets : NoAssign {
 template< typename T >
 struct parallel_put_get : NoAssign {
 
-    tbb::buffer_node<T> &my_b;
+    tbb::flow::buffer_node<T> &my_b;
     touches<T> &my_touches;
 
-    parallel_put_get( tbb::buffer_node<T> &b, touches<T> &t ) : my_b(b), my_touches(t) {}
+    parallel_put_get( tbb::flow::buffer_node<T> &b, touches<T> &t ) : my_b(b), my_touches(t) {}
 
     void operator()(int tid) const {
 
@@ -152,11 +151,11 @@ struct parallel_put_get : NoAssign {
 //
 template< typename T >
 int test_reservation(int num_threads) {
-    tbb::graph g;
+    tbb::flow::graph g;
     T bogus_value(-1);
 
     // Simple tests
-    tbb::buffer_node<T> b(g);
+    tbb::flow::buffer_node<T> b(g);
 
     b.try_put(T(1));
     b.try_put(T(2));
@@ -202,10 +201,10 @@ int test_reservation(int num_threads) {
 //
 template< typename T >
 int test_parallel(int num_threads) {
-    tbb::graph g;
-    tbb::buffer_node<T> b(g);
-    tbb::buffer_node<T> b2(g);
-    tbb::buffer_node<T> b3(g);
+    tbb::flow::graph g;
+    tbb::flow::buffer_node<T> b(g);
+    tbb::flow::buffer_node<T> b2(g);
+    tbb::flow::buffer_node<T> b3(g);
     T bogus_value(-1);
     T j = bogus_value;
 
@@ -251,8 +250,8 @@ int test_parallel(int num_threads) {
     ASSERT( b.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
-    ASSERT( b.register_successor( b2 ) == true, NULL );
-    ASSERT( b2.register_successor( b3 ) == true, NULL );
+    tbb::flow::make_edge( b, b2 );
+    tbb::flow::make_edge( b2, b3 );
 
     NativeParallelFor( num_threads, parallel_puts<T>(b) );
     {
@@ -270,6 +269,35 @@ int test_parallel(int num_threads) {
     ASSERT( b3.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
+    // test copy constructor
+    ASSERT( b.remove_successor( b2 ), NULL );
+    // fill up b:
+    NativeParallelFor( num_threads, parallel_puts<T>(b) );
+    // copy b:
+    tbb::flow::buffer_node<T> b_copy(b);
+
+    // b_copy should be empty
+    j = bogus_value;
+    g.wait_for_all();
+    ASSERT( b_copy.try_get( j ) == false, NULL );
+
+    // hook them together:
+    ASSERT( b.register_successor(b_copy) == true, NULL );
+    // try to get content from b_copy
+    {
+        touches< T > t( num_threads );
+        NativeParallelFor( num_threads, parallel_gets<T>(b_copy, t) );
+        g.wait_for_all();
+        ASSERT( t.validate_touches(), NULL );
+    }
+    // now both should be empty
+    j = bogus_value;
+    g.wait_for_all();
+    ASSERT( b.try_get( j ) == false, NULL );
+    g.wait_for_all();
+    ASSERT( b_copy.try_get( j ) == false, NULL );
+    ASSERT( j == bogus_value, NULL );
+
     return 0;
 }
 
@@ -284,11 +312,11 @@ int test_parallel(int num_threads) {
 
 template< typename T >
 int test_serial() {
-    tbb::graph g;
+    tbb::flow::graph g;
     T bogus_value(-1);
 
-    tbb::buffer_node<T> b(g);
-    tbb::buffer_node<T> b2(g);
+    tbb::flow::buffer_node<T> b(g);
+    tbb::flow::buffer_node<T> b2(g);
     T j = bogus_value;
 
     //
@@ -321,7 +349,7 @@ int test_serial() {
     ASSERT( b.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
-    ASSERT( b.register_successor( b2 ) == true, NULL );
+    tbb::flow::make_edge(b, b2);
 
     vsum = T(0);
     for (int i = 0; i < N; ++i) {
@@ -342,7 +370,7 @@ int test_serial() {
     ASSERT( b2.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
-    ASSERT( b.remove_successor( b2 ) == true, NULL );
+    tbb::flow::remove_edge(b, b2);
     ASSERT( b.try_put( 1 ) == true, NULL );
     g.wait_for_all();
     ASSERT( b2.try_get( j ) == false, NULL );
@@ -351,9 +379,9 @@ int test_serial() {
     ASSERT( b.try_get( j ) == true, NULL );
     ASSERT( j == 1, NULL );
 
-    tbb::buffer_node<T> b3(g);
-    ASSERT( b.register_successor( b2 ) == true, NULL );
-    ASSERT( b2.register_successor( b3 ) == true, NULL );
+    tbb::flow::buffer_node<T> b3(g);
+    tbb::flow::make_edge( b, b2 );
+    tbb::flow::make_edge( b2, b3 );
 
     vsum = T(0);
     for (int i = 0; i < N; ++i) {
@@ -376,7 +404,7 @@ int test_serial() {
     ASSERT( b3.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
-    ASSERT( b.remove_successor( b2 ) == true, NULL );
+    tbb::flow::remove_edge(b, b2);
     ASSERT( b.try_put( 1 ) == true, NULL );
     g.wait_for_all();
     ASSERT( b2.try_get( j ) == false, NULL );
diff --git a/src/test/test_cilk_dynamic_load.cpp b/src/test/test_cilk_dynamic_load.cpp
index 2b91bac..a11554b 100644
--- a/src/test/test_cilk_dynamic_load.cpp
+++ b/src/test/test_cilk_dynamic_load.cpp
@@ -28,14 +28,16 @@
 
 #include "tbb/tbb_config.h"
 
-// Skip the test if no TBB-Cilk interoperability
+// Skip the test if no interoperability with cilkrts
 #define __TBB_CILK_INTEROP   (__TBB_SURVIVE_THREAD_SWITCH && __INTEL_COMPILER>=1200)
-// Skip the test until Cilk will have dlopen()/dlclose() start up feature
+// Skip the test when cilkrts did not have dlopen()/dlclose() start up feature
 #define CILK_SYMBOLS_VISIBLE (_WIN32||_WIN64)
 // The compiler does not add "-lcilkrts" linker option on some linux systems
-#define CILK_LINKAGE_BROKEN  (__linux__ && __GNUC__<4 && __INTEL_COMPILER_BUILD_DATE <= 20101116)
+#define CILK_LINKAGE_BROKEN  (__linux__ && __GNUC__<4 && __INTEL_COMPILER_BUILD_DATE <= 20110427)
+// In U4, cilkrts incorrectly sends the interop notifications to TBB
+#define CILK_NOTIFICATIONS_BROKEN ( __INTEL_COMPILER_BUILD_DATE == 20110427 )
 
-#if __TBB_CILK_INTEROP && CILK_SYMBOLS_VISIBLE && !CILK_LINKAGE_BROKEN
+#if __TBB_CILK_INTEROP && CILK_SYMBOLS_VISIBLE && !CILK_LINKAGE_BROKEN && !CILK_NOTIFICATIONS_BROKEN
 
 #if _WIN32 || _WIN64
 #include "tbb/machine/windows_api.h"
@@ -63,7 +65,7 @@ static const int P_nested = 2;
 #define CILK_TEST_EXPORT extern "C"
 #endif /* _WIN32 || _WIN64 */
 
-bool g_sandwich = true; // have to be declare before #include "test_cilk_sandwich.h"
+bool g_sandwich = true; // have to be declare before #include "test_cilk_common.h"
 #include "test_cilk_common.h"
 
 CILK_TEST_EXPORT int CilkFib( int n )
@@ -175,7 +177,7 @@ int TestMain () {
 
 #endif /* _USRDLL */
 
-#else /* No Cilk interop */
+#else /* !__TBB_CILK_INTEROP */
 
 #include "harness.h"
 
@@ -183,4 +185,4 @@ int TestMain () {
     return Harness::Skipped;
 }
 
-#endif /* No Cilk interop */
+#endif /* !__TBB_CILK_INTEROP */
diff --git a/src/test/test_cilk_interop.cpp b/src/test/test_cilk_interop.cpp
index ba9fb1e..46861c8 100644
--- a/src/test/test_cilk_interop.cpp
+++ b/src/test/test_cilk_interop.cpp
@@ -29,12 +29,14 @@
 #include "tbb/tbb_config.h"
 #include "harness.h"
 
-// Skip the test if no TBB-Cilk interoperability
+// Skip the test if no interoperability with cilkrts
 #define __TBB_CILK_INTEROP   (__TBB_SURVIVE_THREAD_SWITCH && __INTEL_COMPILER>=1200)
 // The compiler does not add "-lcilkrts" linker option on some linux systems
-#define CILK_LINKAGE_BROKEN  (__linux__ && __GNUC__<4 && __INTEL_COMPILER_BUILD_DATE <= 20101116)
+#define CILK_LINKAGE_BROKEN  (__linux__ && __GNUC__<4 && __INTEL_COMPILER_BUILD_DATE <= 20110427)
+// In U4, cilkrts incorrectly sends the interop notifications to TBB
+#define CILK_NOTIFICATIONS_BROKEN ( __INTEL_COMPILER_BUILD_DATE == 20110427 )
 
-#if __TBB_CILK_INTEROP && !CILK_LINKAGE_BROKEN
+#if __TBB_CILK_INTEROP && !CILK_LINKAGE_BROKEN && !CILK_NOTIFICATIONS_BROKEN
 
 static const int N = 14;
 static const int P_outer = 4;
@@ -57,7 +59,7 @@ enum tbb_sched_injection_mode_t {
 
 tbb_sched_injection_mode_t g_sim = tbbsched_none;
 
-bool g_sandwich = false; // have to be declare before #include "test_cilk_sandwich.h"
+bool g_sandwich = false; // have to be declare before #include "test_cilk_common.h"
 #include "test_cilk_common.h"
 
 // A time delay routine
@@ -151,10 +153,10 @@ int TestMain () {
     return Harness::Done;
 }
 
-#else /* No Cilk interop */
+#else /* !__TBB_CILK_INTEROP */
 
 int TestMain () {
     return Harness::Skipped;
 }
 
-#endif /* No Cilk interop */
+#endif /* !__TBB_CILK_INTEROP */
diff --git a/src/test/test_combinable.cpp b/src/test/test_combinable.cpp
index b7ff86b..5dbd83a 100644
--- a/src/test/test_combinable.cpp
+++ b/src/test/test_combinable.cpp
@@ -52,7 +52,7 @@
 #include "harness_assert.h"
 #include "harness.h"
 
-#if __TBB_GCC_WARNING_SUPPRESSION_ENABLED
+#if __TBB_GCC_WARNING_SUPPRESSION_PRESENT
 #pragma GCC diagnostic ignored "-Wuninitialized"
 #endif
 
diff --git a/src/test/test_concurrent_hash_map.cpp b/src/test/test_concurrent_hash_map.cpp
index 26af309..e9b02f3 100644
--- a/src/test/test_concurrent_hash_map.cpp
+++ b/src/test/test_concurrent_hash_map.cpp
@@ -77,6 +77,13 @@ namespace tbb {
     };
 }
 
+#if HARNESS_USE_PROXY
+    #define TBB_PREVIEW_RUNTIME_LOADER 1
+    #include "tbb/runtime_loader.h"
+    static char const * test_path[] = { ".", NULL };
+    static tbb::runtime_loader test_runtime_loader( test_path );
+#endif // HARNESS_USE_PROXY
+
 tbb::concurrent_hash_map<UserDefinedKeyType,int> TestInstantiationWithUserDefinedKeyType;
 
 // Test whether a sufficient set of headers were included to instantiate a concurernt_hash_map. OSS Bug #120 (& #130):
diff --git a/src/test/test_concurrent_monitor.cpp b/src/test/test_concurrent_monitor.cpp
index 0390adc..3e6ec13 100644
--- a/src/test/test_concurrent_monitor.cpp
+++ b/src/test/test_concurrent_monitor.cpp
@@ -28,11 +28,23 @@
 
 #include "tbb/concurrent_monitor.h"
 #include "tbb/atomic.h"
+#include "tbb/task_scheduler_init.h"
 #include "tbb/parallel_for.h"
 #include "tbb/blocked_range.h"
 #include "harness.h"
+#if _WIN32||_WIN64
+#include "tbb/dynamic_link.cpp"
+#endif
+
+#include "tbb/semaphore.cpp"
 #include "tbb/concurrent_monitor.cpp"
 
+#if _MSC_VER && !defined(__INTEL_COMPILER)
+    // Workaround for overzealous compiler warnings
+    // Suppress compiler warning about constant conditional expression
+    #pragma warning (disable: 4127)
+#endif
+
 using namespace tbb;
 
 //! Queuing lock with concurrent_monitor; to test concurrent_monitor::notify( Predicate p )
@@ -85,7 +97,10 @@ void QueuingMutex::ScopedLock::Acquire( QueuingMutex& m )
     // "sending" the fields initialized above to other processors.
     ScopedLock* pred = m.q_tail.fetch_and_store<tbb::release>(this);
     if( pred ) {
+#if TBB_USE_ASSERT
+        __TBB_control_consistency_helper(); // on "m.q_tail"
         ASSERT( !pred->next, "the predecessor has another successor!");
+#endif
         pred->next = this;
         for( int i=0; i<16; ++i ) {
             if( going!=0ul ) break;
@@ -94,9 +109,8 @@ void QueuingMutex::ScopedLock::Acquire( QueuingMutex& m )
         SleepPerhaps();
     }
 
-    // Force acquire so that user's critical section receives correct values
-    // from processor that was previously in the user's critical section.
-    __TBB_load_with_acquire(going);
+    // Acquire critical section indirectly from previous owner or directly from predecessor.
+    __TBB_control_consistency_helper(); // on either "m.q_tail" or "going"
 }
 
 //! A method to release QueuingMutex lock
@@ -199,15 +213,16 @@ void SpinMutex::ScopedLock::SleepPerhaps()
         mq.cancel_wait( thr_ctx );
 }
 
+//! A value protected by a mutex.
 template<typename M>
 struct Counter {
     typedef M mutex_type;
     M mutex;
-    volatile long value;
+    long value;
 };
 
 //! Function object for use with parallel_for.h.
-template<typename C>
+template<typename C, int D>
 struct AddOne: NoAssign {
     C& counter;
     /** Increments counter once for each iteration in the iteration space. */
@@ -215,30 +230,34 @@ struct AddOne: NoAssign {
         for( size_t i=range.begin(); i!=range.end(); ++i ) {
             typename C::mutex_type::ScopedLock lock(counter.mutex);
             counter.value = counter.value+1;
+            if( D>0 )
+                for( int j=0; j<D; ++j ) __TBB_Yield();
         }
     }
     AddOne( C& counter_ ) : counter(counter_) {}
 };
 
-//! Generic test of a TBB mutex type M.
-/** Does not test features specific to reader-writer locks. */
-template<typename M>
-void Test() {
+//! Generic test with TBB mutex type M, max range R, and delay D.
+template<typename M,int R, int D>
+void Test( int p ) {
     Counter<M> counter;
     counter.value = 0;
-    const int n = 100000;
-    tbb::parallel_for(tbb::blocked_range<size_t>(0,n,n/10),AddOne<Counter<M> >(counter));
+    const int n = R;
+    tbb::task_scheduler_init init(p);
+    tbb::parallel_for(tbb::blocked_range<size_t>(0,n,n/10),AddOne<Counter<M>,D>(counter));
     if( counter.value!=n )
-        REPORT("ERROR : counter.value=%ld\n",counter.value);
+        REPORT("ERROR : counter.value=%ld (instead of %ld)\n",counter.value,n);
 }
 
 int TestMain () {
     for( int p=MinThread; p<=MaxThread; ++p ) {
         REMARK( "testing with %d workers\n", static_cast<int>(p) );
         // test the predicated notify 
-        Test<QueuingMutex>();
+        Test<QueuingMutex,100000,0>( p );
+        Test<QueuingMutex,1000,10000>( p );
         // test the notify_all method
-        Test<SpinMutex>();
+        Test<SpinMutex,100000,0>( p );
+        Test<SpinMutex,1000,10000>( p );
         REMARK( "calling destructor for task_scheduler_init\n" );
     }
     return Harness::Done;
diff --git a/src/test/test_concurrent_priority_queue.cpp b/src/test/test_concurrent_priority_queue.cpp
index 2d757c7..b932b08 100644
--- a/src/test/test_concurrent_priority_queue.cpp
+++ b/src/test/test_concurrent_priority_queue.cpp
@@ -26,17 +26,6 @@
     the GNU General Public License.
 */
 
-#ifndef TBB_PREVIEW_CONCURRENT_PRIORITY_QUEUE
-    #define TBB_PREVIEW_CONCURRENT_PRIORITY_QUEUE 1
-#endif
-
-#if __INTEL_COMPILER && _WIN64 && TBB_USE_ASSERT
-// The Intel Compiler has an issue that causes the Microsoft Iterator
-// Debugging code to crash in vector::pop_back when it is called after a
-// vector::push_back throws an exception.
-#define _HAS_ITERATOR_DEBUGGING 0
-#endif
-
 #include "tbb/concurrent_priority_queue.h"
 #include "tbb/atomic.h"
 #include "harness.h"
@@ -53,6 +42,15 @@
     #pragma warning( pop )
 #endif
 
+#if __INTEL_COMPILER && (_WIN32 || _WIN64) && TBB_USE_DEBUG && _CPPLIB_VER<520
+// The Intel Compiler has an issue that causes the Microsoft Iterator
+// Debugging code to crash in vector::pop_back when it is called after a
+// vector::push_back throws an exception.
+// #define _HAS_ITERATOR_DEBUGGING 0 // Setting this to 0 doesn't solve the problem
+                                     // and also provokes a redefinition warning
+#define __TBB_ITERATOR_DEBUGGING_EXCEPTIONS_BROKEN
+#endif
+
 using namespace tbb;
 
 const size_t MAX_ITER = 10000;
@@ -139,23 +137,6 @@ public:
     }
 };
 
-template<typename T, typename C>
-struct ReserveBody : NoAssign {
-    int nThread;
-    concurrent_priority_queue<T, C> *q;
-public:
-    ReserveBody(int nThread_, concurrent_priority_queue<T, C> *q_) : nThread(nThread_), q(q_) {}
-    void operator()(const int threadID) const {
-        T in_elem(threadID), out_elem;
-        q->reserve(q->capacity()+1);
-        for (size_t i=0; i<MAX_ITER; ++i) {
-            q->push(in_elem);
-            if (i%2) in_elem = in_elem + nThread;
-            ASSERT(q->try_pop(out_elem), "FAILED simultaneous enqueue/dequeue test in ReserveBody.");
-        }
-    }
-};
-
 template <typename T, typename C>
 class FloggerBody : NoAssign {
     int nThread;
@@ -183,7 +164,6 @@ void TestConstructorsDestructorsAccessors() {
     q = new concurrent_priority_queue<int, std::less<int> >();
     REMARK("Default constructor complete.\n");
     ASSERT(q->size()==0, "FAILED size test.");
-    ASSERT(q->capacity()==0, "FAILED capacity test.");
     ASSERT(q->empty(), "FAILED empty test.");
     REMARK("Testing destructor.\n");
     delete q;
@@ -193,7 +173,6 @@ void TestConstructorsDestructorsAccessors() {
     q = new concurrent_priority_queue<int, std::less<int> >(42);
     REMARK("Capacity constructor complete.\n");
     ASSERT(q->size()==0, "FAILED size test.");
-    ASSERT(q->capacity()==42, "FAILED capacity test.");
     ASSERT(q->empty(), "FAILED empty test.");
     REMARK("Testing destructor.\n");
     delete q;
@@ -203,7 +182,6 @@ void TestConstructorsDestructorsAccessors() {
     qi = new concurrent_priority_queue<int, std::less<int>, std::allocator<int> >(a);
     REMARK("Allocator constructor complete.\n");
     ASSERT(qi->size()==0, "FAILED size test.");
-    ASSERT(qi->capacity()==0, "FAILED allocator test.");
     ASSERT(qi->empty(), "FAILED empty test.");
     REMARK("Testing destructor.\n");
     delete qi;
@@ -213,7 +191,6 @@ void TestConstructorsDestructorsAccessors() {
     qi = new concurrent_priority_queue<int, std::less<int>, std::allocator<int> >(42, a);
     REMARK("Capacity+allocator constructor complete.\n");
     ASSERT(qi->size()==0, "FAILED size test.");
-    ASSERT(qi->capacity()==42, "FAILED capacity+allocator test.");
     ASSERT(qi->empty(), "FAILED empty test.");
     REMARK("Testing destructor.\n");
     delete qi;
@@ -225,14 +202,12 @@ void TestConstructorsDestructorsAccessors() {
     q = new concurrent_priority_queue<int, std::less<int> >(v.begin(), v.end());
     REMARK("Iterator filler constructor complete.\n");
     ASSERT(q->size()==42, "FAILED vector/size test.");
-    ASSERT(q->capacity()==42, "FAILED vector/capacity test.");
     ASSERT(!q->empty(), "FAILED vector/empty test.");
 
     REMARK("Testing copy constructor.\n");
     qo = new concurrent_priority_queue<int, std::less<int> >(*q);
     REMARK("Copy constructor complete.\n");
     ASSERT(qo->size()==42, "FAILED vector/size test.");
-    ASSERT(qo->capacity()==42, "FAILED vector/capacity test.");
     ASSERT(!qo->empty(), "FAILED vector/empty test.");
     REMARK("Testing destructor.\n");
     delete q;
@@ -240,7 +215,7 @@ void TestConstructorsDestructorsAccessors() {
     REMARK("Destruction complete.\n");
 }
 
-void TestAssignmentClearShrinkSwap() {
+void TestAssignmentClearSwap() {
     std::vector<int> v;
     concurrent_priority_queue<int, std::less<int> > *q, *qo;
     int e;
@@ -254,14 +229,12 @@ void TestAssignmentClearShrinkSwap() {
     *qo = *q; 
     REMARK("Assignment complete.\n");
     ASSERT(qo->size()==42, "FAILED assignment/size test.");
-    ASSERT(qo->capacity()==42, "FAILED assignment/capacity test.");
     ASSERT(!qo->empty(), "FAILED assignment/empty test.");
 
     REMARK("Testing clear.\n");
     q->clear();
     REMARK("Clear complete.\n");
     ASSERT(q->size()==0, "FAILED clear/size test.");
-    ASSERT(q->capacity()==42, "FAILED clear/capacity test.");
     ASSERT(q->empty(), "FAILED clear/empty test.");
 
     for (size_t i=0; i<5; ++i)
@@ -271,27 +244,17 @@ void TestAssignmentClearShrinkSwap() {
     *q = *qo;
     REMARK("Assignment complete.\n");
     ASSERT(q->size()==37, "FAILED assignment/size test.");
-    ASSERT(q->capacity()==37, "FAILED assignment/capacity test.");
     ASSERT(!q->empty(), "FAILED assignment/empty test.");
 
     for (size_t i=0; i<5; ++i)
         (void) qo->try_pop(e);
 
-    REMARK("Testing shrink_to_fit.\n");
-    qo->shrink_to_fit();
-    REMARK("Shrink_to_fit complete.\n");
-    ASSERT(qo->size()==32, "FAILED shrink_to_fit/size test.");
-    ASSERT(qo->capacity()==32, "FAILED shrink_to_fit/capacity test.");
-    ASSERT(!qo->empty(), "FAILED shrink_to_fit/empty test.");
-
     REMARK("Testing swap.\n");
     q->swap(*qo);
     REMARK("Swap complete.\n");
     ASSERT(q->size()==32, "FAILED swap/size test.");
-    ASSERT(q->capacity()==32, "FAILED swap/capacity test.");
     ASSERT(!q->empty(), "FAILED swap/empty test.");
     ASSERT(qo->size()==37, "FAILED swap_operand/size test.");
-    ASSERT(qo->capacity()==37, "FAILED swap_operand/capacity test.");
     ASSERT(!qo->empty(), "FAILED swap_operand/empty test.");
     delete q;
     delete qo;
@@ -310,7 +273,6 @@ void TestSerialPushPop() {
     }
     REMARK("Pushing complete.\n");
     ASSERT(q->size()==MAX_ITER, "FAILED push/size test.");
-    ASSERT(q->capacity()==MAX_ITER, "FAILED push/capacity test.");
     ASSERT(!q->empty(), "FAILED push/empty test.");
     
     REMARK("Testing serial pop.\n");
@@ -320,7 +282,6 @@ void TestSerialPushPop() {
         prev = e;
         ++count;
         ASSERT(q->size()==MAX_ITER-count, "FAILED swap/size test.");
-        ASSERT(q->capacity()==MAX_ITER, "FAILED swap/capacity test.");
         ASSERT(!q->empty() || count==MAX_ITER, "FAILED swap/empty test.");
     }
     REMARK("Popping complete.\n");
@@ -340,7 +301,6 @@ void TestParallelPushPop(int nThreads, T t_max, T t_min, C /*compare*/) {
     REMARK("Pushing complete.\n");
     qsize = q->size();
     ASSERT(q->size()==nThreads*MAX_ITER, "FAILED push/size test.");
-    ASSERT(q->capacity()>=qsize, "FAILED push/capacity test.");
     ASSERT(!q->empty(), "FAILED push/empty test.");
     
     REMARK("Testing parallel pop.\n");
@@ -350,23 +310,9 @@ void TestParallelPushPop(int nThreads, T t_max, T t_min, C /*compare*/) {
     ASSERT(q->size()==0, "FAILED pop/empty test.");
 
     q->clear();
-    q->shrink_to_fit();
     delete(q);
 }
 
-void TestPushPopReserve(int nThreads) {
-    concurrent_priority_queue<int, std::less<int> > *q = new concurrent_priority_queue<int, std::less<int> >(0);
-    counter = 0;
-    REMARK("Testing reserve.\n");
-    NativeParallelFor(nThreads, ReserveBody<int, std::less<int> >(nThreads, q));
-    REMARK("Reserve complete.\n");
-    ASSERT(q->size()==0, "FAILED reserve/size test.");
-    ASSERT(q->empty(), "FAILED reserve/empty test.");
-    q->clear();
-    q->shrink_to_fit();
-    delete q;
-}
-
 void TestExceptions() {
     const size_t TOO_LARGE_SZ = 1000000000;
     my_throwing_type elem;
@@ -377,14 +323,14 @@ void TestExceptions() {
         my_throwing_type::throw_flag = 1;
         cpq_ex_test_type q;
     } catch(...) {
-        REMARK("FAILED: allocating empty queue should not throw exception.\n");
+        ASSERT(false, "FAILED: allocating empty queue should not throw exception.\n");
     }
     // Allocate small queue should not throw for reasonably sized type
     try {
         my_throwing_type::throw_flag = 1;
         cpq_ex_test_type q(42);
     } catch(...) {
-        REMARK("FAILED: allocating small queue should not throw exception.\n");
+        ASSERT(false, "FAILED: allocating small queue should not throw exception.\n");
     }
     // Allocate a queue with too large initial size
     try {
@@ -434,21 +380,9 @@ void TestExceptions() {
         REMARK("FAILED: Assign did not throw exception.\n");
     } catch(...) {
         ASSERT(assign_q.empty(), "FAILED: assign_q should be empty.\n");
-        ASSERT(assign_q.capacity()==24, "FAILED: assign_q should have no newly allocated memory.\n");
     }
     REMARK("Assignment exceptions testing complete.\n");
-    REMARK("Testing reserve exceptions.\n");
-    try {
-        my_throwing_type::throw_flag = 1;
-        src_q.reserve(50);
-        REMARK("FAILED: Reserve did not throw exception.\n");
-    } catch(...) {
-        ASSERT(!src_q.empty(), "FAILED: src_q should not be empty.\n");
-        ASSERT(src_q.capacity()==42, "FAILED: src_q should be have no new allocated memory.\n");
-        ASSERT(src_q.size()==42, "FAILED: src_q should have same size.\n");
-        ASSERT(src_q.try_pop(elem), "FAILED: src_q is not functional.\n");
-    }
-    REMARK("Reserve exceptions testing complete.\n");
+#ifndef __TBB_ITERATOR_DEBUGGING_EXCEPTIONS_BROKEN
     REMARK("Testing push exceptions.\n");
     my_throwing_type::throw_flag = 0;
     pq = new cpq_ex_test_type(3);
@@ -457,30 +391,39 @@ void TestExceptions() {
         pq->push(elem);
         pq->push(elem);
     } catch(...) {
-        REMARK("FAILED: Push should not throw exception... yet.\n");
+        ASSERT(false, "FAILED: Push should not throw exception... yet.\n");
     }
-    try { // should crash on reserve copy 
+    try { // should crash on copy during expansion of vector
         my_throwing_type::throw_flag = 1;
         pq->push(elem);
         REMARK("FAILED: Push did not throw exception.\n");
     } catch(...) {
         ASSERT(!pq->empty(), "FAILED: pq should not be empty.\n");
-        ASSERT(pq->capacity()==3, "FAILED: pq should be have no new allocated memory.\n");
         ASSERT(pq->size()==3, "FAILED: pq should be only three elements.\n");
         ASSERT(pq->try_pop(elem), "FAILED: pq is not functional.\n");
     }
-    try { // should crash on push copy of element, reserve not needed
+    delete pq;
+
+    my_throwing_type::throw_flag = 0;
+    pq = new cpq_ex_test_type(3);
+    try {
+        pq->push(elem);
+        pq->push(elem);
+    } catch(...) {
+        ASSERT(false, "FAILED: Push should not throw exception... yet.\n");
+    }
+    try { // should crash on push copy of element
         my_throwing_type::throw_flag = 1;
         pq->push(elem);
         REMARK("FAILED: Push did not throw exception.\n");
     } catch(...) {
         ASSERT(!pq->empty(), "FAILED: pq should not be empty.\n");
-        ASSERT(pq->capacity()==3, "FAILED: pq should be have no new allocated memory.\n");
         ASSERT(pq->size()==2, "FAILED: pq should be only two elements.\n");
         ASSERT(pq->try_pop(elem), "FAILED: pq is not functional.\n");
     }
     delete pq;
     REMARK("Push exceptions testing complete.\n");
+#endif
 }
 
 template <typename T, typename C>
@@ -499,7 +442,7 @@ void TestCpqOnNThreads(int nThreads) {
     my_less data_compare;
 
     TestConstructorsDestructorsAccessors();
-    TestAssignmentClearShrinkSwap();
+    TestAssignmentClearSwap();
     TestSerialPushPop(); 
 
     TestParallelPushPop(nThreads, INT_MAX, INT_MIN, int_compare);
@@ -510,7 +453,6 @@ void TestCpqOnNThreads(int nThreads) {
     TestFlogger(nThreads, (unsigned char)CHAR_MAX, int_compare);
     TestFlogger(nThreads, DATA_MAX, data_compare);
 
-    TestPushPopReserve(nThreads);
 #if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
     TestExceptions();
 #else
diff --git a/src/test/test_concurrent_queue.cpp b/src/test/test_concurrent_queue.cpp
index 1e7f8db..b4a96f5 100644
--- a/src/test/test_concurrent_queue.cpp
+++ b/src/test/test_concurrent_queue.cpp
@@ -397,12 +397,20 @@ bool operator==(const BarEx& bar1, const BarEx& bar2) {
 #endif /* TBB_USE_EXCEPTIONS */
 
 #if TBB_DEPRECATED
+
+#if __INTEL_COMPILER==1200 && _MSC_VER==1600
+// A workaround due to ICL 12.0 with /Qvc10 generating buggy code in TestIterator
+#define CALL_BEGIN(q,i) q.begin()
+#define CALL_END(q,i)   q.end()
+#else
 #define CALL_BEGIN(q,i) (((i)&0x1)?q.begin():q.unsafe_begin())
 #define CALL_END(q,i)   (((i)&0x1)?q.end():q.unsafe_end())
+#endif
+
 #else
 #define CALL_BEGIN(q,i) q.unsafe_begin()
 #define CALL_END(q,i)   q.unsafe_end()
-#endif
+#endif /* TBB_DEPRECATED */
 
 void TestConstructors ()
 {
@@ -897,34 +905,39 @@ void TestPrimitiveTypes( int nthread, T exemplar )
 
 #include "harness_m128.h"
 
-#if HAVE_m128
+#if HAVE_m128 || HAVE_m256
 
-//! Test concurrent queue with SSE type
-/** Type Queue should be a queue of ClassWithSSE. */
-template<typename Queue>
-void TestSSE() {
+//! Test concurrent queue with vector types
+/** Type Queue should be a queue of ClassWithSSE/ClassWithAVX. */
+template<typename ClassWithVectorType, typename Queue>
+void TestVectorTypes() {
     Queue q1;
-    for( int i=0; i<100; ++i )
-        q1.push(ClassWithSSE(i));
+    for( int i=0; i<100; ++i ) {
+        // VC8 does not properly align a temporary value; to work around, use explicit variable
+        ClassWithVectorType bar(i);
+        q1.push(bar);
+    }
 
     // Copy the queue
     Queue q2 = q1;
     // Check that elements of the copy are correct
     typename Queue::const_iterator ci = q2.unsafe_begin();
     for( int i=0; i<100; ++i ) {
-        ClassWithSSE foo = *ci;
-        ASSERT( *ci==ClassWithSSE(i), NULL );
+        ClassWithVectorType foo = *ci;
+        ClassWithVectorType bar(i);
+        ASSERT( *ci==bar, NULL );
         ++ci;
     }
 
     for( int i=0; i<101; ++i ) {
-        ClassWithSSE tmp;
+        ClassWithVectorType tmp;
         bool b = q1.try_pop( tmp );
         ASSERT( b==(i<100), NULL );
-        ASSERT( !b || tmp==ClassWithSSE(i), NULL );
+        ClassWithVectorType bar(i);
+        ASSERT( !b || tmp==bar, NULL );
     }
 }
-#endif /* HAVE_m128 */
+#endif /* HAVE_m128 || HAVE_m256 */
 
 int TestMain () {
     TestEmptyQueue<char>();
@@ -942,9 +955,15 @@ int TestMain () {
     TestPrimitiveTypes( MaxThread, (float)-1.2f );
     TestPrimitiveTypes( MaxThread, (double)-4.3 );
 #if HAVE_m128
-    TestSSE<tbb::concurrent_queue<ClassWithSSE> >();
-    TestSSE<tbb::concurrent_bounded_queue<ClassWithSSE> >();
-#endif /* HAVE_m128 */
+    TestVectorTypes<ClassWithSSE, tbb::concurrent_queue<ClassWithSSE> >();
+    TestVectorTypes<ClassWithSSE, tbb::concurrent_bounded_queue<ClassWithSSE> >();
+#endif
+#if HAVE_m256
+    if( have_AVX() ) {
+        TestVectorTypes<ClassWithAVX, tbb::concurrent_queue<ClassWithAVX> >();
+        TestVectorTypes<ClassWithAVX, tbb::concurrent_bounded_queue<ClassWithAVX> >();
+    }
+#endif
 
     // Test concurrent operations
     for( int nthread=MinThread; nthread<=MaxThread; ++nthread ) {
diff --git a/src/test/test_concurrent_unordered.cpp b/src/test/test_concurrent_unordered.cpp
index b9e857f..c6be930 100644
--- a/src/test/test_concurrent_unordered.cpp
+++ b/src/test/test_concurrent_unordered.cpp
@@ -30,6 +30,7 @@
 
 #define __TBB_EXTRA_DEBUG 1
 #include "tbb/concurrent_unordered_map.h"
+#include "tbb/concurrent_unordered_set.h"
 #include "tbb/parallel_for.h"
 #include "tbb/tick_count.h"
 #include <stdio.h>
@@ -39,9 +40,8 @@
 using namespace std;
 
 typedef local_counting_allocator<debug_allocator<std::pair<const int,int>,std::allocator> > MyAllocator;
-typedef tbb::concurrent_unordered_map<int, int, tbb::tbb_hash<int>, std::equal_to<int>, MyAllocator> Mycumap;
-//typedef tbb::concurrent_unordered_map<int, int> Mycumap;
-//typedef concurrent_unordered_multimap<int, int> Mycummap;
+typedef tbb::concurrent_unordered_map<int, int, tbb::tbb_hash<int>, std::equal_to<int>, MyAllocator> MyMap;
+typedef tbb::concurrent_unordered_set<int, tbb::tbb_hash<int>, std::equal_to<int>, MyAllocator> MySet;
 
 #define CheckAllocatorE(t,a,f) CheckAllocator(t,a,f,true,__LINE__)
 #define CheckAllocatorA(t,a,f) CheckAllocator(t,a,f,false,__LINE__)
@@ -59,15 +59,19 @@ inline void CheckAllocator(MyTable &table, size_t expected_allocs, size_t expect
     }
 }
 
+// value generator for cumap
 template <typename K, typename V = std::pair<const K, K> >
 struct ValueFactory {
     static V make(const K &value) { return V(value, value); }
+    static K key(const V &value) { return value.first; }
     static K get(const V& value) { return value.second; }
 };
 
+// generator for cuset
 template <typename T>
 struct ValueFactory<T, T> {
     static T make(const T &value) { return value; }
+    static T key(const T &value) { return value; }
     static T get(const T &value) { return value; }
 };
 
@@ -79,16 +83,16 @@ struct Value : ValueFactory<typename T::key_type, typename T::value_type> {};
 #pragma warning(disable: 4127) // warning 4127 -- while (true) has a constant expression in it
 #endif
 
-template<typename Iterator, typename RangeType>
+template<typename ContainerType, typename Iterator, typename RangeType>
 std::pair<int,int> CheckRecursiveRange(RangeType range) {
     std::pair<int,int> sum(0, 0); // count, sum
     for( Iterator i = range.begin(), e = range.end(); i != e; ++i ) {
-        ++sum.first; sum.second += i->second;
+        ++sum.first; sum.second += Value<ContainerType>::get(*i);
     }
     if( range.is_divisible() ) {
         RangeType range2( range, tbb::split() );
-        std::pair<int,int> sum1 = CheckRecursiveRange<Iterator, RangeType>( range );
-        std::pair<int,int> sum2 = CheckRecursiveRange<Iterator, RangeType>( range2 );
+        std::pair<int,int> sum1 = CheckRecursiveRange<ContainerType,Iterator, RangeType>( range );
+        std::pair<int,int> sum2 = CheckRecursiveRange<ContainerType,Iterator, RangeType>( range2 );
         sum1.first += sum2.first; sum1.second += sum2.second;
         ASSERT( sum == sum1, "Mismatched ranges after division");
     }
@@ -97,16 +101,16 @@ std::pair<int,int> CheckRecursiveRange(RangeType range) {
 
 template <typename T>
 struct SpecialTests {
-    static void Test() {}
+    static void Test(const char *str) {REMARK("skipped -- specialized %s tests\n", str);}
 };
 
 template <>
-struct SpecialTests <Mycumap>
+struct SpecialTests <MyMap>
 {
-    static void Test()
+    static void Test(const char *str)
     {
-        Mycumap cont(0);
-        const Mycumap &ccont(cont);
+        MyMap cont(0);
+        const MyMap &ccont(cont);
 
         // mapped_type& operator[](const key_type& k);
         cont[1] = 2;
@@ -125,10 +129,10 @@ struct SpecialTests <Mycumap>
         ASSERT(ccont.at(1) == 2, "Concurrent container size incorrect");
 
         // iterator find(const key_type& k);
-        Mycumap::const_iterator it = cont.find(1);
-        ASSERT(it != cont.end() && Value<Mycumap>::get(*(it)) == 2, "Element with key 1 not properly found");
+        MyMap::const_iterator it = cont.find(1);
+        ASSERT(it != cont.end() && Value<MyMap>::get(*(it)) == 2, "Element with key 1 not properly found");
 
-        REMARK("passed -- specialized concurrent unordered map tests\n");
+        REMARK("passed -- specialized %s tests\n", str);
     }
 };
 
@@ -273,8 +277,8 @@ void test_basic(const char * str)
         ASSERT(ins3.second == true && Value<T>::get(*(ins3.first)) == i, "Element 1 not properly inserted");
     }
     ASSERT(cont.size() == 256, "Wrong number of elements inserted");
-    ASSERT(256 == CheckRecursiveRange<typename T::iterator>(cont.range()).first, NULL);
-    ASSERT(256 == CheckRecursiveRange<typename T::const_iterator>(ccont.range()).first, NULL);
+    ASSERT((256 == CheckRecursiveRange<T,typename T::iterator>(cont.range()).first), NULL);
+    ASSERT((256 == CheckRecursiveRange<T,typename T::const_iterator>(ccont.range()).first), NULL);
 
     // size_type unsafe_bucket_count() const;
     ASSERT(ccont.unsafe_bucket_count() == 16, "Wrong number of buckets");
@@ -327,7 +331,7 @@ void test_basic(const char * str)
     REMARK("\n");
 #endif
 
-    SpecialTests<T>::Test();
+    SpecialTests<T>::Test(str);
 }
 
 void test_machine() {
@@ -383,7 +387,7 @@ public:
 
 typedef tbb::atomic<unsigned char> AtomicByte;
 
-template<typename RangeType>
+template<typename ContainerType, typename RangeType>
 struct ParallelTraverseBody: NoAssign {
     const int n;
     AtomicByte* const array;
@@ -392,8 +396,8 @@ struct ParallelTraverseBody: NoAssign {
     {}
     void operator()( const RangeType& range ) const {
         for( typename RangeType::iterator i = range.begin(); i!=range.end(); ++i ) {
-            int k = i->first;
-            ASSERT( k == i->second, NULL );
+            int k = Value<ContainerType>::key(*i);
+            ASSERT( k == Value<ContainerType>::get(*i), NULL );
             ASSERT( 0<=k && k<n, NULL ); 
             array[k]++;
         }
@@ -430,6 +434,16 @@ public:
     }
 };
 
+template<>
+class AssignBody<MySet>: NoAssign {
+    MySet &table;
+public:
+    AssignBody(MySet &t) : NoAssign(), table(t) {}
+    void operator()(int i) const {
+        table.insert(i);
+    }
+};
+
 template<typename T>
 void test_concurrent(const char *tablename) {
 #if TBB_USE_ASSERT
@@ -452,15 +466,15 @@ void test_concurrent(const char *tablename) {
     memset( array, 0, items*sizeof(AtomicByte) );
 
     typename T::range_type r = table.range();
-    ASSERT(items == CheckRecursiveRange<typename T::iterator>(r).first, NULL);
-    tbb::parallel_for( r, ParallelTraverseBody<typename T::const_range_type>( array, items ));
+    ASSERT((items == CheckRecursiveRange<T,typename T::iterator>(r).first), NULL);
+    tbb::parallel_for( r, ParallelTraverseBody<T, typename T::const_range_type>( array, items ));
     CheckRange( array, items );
 
     const T &const_table = table;
     memset( array, 0, items*sizeof(AtomicByte) );
     typename T::const_range_type cr = const_table.range();
-    ASSERT(items == CheckRecursiveRange<typename T::const_iterator>(cr).first, NULL);
-    tbb::parallel_for( cr, ParallelTraverseBody<typename T::const_range_type>( array, items ));
+    ASSERT((items == CheckRecursiveRange<T,typename T::const_iterator>(cr).first), NULL);
+    tbb::parallel_for( cr, ParallelTraverseBody<T, typename T::const_range_type>( array, items ));
     CheckRange( array, items );
     delete[] array;
 
@@ -477,7 +491,9 @@ void test_concurrent(const char *tablename) {
 
 int TestMain () {
     test_machine();
-    test_basic<Mycumap>("concurrent unordered map");
-    test_concurrent<Mycumap>("concurrent unordered map");
+    test_basic<MyMap>("concurrent unordered map");
+    test_concurrent<MyMap>("concurrent unordered map");
+    test_basic<MySet>("concurrent unordered set");
+    test_concurrent<MySet>("concurrent unordered set");
     return Harness::Done;
 }
diff --git a/src/test/test_concurrent_vector.cpp b/src/test/test_concurrent_vector.cpp
index e33190d..37cec5a 100644
--- a/src/test/test_concurrent_vector.cpp
+++ b/src/test/test_concurrent_vector.cpp
@@ -959,21 +959,26 @@ void TestExceptions() {
 #endif /* TBB_USE_EXCEPTIONS */
 
 //------------------------------------------------------------------------
-// Test SSE
+// Test SSE / AVX
 //------------------------------------------------------------------------
 #include "harness_m128.h"
 
-#if HAVE_m128
+#if HAVE_m128 | HAVE_m256
 
-void TestSSE() {
-    tbb::concurrent_vector<ClassWithSSE> v;
+template<typename ClassWithVectorType>
+void TestVectorTypes() {
+    tbb::concurrent_vector<ClassWithVectorType> v;
     for( int i=0; i<100; ++i ) {
-        v.push_back(ClassWithSSE(i));
-        for( int j=0; i<i; ++j ) 
-            ASSERT( v[j]==ClassWithSSE(j), NULL );
+        // VC8 does not properly align a temporary value; to work around, use explicit variable
+        ClassWithVectorType foo(i);
+        v.push_back(foo);
+        for( int j=0; i<i; ++j ) {
+            ClassWithVectorType bar(j);
+            ASSERT( v[j]==bar, NULL );
+        }
     }
 }
-#endif /* HAVE_m128 */
+#endif /* HAVE_m128 | HAVE_m256 */
 
 //------------------------------------------------------------------------
 
@@ -988,9 +993,12 @@ int TestMain () {
     TestResizeAndCopy();
     TestAssign();
 #if HAVE_m128
-    TestSSE();
-#endif /* HAVE_m128 */    
+    TestVectorTypes<ClassWithSSE>();
 #endif
+#if HAVE_m256
+    if (have_AVX()) TestVectorTypes<ClassWithAVX>();
+#endif
+#endif /* !TBB_DEPRECATED */
     TestCapacity();
     ASSERT( !FooCount, NULL );
     for( int nthread=MinThread; nthread<=MaxThread; ++nthread ) {
diff --git a/src/test/test_condition_variable.h b/src/test/test_condition_variable.h
index c685f3f..f403a02 100644
--- a/src/test/test_condition_variable.h
+++ b/src/test/test_condition_variable.h
@@ -189,11 +189,13 @@ void TestLocks( const char* name, int nthread ) {
     Counter<M> counter;
     counter.value = 0;
     Order = 0;
-    const long test_size = 100000;
-    NativeParallelFor( nthread, WorkForLocks<Counter<M>, test_size>(counter) );
+    // use the macro because of a seeming gcc 4.6 bug
+#define TEST_SIZE 100000
+    NativeParallelFor( nthread, WorkForLocks<Counter<M>, TEST_SIZE>(counter) );
 
-    if( counter.value!=2*test_size )
-        REPORT("ERROR for %s in TestLocks: counter.value=%ld != 2 * %ld=test_size\n",name,counter.value,test_size);
+    if( counter.value!=2*TEST_SIZE )
+        REPORT("ERROR for %s in TestLocks: counter.value=%ld != 2 * %ld=test_size\n",name,counter.value,TEST_SIZE);
+#undef TEST_SIZE
 }
 
 static tbb::atomic<int> barrier;
diff --git a/src/test/test_continue_node.cpp b/src/test/test_continue_node.cpp
index 86f757b..1e381df 100644
--- a/src/test/test_continue_node.cpp
+++ b/src/test/test_continue_node.cpp
@@ -26,108 +26,165 @@
     the GNU General Public License.
 */
 
-#include "harness.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "harness_graph.h"
 
-#define N 100
-#define T 10
+#include "tbb/task_scheduler_init.h"
+#include "tbb/spin_mutex.h"
 
-struct counting_receiver : public tbb::receiver<tbb::continue_msg> {
+tbb::spin_mutex global_mutex;
 
-    typedef tbb::continue_msg input_type;
-    typedef tbb::sender<tbb::continue_msg> predecessor_type;
+#define N 1000
+#define MAX_NODES 4
+#define C 8 
 
-    tbb::atomic< int > my_count;
+struct empty_no_assign : private NoAssign { 
+   empty_no_assign() {}
+   empty_no_assign( int ) {}
+   operator int() { return 0; }
+};
+
+template< typename InputType >
+struct parallel_puts : private NoAssign {
+
+    tbb::flow::receiver< InputType > * const my_exe_node;
 
-    counting_receiver() { my_count = 0; }    
+    parallel_puts( tbb::flow::receiver< InputType > &exe_node ) : my_exe_node(&exe_node) {}
 
-    bool try_put( input_type ) { 
-        ++my_count; 
-        return true;  
+    void operator()( int ) const  {
+        for ( int i = 0; i < N; ++i ) {
+            // the nodes will accept all puts
+            ASSERT( my_exe_node->try_put( InputType() ) == true, NULL );
+        }
     }
 
 };
 
-#if !__TBB_LAMBDAS_PRESENT
-class native_body : tbb::internal::no_assign {
-    tbb::continue_node &my_node;
+template< typename OutputType >
+void run_continue_nodes( int p, tbb::flow::graph& g, tbb::flow::continue_node< OutputType >& n ) {
+    for (size_t i = 0; i < N; ++i) {
+        n.register_predecessor( *reinterpret_cast< tbb::flow::sender< tbb::flow::continue_msg > * >(&n) );
+    }
+
+    for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) { 
+        harness_counting_receiver<OutputType> *receivers = new harness_counting_receiver<OutputType>[num_receivers];
+        harness_graph_executor<tbb::flow::continue_msg, OutputType>::execute_count = 0;
+
+        for (size_t r = 0; r < num_receivers; ++r ) {
+            tbb::flow::make_edge( n, receivers[r] );
+        }
+
+        NativeParallelFor( p, parallel_puts<tbb::flow::continue_msg>(n) );
+        g.wait_for_all(); 
+
+        // 2) the nodes will receive puts from multiple predecessors simultaneously,
+        size_t ec = harness_graph_executor<tbb::flow::continue_msg, OutputType>::execute_count;
+        ASSERT( (int)ec == p, NULL ); 
+        for (size_t r = 0; r < num_receivers; ++r ) {
+            size_t c = receivers[r].my_count;
+            // 3) the nodes will send to multiple successors.
+            ASSERT( (int)c == p, NULL );
+        }
+    }
+}
+
+template< typename OutputType, typename Body >
+void continue_nodes( Body body ) {
+    for (int p = 1; p < 2*MaxThread; ++p) {
+        tbb::flow::graph g;
+        tbb::flow::continue_node< OutputType > exe_node( g, body );
+        run_continue_nodes( p, g, exe_node);
+        tbb::flow::continue_node< OutputType > exe_node_copy( exe_node );
+        run_continue_nodes( p, g, exe_node_copy);
+    }
+}
+
+const size_t Offset = 123;
+tbb::atomic<size_t> global_execute_count;
+
+template< typename OutputType >
+struct inc_functor {
 
-public:
+    tbb::atomic<size_t> local_execute_count;
+    inc_functor( ) { local_execute_count = 0; }
+    inc_functor( const inc_functor &f ) { local_execute_count = f.local_execute_count; }
+
+    OutputType operator()( tbb::flow::continue_msg ) {
+       ++global_execute_count;
+       ++local_execute_count;
+       return OutputType(); 
+    }
 
-     native_body( tbb::continue_node &n ) : my_node(n) {}
-     void operator()( int ) const { 
-         my_node.try_put( tbb::continue_msg() ); 
-     } 
 };
-#endif
-
-// Tests
-//  
-// Test that the node fires after receiving N messages from multiple senders
-// Test that the node resets and can be reused
-// Test that a successor added after triggering is NOT immediately signalled
-// 
-int test_parallel_puts() {
-    tbb::graph g;
-    tbb::continue_node n(g);
-    counting_receiver r;
-    counting_receiver r2;
-
-    n.register_successor(r);
-
-    for (int i = 0; i < N; ++i) 
-        n.register_predecessor( n ); // this is a trick since the predecessor doesn't matter
-
-    for (int t = 0; t < T; ++t)
-#if __TBB_LAMBDAS_PRESENT
-        NativeParallelFor( N, [&](int) { n.try_put( tbb::continue_msg() ); } );
-#else
-        NativeParallelFor( N, native_body(n) );
-#endif
-
-    g.wait_for_all();
-    ASSERT( r.my_count == T, NULL ); 
-
-
-    n.register_successor(r2);
-    ASSERT( r2.my_count == 0, NULL );
-    return 0; 
+
+template< typename OutputType >
+void continue_nodes_with_copy( ) {
+
+    for (int p = 1; p < 2*MaxThread; ++p) {
+        tbb::flow::graph g;
+        inc_functor<OutputType> cf;
+        cf.local_execute_count = Offset;
+        global_execute_count = Offset;
+      
+        tbb::flow::continue_node< OutputType > exe_node( g, cf );
+        for (size_t i = 0; i < N; ++i) {
+           exe_node.register_predecessor( *reinterpret_cast< tbb::flow::sender< tbb::flow::continue_msg > * >(&exe_node) );
+        }
+
+        for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) { 
+            harness_counting_receiver<OutputType> *receivers = new harness_counting_receiver<OutputType>[num_receivers];
+
+            for (size_t r = 0; r < num_receivers; ++r ) {
+                tbb::flow::make_edge( exe_node, receivers[r] );
+            }
+
+            NativeParallelFor( p, parallel_puts<tbb::flow::continue_msg>(exe_node) );
+            g.wait_for_all(); 
+
+            // 2) the nodes will receive puts from multiple predecessors simultaneously,
+            for (size_t r = 0; r < num_receivers; ++r ) {
+                size_t c = receivers[r].my_count;
+                // 3) the nodes will send to multiple successors.
+                ASSERT( (int)c == p, NULL );
+            }
+        }
+
+        // validate that the local body matches the global execute_count and both are correct
+        inc_functor<OutputType> body_copy = tbb::flow::copy_body< inc_functor<OutputType> >( exe_node );
+        const size_t expected_count = p*MAX_NODES + Offset;
+        size_t global_count = global_execute_count;
+        size_t inc_count = body_copy.local_execute_count;
+        ASSERT( global_count == expected_count && global_count == inc_count, NULL ); 
+
+    }
 }
 
-//
-// Tests
-//  
-// Test that the node fires after receiving N messages from a single sender
-// Test that the node resets and can be reused
-// Test that a successor added after triggering is NOT immediately signalled
-// 
-int test_serial_puts() {
-    tbb::graph g;
-    tbb::continue_node n(g);
-    counting_receiver r;
-    counting_receiver r2;
-
-    n.register_successor(r);
-
-    for (int i = 0; i < N; ++i) 
-        n.register_predecessor( n ); // this is a trick since the predecessor doesn't matter
-
-    for (int t = 0; t < T; ++t)
-        for (int i = 0; i < N; ++i)
-            n.try_put( tbb::continue_msg() );
-
-    g.wait_for_all();
-    ASSERT( r.my_count == T, NULL ); 
-
-    n.register_successor(r2);
-    ASSERT( r2.my_count == 0, NULL );
-    return 0; 
+template< typename OutputType >
+void run_continue_nodes() {
+    harness_graph_executor< tbb::flow::continue_msg, OutputType>::max_executors = 0;
+    #if __TBB_LAMBDAS_PRESENT
+    continue_nodes<OutputType>( []( tbb::flow::continue_msg i ) -> OutputType { return harness_graph_executor<tbb::flow::continue_msg, OutputType>::func(i); } );
+    #endif
+    continue_nodes<OutputType>( &harness_graph_executor<tbb::flow::continue_msg, OutputType>::func );
+    continue_nodes<OutputType>( typename harness_graph_executor<tbb::flow::continue_msg, OutputType>::functor() );
+    continue_nodes_with_copy<OutputType>();
+}
+
+//! Tests limited concurrency cases for nodes that accept data messages
+void test_concurrency(int num_threads) {
+    tbb::task_scheduler_init init(num_threads);
+    run_continue_nodes<tbb::flow::continue_msg>();
+    run_continue_nodes<int>();
+    run_continue_nodes<empty_no_assign>();
 }
 
 int TestMain() { 
-   test_serial_puts();
-   test_parallel_puts();
+    if( MinThread<1 ) {
+        REPORT("number of threads must be positive\n");
+        exit(1);
+    }
+    for( int p=MinThread; p<=MaxThread; ++p ) {
+       test_concurrency(p);
+   }
    return Harness::Done;
 }
 
diff --git a/src/test/test_eh_algorithms.cpp b/src/test/test_eh_algorithms.cpp
index cd204dc..adc2ffa 100644
--- a/src/test/test_eh_algorithms.cpp
+++ b/src/test/test_eh_algorithms.cpp
@@ -89,10 +89,10 @@ intptr_t TestNumSubrangesCalculation ( intptr_t length, intptr_t grain, intptr_t
 class NoThrowParForBody {
 public:
     void operator()( const range_type& r ) const {
-        volatile long x;
+        volatile count_type x = 0;
         count_type end = r.end();
         for( count_type i=r.begin(); i<end; ++i )
-            x = 0;
+            x += i;
     }
 };
 
diff --git a/src/test/test_enumerable_thread_specific.cpp b/src/test/test_enumerable_thread_specific.cpp
index c0744fd..0d24e24 100644
--- a/src/test/test_enumerable_thread_specific.cpp
+++ b/src/test/test_enumerable_thread_specific.cpp
@@ -56,7 +56,7 @@
 #include "harness_assert.h"
 #include "harness.h"
 
-#if __TBB_GCC_WARNING_SUPPRESSION_ENABLED
+#if __TBB_GCC_WARNING_SUPPRESSION_PRESENT
 #pragma GCC diagnostic ignored "-Wuninitialized"
 #endif
 
@@ -888,6 +888,7 @@ flog_segmented_iterator_map() {
            REMARK( "ii=%d, (*my_csi).first=%d, second=%d\n",ii, int((*my_csi).first), int((*my_csi).second));
        }
    }
+   if(found_error) REPORT("segmented_iterator_map failed\n");
 }
 
 void
diff --git a/src/test/test_executable_node.cpp b/src/test/test_executable_node.cpp
deleted file mode 100644
index 74c968c..0000000
--- a/src/test/test_executable_node.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
-
-    This file is part of Threading Building Blocks.
-
-    Threading Building Blocks is free software; you can redistribute it
-    and/or modify it under the terms of the GNU General Public License
-    version 2 as published by the Free Software Foundation.
-
-    Threading Building Blocks is distributed in the hope that it will be
-    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Threading Building Blocks; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-    As a special exception, you may use this file as part of a free software
-    library without restriction.  Specifically, if other files instantiate
-    templates or use macros or inline functions from this file, or you compile
-    this file and link it with other files to produce an executable, this
-    file does not by itself cause the resulting executable to be covered by
-    the GNU General Public License.  This exception does not however
-    invalidate any other reasons why the executable file might be covered by
-    the GNU General Public License.
-*/
-
-#include "harness_graph.h"
-
-#include "tbb/task_scheduler_init.h"
-#include "tbb/spin_mutex.h"
-
-tbb::spin_mutex global_mutex;
-
-#define N 1000
-#define MAX_NODES 4
-#define C 8 
-
-struct empty_no_assign : private NoAssign { 
-   empty_no_assign() {}
-   empty_no_assign( int ) {}
-   operator int() { return 0; }
-};
-
-template< typename InputType >
-struct parallel_puts : private NoAssign {
-
-    tbb::receiver< InputType > * const my_exe_node;
-
-    parallel_puts( tbb::receiver< InputType > &exe_node ) : my_exe_node(&exe_node) {}
-
-    void operator()( int ) const  {
-        for ( int i = 0; i < N; ++i ) {
-            // the nodes will accept all puts
-            ASSERT( my_exe_node->try_put( InputType() ) == true, NULL );
-        }
-    }
-
-};
-
-template< typename OutputType, typename Body >
-void continue_nodes( Body body ) {
-
-    for (int p = 1; p < 2*MaxThread; ++p) {
-        tbb::graph g;
-        tbb::executable_node< OutputType > exe_node( g, body );
-        for (size_t i = 0; i < N; ++i) {
-           exe_node.register_predecessor( *reinterpret_cast< tbb::sender< tbb::continue_msg > * >(&exe_node) );
-        }
-
-        for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) { 
-            harness_counting_receiver<OutputType> *receivers = new harness_counting_receiver<OutputType>[num_receivers];
-            harness_graph_executor<tbb::continue_msg, OutputType>::execute_count = 0;
-
-            for (size_t r = 0; r < num_receivers; ++r ) {
-                ASSERT( exe_node.register_successor( receivers[r] ), NULL );
-            }
-
-            NativeParallelFor( p, parallel_puts<tbb::continue_msg>(exe_node) );
-            g.wait_for_all(); 
-
-            // 2) the nodes will receive puts from multiple predecessors simultaneously,
-            size_t ec = harness_graph_executor<tbb::continue_msg, OutputType>::execute_count;
-            ASSERT( (int)ec == p, NULL ); 
-            for (size_t r = 0; r < num_receivers; ++r ) {
-                size_t c = receivers[r].my_count;
-                // 3) the nodes will send to multiple successors.
-                ASSERT( (int)c == p, NULL );
-            }
-        }
-    }
-}
-
-template< typename OutputType >
-void run_continue_nodes() {
-    harness_graph_executor< tbb::continue_msg, OutputType>::max_executors = 0;
-    #if __TBB_LAMBDAS_PRESENT
-    continue_nodes<OutputType>( []( tbb::continue_msg i ) -> OutputType { return harness_graph_executor<tbb::continue_msg, OutputType>::func(i); } );
-    #endif
-    continue_nodes<OutputType>( &harness_graph_executor<tbb::continue_msg, OutputType>::func );
-    continue_nodes<OutputType>( typename harness_graph_executor<tbb::continue_msg, OutputType>::functor() );
-}
-
-//! Tests limited concurrency cases for nodes that accept data messages
-void test_concurrency(int num_threads) {
-    tbb::task_scheduler_init init(num_threads);
-    run_continue_nodes<tbb::continue_msg>();
-    run_continue_nodes<int>();
-    run_continue_nodes<empty_no_assign>();
-}
-
-int TestMain() { 
-    if( MinThread<1 ) {
-        REPORT("number of threads must be positive\n");
-        exit(1);
-    }
-    for( int p=MinThread; p<=MaxThread; ++p ) {
-       test_concurrency(p);
-   }
-   return Harness::Done;
-}
-
diff --git a/src/test/test_faf_task.cpp b/src/test/test_faf_task.cpp
deleted file mode 100644
index ca2e702..0000000
--- a/src/test/test_faf_task.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
-    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
-
-    This file is part of Threading Building Blocks.
-
-    Threading Building Blocks is free software; you can redistribute it
-    and/or modify it under the terms of the GNU General Public License
-    version 2 as published by the Free Software Foundation.
-
-    Threading Building Blocks is distributed in the hope that it will be
-    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Threading Building Blocks; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-    As a special exception, you may use this file as part of a free software
-    library without restriction.  Specifically, if other files instantiate
-    templates or use macros or inline functions from this file, or you compile
-    this file and link it with other files to produce an executable, this
-    file does not by itself cause the resulting executable to be covered by
-    the GNU General Public License.  This exception does not however
-    invalidate any other reasons why the executable file might be covered by
-    the GNU General Public License.
-*/
-
-#include "harness.h"
-#include "tbb/task.h"
-#include "tbb/task_scheduler_init.h"
-
-const int NumRepeats = 200;
-const int MaxNumThreads = 16;
-static volatile bool Finished[MaxNumThreads] = {};
-
-static volatile bool CanStart;
-
-//! Custom user task interface
-class ITask {
-public: 
-	virtual ~ITask() {} 
-	virtual void Execute() = 0;
-	virtual void Release() { delete this; }
-};
-
-class TestTask : public ITask {
-	volatile bool *m_pDone;
-public:
-    TestTask ( volatile bool *pDone ) : m_pDone(pDone) {}
-
-	/* override */ void Execute() {
-		*m_pDone = true;
-	}
-};
-
-class CarrierTask : public tbb::task {
-	ITask* m_pTask;
-public:
-    CarrierTask(ITask* pTask) : m_pTask(pTask) {}
-
-	/*override*/ task* execute() {
-		m_pTask->Execute();
-		m_pTask->Release();
-		return NULL;
-	}
-};
-
-class SpawnerTask : public ITask {
-	ITask* m_taskToSpawn;
-public:
-	SpawnerTask(ITask* job) : m_taskToSpawn(job) {}
-
-	void Execute() {
-		while ( !CanStart )
-		    __TBB_Yield();
-		tbb::task::enqueue( *new( tbb::task::allocate_root() ) CarrierTask(m_taskToSpawn) );
-	}
-};
-
-class EnqueuerBody {
-public:
-    void operator() ( int id ) const {
-	    tbb::task_scheduler_init init(tbb::task_scheduler_init::default_num_threads() + 1);
-
-	    SpawnerTask* pTask = new SpawnerTask( new TestTask(Finished + id) );
-	    tbb::task::enqueue( *new( tbb::task::allocate_root() ) CarrierTask(pTask) );
-    }
-};
-
-//! Regression test for a bug that caused premature arena destruction
-void TestCascadedEnqueue () {
-	tbb::task_scheduler_init init(tbb::task_scheduler_init::default_num_threads() + 1);
-
-    int minNumThreads = min(tbb::task_scheduler_init::default_num_threads(), MaxNumThreads) / 2;
-	int maxNumThreads = min(tbb::task_scheduler_init::default_num_threads() * 2, MaxNumThreads);
-
-	for ( int numThreads = minNumThreads; numThreads <= maxNumThreads; ++numThreads ) {
-		for ( int i = 0; i < NumRepeats; ++i ) {
-			CanStart = false;
-            __TBB_Yield();
-			NativeParallelFor( numThreads, EnqueuerBody() );
-			CanStart = true;
-            int j = 0;
-			while ( j < numThreads ) {
-                if ( Finished[j] )
-                    ++j;
-                else
-    				__TBB_Yield();
-			}
-            for ( j = 0; j < numThreads; ++j )
-                Finished[j] = false;
-            REMARK("%02d threads; Iteration %03d\r", numThreads, i);
-		}
-	}
-    REMARK( "                                 \r" );
-}
-
-class DummyTask : public tbb::task {
-public:
-    task *execute() {
-        Harness::Sleep(1);
-        return NULL;
-    }
-};
-
-class SharedRootBody {
-    tbb::task *my_root;
-public:
-	SharedRootBody ( tbb::task *root ) : my_root(root) {}
-
-	void operator() ( int ) const {
-	    tbb::task::enqueue( *new( tbb::task::allocate_additional_child_of(*my_root) ) DummyTask );
-	}
-};
-
-//! Test for enqueuing children of the same root from different master threads
-void TestSharedRoot () { 
-    for ( int p = MinThread; p <= MaxThread; ++p ) {
-        tbb::task_scheduler_init init(p);
-    	tbb::task *root =  new ( tbb::task::allocate_root() ) tbb::empty_task; 
-    	root->set_ref_count(1);
-        for( int n = MinThread; n <= MaxThread; ++n )
-            NativeParallelFor( n, SharedRootBody(root) );
-    	root->wait_for_all();
-        tbb::task::destroy(*root);
-    } 
-}
-
-
-int TestMain () {
-    TestCascadedEnqueue();
-    TestSharedRoot();
-    return Harness::Done;
-}
diff --git a/src/test/test_fast_random.cpp b/src/test/test_fast_random.cpp
index ba620c5..6d53c7f 100644
--- a/src/test/test_fast_random.cpp
+++ b/src/test/test_fast_random.cpp
@@ -33,6 +33,21 @@
     by no more than AcceptableDeviation percent.
 **/
 
+#if HARNESS_USE_PROXY
+
+// The test includes injects scheduler directly, so skip it when proxy tested.
+
+#undef HARNESS_USE_PROXY
+#include "harness.h"
+#undef __TBB_DYNAMIC_LOAD_ENABLED
+#include "harness_tbb_independence.h"
+
+int TestMain () {
+    return Harness::Skipped;
+}
+
+#else // HARNESS_USE_PROXY
+
 #include "harness_inject_scheduler.h"
 
 #define HARNESS_DEFAULT_MIN_THREADS 2
@@ -132,6 +147,42 @@ struct CheckDistributionBody {
     }
 };
 
+struct rng {
+    tbb::internal::FastRandom my_fast_random;
+    rng (unsigned seed):my_fast_random(seed) {}
+    unsigned short operator()(){return my_fast_random.get();}
+};
+
+#include <algorithm>
+
+template <std::size_t seriesLen >
+struct SingleCheck{
+    bool operator()(unsigned seed)const{
+        std::size_t series1[seriesLen]={0};
+        std::size_t series2[seriesLen]={0};
+        std::generate(series1,series1+seriesLen,rng(seed));
+        std::generate(series2,series2+seriesLen,rng(seed));
+        return std::equal(series1,series1+seriesLen,series2);
+    }
+};
+
+template <std::size_t seriesLen ,size_t seedsNum>
+struct CheckReproducibilityBody:NoAssign{
+    unsigned short seeds[seedsNum];
+    const std::size_t grainSize;
+    CheckReproducibilityBody(std::size_t GrainSize): grainSize(GrainSize){
+       //first generate seeds to check on, and make sure that sequence is reproducible
+       ASSERT(SingleCheck<seedsNum>()(0),"Series generated by FastRandom must be reproducible");
+       std::generate(seeds,seeds+seedsNum,rng(0));
+    }
+
+    void operator()(int id)const{
+       for (size_t i=id*grainSize; (i<seedsNum)&&(i< ((id+1)*grainSize));++i ){
+           ASSERT(SingleCheck<seriesLen>()(i),"Series generated by FastRandom must be reproducible");
+       }
+    }
+
+};
 #include "tbb/tbb_thread.h"
 
 int TestMain () {
@@ -146,8 +197,13 @@ int TestMain () {
     // Ideally tbb::parallel_for could be used to parallelize the outermost loop 
     // in CheckDistributionBody, but it is not used to avoid unit test contamination.
     int P = tbb::tbb_thread::hardware_concurrency();
+    enum {reproducibilitySeedsToTest=1000};
+    enum {reproducibilitySeriesLen=100};
+    CheckReproducibilityBody<reproducibilitySeriesLen,reproducibilitySeedsToTest>  CheckReproducibility(reproducibilitySeedsToTest/MaxThread);
     while ( MinThread <= MaxThread ) {
-        NativeParallelFor( min(P, MaxThread - MinThread + 1), CheckDistributionBody() );
+        int ThreadsToRun = min(P, MaxThread - MinThread + 1);
+        NativeParallelFor( ThreadsToRun, CheckDistributionBody() );
+        NativeParallelFor(ThreadsToRun, CheckReproducibility);
         MinThread += P;
     }
     double observedProbabilityOfOutliers = (NumLowOutliers + NumHighOutliers) / NumChecks;
@@ -160,3 +216,4 @@ int TestMain () {
     }
     return Harness::Done;
 }
+#endif // HARNESS_USE_PROXY
diff --git a/src/test/test_flow_graph.cpp b/src/test/test_flow_graph.cpp
new file mode 100644
index 0000000..882b5db
--- /dev/null
+++ b/src/test/test_flow_graph.cpp
@@ -0,0 +1,141 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#include "harness_graph.h"
+#include "tbb/task_scheduler_init.h"
+
+const int T = 4;
+const int W = 4;
+
+struct decrement_wait : NoAssign {
+
+    tbb::flow::graph * const my_graph;
+    bool * const my_done_flag;
+
+    decrement_wait( tbb::flow::graph &h, bool *done_flag ) : my_graph(&h), my_done_flag(done_flag) {}
+
+    void operator()(int i) const {
+        Harness::Sleep(10*i);
+        my_done_flag[i] = true;
+        my_graph->decrement_wait_count();
+    }
+};
+
+static void test_wait_count() {
+   tbb::flow::graph h;
+   for (int i = 0; i < T; ++i ) {
+       bool done_flag[W];
+       for (int j = 0; j < W; ++j ) {
+           for ( int w = 0; w < W; ++w ) done_flag[w] = false;
+           for ( int w = 0; w < j; ++w ) h.increment_wait_count();
+
+           NativeParallelFor( j, decrement_wait(h, done_flag) );
+           h.wait_for_all();
+           for ( int w = 0; w < W; ++w ) {
+              if ( w < j ) ASSERT( done_flag[w] == true, NULL );
+              else ASSERT( done_flag[w] == false, NULL );
+           }
+       }
+   }
+}
+
+const int F = 100;
+
+#if __TBB_LAMBDAS_PRESENT
+bool lambda_flag[F];
+#endif
+bool functor_flag[F];
+
+struct set_functor {
+    int my_i;
+    set_functor( int i ) : my_i(i) {} 
+    void operator()() { functor_flag[my_i] = true; }
+};
+
+struct return_functor {
+    int my_i;
+    return_functor( int i ) : my_i(i) {} 
+    int operator()() { return my_i; }
+};
+
+static void test_run() {
+    tbb::flow::graph h;
+    for (int i = 0; i < T; ++i ) {
+
+        // Create receivers and flag arrays
+        #if __TBB_LAMBDAS_PRESENT
+        harness_mapped_receiver<int> lambda_r;
+        lambda_r.initialize_map( F, 1 );
+        #endif
+        harness_mapped_receiver<int> functor_r;
+        functor_r.initialize_map( F, 1 );
+
+        // Initialize flag arrays
+        for (int j = 0; j < F; ++j ) {
+            #if __TBB_LAMBDAS_PRESENT
+            lambda_flag[j] = false;
+            #endif
+            functor_flag[j] = false;
+        }
+
+        for ( int j = 0; j < F; ++j ) {
+            #if __TBB_LAMBDAS_PRESENT
+                h.run( [=]() { lambda_flag[j] = true; } );  
+                h.run( lambda_r, [=]() { return j; } );  
+            #endif
+            h.run( set_functor(j) );
+            h.run( functor_r, return_functor(j) );
+        } 
+        h.wait_for_all();
+        for ( int j = 0; j < F; ++j ) {
+        #if __TBB_LAMBDAS_PRESENT
+            ASSERT( lambda_flag[i] == true, NULL );
+        #endif
+            ASSERT( functor_flag[i] == true, NULL );
+        }
+        #if __TBB_LAMBDAS_PRESENT
+        lambda_r.validate();
+        #endif
+        functor_r.validate();
+    }
+}
+
+int TestMain() { 
+    current_executors = 0;
+    if( MinThread<1 ) {
+        REPORT("number of threads must be positive\n");
+        exit(1);
+    }
+    for( int p=MinThread; p<=MaxThread; ++p ) {
+       tbb::task_scheduler_init init(p);
+       test_wait_count();
+       test_run();
+   }
+   return Harness::Done;
+}
+
diff --git a/src/test/test_function_node.cpp b/src/test/test_function_node.cpp
index eba9782..aa9483a 100644
--- a/src/test/test_function_node.cpp
+++ b/src/test/test_function_node.cpp
@@ -33,9 +33,197 @@
 
 tbb::spin_mutex global_mutex;
 
-#define N 1000
+#define N 100
 #define MAX_NODES 4
-#define C 8 
+
+//! Performs test on function nodes with limited concurrency and buffering
+/** Theses tests check:
+    1) that the number of executing copies never exceed the concurreny limit
+    2) that the node never rejects
+    3) that no items are lost
+    and 4) all of this happens even if there are multiple predecessors and successors
+*/
+
+template< typename InputType >
+struct parallel_put_until_limit : private NoAssign {
+
+    harness_counting_sender<InputType> *my_senders;
+
+    parallel_put_until_limit( harness_counting_sender<InputType> *senders ) : my_senders(senders) {}
+
+    void operator()( int i ) const  {
+        if ( my_senders ) {
+            my_senders[i].try_put_until_limit();
+        }
+    }
+
+};
+     
+template< typename InputType, typename OutputType, typename Body >
+void buffered_levels( size_t concurrency, Body body ) {
+
+   // Do for lc = 1 to concurrency level
+   for ( size_t lc = 1; lc <= concurrency; ++lc ) { 
+   tbb::flow::graph g;
+
+   // Set the execute_counter back to zero in the harness
+   harness_graph_executor<InputType, OutputType>::execute_count = 0;
+   // Set the max allowed executors to lc.  There is a check in the functor to make sure this is never exceeded.
+   harness_graph_executor<InputType, OutputType>::max_executors = lc;
+
+   // Create the function_node with the appropriate concurreny level, and use default buffering
+   tbb::flow::function_node< InputType, OutputType > exe_node( g, lc, body );
+   
+   //Create a vector of identical exe_nodes
+   std::vector< tbb::flow::function_node< InputType, OutputType > > exe_vec(2, exe_node);
+
+   for (size_t node_idx=0; node_idx<exe_vec.size(); ++node_idx) {
+   // For num_receivers = 1 to MAX_NODES
+   for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
+        // Create num_receivers counting receivers and connect the exe_vec[node_idx] to them.
+        harness_mapped_receiver<OutputType> *receivers = new harness_mapped_receiver<OutputType>[num_receivers];
+        for (size_t r = 0; r < num_receivers; ++r ) {
+            tbb::flow::make_edge( exe_vec[node_idx], receivers[r] );
+        }
+
+        // Do the test with varying numbers of senders
+        harness_counting_sender<InputType> *senders = NULL;
+        for (size_t num_senders = 1; num_senders <= MAX_NODES; ++num_senders ) {
+            // Create num_senders senders, set there message limit each to N, and connect them to the exe_vec[node_idx]
+            senders = new harness_counting_sender<InputType>[num_senders];
+            for (size_t s = 0; s < num_senders; ++s ) {
+               senders[s].my_limit = N;
+               tbb::flow::make_edge( senders[s], exe_vec[node_idx] );
+            }
+
+            // Initialize the receivers so they know how many senders and messages to check for
+            for (size_t r = 0; r < num_receivers; ++r ) {
+                 receivers[r].initialize_map( N, num_senders ); 
+            }
+
+            // Do the test
+            NativeParallelFor( (int)num_senders, parallel_put_until_limit<InputType>(senders) );
+            g.wait_for_all();
+
+            // cofirm that each sender was requested from N times 
+            for (size_t s = 0; s < num_senders; ++s ) {
+                size_t n = senders[s].my_received;
+                ASSERT( n == N, NULL ); 
+                ASSERT( senders[s].my_receiver == &exe_vec[node_idx], NULL );
+            }
+            // validate the receivers
+            for (size_t r = 0; r < num_receivers; ++r ) {
+                receivers[r].validate();
+            }
+            delete [] senders;
+        }
+        for (size_t r = 0; r < num_receivers; ++r ) {
+            tbb::flow::remove_edge( exe_vec[node_idx], receivers[r] );
+        }
+        ASSERT( exe_vec[node_idx].try_put( InputType() ) == true, NULL );
+        g.wait_for_all();
+        for (size_t r = 0; r < num_receivers; ++r ) {
+            // since it's detached, nothing should have changed
+            receivers[r].validate();
+        }
+        delete [] receivers;
+    }
+    } 
+    }
+}
+
+const size_t Offset = 123;
+tbb::atomic<size_t> global_execute_count;
+
+struct inc_functor {
+
+    tbb::atomic<size_t> local_execute_count;
+    inc_functor( ) { local_execute_count = 0; }
+    inc_functor( const inc_functor &f ) { local_execute_count = f.local_execute_count; }
+
+    int operator()( int i ) {
+       ++global_execute_count;
+       ++local_execute_count;
+       return i; 
+    }
+
+};
+
+template< typename InputType, typename OutputType >
+void buffered_levels_with_copy( size_t concurrency ) {
+
+    // Do for lc = 1 to concurrency level
+    for ( size_t lc = 1; lc <= concurrency; ++lc ) { 
+        tbb::flow::graph g;
+
+        inc_functor cf;
+        cf.local_execute_count = Offset;
+        global_execute_count = Offset;
+       
+        tbb::flow::function_node< InputType, OutputType > exe_node( g, lc, cf );
+
+        for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
+           harness_mapped_receiver<OutputType> *receivers = new harness_mapped_receiver<OutputType>[num_receivers];
+           for (size_t r = 0; r < num_receivers; ++r ) {
+               tbb::flow::make_edge( exe_node, receivers[r] );
+            }
+
+            harness_counting_sender<InputType> *senders = NULL;
+            for (size_t num_senders = 1; num_senders <= MAX_NODES; ++num_senders ) {
+                senders = new harness_counting_sender<InputType>[num_senders];
+                for (size_t s = 0; s < num_senders; ++s ) {
+                    senders[s].my_limit = N;
+                    tbb::flow::make_edge( senders[s], exe_node );
+                }
+
+                for (size_t r = 0; r < num_receivers; ++r ) {
+                    receivers[r].initialize_map( N, num_senders ); 
+                }
+
+                NativeParallelFor( (int)num_senders, parallel_put_until_limit<InputType>(senders) );
+                g.wait_for_all();
+
+                for (size_t s = 0; s < num_senders; ++s ) {
+                    size_t n = senders[s].my_received;
+                    ASSERT( n == N, NULL ); 
+                    ASSERT( senders[s].my_receiver == &exe_node, NULL );
+                }
+                for (size_t r = 0; r < num_receivers; ++r ) {
+                    receivers[r].validate();
+                }
+                delete [] senders;
+            }
+            for (size_t r = 0; r < num_receivers; ++r ) {
+                tbb::flow::remove_edge( exe_node, receivers[r] );
+            }
+            ASSERT( exe_node.try_put( InputType() ) == true, NULL );
+            g.wait_for_all();
+            for (size_t r = 0; r < num_receivers; ++r ) {
+                receivers[r].validate();
+            }
+            delete [] receivers;
+        }
+
+        // validate that the local body matches the global execute_count and both are correct
+        inc_functor body_copy = tbb::flow::copy_body<inc_functor>( exe_node );
+        const size_t expected_count = N/2 * MAX_NODES * MAX_NODES * ( MAX_NODES + 1 ) + MAX_NODES + Offset; 
+        size_t global_count = global_execute_count;
+        size_t inc_count = body_copy.local_execute_count;
+        ASSERT( global_count == expected_count && global_count == inc_count, NULL ); 
+    }
+}
+
+template< typename InputType, typename OutputType >
+void run_buffered_levels( int c ) {
+    harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::max_executors = c;
+    #if __TBB_LAMBDAS_PRESENT
+    buffered_levels<InputType,OutputType>( c, []( InputType i ) -> OutputType { return harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::func(i); } );
+    #endif
+    buffered_levels<InputType,OutputType>( c, &harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::func );
+    buffered_levels<InputType,OutputType>( c, typename harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::functor() );
+    buffered_levels_with_copy<InputType,OutputType>( c );
+}
+
 
 //! Performs test on executable nodes with limited concurrency
 /** Theses tests check:
@@ -50,17 +238,17 @@ template< typename InputType, typename OutputType, typename Body >
 void concurrency_levels( size_t concurrency, Body body ) {
 
    for ( size_t lc = 1; lc <= concurrency; ++lc ) { 
-   tbb::graph g;
+   tbb::flow::graph g;
    harness_graph_executor<InputType, OutputType, tbb::spin_mutex>::execute_count = 0;
 
-   tbb::function_node< InputType, OutputType > exe_node( g, lc, body );
+   tbb::flow::function_node< InputType, OutputType, tbb::flow::rejecting > exe_node( g, lc, body );
 
    for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
 
         harness_counting_receiver<OutputType> *receivers = new harness_counting_receiver<OutputType>[num_receivers];
 
         for (size_t r = 0; r < num_receivers; ++r ) {
-            ASSERT( exe_node.register_successor( receivers[r] ), NULL );
+            tbb::flow::make_edge( exe_node, receivers[r] );
         }
 
         harness_counting_sender<InputType> *senders = NULL;
@@ -103,7 +291,7 @@ void concurrency_levels( size_t concurrency, Body body ) {
             delete [] senders;
         }
         for (size_t r = 0; r < num_receivers; ++r ) {
-            ASSERT( exe_node.remove_successor( receivers[r] ) == true, NULL );
+            tbb::flow::remove_edge( exe_node, receivers[r] );
         }
         ASSERT( exe_node.try_put( InputType() ) == true, NULL );
         g.wait_for_all();
@@ -127,7 +315,7 @@ void run_concurrency_levels( int c ) {
 }
 
 
-struct empty_no_assign : private NoAssign { 
+struct empty_no_assign { 
    empty_no_assign() {}
    empty_no_assign( int ) {}
    operator int() { return 0; }
@@ -136,9 +324,9 @@ struct empty_no_assign : private NoAssign {
 template< typename InputType >
 struct parallel_puts : private NoAssign {
 
-    tbb::receiver< InputType > * const my_exe_node;
+    tbb::flow::receiver< InputType > * const my_exe_node;
 
-    parallel_puts( tbb::receiver< InputType > &exe_node ) : my_exe_node(&exe_node) {}
+    parallel_puts( tbb::flow::receiver< InputType > &exe_node ) : my_exe_node(&exe_node) {}
 
     void operator()( int ) const  {
         for ( int i = 0; i < N; ++i ) {
@@ -161,8 +349,8 @@ template< typename InputType, typename OutputType, typename Body >
 void unlimited_concurrency( Body body ) {
 
     for (int p = 1; p < 2*MaxThread; ++p) {
-        tbb::graph g;
-        tbb::function_node< InputType, OutputType > exe_node( g, tbb::graph::unlimited, body );
+        tbb::flow::graph g;
+        tbb::flow::function_node< InputType, OutputType, tbb::flow::rejecting > exe_node( g, tbb::flow::unlimited, body );
 
         for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
 
@@ -170,7 +358,7 @@ void unlimited_concurrency( Body body ) {
             harness_graph_executor<InputType, OutputType>::execute_count = 0;
 
             for (size_t r = 0; r < num_receivers; ++r ) {
-                ASSERT( exe_node.register_successor( receivers[r] ), NULL );
+                tbb::flow::make_edge( exe_node, receivers[r] );
             }
 
             NativeParallelFor( p, parallel_puts<InputType>(exe_node) );
@@ -198,17 +386,41 @@ void run_unlimited_concurrency() {
     unlimited_concurrency<InputType,OutputType>( typename harness_graph_executor<InputType, OutputType>::functor() );
 }
 
+struct continue_msg_to_int : private NoAssign {
+    int my_int;
+    continue_msg_to_int(int x) : my_int(x) {}
+    int operator()(tbb::flow::continue_msg) { return my_int; }
+};
+
+void test_function_node_with_continue_msg_as_input() {
+    // If this function terminates, then this test is successful
+    tbb::flow::graph g;
+
+    tbb::flow::broadcast_node<tbb::flow::continue_msg> Start;
+
+    tbb::flow::function_node<tbb::flow::continue_msg, int, tbb::flow::rejecting> FN1( g, tbb::flow::serial, continue_msg_to_int(42));
+    tbb::flow::function_node<tbb::flow::continue_msg, int, tbb::flow::rejecting> FN2( g, tbb::flow::serial, continue_msg_to_int(43));
+    
+    tbb::flow::make_edge( Start, FN1 );
+    tbb::flow::make_edge( Start, FN2 );
+    
+    Start.try_put( tbb::flow::continue_msg() );
+    g.wait_for_all();
+}
+
 //! Tests limited concurrency cases for nodes that accept data messages
 void test_concurrency(int num_threads) {
     tbb::task_scheduler_init init(num_threads);
     run_concurrency_levels<int,int>(num_threads);
-    run_concurrency_levels<int,tbb::continue_msg>(num_threads);
+    run_concurrency_levels<int,tbb::flow::continue_msg>(num_threads);
+    run_buffered_levels<int, int>(num_threads);
     run_unlimited_concurrency<int,int>();
     run_unlimited_concurrency<int,empty_no_assign>();
     run_unlimited_concurrency<empty_no_assign,int>();
     run_unlimited_concurrency<empty_no_assign,empty_no_assign>();
-    run_unlimited_concurrency<int,tbb::continue_msg>();
-    run_unlimited_concurrency<empty_no_assign,tbb::continue_msg>();
+    run_unlimited_concurrency<int,tbb::flow::continue_msg>();
+    run_unlimited_concurrency<empty_no_assign,tbb::flow::continue_msg>();
+    test_function_node_with_continue_msg_as_input();
 }
 
 int TestMain() { 
diff --git a/src/test/test_intrusive_list.cpp b/src/test/test_intrusive_list.cpp
index a1fe490..cc3c8b9 100644
--- a/src/test/test_intrusive_list.cpp
+++ b/src/test/test_intrusive_list.cpp
@@ -31,8 +31,6 @@
 
 #include "../tbb/intrusive_list.h"
 
-#if __TBB_ARENA_PER_MASTER
-
 using tbb::internal::intrusive_list_node;
 
 // Machine word filled with repeated pattern of FC bits
@@ -139,10 +137,8 @@ void TestListAssertions () {
     tbb::set_assertion_handler( NULL );
 #endif /* TRY_BAD_EXPR_ENABLED */
 }
-#endif /* __TBB_ARENA_PER_MASTER */
 
 int TestMain () {
-#if __TBB_ARENA_PER_MASTER
     TestListOperations<IntrusiveList1, DataItemWithInheritedNode>();
     TestListOperations<IntrusiveList2, DataItemWithMemberNodes>();
     TestListOperations<IntrusiveList3, DataItemWithMemberNodes>();
@@ -150,7 +146,4 @@ int TestMain () {
     TestListAssertions<IntrusiveList2, DataItemWithMemberNodes>();
     TestListAssertions<IntrusiveList3, DataItemWithMemberNodes>();
     return Harness::Done;
-#else
-    return Harness::Skipped;
-#endif /* __TBB_ARENA_PER_MASTER */
 }
diff --git a/src/test/test_join_node.cpp b/src/test/test_join_node.cpp
index 35199c8..5255a6c 100644
--- a/src/test/test_join_node.cpp
+++ b/src/test/test_join_node.cpp
@@ -27,22 +27,22 @@
 */
 
 #include "harness.h"
+#include "tbb/flow_graph.h"
+#include "tbb/task_scheduler_init.h"
 
 #if !__SUNPRO_CC
 
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
-#include "tbb/task_scheduler_init.h"
-
 //
 // Tests
 //
 
-const int Count = 300;
+const int Count = 150;
 const int MaxPorts = 10;
 const int MaxNSources = 5; // max # of source_nodes to register for each join_node input in parallel test
 bool outputCheck[MaxPorts][Count];  // for checking output
 
+using tbb::flow::NO_TAG;
+
 void
 check_outputCheck( int nUsed, int maxCnt) {
     for(int i=0; i < nUsed; ++i) {
@@ -92,8 +92,8 @@ public:
     static const char* name() { return  "short"; }
 };
 
-// T must be arithmetic, and shouldn't wrap around for reasonable sizes of Count (which is now 1000, and maxPorts is 10,
-// so the max number generated right now is 11000.)  Source will generate a series of TT with value
+// T must be arithmetic, and shouldn't wrap around for reasonable sizes of Count (which is now 150, and maxPorts is 10,
+// so the max number generated right now is 1500 or so.)  Source will generate a series of TT with value
 // (init_val + (i-1)*addend) * my_mult, where i is the i-th invocation of the body.  We are attaching addend
 // source nodes to a join_port, and each will generate part of the numerical series the port is expecting
 // to receive.  If there is only one source node, the series order will be maintained; if more than one,
@@ -114,6 +114,249 @@ public:
     }
 };
 
+template<typename TT>
+class tag_func {
+    const TT my_mult;
+    tag_func& operator=( const tag_func& other);
+public:
+    tag_func(TT multiplier) : my_mult(multiplier) { }
+    // operator() will return [0 .. Count) 
+    tbb::flow::tag_value operator()( TT v) {
+        tbb::flow::tag_value t = tbb::flow::tag_value(v / my_mult);
+        return t;
+    }
+};
+
+// allocator for join_node.  This is specialized for tag_matching joins because they  require a variable number
+// of tag_value methods passed to the constructor
+
+template<int N, typename JType, tbb::flow::graph_buffer_policy JP>
+class makeJoin {
+public:
+    static JType *create(tbb::flow::graph& g) {
+        JType *temp = new JType(g);
+        return temp;
+    }
+    static void destroy(JType *p) { delete p; }
+};
+
+
+template<typename JType>
+class makeJoin<2,JType,tbb::flow::tag_matching> {
+    typedef typename JType::output_type TType;
+    typedef typename std::tuple_element<0, TType>::type T0;
+    typedef typename std::tuple_element<1, TType>::type T1;
+public:
+    static JType *create(tbb::flow::graph& g) {
+        JType *temp = new JType(g, 
+            tag_func<T0>(T0(2)),
+            tag_func<T1>(T1(3))
+            );
+        return temp;
+    }
+    static void destroy(JType *p) { delete p; }
+};
+
+template<typename JType>
+class makeJoin<3,JType,tbb::flow::tag_matching> {
+    typedef typename JType::output_type TType;
+    typedef typename std::tuple_element<0, TType>::type T0;
+    typedef typename std::tuple_element<1, TType>::type T1;
+    typedef typename std::tuple_element<2, TType>::type T2;
+public:
+    static JType *create(tbb::flow::graph& g) {
+        JType *temp = new JType(g, 
+            tag_func<T0>(T0(2)),
+            tag_func<T1>(T1(3)),
+            tag_func<T2>(T2(4))
+            );
+        return temp;
+    }
+    static void destroy(JType *p) { delete p; }
+};
+
+template<typename JType>
+class makeJoin<4,JType,tbb::flow::tag_matching> {
+    typedef typename JType::output_type TType;
+    typedef typename std::tuple_element<0, TType>::type T0;
+    typedef typename std::tuple_element<1, TType>::type T1;
+    typedef typename std::tuple_element<2, TType>::type T2;
+    typedef typename std::tuple_element<3, TType>::type T3;
+public:
+    static JType *create(tbb::flow::graph& g) {
+        JType *temp = new JType(g, 
+            tag_func<T0>(T0(2)),
+            tag_func<T1>(T1(3)),
+            tag_func<T2>(T2(4)),
+            tag_func<T3>(T3(5))
+            );
+        return temp;
+    }
+    static void destroy(JType *p) { delete p; }
+};
+
+template<typename JType>
+class makeJoin<5,JType,tbb::flow::tag_matching> {
+    typedef typename JType::output_type TType;
+    typedef typename std::tuple_element<0, TType>::type T0;
+    typedef typename std::tuple_element<1, TType>::type T1;
+    typedef typename std::tuple_element<2, TType>::type T2;
+    typedef typename std::tuple_element<3, TType>::type T3;
+    typedef typename std::tuple_element<4, TType>::type T4;
+public:
+    static JType *create(tbb::flow::graph& g) {
+        JType *temp = new JType(g, 
+            tag_func<T0>(T0(2)),
+            tag_func<T1>(T1(3)),
+            tag_func<T2>(T2(4)),
+            tag_func<T3>(T3(5)),
+            tag_func<T4>(T4(6))
+            );
+        return temp;
+    }
+    static void destroy(JType *p) { delete p; }
+};
+
+template<typename JType>
+class makeJoin<6,JType,tbb::flow::tag_matching> {
+    typedef typename JType::output_type TType;
+    typedef typename std::tuple_element<0, TType>::type T0;
+    typedef typename std::tuple_element<1, TType>::type T1;
+    typedef typename std::tuple_element<2, TType>::type T2;
+    typedef typename std::tuple_element<3, TType>::type T3;
+    typedef typename std::tuple_element<4, TType>::type T4;
+    typedef typename std::tuple_element<5, TType>::type T5;
+public:
+    static JType *create(tbb::flow::graph& g) {
+        JType *temp = new JType(g, 
+            tag_func<T0>(T0(2)),
+            tag_func<T1>(T1(3)),
+            tag_func<T2>(T2(4)),
+            tag_func<T3>(T3(5)),
+            tag_func<T4>(T4(6)),
+            tag_func<T5>(T5(7))
+            );
+        return temp;
+    }
+    static void destroy(JType *p) { delete p; }
+};
+
+template<typename JType>
+class makeJoin<7,JType,tbb::flow::tag_matching> {
+    typedef typename JType::output_type TType;
+    typedef typename std::tuple_element<0, TType>::type T0;
+    typedef typename std::tuple_element<1, TType>::type T1;
+    typedef typename std::tuple_element<2, TType>::type T2;
+    typedef typename std::tuple_element<3, TType>::type T3;
+    typedef typename std::tuple_element<4, TType>::type T4;
+    typedef typename std::tuple_element<5, TType>::type T5;
+    typedef typename std::tuple_element<6, TType>::type T6;
+public:
+    static JType *create(tbb::flow::graph& g) {
+        JType *temp = new JType(g, 
+            tag_func<T0>(T0(2)),
+            tag_func<T1>(T1(3)),
+            tag_func<T2>(T2(4)),
+            tag_func<T3>(T3(5)),
+            tag_func<T4>(T4(6)),
+            tag_func<T5>(T5(7)),
+            tag_func<T6>(T6(8))
+            );
+        return temp;
+    }
+    static void destroy(JType *p) { delete p; }
+};
+
+template<typename JType>
+class makeJoin<8,JType,tbb::flow::tag_matching> {
+    typedef typename JType::output_type TType;
+    typedef typename std::tuple_element<0, TType>::type T0;
+    typedef typename std::tuple_element<1, TType>::type T1;
+    typedef typename std::tuple_element<2, TType>::type T2;
+    typedef typename std::tuple_element<3, TType>::type T3;
+    typedef typename std::tuple_element<4, TType>::type T4;
+    typedef typename std::tuple_element<5, TType>::type T5;
+    typedef typename std::tuple_element<6, TType>::type T6;
+    typedef typename std::tuple_element<7, TType>::type T7;
+public:
+    static JType *create(tbb::flow::graph& g) {
+        JType *temp = new JType(g, 
+            tag_func<T0>(T0(2)),
+            tag_func<T1>(T1(3)),
+            tag_func<T2>(T2(4)),
+            tag_func<T3>(T3(5)),
+            tag_func<T4>(T4(6)),
+            tag_func<T5>(T5(7)),
+            tag_func<T6>(T6(8)),
+            tag_func<T7>(T7(9))
+            );
+        return temp;
+    }
+    static void destroy(JType *p) { delete p; }
+};
+
+template<typename JType>
+class makeJoin<9,JType,tbb::flow::tag_matching> {
+    typedef typename JType::output_type TType;
+    typedef typename std::tuple_element<0, TType>::type T0;
+    typedef typename std::tuple_element<1, TType>::type T1;
+    typedef typename std::tuple_element<2, TType>::type T2;
+    typedef typename std::tuple_element<3, TType>::type T3;
+    typedef typename std::tuple_element<4, TType>::type T4;
+    typedef typename std::tuple_element<5, TType>::type T5;
+    typedef typename std::tuple_element<6, TType>::type T6;
+    typedef typename std::tuple_element<7, TType>::type T7;
+    typedef typename std::tuple_element<8, TType>::type T8;
+public:
+    static JType *create(tbb::flow::graph& g) {
+        JType *temp = new JType(g, 
+            tag_func<T0>(T0(2)),
+            tag_func<T1>(T1(3)),
+            tag_func<T2>(T2(4)),
+            tag_func<T3>(T3(5)),
+            tag_func<T4>(T4(6)),
+            tag_func<T5>(T5(7)),
+            tag_func<T6>(T6(8)),
+            tag_func<T7>(T7(9)),
+            tag_func<T8>(T8(10))
+            );
+        return temp;
+    }
+    static void destroy(JType *p) { delete p; }
+};
+
+template<typename JType>
+class makeJoin<10,JType,tbb::flow::tag_matching> {
+    typedef typename JType::output_type TType;
+    typedef typename std::tuple_element<0, TType>::type T0;
+    typedef typename std::tuple_element<1, TType>::type T1;
+    typedef typename std::tuple_element<2, TType>::type T2;
+    typedef typename std::tuple_element<3, TType>::type T3;
+    typedef typename std::tuple_element<4, TType>::type T4;
+    typedef typename std::tuple_element<5, TType>::type T5;
+    typedef typename std::tuple_element<6, TType>::type T6;
+    typedef typename std::tuple_element<7, TType>::type T7;
+    typedef typename std::tuple_element<8, TType>::type T8;
+    typedef typename std::tuple_element<9, TType>::type T9;
+public:
+    static JType *create(tbb::flow::graph& g) {
+        JType *temp = new JType(g, 
+            tag_func<T0>(T0(2)),
+            tag_func<T1>(T1(3)),
+            tag_func<T2>(T2(4)),
+            tag_func<T3>(T3(5)),
+            tag_func<T4>(T4(6)),
+            tag_func<T5>(T5(7)),
+            tag_func<T6>(T6(8)),
+            tag_func<T7>(T7(9)),
+            tag_func<T8>(T8(10)),
+            tag_func<T9>(T9(11))
+            );
+        return temp;
+    }
+    static void destroy(JType *p) { delete p; }
+};
+
 // holder for source_node pointers for eventual deletion
 
 static void* all_source_nodes[MaxPorts][MaxNSources];
@@ -124,15 +367,15 @@ public:
     typedef JNT join_node_type;
     typedef typename join_node_type::output_type TT;
     typedef typename std::tuple_element<ELEM-1,TT>::type IT;
-    typedef typename tbb::source_node<IT> my_source_node_type;
+    typedef typename tbb::flow::source_node<IT> my_source_node_type;
     static void print_remark() {
         source_node_helper<ELEM-1,JNT>::print_remark();
         REMARK(", %s", name_of<IT>::name());
     }
-    static void add_source_nodes(join_node_type &my_join, tbb::graph &g, int nInputs) {
+    static void add_source_nodes(join_node_type &my_join, tbb::flow::graph &g, int nInputs) {
         for(int i=0; i < nInputs; ++i) {
             my_source_node_type *new_node = new my_source_node_type(g, source_body<IT>((IT)(ELEM+1), i, nInputs));
-            ASSERT(new_node->register_successor(std::get<ELEM-1>(my_join.inputs() )), NULL);
+            tbb::flow::make_edge( *new_node, tbb::flow::input_port<ELEM-1>(my_join) );
             all_source_nodes[ELEM-1][i] = (void *)new_node;
         }
         // add the next source_node
@@ -152,7 +395,7 @@ public:
     static void remove_source_nodes(join_node_type& my_join, int nInputs) {
         for(int i=0; i< nInputs; ++i) {
             my_source_node_type *dp = reinterpret_cast<my_source_node_type *>(all_source_nodes[ELEM-1][i]);
-            dp->remove_successor(std::get<ELEM-1>(my_join.inputs()));
+            tbb::flow::remove_edge( *dp, tbb::flow::input_port<ELEM-1>(my_join) );
             delete dp;
         }
         source_node_helper<ELEM-1, JNT>::remove_source_nodes(my_join, nInputs);
@@ -164,15 +407,15 @@ class source_node_helper<1, JNT> {
     typedef JNT join_node_type;
     typedef typename join_node_type::output_type TT;
     typedef typename std::tuple_element<0,TT>::type IT;
-    typedef typename tbb::source_node<IT> my_source_node_type;
+    typedef typename tbb::flow::source_node<IT> my_source_node_type;
 public:
     static void print_remark() {
         REMARK("Parallel test of join_node< %s", name_of<IT>::name());
     }
-    static void add_source_nodes(join_node_type &my_join, tbb::graph &g, int nInputs) {
+    static void add_source_nodes(join_node_type &my_join, tbb::flow::graph &g, int nInputs) {
         for(int i=0; i < nInputs; ++i) {
             my_source_node_type *new_node = new my_source_node_type(g, source_body<IT>((IT)2, i, nInputs));
-            ASSERT(new_node->register_successor(std::get<0>(my_join.inputs() )), NULL);
+            tbb::flow::make_edge( *new_node, tbb::flow::input_port<0>(my_join) );
             all_source_nodes[0][i] = (void *)new_node;
         }
     }
@@ -187,17 +430,18 @@ public:
     static void remove_source_nodes(join_node_type& my_join, int nInputs) {
         for(int i=0; i < nInputs; ++i) {
             my_source_node_type *dp = reinterpret_cast<my_source_node_type *>(all_source_nodes[0][i]);
-            dp->remove_successor(std::get<0>(my_join.inputs()));
+            tbb::flow::remove_edge( *dp, tbb::flow::input_port<0>(my_join) );
             delete dp;
         }
     }
 };
 
-template<typename JType>
+template<typename JType, tbb::flow::graph_buffer_policy JP>
 class parallel_test {
 public:
     typedef typename JType::output_type TType;
     static const int SIZE = std::tuple_size<TType>::value;
+    static const tbb::flow::graph_buffer_policy jp = JP;
     static void test() {
         TType v;
         source_node_helper<SIZE,JType>::print_remark();
@@ -208,22 +452,24 @@ public:
             }
         }
         for(int nInputs = 1; nInputs <= MaxNSources; ++nInputs) {
-            tbb::graph g;
-            JType my_join(g);
-            tbb::queue_node<TType> outq1(g);
-            tbb::queue_node<TType> outq2(g);
+            tbb::flow::graph g;
+            // JType my_join(g);
+            bool not_out_of_order = (nInputs == 1) && (jp != tbb::flow::tag_matching);
+            JType* my_join = makeJoin<SIZE,JType,JP>::create(g);
+            tbb::flow::queue_node<TType> outq1(g);
+            tbb::flow::queue_node<TType> outq2(g);
 
-            ASSERT(my_join.register_successor(outq1), NULL);  // register outputs first, so they both get all
-            ASSERT(my_join.register_successor(outq2), NULL);  // the results
+            tbb::flow::make_edge( *my_join, outq1 );
+            tbb::flow::make_edge( *my_join, outq2 );
 
-            source_node_helper<SIZE, JType>::add_source_nodes(my_join, g, nInputs);
+            source_node_helper<SIZE, JType>::add_source_nodes((*my_join), g, nInputs);
 
             g.wait_for_all();
 
             reset_outputCheck(SIZE, Count);
             for(int i=0; i < Count; ++i) {
                 ASSERT(outq1.try_get(v), NULL);
-                source_node_helper<SIZE, JType>::check_value(i, v, nInputs == 1);
+                source_node_helper<SIZE, JType>::check_value(i, v, not_out_of_order);
             }
 
             check_outputCheck(SIZE, Count);
@@ -231,16 +477,17 @@ public:
 
             for(int i=0; i < Count; i++) {
                 ASSERT(outq2.try_get(v), NULL);;
-                source_node_helper<SIZE, JType>::check_value(i, v, nInputs == 1);
+                source_node_helper<SIZE, JType>::check_value(i, v, not_out_of_order);
             }
             check_outputCheck(SIZE, Count);
 
             ASSERT(!outq1.try_get(v), NULL);
             ASSERT(!outq2.try_get(v), NULL);
 
-            source_node_helper<SIZE, JType>::remove_source_nodes(my_join, nInputs);
-            my_join.remove_successor(outq1);
-            my_join.remove_successor(outq2);
+            source_node_helper<SIZE, JType>::remove_source_nodes((*my_join), nInputs);
+            tbb::flow::remove_edge( *my_join, outq1 );
+            tbb::flow::remove_edge( *my_join, outq2 );
+            makeJoin<SIZE,JType,JP>::destroy(my_join);
         }
     }
 };
@@ -251,15 +498,15 @@ class serial_queue_helper {
 public:
     typedef typename JType::output_type TT;
     typedef typename std::tuple_element<ELEM-1,TT>::type IT;
-    typedef typename tbb::queue_node<IT> my_queue_node_type;
+    typedef typename tbb::flow::queue_node<IT> my_queue_node_type;
     static void print_remark() {
         serial_queue_helper<ELEM-1,JType>::print_remark();
         REMARK(", %s", name_of<IT>::name());
     }
-    static void add_queue_nodes(tbb::graph &g, JType &my_join) {
+    static void add_queue_nodes(tbb::flow::graph &g, JType &my_join) {
         serial_queue_helper<ELEM-1,JType>::add_queue_nodes(g, my_join);
         my_queue_node_type *new_node = new my_queue_node_type(g);
-        ASSERT(new_node->register_successor(std::get<ELEM-1>(my_join.inputs())), NULL);
+        tbb::flow::make_edge( *new_node, std::get<ELEM-1>(my_join.inputs()) );
         all_source_nodes[ELEM-1][0] = (void *)new_node;
     }
     static void fill_one_queue(int maxVal) {
@@ -282,7 +529,7 @@ public:
     }
     static void remove_queue_nodes(JType &my_join) {
         my_queue_node_type *vptr = reinterpret_cast<my_queue_node_type *>(all_source_nodes[ELEM-1][0]);
-        vptr->remove_successor(my_join);
+        tbb::flow::remove_edge( *vptr, std::get<ELEM-1>(my_join.inputs()) );
         serial_queue_helper<ELEM-1, JType>::remove_queue_nodes(my_join);
         delete vptr;
     }
@@ -293,13 +540,13 @@ class serial_queue_helper<1, JType> {
 public:
     typedef typename JType::output_type TT;
     typedef typename std::tuple_element<0,TT>::type IT;
-    typedef typename tbb::queue_node<IT> my_queue_node_type;
+    typedef typename tbb::flow::queue_node<IT> my_queue_node_type;
     static void print_remark() {
         REMARK("Serial test of join_node< %s", name_of<IT>::name());
     }
-    static void add_queue_nodes(tbb::graph &g, JType &my_join) {
+    static void add_queue_nodes(tbb::flow::graph &g, JType &my_join) {
         my_queue_node_type *new_node = new my_queue_node_type(g);
-        ASSERT(new_node->register_successor(std::get<0>(my_join.inputs() )), NULL);
+        tbb::flow::make_edge( *new_node, tbb::flow::input_port<0>(my_join) );
         all_source_nodes[0][0] = (void *)new_node;
     }
     static void fill_one_queue(int maxVal) {
@@ -317,7 +564,7 @@ public:
     }
     static void remove_queue_nodes(JType &my_join) {
         my_queue_node_type *vptr = reinterpret_cast<my_queue_node_type *>(all_source_nodes[0][0]);
-        vptr->remove_successor(my_join);
+        tbb::flow::remove_edge( *vptr, std::get<0>(my_join.inputs()) );
         delete vptr;
     }
 };
@@ -327,34 +574,46 @@ public:
 //   * put to buffer before port0, then put to buffer before port1, ...
 //   * fill buffer before port0 then fill buffer before port1, ...
 
-template<typename JType>
-class serial_test {
+template<typename JType, tbb::flow::graph_buffer_policy JP>
+void test_one_serial( JType &my_join, tbb::flow::graph &g) {
     typedef typename JType::output_type TType;
     static const int SIZE = std::tuple_size<TType>::value;
-public:
-static void test() {
-    tbb::graph g;
-    JType my_join(g);
-
+    std::vector<bool> flags;
     serial_queue_helper<SIZE, JType>::add_queue_nodes(g,my_join);
     typedef TType q3_input_type;
-    tbb::queue_node< q3_input_type >  q3(g);
-
-    serial_queue_helper<SIZE, JType>::print_remark(); REMARK(" >\n");
+    tbb::flow::queue_node< q3_input_type >  q3(g);
 
-    ASSERT(my_join.register_successor( q3 ), NULL);
+    tbb::flow::make_edge( my_join, q3 );
 
     // fill each queue with its value one-at-a-time
+    flags.clear();
     for (int i = 0; i < Count; ++i ) {
         serial_queue_helper<SIZE,JType>::put_one_queue_val(i);
+        flags.push_back(false);
     }
 
     g.wait_for_all();
+    tbb::flow::graph_buffer_policy jp = JP;
     for (int i = 0; i < Count; ++i ) {
         q3_input_type v;
         g.wait_for_all();
         ASSERT(q3.try_get( v ), "Error in try_get()");
-        serial_queue_helper<SIZE,JType>::check_queue_value(i, v);
+        if(jp == tbb::flow::tag_matching) {
+            // because we look up tags in the hash table, the output may be out of order.
+            int j = int(std::get<0>(v)) / 2;  // figure what the index should be
+            serial_queue_helper<SIZE,JType>::check_queue_value(j, v);
+            flags[j] = true;
+        }
+        else {
+            serial_queue_helper<SIZE,JType>::check_queue_value(i, v);
+        }
+    }
+
+    if(jp == tbb::flow::tag_matching) {
+        for(int i = 0; i < Count; ++i) {
+            ASSERT(flags[i], NULL);
+            flags[i] = false;
+        }
     }
 
     // fill each queue completely before filling the next.
@@ -365,55 +624,409 @@ static void test() {
         q3_input_type v;
         g.wait_for_all();
         ASSERT(q3.try_get( v ), "Error in try_get()");
-        serial_queue_helper<SIZE,JType>::check_queue_value(i, v);
+        if(jp == tbb::flow::tag_matching) {
+            int j = int(std::get<0>(v)) / 2;
+            serial_queue_helper<SIZE,JType>::check_queue_value(j, v);
+            flags[i] = true;
+        }
+        else {
+            serial_queue_helper<SIZE,JType>::check_queue_value(i, v);
+        }
+    }
+
+    if(jp == tbb::flow::tag_matching) {
+        for(int i = 0; i < Count; ++i) {
+            ASSERT(flags[i], NULL);
+        }
+    }
+
+    serial_queue_helper<SIZE, JType>::remove_queue_nodes(my_join);
+
+}
+
+template<typename JType, tbb::flow::graph_buffer_policy JP>
+class serial_test {
+    typedef typename JType::output_type TType;
+    static const int SIZE = std::tuple_size<TType>::value;
+    static const int ELEMS = 3;
+public:
+static void test() {
+    tbb::flow::graph g;
+    std::vector<bool> flags;
+    flags.reserve(Count);
+    JType* my_join = makeJoin<SIZE,JType,JP>::create(g);
+    serial_queue_helper<SIZE, JType>::print_remark(); REMARK(" >\n");
+
+    test_one_serial<JType,JP>( *my_join, g);
+    // build the vector with copy construction from the used join node.
+    std::vector<JType>join_vector(ELEMS, *my_join);
+    // destroy the tired old join_node in case we're accidentally reusing pieces of it.
+    makeJoin<SIZE,JType,JP>::destroy(my_join);
+
+
+    for(int e = 0; e < ELEMS; ++e) {  // exercise each of the vector elements
+        test_one_serial<JType,JP>( join_vector[e], g);
     }
 }
 
 }; // serial_test
 
-template<template<typename> class TestType, typename OutputTupleType, tbb::join_policy J>
+template<
+      template<typename, tbb::flow::graph_buffer_policy> class TestType,  // serial_test or parallel_test
+      typename OutputTupleType,           // type of the output of the join
+      tbb::flow::graph_buffer_policy J>                 // graph_buffer_policy (reserving, queueing or tag_matching)
 class generate_test {
 public:
-    typedef tbb::join_node<OutputTupleType,J> join_node_type;
+    typedef tbb::flow::join_node<OutputTupleType,J> join_node_type;
     static void do_test() {
-        TestType<join_node_type>::test();
+        TestType<join_node_type,J>::test();
     }
 };
 
+template<tbb::flow::graph_buffer_policy JP>
+void test_input_port_policies();
+
+// join_node (reserving) does not consume inputs until an item is available at
+// every input.  It tries to reserve each input, and if any fails it releases the
+// reservation.  When it builds a tuple it broadcasts to all its successors and
+// consumes all the inputs.
+//
+// So our test will put an item at one input port, then attach another node to the
+// same node (a queue node in this case).  The second successor should receive the
+// item in the queue, emptying it.
+//
+// We then place an item in the second input queue, and check the output queues; they
+// should still be empty.  Then we place an item in the first queue; the output queues
+// should then receive a tuple.
+//
+// we then attach another function node to the second input.  It should not receive
+// an item, verifying that the item in the queue is consumed.
+template<>
+void test_input_port_policies<tbb::flow::reserving>() {
+    tbb::flow::graph g;
+    typedef tbb::flow::join_node<std::tuple<int, int>, tbb::flow::reserving > JType; // two-phase is the default policy
+    // create join_node<type0,type1> jn
+    JType jn(g);
+    // create output_queue oq0, oq1
+    typedef JType::output_type OQType;
+    tbb::flow::queue_node<OQType> oq0(g);
+    tbb::flow::queue_node<OQType> oq1(g);
+    // create iq0, iq1
+    typedef tbb::flow::queue_node<int> IQType;
+    IQType iq0(g);
+    IQType iq1(g);
+    // create qnp, qnq
+    IQType qnp(g);
+    IQType qnq(g);
+    REMARK("Testing policies of join_node<reserving> input ports\n");
+    // attach jn to oq0, oq1
+    tbb::flow::make_edge( jn, oq0 );
+    tbb::flow::make_edge( jn, oq1 );
+    // attach iq0, iq1 to jn
+    tbb::flow::make_edge( iq0, std::get<0>(jn.inputs()) );
+    tbb::flow::make_edge( iq1, std::get<1>(jn.inputs()) );
+    for(int loop = 0; loop < 3; ++loop) {
+        // place one item in iq0
+        ASSERT(iq0.try_put(1), "Error putting to iq1");
+        // attach iq0 to qnp
+        tbb::flow::make_edge( iq0, qnp );
+        // qnp should have an item in it.
+        g.wait_for_all();
+        {
+            int i;
+            ASSERT(qnp.try_get(i) && i == 1, "Error in item fetched by qnp");
+        }
+        // place item in iq1
+        ASSERT(iq1.try_put(2), "Error putting to iq1");
+        // oq0, oq1 should be empty
+        g.wait_for_all();
+        {
+            OQType t1;
+            ASSERT(!oq0.try_get(t1) && !oq1.try_get(t1), "oq0 and oq1 not empty");
+        }
+        // detach qnp from iq0
+        tbb::flow::remove_edge( iq0, qnp); // if we don't remove qnp it will gobble any values we put in iq0
+        // place item in iq0
+        ASSERT(iq0.try_put(3), "Error on second put to iq0");
+        // oq0, oq1 should have items in them
+        g.wait_for_all();
+        {
+            OQType t0;
+            OQType t1;
+            ASSERT(oq0.try_get(t0) && std::get<0>(t0) == 3 && std::get<1>(t0) == 2, "Error in oq0 output");
+            ASSERT(oq1.try_get(t1) && std::get<0>(t1) == 3 && std::get<1>(t1) == 2, "Error in oq1 output");
+        }
+        // attach qnp to iq0, qnq to iq1
+        // qnp and qnq should be empty
+        tbb::flow::make_edge( iq0, qnp );
+        tbb::flow::make_edge( iq1, qnq );
+        g.wait_for_all();
+        {
+            int i;
+            ASSERT(!qnp.try_get(i), "iq0 still had value in it");
+            ASSERT(!qnq.try_get(i), "iq1 still had value in it");
+        }
+        tbb::flow::remove_edge( iq0, qnp );
+        tbb::flow::remove_edge( iq1, qnq );
+    } // for ( int loop ...
+}
+
+// join_node (queueing) consumes inputs as soon as they are available at
+// any input.  When it builds a tuple it broadcasts to all its successors and
+// discards the broadcast values.
+//
+// So our test will put an item at one input port, then attach another node to the
+// same node (a queue node in this case).  The second successor should not receive
+// an item (because the join consumed it).
+//
+// We then place an item in the second input queue, and check the output queues; they
+// should each have a tuple.
+//
+// we then attach another function node to the second input.  It should not receive
+// an item, verifying that the item in the queue is consumed.
+template<>
+void test_input_port_policies<tbb::flow::queueing>() {
+    tbb::flow::graph g;
+    typedef tbb::flow::join_node<std::tuple<int, int>, tbb::flow::queueing > JType;
+    // create join_node<type0,type1> jn
+    JType jn(g);
+    // create output_queue oq0, oq1
+    typedef JType::output_type OQType;
+    tbb::flow::queue_node<OQType> oq0(g);
+    tbb::flow::queue_node<OQType> oq1(g);
+    // create iq0, iq1
+    typedef tbb::flow::queue_node<int> IQType;
+    IQType iq0(g);
+    IQType iq1(g);
+    // create qnp, qnq
+    IQType qnp(g);
+    IQType qnq(g);
+    REMARK("Testing policies of join_node<queueing> input ports\n");
+    // attach jn to oq0, oq1
+    tbb::flow::make_edge( jn, oq0 );
+    tbb::flow::make_edge( jn, oq1 );
+    // attach iq0, iq1 to jn
+    tbb::flow::make_edge( iq0, std::get<0>(jn.inputs()) );
+    tbb::flow::make_edge( iq1, std::get<1>(jn.inputs()) );
+    for(int loop = 0; loop < 3; ++loop) {
+        // place one item in iq0
+        ASSERT(iq0.try_put(1), "Error putting to iq1");
+        // attach iq0 to qnp
+        tbb::flow::make_edge( iq0, qnp );
+        // qnp should have an item in it.
+        g.wait_for_all();
+        {
+            int i;
+            ASSERT(!qnp.try_get(i), "Item was received by qnp");
+        }
+        // place item in iq1
+        ASSERT(iq1.try_put(2), "Error putting to iq1");
+        // oq0, oq1 should have items
+        g.wait_for_all();
+        {
+            OQType t0;
+            OQType t1;
+            ASSERT(oq0.try_get(t0) && std::get<0>(t0) == 1 && std::get<1>(t0) == 2, "Error in oq0 output");
+            ASSERT(oq1.try_get(t1) && std::get<0>(t1) == 1 && std::get<1>(t1) == 2, "Error in oq1 output");
+        }
+        // attach qnq to iq1
+        // qnp and qnq should be empty
+        tbb::flow::make_edge( iq1, qnq );
+        g.wait_for_all();
+        {
+            int i;
+            ASSERT(!qnp.try_get(i), "iq0 still had value in it");
+            ASSERT(!qnq.try_get(i), "iq1 still had value in it");
+        }
+        tbb::flow::remove_edge( iq0, qnp );
+        tbb::flow::remove_edge( iq1, qnq );
+    } // for ( int loop ...
+}
+
+tbb::flow::tag_value myTagValue(int i) { return tbb::flow::tag_value(i); }
+
+// join_node (tag_matching) consumes inputs as soon as they are available at
+// any input.  When it builds a tuple it broadcasts to all its successors and
+// discards the broadcast values.
+//
+// It chooses the tuple it broadcasts by matching the tag values returned by the
+// methods given the constructor of the join, in this case the method just casts
+// the value in each port to tag_value.
+//
+// So our test will put an item at one input port, then attach another node to the
+// same node (a queue node in this case).  The second successor should not receive
+// an item (because the join consumed it).
+//
+// We then place an item in the second input queue, and check the output queues; they
+// should each have a tuple.
+//
+// we then attach another queue node to the second input.  It should not receive
+// an item, verifying that the item in the queue is consumed.
+//
+// We will then exercise the join with a bunch of values, and the output order should
+// be determined by the order we insert items into the second queue.  (Each tuple set
+// corresponding to a tag will be complete when the second item is inserted.)
+template<>
+void test_input_port_policies<tbb::flow::tag_matching>() {
+    tbb::flow::graph g;
+    typedef tbb::flow::join_node<std::tuple<int, int>, tbb::flow::tag_matching > JType;
+    JType jn(g, myTagValue, myTagValue);
+    // create output_queue oq0, oq1
+    typedef JType::output_type OQType;
+    tbb::flow::queue_node<OQType> oq0(g);
+    tbb::flow::queue_node<OQType> oq1(g);
+    // create iq0, iq1
+    typedef tbb::flow::queue_node<int> IQType;
+    IQType iq0(g);
+    IQType iq1(g);
+    // create qnp, qnq
+    IQType qnp(g);
+    IQType qnq(g);
+
+    REMARK("Testing policies of join_node<tag_matching> input ports\n");
+    // attach jn to oq0, oq1
+    tbb::flow::make_edge( jn, oq0 );
+    tbb::flow::make_edge( jn, oq1 );
+    // attach iq0, iq1 to jn
+    tbb::flow::make_edge( iq0, tbb::flow::input_port<0>(jn) );
+    tbb::flow::make_edge( iq1, tbb::flow::input_port<1>(jn) );
+    // we'll put four discrete values in the inputs to the join_node.  Each
+    // set of inputs should result in one output.  (NO_TAG is currently defined
+    // to be tag_value(-1), so zero is an allowed tag_value.)
+    for(int loop = 0; loop < 4; ++loop) {
+        // place one item in iq0
+        ASSERT(iq0.try_put(loop), "Error putting to iq1"); 
+        // attach iq0 to qnp
+        tbb::flow::make_edge( iq0, qnp );
+        // qnp should not have an item in it.  (the join consumed it.)
+        g.wait_for_all();
+        {
+            int i;
+            ASSERT(!qnp.try_get(i), "Item was received by qnp");
+        }
+        // place item in iq1
+        ASSERT(iq1.try_put(loop), "Error putting to iq1");
+        // oq0, oq1 should have items
+        g.wait_for_all();
+        {
+            OQType t0;
+            OQType t1;
+            ASSERT(oq0.try_get(t0) && std::get<0>(t0) == loop && std::get<1>(t0) == loop, "Error in oq0 output");
+            ASSERT(oq1.try_get(t1) && std::get<0>(t1) == loop && std::get<1>(t1) == loop, "Error in oq1 output");
+            ASSERT(!oq0.try_get(t0), "extra object in output queue oq0");
+            ASSERT(!oq1.try_get(t0), "extra object in output queue oq1");
+        }
+        // attach qnq to iq1
+        // qnp and qnq should be empty
+        tbb::flow::make_edge( iq1, qnq );
+        g.wait_for_all();
+        {
+            int i;
+            ASSERT(!qnp.try_get(i), "iq0 still had value in it");
+            ASSERT(!qnq.try_get(i), "iq1 still had value in it");
+        }
+        tbb::flow::remove_edge( iq0, qnp );
+        tbb::flow::remove_edge( iq1, qnq );
+    } // for ( int loop ...
+
+    // Now we'll put [4 .. nValues - 1] in iq0, and then put [4 .. nValues - 1] in iq1 in
+    // a different order.  We should see tuples in the output queues in the order we inserted
+    // the integers into iq1.
+
+    const int nValues = 100;
+    const int nIncr = 31;  // relatively prime to nValues
+
+    for(int loop = 4; loop < 4+nValues; ++loop) {
+        // place one item in iq0
+        ASSERT(iq0.try_put(loop), "Error putting to iq1"); 
+        g.wait_for_all();
+        {
+            OQType t3;
+            ASSERT(!oq0.try_get(t3), "Object in output queue");
+            ASSERT(!oq1.try_get(t3), "Object in output queue");
+        }
+    } // for ( int loop ...
+
+    for(int loop = 1; loop <= nValues; ++loop) {
+        int lp1 = 4 + (loop * nIncr)%nValues;
+        // place item in iq1
+        ASSERT(iq1.try_put(lp1), "Error putting to iq1");
+        // oq0, oq1 should have items
+        g.wait_for_all();
+        {
+            OQType t0;
+            OQType t1;
+            ASSERT(oq0.try_get(t0) && std::get<0>(t0) == lp1 && std::get<1>(t0) == lp1, "Error in oq0 output");
+            ASSERT(oq1.try_get(t1) && std::get<0>(t1) == lp1 && std::get<1>(t1) == lp1, "Error in oq1 output");
+            ASSERT(!oq0.try_get(t0), "extra object in output queue oq0");
+            ASSERT(!oq1.try_get(t0), "extra object in output queue oq1");
+        }
+    } // for ( int loop ...
+}
+
 int TestMain() {
 #if __TBB_USE_TBB_TUPLE
-    REMARK("  Using TBB tuple");
+    REMARK("  Using TBB tuple\n");
 #else
-    REMARK("  Using platform tuple");
+    REMARK("  Using platform tuple\n");
 #endif
-#if __TBB_USE_VARIADIC_TEMPLATE
-    REMARK(" with variadic template\n");
-#else
-    REMARK(" with explicit template\n");
-#endif
-   for (int p = 0; p < 2; ++p) {
-
-       REMARK("two_phase\n");
-       generate_test<serial_test, std::tuple<float, double>, tbb::two_phase >::do_test();
-       generate_test<serial_test, std::tuple<float, double, int, long>, tbb::two_phase >::do_test();
-       generate_test<serial_test, std::tuple<double, double, int, long, int, short>, tbb::two_phase >::do_test();
-       generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long>, tbb::two_phase >::do_test();
-       generate_test<serial_test, std::tuple<float, double, int, double, double, float, long, int, float, long>, tbb::two_phase >::do_test();
-       generate_test<parallel_test, std::tuple<float, double>, tbb::two_phase >::do_test();
-       generate_test<parallel_test, std::tuple<float, int, long>, tbb::two_phase >::do_test();
-       generate_test<parallel_test, std::tuple<double, double, int, int, short>, tbb::two_phase >::do_test();
-       generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long>, tbb::two_phase >::do_test();
-       generate_test<parallel_test, std::tuple<float, double, int, double, double, long, int, float, long>, tbb::two_phase >::do_test();
+    test_input_port_policies<tbb::flow::reserving>();
+    test_input_port_policies<tbb::flow::queueing>();
+    test_input_port_policies<tbb::flow::tag_matching>();
 
+   for (int p = 0; p < 2; ++p) {
+       REMARK("reserving\n");
+       generate_test<serial_test, std::tuple<float, double>, tbb::flow::reserving >::do_test();
+       generate_test<serial_test, std::tuple<float, double, int, long>, tbb::flow::reserving >::do_test();
+       generate_test<serial_test, std::tuple<double, double, int, long, int, short>, tbb::flow::reserving >::do_test();
+#if COMPREHENSIVE_TEST
+       generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long>, tbb::flow::reserving >::do_test();
+       generate_test<serial_test, std::tuple<float, double, int, double, double, float, long, int, float, long>, tbb::flow::reserving >::do_test();
+#endif
+       generate_test<parallel_test, std::tuple<float, double>, tbb::flow::reserving >::do_test();
+       generate_test<parallel_test, std::tuple<float, int, long>, tbb::flow::reserving >::do_test();
+       generate_test<parallel_test, std::tuple<double, double, int, int, short>, tbb::flow::reserving >::do_test();
+#if COMPREHENSIVE_TEST
+       generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long>, tbb::flow::reserving >::do_test();
+       generate_test<parallel_test, std::tuple<float, double, int, double, double, long, int, float, long>, tbb::flow::reserving >::do_test();
+#endif
+       REMARK("queueing\n");
+       generate_test<serial_test, std::tuple<float, double>, tbb::flow::queueing >::do_test();
+       generate_test<serial_test, std::tuple<float, double, int, long>, tbb::flow::queueing >::do_test();
+       generate_test<serial_test, std::tuple<double, double, int, long, int, short>, tbb::flow::queueing >::do_test();
+#if COMPREHENSIVE_TEST
+       generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long>, tbb::flow::queueing >::do_test();
+       generate_test<serial_test, std::tuple<float, double, int, double, double, float, long, int, float, long>, tbb::flow::queueing >::do_test();
+#endif
+       generate_test<parallel_test, std::tuple<float, double>, tbb::flow::queueing >::do_test();
+       generate_test<parallel_test, std::tuple<float, int, long>, tbb::flow::queueing >::do_test();
+       generate_test<parallel_test, std::tuple<double, double, int, int, short>, tbb::flow::queueing >::do_test();
+#if COMPREHENSIVE_TEST
+       generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long>, tbb::flow::queueing >::do_test();
+       generate_test<parallel_test, std::tuple<float, double, int, double, double, long, int, float, long>, tbb::flow::queueing >::do_test();
+#endif
+       REMARK("tag_matching\n");
+       generate_test<serial_test, std::tuple<float, double>, tbb::flow::tag_matching >::do_test();
+       generate_test<serial_test, std::tuple<float, double, int, long>, tbb::flow::tag_matching >::do_test();
+       generate_test<serial_test, std::tuple<double, double, int, long, int, short>, tbb::flow::tag_matching >::do_test();
+#if COMPREHENSIVE_TEST
+       generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long>, tbb::flow::tag_matching >::do_test();
+       generate_test<serial_test, std::tuple<float, double, int, double, double, float, long, int, float, long>, tbb::flow::tag_matching >::do_test();
+#endif
+       generate_test<parallel_test, std::tuple<float, double>, tbb::flow::tag_matching >::do_test();
+       generate_test<parallel_test, std::tuple<float, int, long>, tbb::flow::tag_matching >::do_test();
+       generate_test<parallel_test, std::tuple<double, double, int, int, short>, tbb::flow::tag_matching >::do_test();
+#if COMPREHENSIVE_TEST
+       generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long>, tbb::flow::tag_matching >::do_test();
+       generate_test<parallel_test, std::tuple<float, double, int, double, double, long, int, float, long>, tbb::flow::tag_matching >::do_test();
+#endif
    }
    return Harness::Done;
 }
+#else  // __SUNPRO_CC
 
-#else /* __SUNPRO_CC */
-
-int TestMain() { 
-    REPORT("Known issue: test skipped because of the compiler (CC %X) bug.\n", __SUNPRO_CC);
+int TestMain() {
     return Harness::Skipped;
 }
 
-#endif /* __SUNPRO_CC */
+#endif  // SUNPRO_CC
diff --git a/src/test/test_lambda.cpp b/src/test/test_lambda.cpp
index 99037b2..0a7fb8c 100644
--- a/src/test/test_lambda.cpp
+++ b/src/test/test_lambda.cpp
@@ -56,6 +56,7 @@ void f(int val, int *arr, int start, int stop) {
 
 #include "harness.h"
 
+#if __TBB_TASK_GROUP_CONTEXT
 int Fib(int n) {
     if( n<2 ) {
         return n;
@@ -70,6 +71,7 @@ int Fib(int n) {
         return x+y;
     }
 }
+#endif /* !__TBB_TASK_GROUP_CONTEXT */
 
 #include "harness_report.h"
 #include "harness_assert.h"
@@ -159,12 +161,14 @@ int TestMain () {
                             }, 42, 64);
         myThread.join();
 
+#if __TBB_TASK_GROUP_CONTEXT
         // test task_group
         REMARK("Testing task_group... ");
         int result;
         result = Fib(32);
         ASSERT(result==2178309, "task_group w/lambda failed.\n");
         REMARK("passed.\n");
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
         // Reset array a to index values
         parallel_for(blocked_range<int>(0,N,Grainsize),
diff --git a/src/test/test_limiter_node.cpp b/src/test/test_limiter_node.cpp
index e560249..513deb7 100644
--- a/src/test/test_limiter_node.cpp
+++ b/src/test/test_limiter_node.cpp
@@ -27,8 +27,7 @@
 */
 
 #include "harness.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
 #include "tbb/atomic.h"
 #include "tbb/task_scheduler_init.h"
 
@@ -36,44 +35,44 @@ const int L = 10;
 const int N = 1000;
 
 template< typename T >
-struct serial_receiver : public tbb::receiver<T> {
+struct serial_receiver : public tbb::flow::receiver<T> {
    T next_value;
 
    serial_receiver() : next_value(T(0)) {}
 
-   /* override */ bool try_put( T v ) {
+   /* override */ bool try_put( const T &v ) {
        ASSERT( next_value++  == v, NULL );
        return true;
    }
 };
 
 template< typename T >
-struct parallel_receiver : public tbb::receiver<T> {
+struct parallel_receiver : public tbb::flow::receiver<T> {
 
    tbb::atomic<int> my_count;
 
    parallel_receiver() { my_count = 0; }
 
-   /* override */ bool try_put( T ) {
+   /* override */ bool try_put( const T & ) {
        ++my_count;
        return true;
    }
 };
 
 template< typename T >
-struct empty_sender : public tbb::sender<T> {
-        /* override */ bool register_successor( tbb::receiver<T> & ) { return false; }
-        /* override */ bool remove_successor( tbb::receiver<T> & ) { return false; }
+struct empty_sender : public tbb::flow::sender<T> {
+        /* override */ bool register_successor( tbb::flow::receiver<T> & ) { return false; }
+        /* override */ bool remove_successor( tbb::flow::receiver<T> & ) { return false; }
 };
 
 
 template< typename T >
 struct put_body : NoAssign {
 
-    tbb::limiter_node<T> &my_lim;
+    tbb::flow::limiter_node<T> &my_lim;
     tbb::atomic<int> &my_accept_count;
 
-    put_body( tbb::limiter_node<T> &lim, tbb::atomic<int> &accept_count ) : 
+    put_body( tbb::flow::limiter_node<T> &lim, tbb::atomic<int> &accept_count ) : 
         my_lim(lim), my_accept_count(accept_count) {}
 
     void operator()( int ) const {
@@ -88,10 +87,10 @@ struct put_body : NoAssign {
 template< typename T >
 struct put_dec_body : NoAssign {
 
-    tbb::limiter_node<T> &my_lim;
+    tbb::flow::limiter_node<T> &my_lim;
     tbb::atomic<int> &my_accept_count;
 
-    put_dec_body( tbb::limiter_node<T> &lim, tbb::atomic<int> &accept_count ) : 
+    put_dec_body( tbb::flow::limiter_node<T> &lim, tbb::atomic<int> &accept_count ) : 
         my_lim(lim), my_accept_count(accept_count) {}
 
     void operator()( int ) const {
@@ -101,13 +100,28 @@ struct put_dec_body : NoAssign {
             if ( msg == true ) {
                 ++local_accept_count;
                 ++my_accept_count;
-                my_lim.decrement.try_put( tbb::continue_msg() );
+                my_lim.decrement.try_put( tbb::flow::continue_msg() );
             } 
         }
     }
 
 };
 
+template< typename T >
+void test_puts_with_decrements( int num_threads, tbb::flow::limiter_node< T >& lim ) {
+    parallel_receiver<T> r;
+    empty_sender< tbb::flow::continue_msg > s;
+    tbb::atomic<int> accept_count;
+    accept_count = 0;
+    tbb::flow::make_edge( lim, r );
+    lim.decrement.register_predecessor( s );
+    // test puts with decrements
+    NativeParallelFor( num_threads, put_dec_body<T>(lim, accept_count) );
+    int c = accept_count;
+    ASSERT( c == N*num_threads, NULL );
+    ASSERT( r.my_count == N*num_threads, NULL );
+}
+
 //
 // Tests
 //
@@ -120,12 +134,12 @@ int test_parallel(int num_threads) {
  
    // test puts with no decrements
    for ( int i = 0; i < L; ++i ) {
-       tbb::graph g;
-       tbb::limiter_node< T > lim(g, i);
+       tbb::flow::graph g;
+       tbb::flow::limiter_node< T > lim(g, i);
        parallel_receiver<T> r;
        tbb::atomic<int> accept_count;
        accept_count = 0;
-       lim.register_successor( r );
+       tbb::flow::make_edge( lim, r );
        // test puts with no decrements
        NativeParallelFor( num_threads, put_body<T>(lim, accept_count) );
        g.wait_for_all();
@@ -135,19 +149,11 @@ int test_parallel(int num_threads) {
 
    // test puts with decrements
    for ( int i = 1; i < L; ++i ) {
-       tbb::graph g;
-       tbb::limiter_node< T > lim(g, i);
-       parallel_receiver<T> r;
-       empty_sender< tbb::continue_msg > s;
-       tbb::atomic<int> accept_count;
-       accept_count = 0;
-       lim.register_successor( r );
-       lim.decrement.register_predecessor( s );
-       // test puts with no decrements
-       NativeParallelFor( num_threads, put_dec_body<T>(lim, accept_count) );
-       int c = accept_count;
-       ASSERT( c == N*num_threads, NULL );
-       ASSERT( r.my_count == N*num_threads, NULL );
+       tbb::flow::graph g;
+       tbb::flow::limiter_node< T > lim(g, i);
+       test_puts_with_decrements(num_threads, lim);
+       tbb::flow::limiter_node< T > lim_copy( lim );
+       test_puts_with_decrements(num_threads, lim_copy);
    }
 
    return 0;
@@ -164,10 +170,10 @@ int test_serial() {
  
    // test puts with no decrements
    for ( int i = 0; i < L; ++i ) {
-       tbb::graph g;
-       tbb::limiter_node< T > lim(g, i);
+       tbb::flow::graph g;
+       tbb::flow::limiter_node< T > lim(g, i);
        serial_receiver<T> r;
-       lim.register_successor( r );
+       tbb::flow::make_edge( lim, r );
        for ( int j = 0; j < L; ++j ) {
            bool msg = lim.try_put( T(j) );
            ASSERT( ( j < i && msg == true ) || ( j >= i && msg == false ), NULL );
@@ -177,17 +183,17 @@ int test_serial() {
 
    // test puts with decrements
    for ( int i = 1; i < L; ++i ) {
-       tbb::graph g;
-       tbb::limiter_node< T > lim(g, i);
+       tbb::flow::graph g;
+       tbb::flow::limiter_node< T > lim(g, i);
        serial_receiver<T> r;
-       empty_sender< tbb::continue_msg > s;
-       lim.register_successor( r );
+       empty_sender< tbb::flow::continue_msg > s;
+       tbb::flow::make_edge( lim, r );
        lim.decrement.register_predecessor( s );
        for ( int j = 0; j < N; ++j ) {
            bool msg = lim.try_put( T(j) );
            ASSERT( ( j < i && msg == true ) || ( j >= i && msg == false ), NULL );
            if ( msg == false ) {
-               lim.decrement.try_put( tbb::continue_msg() );
+               lim.decrement.try_put( tbb::flow::continue_msg() );
                msg = lim.try_put( T(j) );
                ASSERT( msg == true, NULL );
            }
diff --git a/src/test/test_malloc_compliance.cpp b/src/test/test_malloc_compliance.cpp
index 5db0db0..2e74ebf 100644
--- a/src/test/test_malloc_compliance.cpp
+++ b/src/test/test_malloc_compliance.cpp
@@ -26,7 +26,7 @@
     the GNU General Public License.
 */
 
-const int MByte = 1048576; //1MB
+const unsigned MByte = 1048576; //1MB
 bool __tbb_test_errno = false;
 
 /* _WIN32_WINNT should be defined at the very beginning, 
@@ -44,13 +44,13 @@ bool __tbb_test_errno = false;
     #pragma comment(lib, "version.lib")  // to use GetFileVersionInfo*
 #endif
 
-void limitMem( int limit )
+void limitMem( size_t limit )
 {
     static HANDLE hJob = NULL;
     JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo;
 
     jobInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_MEMORY;
-    jobInfo.ProcessMemoryLimit = limit? limit*MByte : 2*1024LL*MByte;
+    jobInfo.ProcessMemoryLimit = limit? limit*MByte : 2*MByte*1024;
     if (NULL == hJob) {
         if (NULL == (hJob = CreateJobObject(NULL, NULL))) {
             REPORT("Can't assign create job object: %ld\n", GetLastError());
@@ -76,7 +76,7 @@ void limitMem( int limit )
 #include <sys/types.h>  // uint64_t on FreeBSD, needed for rlim_t
 #include "harness_report.h"
 
-void limitMem( int limit )
+void limitMem( size_t limit )
 {
     rlimit rlim;
     rlim.rlim_cur = limit? limit*MByte : (rlim_t)RLIM_INFINITY;
@@ -212,9 +212,9 @@ public:
 };
 
 class Limit {
-    int limit;
+    size_t limit;
 public:
-    Limit(int limit) : limit(limit) {}
+    Limit(size_t limit) : limit(limit) {}
     void operator() () const {
         limitMem(limit);
     }
@@ -371,6 +371,27 @@ int main(int argc, char* argv[]) {
     return 0;
 }
 
+// if non-zero byte found, returns bad value address plus 1
+size_t NonZero(void *ptr, size_t size)
+{
+    size_t words = size / sizeof(intptr_t);
+    size_t tailSz = size % sizeof(intptr_t);
+    intptr_t *buf =(intptr_t*)ptr;
+    char *bufTail =(char*)(buf+words);
+
+    for (size_t i=0; i<words; i++)
+        if (buf[i]) {
+            for (unsigned b=0; b<sizeof(intptr_t); b++)
+                if (((char*)(buf+i))[b])
+                    return sizeof(intptr_t)*i + b + 1;
+        }
+    for (size_t i=0; i<tailSz; i++)
+        if (bufTail[i]) {
+            return words*sizeof(intptr_t)+i+1;
+        }
+    return 0;
+}
+
 struct TestStruct
 {
     DWORD field1:2;
@@ -378,22 +399,8 @@ struct TestStruct
     double field3;
     UCHAR field4[100];
     TestStruct* field5;
-//  std::string field6;
     std::vector<int> field7;
     double field8;
-    bool IsZero() {
-        int wordSz = sizeof(TestStruct) / sizeof(intptr_t);
-        int tailSz = sizeof(TestStruct) % sizeof(intptr_t);
-
-        intptr_t *buf =(intptr_t*)this;
-        char *bufTail =(char*) (buf+wordSz);
-
-        for (int i=0; i<wordSz; i++)
-            if (buf[i]) return false;
-        for (int i=0; i<tailSz; i++)
-            if (bufTail[i]) return false;
-        return true;
-    }
 };
 
 int Tposix_memalign(void **memptr, size_t alignment, size_t size)
@@ -567,7 +574,7 @@ void CMemTest::Zerofilling()
             continue;
         for (size_t j=0; j<CountElement; j++)
         {
-            if (!(TSMas+j)->IsZero())
+            if (NonZero(TSMas+j, sizeof(TestStruct)))
             {
                 CountErrors++;
                 if (ShouldReportError()) REPORT("detect nonzero element at TestStruct\n");
@@ -581,6 +588,22 @@ void CMemTest::Zerofilling()
 }
 
 #if !__APPLE__
+
+void myMemset(void *ptr, int c, size_t n)
+{
+#if  __linux__ &&  __i386__
+// memset in Fedora 13 is not always correclty set memory to
+// required values.
+    char *p = (char*)ptr;
+    for (size_t i=0; i<n; i++)
+        p[i] = c;
+#else
+    memset(ptr, c, n);
+#endif
+}
+
+// This test requires 200 MB per thread, i.e. for standart 1:4 run
+// more then 800 MB of RAM is required.
 void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
 {
     // find size to guarantee getting NULL for 1024 B allocations
@@ -596,13 +619,14 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
     void **buf_1024 = (void**)Tmalloc(MAXNUM_1024*sizeof(void*));
 
     ASSERT(buf_1024, NULL);
-    /* We must have space for pointers when memory limit is hit. 
-       Reserve enough for the worst case. 
+    /* We must have space for pointers when memory limit is hit.
+       Reserve enough for the worst case, taking into account race for
+       limited space between threads.
     */
-    PointerList.reserve(200*MByte/MinSize);
+    PointerList.reserve(200*total_threads*MByte/MinSize);
 
-    /* There is a bug in the specific verion of GLIBC (2.5-12) shipped 
-       with RHEL5 that leads to erroneous working of the test 
+    /* There is a bug in the specific verion of GLIBC (2.5-12) shipped
+       with RHEL5 that leads to erroneous working of the test
        on Intel64 and IPF systems when setrlimit-related part is enabled.
        Switching to GLIBC 2.5-18 from RHEL5.1 resolved the issue.
      */
@@ -611,8 +635,8 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
     else
         limitMem(200);
 
-    /* regression test against the bug in allocator when it dereference NULL 
-       while lack of memory 
+    /* regression test against the bug in allocator when it dereference NULL
+       while lack of memory
     */
     for (num_1024=0; num_1024<MAXNUM_1024; num_1024++) {
         buf_1024[num_1024] = Tcalloc(1024, 1);
@@ -630,7 +654,7 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
         tmp=Tmalloc(Size);
         if (tmp != NULL)
         {
-            memset(tmp, 0, Size);
+            myMemset(tmp, 0, Size);
             PointerList.push_back(MemStruct(tmp, Size));
         }
     } while(tmp != NULL);
@@ -667,7 +691,7 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
                     CountErrors++;
                     if (ShouldReportError()) REPORT("error: errno changed to %d though valid pointer was returned\n", errno);
                 }
-                memset(tmp, 0, Size);
+                myMemset(tmp, 0, Size);
                 PointerList.push_back(MemStruct(tmp, Size));
             }
         }
@@ -745,7 +769,7 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
                         if (ShouldReportError()) REPORT("valid pointer returned, error: errno not kept\n");
                     }
                     // newly allocated area have to be zeroed
-                    memset((char*)tmp + PointerList[i].Size, 0, PointerList[i].Size);
+                    myMemset((char*)tmp + PointerList[i].Size, 0, PointerList[i].Size);
                     PointerList[i].Pointer = tmp;
                     PointerList[i].Size *= 2;
                 }
@@ -758,13 +782,10 @@ void CMemTest::NULLReturn(UINT MinSize, UINT MaxSize, int total_threads)
                         if (ShouldReportError()) REPORT("NULL returned, error: errno(%d) != ENOMEM\n", errno);
                     }
                     // check data integrity
-                    BYTE *zer=(BYTE*)PointerList[i].Pointer;
-                    for (UINT k=0; k<PointerList[i].Size; k++)
-                        if (zer[k] != 0)
-                        {
-                            CountErrors++;
-                            if (ShouldReportError()) REPORT("NULL returned, error: data changed\n");
-                        }
+                    if (NonZero(PointerList[i].Pointer, PointerList[i].Size)) {
+                        CountErrors++;
+                        if (ShouldReportError()) REPORT("NULL returned, error: data changed\n");
+                    }
                 }
             }
     if (FullLog) REPORT("realloc end\n");
@@ -799,21 +820,17 @@ void CMemTest::UniquePointer()
         MasPointer[i]=(int*)Tmalloc(MasCountElem[i]*sizeof(int));
         if (NULL == MasPointer[i])
             MasCountElem[i]=0;
-        for (UINT j=0; j<MasCountElem[i]; j++)
-            *(MasPointer[i]+j)=0;
+        memset(MasPointer[i], 0, sizeof(int)*MasCountElem[i]);
     }
     if (FullLog) REPORT("malloc....");
     for (UINT i=0; i<COUNT_ELEM-1; i++)
     {
-        for (UINT j=0; j<MasCountElem[i]; j++)
-        {
-            if (*(*(MasPointer+i)+j)!=0)
-            {
-                CountErrors++;
-                if (ShouldReportError()) REPORT("error, detect 1 with 0x%p\n",(*(MasPointer+i)+j));
-            }
-            *(*(MasPointer+i)+j)+=1;
+        if (size_t badOff = NonZero(MasPointer[i], sizeof(int)*MasCountElem[i])) {
+            CountErrors++;
+            if (ShouldReportError())
+                REPORT("error, detect non-zero at %p\n", (char*)MasPointer[i]+badOff-1);
         }
+        memset(MasPointer[i], 1, sizeof(int)*MasCountElem[i]);
     }
     if (CountErrors) REPORT("%s\n",strError);
     else if (FullLog) REPORT("%s\n",strOk);
@@ -832,15 +849,12 @@ void CMemTest::UniquePointer()
     if (FullLog) REPORT("calloc....");
     for (int i=0; i<COUNT_ELEM-1; i++)
     {
-        for (UINT j=0; j<*(MasCountElem+i); j++)
-        {
-            if (*(*(MasPointer+i)+j)!=0)
-            {
-                CountErrors++;
-                if (ShouldReportError()) REPORT("error, detect 1 with 0x%p\n",(*(MasPointer+i)+j));
-            }
-            *(*(MasPointer+i)+j)+=1;
+        if (size_t badOff = NonZero(MasPointer[i], sizeof(int)*MasCountElem[i])) {
+            CountErrors++;
+            if (ShouldReportError())
+                REPORT("error, detect non-zero at %p\n", (char*)MasPointer[i]+badOff-1);
         }
+        memset(MasPointer[i], 1, sizeof(int)*MasCountElem[i]);
     }
     if (CountErrors) REPORT("%s\n",strError);
     else if (FullLog) REPORT("%s\n",strOk);
@@ -855,20 +869,14 @@ void CMemTest::UniquePointer()
             (int*)Trealloc(*(MasPointer+i),MasCountElem[i]*sizeof(int));
         if (NULL == MasPointer[i])
             MasCountElem[i]=0;
-        for (UINT j=0; j<MasCountElem[i]; j++)
-            *(*(MasPointer+i)+j)=0;
+        memset(MasPointer[i], 0, sizeof(int)*MasCountElem[i]);
     }
     if (FullLog) REPORT("realloc....");
     for (int i=0; i<COUNT_ELEM-1; i++)
     {
-        for (UINT j=0; j<*(MasCountElem+i); j++)
-        {
-            if (*(*(MasPointer+i)+j)!=0)
-            {
-                CountErrors++;
-            }
-            *(*(MasPointer+i)+j)+=1;
-        }
+        if (NonZero(MasPointer[i], sizeof(int)*MasCountElem[i]))
+            CountErrors++;
+        memset(MasPointer[i], 1, sizeof(int)*MasCountElem[i]);
     }
     if (CountErrors) REPORT("%s\n",strError);
     else if (FullLog) REPORT("%s\n",strOk);
diff --git a/src/test/test_malloc_overload.cpp b/src/test/test_malloc_overload.cpp
index 2c6f75d..684d27c 100644
--- a/src/test/test_malloc_overload.cpp
+++ b/src/test/test_malloc_overload.cpp
@@ -115,14 +115,24 @@ public:
     static BackRefIdx newBackRef(bool largeObj);
 };
 
-struct LargeMemoryBlock {
+class ExtMemoryPool;
+
+class BlockI {
+    intptr_t     blockState[2];
+};
+
+struct LargeMemoryBlock : public BlockI {
     LargeMemoryBlock *next,          // ptrs in list of cached blocks
-                     *prev;
+                     *prev,
+                     *gPrev,         // in pool's global list 
+                     *gNext;
     uintptr_t         age;           // age of block while in cache
     size_t            objectSize;    // the size requested by a client
     size_t            unalignedSize; // the size requested from getMemory
     bool              fromMapMemory;
     BackRefIdx        backRefIdx;    // cached here, used copy is in LargeObjectHdr
+    void registerInPool(ExtMemoryPool *extMemPool);
+    void unregisterFromPool(ExtMemoryPool *extMemPool);
 };
 
 struct LargeObjectHdr {
diff --git a/src/test/test_malloc_pools.cpp b/src/test/test_malloc_pools.cpp
new file mode 100644
index 0000000..bd2be42
--- /dev/null
+++ b/src/test/test_malloc_pools.cpp
@@ -0,0 +1,397 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#include "tbb/scalable_allocator.h"
+#include "tbb/atomic.h"
+#include "harness.h"
+#include "harness_barrier.h"
+#include "harness_tbb_independence.h"
+
+template<typename T>
+static inline T alignUp  (T arg, uintptr_t alignment) {
+    return T(((uintptr_t)arg+(alignment-1)) & ~(alignment-1));
+}
+
+struct PoolSpace {
+    size_t pos;
+    int    regions;
+    size_t bufSize;
+    char  *space;
+
+    static const size_t BUF_SIZE = 8*1024*1024;
+
+    PoolSpace(size_t bufSize = BUF_SIZE) :
+        pos(0), regions(0),
+        bufSize(bufSize), space(new char[bufSize]) {
+        memset(space, 0, bufSize);
+    }
+    ~PoolSpace() {
+        delete []space;
+    }
+};
+
+static PoolSpace *poolSpace;
+
+struct MallocPoolHeader {
+    void  *rawPtr;
+    size_t userSize;
+};
+
+static tbb::atomic<int> liveRegions;
+
+static void *getMallocMem(intptr_t /*pool_id*/, size_t &bytes)
+{
+    void *rawPtr = malloc(bytes+sizeof(MallocPoolHeader));
+    if (!rawPtr)
+        return NULL;
+    void *ret = (void *)((uintptr_t)rawPtr+sizeof(MallocPoolHeader));
+
+    MallocPoolHeader *hdr = (MallocPoolHeader*)ret-1;
+    hdr->rawPtr = rawPtr;
+    hdr->userSize = bytes;
+
+    liveRegions++;
+
+    return ret;
+}
+
+static int putMallocMem(intptr_t /*pool_id*/, void *ptr, size_t bytes)
+{
+    MallocPoolHeader *hdr = (MallocPoolHeader*)ptr-1;
+    ASSERT(bytes == hdr->userSize, "Invalid size in pool callback.");
+    free(hdr->rawPtr);
+
+    liveRegions--;
+
+    return 0;
+}
+
+void TestPoolReset()
+{
+    rml::MemPoolPolicy pol;
+    pol.pAlloc = getMallocMem;
+    pol.pFree = putMallocMem;
+    pol.granularity = 8;
+
+    rml::MemoryPool *pool = pool_create(0, &pol);
+    for (int i=0; i<100; i++) {
+        ASSERT(pool_malloc(pool, 8), NULL);
+        ASSERT(pool_malloc(pool, 50*1024), NULL);
+    }
+    int regionsBeforeReset = liveRegions;
+    pool_reset(pool);
+    for (int i=0; i<100; i++) {
+        ASSERT(pool_malloc(pool, 8), NULL);
+        ASSERT(pool_malloc(pool, 50*1024), NULL);
+    }
+    ASSERT(regionsBeforeReset == liveRegions,
+           "Expected no new regions allocation.");
+    pool_destroy(pool);
+    ASSERT(!liveRegions, "Expected all regions were released.");
+}
+
+class SharedPoolRun: NoAssign {
+    static long                 threadNum;
+    static Harness::SpinBarrier startB,
+                                mallocDone;
+    static rml::MemoryPool     *pool;
+    static void               **crossThread,
+                              **afterTerm;
+public:
+    static const int OBJ_CNT = 100;
+
+    static void init(int num, rml::MemoryPool *pl, void **crThread, void **aTerm) {
+        threadNum = num;
+        pool = pl;
+        crossThread = crThread;
+        afterTerm = aTerm;
+        startB.initialize(threadNum);
+        mallocDone.initialize(threadNum);
+    }
+
+    void operator()( int id ) const {
+        const int ITERS = 1000;
+        void *local[ITERS];
+
+        startB.wait();
+        for (int i=id*OBJ_CNT; i<(id+1)*OBJ_CNT; i++) {
+            afterTerm[i] = pool_malloc(pool, i%2? 8*1024 : 9*1024);
+            memset(afterTerm[i], i, i%2? 8*1024 : 9*1024);
+            crossThread[i] = pool_malloc(pool, i%2? 9*1024 : 8*1024);
+            memset(crossThread[i], i, i%2? 9*1024 : 8*1024);
+        }
+
+        for (int i=1; i<ITERS; i+=2) {
+            local[i-1] = pool_malloc(pool, 6*1024);
+            memset(local[i-1], i, 6*1024);
+            local[i] = pool_malloc(pool, 16*1024);
+            memset(local[i], i, 16*1024);
+        }
+        mallocDone.wait();
+        int myVictim = threadNum-id-1;
+        for (int i=myVictim*OBJ_CNT; i<(myVictim+1)*OBJ_CNT; i++)
+            pool_free(pool, crossThread[i]);
+        for (int i=0; i<ITERS; i++)
+            pool_free(pool, local[i]);
+    }
+};
+
+long                 SharedPoolRun::threadNum;
+Harness::SpinBarrier SharedPoolRun::startB,
+                     SharedPoolRun::mallocDone;
+rml::MemoryPool     *SharedPoolRun::pool;
+void               **SharedPoolRun::crossThread,
+                   **SharedPoolRun::afterTerm;
+
+// single pool shared by different threads
+void TestSharedPool()
+{
+    rml::MemPoolPolicy pol;
+    pol.pAlloc = getMallocMem;
+    pol.pFree = putMallocMem;
+    pol.granularity = 8;
+
+    rml::MemoryPool *pool = pool_create(0, &pol);
+
+    void **crossThread = new void*[MaxThread * SharedPoolRun::OBJ_CNT];
+    void **afterTerm = new void*[MaxThread * SharedPoolRun::OBJ_CNT];
+
+    for (int p=MinThread; p<=MaxThread; p++) {
+        SharedPoolRun::init(p, pool, crossThread, afterTerm);
+        SharedPoolRun thr;
+
+        void *hugeObj = pool_malloc(pool, 10*1024*1024);
+        ASSERT(hugeObj, NULL);
+
+        NativeParallelFor( p, thr );
+
+        pool_free(pool, hugeObj);
+        for (int i=0; i<p*SharedPoolRun::OBJ_CNT; i++)
+            pool_free(pool, afterTerm[i]);
+    }
+    delete []afterTerm;
+    delete []crossThread;
+
+    pool_destroy(pool);
+    ASSERT(!liveRegions, "Expected all regions were released.");
+}
+
+void *CrossThreadGetMem(intptr_t pool_id, size_t &bytes)
+{
+    if (poolSpace[pool_id].pos + bytes > poolSpace[pool_id].bufSize)
+        return NULL;
+
+    void *ret = poolSpace[pool_id].space + poolSpace[pool_id].pos;
+    poolSpace[pool_id].pos += bytes;
+    poolSpace[pool_id].regions++;
+
+    return ret;
+}
+
+int CrossThreadPutMem(intptr_t pool_id, void* /*raw_ptr*/, size_t /*raw_bytes*/)
+{
+    poolSpace[pool_id].regions--;
+    return 0;
+}
+
+class CrossThreadRun: NoAssign {
+    static long number_of_threads;
+    static Harness::SpinBarrier barrier;
+    static rml::MemoryPool **pool;
+    static char **obj;
+public:
+    static void initBarrier(unsigned thrds) { barrier.initialize(thrds); }
+    static void init(long num) {
+        number_of_threads = num;
+        pool = new rml::MemoryPool*[number_of_threads];
+        poolSpace = new PoolSpace[number_of_threads];
+        obj = new char*[number_of_threads];
+    }
+    static void destroy() {
+        for (long i=0; i<number_of_threads; i++)
+            ASSERT(!poolSpace[i].regions, "Memory leak detected");
+        delete []pool;
+        delete []poolSpace;
+        delete []obj;
+    }
+    CrossThreadRun() {}
+    void operator()( int id ) const {
+        rml::MemPoolPolicy pol;
+
+        pol.pAlloc = CrossThreadGetMem;
+        pol.pFree = CrossThreadPutMem;
+        pol.granularity = 8;
+        pool[id] = pool_create(id, &pol);
+        const int objLen = 10*id;
+
+        obj[id] = (char*)pool_malloc(pool[id], objLen);
+        ASSERT(obj[id], NULL);
+        memset(obj[id], id, objLen);
+
+        {
+            const size_t lrgSz = 2*16*1024;
+            void *ptrLarge = pool_malloc(pool[id], lrgSz);
+            ASSERT(ptrLarge, NULL);
+            memset(ptrLarge, 1, lrgSz);
+
+            // consume all small objects
+            while (pool_malloc(pool[id], 5*1024))
+                ;
+            // releasing of large object can give a chance to allocate more
+            pool_free(pool[id], ptrLarge);
+
+            ASSERT(pool_malloc(pool[id], 5*1024), NULL);
+        }
+
+        barrier.wait();
+        int myPool = number_of_threads-id-1;
+        for (int i=0; i<10*myPool; i++)
+            ASSERT(myPool==obj[myPool][i], NULL);
+        pool_free(pool[myPool], obj[myPool]);
+        pool_destroy(pool[myPool]);
+    }
+};
+
+long CrossThreadRun::number_of_threads;
+Harness::SpinBarrier CrossThreadRun::barrier;
+rml::MemoryPool **CrossThreadRun::pool;
+char **CrossThreadRun::obj;
+
+// pools created, used and destored by different threads
+void TestCrossThreadPools()
+{
+    for (int p=MinThread; p<=MaxThread; p++) {
+        CrossThreadRun::initBarrier(p);
+        CrossThreadRun::init(p);
+        NativeParallelFor( p, CrossThreadRun() );
+        for (int i=0; i<p; i++)
+            ASSERT(!poolSpace[i].regions, "Region leak detected");
+        CrossThreadRun::destroy();
+    }
+}
+
+// buffer is too small to pool be created, but must not leak resourses
+void TestTooSmallBuffer()
+{
+    poolSpace = new PoolSpace(8*1024);
+
+    rml::MemPoolPolicy pol;
+    pol.pAlloc = CrossThreadGetMem;
+    pol.pFree = CrossThreadPutMem;
+    pol.granularity = 8;
+    pool_destroy( pool_create(0, &pol) );
+    ASSERT(!poolSpace[0].regions, "No leaks.");
+
+    delete poolSpace;
+}
+
+static void *fixedBufGetMem(intptr_t /*pool_id*/, size_t &bytes)
+{
+    static const size_t BUF_SZ = 8*1024*1024;
+    static char buf[BUF_SZ];
+    static bool used;
+
+    if (used)
+        return NULL;
+    used = true;
+    bytes = BUF_SZ;
+    return buf;
+}
+
+void TestFixedBufferPool()
+{
+    void *ptrs[7];
+    rml::MemPoolPolicy pol;
+
+    pol.pAlloc = fixedBufGetMem;
+    pol.pFree = NULL;
+    pol.granularity = 8;
+    rml::MemoryPool *pool = pool_create(0, &pol);
+
+    void *largeObj = pool_malloc(pool, 7*1024*1024);
+    ASSERT(largeObj, NULL);
+    pool_free(pool, largeObj);
+
+    for (int i=0; i<7; i++) {
+        ptrs[i] = pool_malloc(pool, 1024*1024);
+        ASSERT(ptrs[i], NULL);
+    }
+    for (int i=0; i<7; i++)
+        pool_free(pool, ptrs[i]);
+
+    largeObj = pool_malloc(pool, 7*1024*1024);
+    ASSERT(largeObj, NULL);
+    pool_free(pool, largeObj);
+
+    pool_destroy(pool);
+}
+
+static size_t currGranularity;
+
+static void *getGranMem(intptr_t /*pool_id*/, size_t &bytes)
+{
+    ASSERT(!(bytes%currGranularity), "Region size mismatch granularity.");
+    return malloc(bytes);
+}
+
+static int putGranMem(intptr_t /*pool_id*/, void *ptr, size_t bytes)
+{
+    ASSERT(!(bytes%currGranularity), "Region size mismatch granularity.");
+    free(ptr);
+    return 0;
+}
+
+static void TestPoolGranularity()
+{
+    rml::MemPoolPolicy pol;
+    const size_t grans[] = {4*1024, 2*1024*1024, 6*1024*1024, 10*1024*1024};
+
+    pol.pAlloc = getGranMem;
+    pol.pFree = putGranMem;
+    for (unsigned i=0; i<sizeof(grans)/sizeof(grans[0]); i++) {
+        pol.granularity = currGranularity = grans[i];
+        rml::MemoryPool *pool = pool_create(0, &pol);
+        for (int sz=500*1024; sz<16*1024*1024; sz+=101*1024) {
+            void *p = pool_malloc(pool, sz);
+            ASSERT(p, "Can't allocate memory in pool.");
+            pool_free(pool, p);
+        }
+        pool_destroy(pool);
+    }
+}
+
+int TestMain () {
+    TestTooSmallBuffer();
+    TestPoolReset();
+    TestSharedPool();
+    TestCrossThreadPools();
+    TestFixedBufferPool();
+    TestPoolGranularity();
+
+    return Harness::Done;
+}
diff --git a/src/test/test_malloc_regression.cpp b/src/test/test_malloc_regression.cpp
index 8223639..72d4d8f 100644
--- a/src/test/test_malloc_regression.cpp
+++ b/src/test/test_malloc_regression.cpp
@@ -50,14 +50,14 @@ void RunThread(const Body& body, const Arg& arg) {
 }
 
 /*--------------------------------------------------------------------*/
-// The regression test against bug #1518 where thread boot strap allocations "leaked"
+// The regression test against bug #1518 where thread bootstrap allocations "leaked"
 
 #include "harness_memory.h"
 
 bool TestBootstrapLeak() {
     /* In the bug 1518, each thread leaked ~384 bytes.
        Initially, scalable allocator maps 1MB. Thus it is necessary to take out most of this space.
-       1MB is chunked into 16K blocks; of those, one block is for thread boot strap, and one more 
+       1MB is chunked into 16K blocks; of those, one block is for thread bootstrap, and one more
        should be reserved for the test body. 62 blocks left, each can serve 15 objects of 1024 bytes.
     */
     const int alloc_size = 1024;
@@ -79,7 +79,7 @@ bool TestBootstrapLeak() {
     }
 
     ptrdiff_t memory_leak = 0;
-    // Note that 16K boot strap memory block is enough to serve 42 threads.
+    // Note that 16K bootstrap memory block is enough to serve 42 threads.
     const int num_thread_runs = 200;
     for (int run=0; run<3; run++) {
         memory_in_use = GetMemoryUsage();
@@ -114,7 +114,7 @@ bool TestReallocMsize(size_t startSz) {
     buf[realSz-1] = 0;
     char *buf1 = (char*)scalable_realloc(buf, 2*realSz);
     ASSERT(buf1, "");
-    ASSERT(scalable_msize(buf1)>=2*realSz, 
+    ASSERT(scalable_msize(buf1)>=2*realSz,
            "scalable_msize must be not less then allocated size");
     buf1[2*realSz-1] = 0;
     if ( strspn(buf1, "a") < realSz-1 ) {
@@ -144,7 +144,7 @@ int TestMain () {
     }
     for (size_t a=2; a<=64*1024; a*=2)
         passed &= TestReallocMsize(a);
-    
+
     ASSERT( passed, "Test failed" );
     return Harness::Done;
 }
diff --git a/src/test/test_malloc_whitebox.cpp b/src/test/test_malloc_whitebox.cpp
index 072da57..5f807ac 100644
--- a/src/test/test_malloc_whitebox.cpp
+++ b/src/test/test_malloc_whitebox.cpp
@@ -221,6 +221,11 @@ static size_t allocatedBackRefCount()
     return cnt;
 }
 
+static void cleanObjectCache()
+{
+    defaultMemPool->extMemPool.hardCachesCleanup();
+}
+
 void TestBackRef() {
     size_t beforeNumBackRef, afterNumBackRef;
 
@@ -245,11 +250,127 @@ void TestBackRef() {
     ASSERT(beforeNumBackRef==afterNumBackRef, "backreference leak detected");
 }
 
+void *getMem(intptr_t /*pool_id*/, size_t &bytes)
+{
+    const size_t BUF_SIZE = 8*1024*1024;
+    static char space[BUF_SIZE];
+    static size_t pos;
+
+    if (pos + bytes > BUF_SIZE)
+        return NULL;
+
+    void *ret = space + pos;
+    pos += bytes;
+
+    return ret;
+}
+
+int putMem(intptr_t /*pool_id*/, void* /*raw_ptr*/, size_t /*raw_bytes*/)
+{
+    return 0;
+}
+
+struct MallocPoolHeader {
+    void  *rawPtr;
+    size_t userSize;
+};
+
+void *getMallocMem(intptr_t /*pool_id*/, size_t &bytes)
+{
+    void *rawPtr = malloc(bytes+sizeof(MallocPoolHeader));
+    void *ret = (void *)((uintptr_t)rawPtr+sizeof(MallocPoolHeader));
+
+    MallocPoolHeader *hdr = (MallocPoolHeader*)ret-1;
+    hdr->rawPtr = rawPtr;
+    hdr->userSize = bytes;
+
+    return ret;
+}
+
+int putMallocMem(intptr_t /*pool_id*/, void *ptr, size_t bytes)
+{
+    MallocPoolHeader *hdr = (MallocPoolHeader*)ptr-1;
+    ASSERT(bytes == hdr->userSize, "Invalid size in pool callback.");
+    free(hdr->rawPtr);
+
+    return 0;
+}
+
+void TestPools() {
+    rml::MemPoolPolicy pol;
+    size_t beforeNumBackRef, afterNumBackRef;
+
+    pol.pAlloc = getMem;
+    pol.pFree = putMem;
+    pol.granularity = 8;
+    rml::MemoryPool *pool1 = pool_create(0, &pol);
+    rml::MemoryPool *pool2 = pool_create(0, &pol);
+    pool_destroy(pool1);
+    pool_destroy(pool2);
+
+    cleanObjectCache();
+    beforeNumBackRef = allocatedBackRefCount();
+    rml::MemoryPool *fixedPool = pool_create(0, &pol);
+
+    pol.pAlloc = getMallocMem;
+    pol.pFree = putMallocMem;
+    pol.granularity = 8;
+    rml::MemoryPool *mallocPool = pool_create(0, &pol);
+
+/* check that large object cache (LOC) returns correct size for cached objects
+   passBackendSz Byte objects are cached in LOC, but bypassed the backend, so
+   memory requested directly from allocation callback.
+   nextPassBackendSz Byte objects must fit to another LOC bin,
+   so that their allocation/realeasing leads to cache cleanup.
+   All this is expecting to lead to releasing of passBackendSz Byte object
+   from LOC during LOC cleanup, and putMallocMem checks that returned size
+   is correct.
+*/
+    const size_t passBackendSz = Backend::maxBinedSize+1,
+        anotherLOCBinSz = minLargeObjectSize+1;
+    for (int i=0; i<10; i++) { // run long enough to be cached
+        void *p = pool_malloc(mallocPool, passBackendSz);
+        ASSERT(p, "Memory was not allocated");
+        pool_free(mallocPool, p);
+    }
+    // run long enough to passBackendSz allocation was cleaned from cache
+    // and returned back to putMallocMem for size checking
+    for (int i=0; i<1000; i++) {
+        void *p = pool_malloc(mallocPool, anotherLOCBinSz);
+        ASSERT(p, "Memory was not allocated");
+        pool_free(mallocPool, p);
+    }
+
+    void *smallObj =  pool_malloc(fixedPool, 10);
+    memset(smallObj, 1, 10);
+    void *ptr = pool_malloc(fixedPool, 1024);
+    memset(ptr, 1, 1024);
+    void *largeObj = pool_malloc(fixedPool, minLargeObjectSize);
+    memset(largeObj, 1, minLargeObjectSize);
+    ptr = pool_malloc(fixedPool, minLargeObjectSize);
+    memset(ptr, minLargeObjectSize, minLargeObjectSize);
+    pool_malloc(fixedPool, 10*minLargeObjectSize); // no leak for unsuccesful allocations
+    pool_free(fixedPool, smallObj);
+    pool_free(fixedPool, largeObj);
+
+    // provoke large object cache cleanup and hope no leaks occurs
+    for (size_t sz=minLargeObjectSize; sz<1*1024*1024; sz+=largeBlockCacheStep) {
+        ptr = pool_malloc(mallocPool, sz);
+        memset(ptr, sz, sz);
+        pool_free(mallocPool, ptr);
+    }
+    pool_destroy(mallocPool);
+    pool_destroy(fixedPool);
+
+    cleanObjectCache();
+    afterNumBackRef = allocatedBackRefCount();
+    ASSERT(beforeNumBackRef==afterNumBackRef, "backreference leak detected");
+}
+
 void TestObjectRecognition() {
     size_t headersSize = sizeof(LargeMemoryBlock)+sizeof(LargeObjectHdr);
     unsigned falseObjectSize = 113; // unsigned is the type expected by getObjectSize
     size_t obtainedSize;
-    Block *auxBackRef;
 
     ASSERT(sizeof(BackRefIdx)==4, "Unexpected size of BackRefIdx");
     ASSERT(getObjectSize(falseObjectSize)!=falseObjectSize, "Error in test: bad choice for false object size");
@@ -316,12 +437,61 @@ void TestObjectRecognition() {
     scalable_free(bufferLOH);
 }
 
+class TestBackendWork: NoAssign {
+    struct TestBlock {
+        intptr_t   data;
+        BackRefIdx idx;
+    };
+    static const int ITERS = 100;
+
+    Harness::SpinBarrier *barrier;
+    rml::internal::Backend *backend;
+public:
+    TestBackendWork(rml::internal::Backend *backend, Harness::SpinBarrier *barrier) : 
+        backend(backend), barrier(barrier) {}
+    void operator()(int) const {
+        barrier->wait();
+        
+        for (int i=0; i<ITERS; i++) {
+            BlockI *block16K = backend->get16KBlock(1, /*startup=*/false);
+            LargeMemoryBlock *lmb = backend->getLargeBlock(16*1024, /*startup=*/false);
+            backend->put16KBlock(block16K, /*startup=*/false);
+            backend->putLargeBlock(lmb);
+        }
+    }
+};
+
+void TestBackend()
+{
+    rml::MemPoolPolicy pol;
+    Harness::SpinBarrier barrier;
+
+    pol.pAlloc = getMallocMem;
+    pol.pFree = putMallocMem;
+    pol.granularity = 8;
+    rml::MemoryPool *mPool = pool_create(0, &pol);
+    rml::internal::ExtMemoryPool *ePool = 
+        &((rml::internal::MemoryPool*)mPool)->extMemPool;
+    rml::internal::Backend *backend = &ePool->backend;
+
+    for( int p=MaxThread; p>=MinThread; --p ) {
+        barrier.initialize(p);
+        NativeParallelFor( p, TestBackendWork(backend, &barrier) );
+    }
+
+    BlockI *block = backend->get16KBlock(1, /*startup=*/false);
+    backend->put16KBlock(block, /*startup=*/false);
+
+    pool_destroy(mPool);
+}
 
 int TestMain () {
     // backreference requires that initialization was done
     if(!isMallocInitialized()) doInitialization();
-     // to succeed, leak detection must be the 1st memory-intensive test
+    // to succeed, leak detection must be the 1st memory-intensive test
     TestBackRef();
+    TestPools();
+    TestBackend();
 
 #if MALLOC_CHECK_RECURSION
     for( int p=MaxThread; p>=MinThread; --p ) {
diff --git a/src/test/test_multioutput_function_node.cpp b/src/test/test_multioutput_function_node.cpp
new file mode 100644
index 0000000..569cb83
--- /dev/null
+++ b/src/test/test_multioutput_function_node.cpp
@@ -0,0 +1,471 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#define TBB_PREVIEW_GRAPH_NODES 1
+#include "harness_graph.h"
+
+#include "tbb/task_scheduler_init.h"
+#include "tbb/spin_mutex.h"
+
+#if !__SUNPRO_CC
+
+tbb::spin_mutex global_mutex;
+
+#define N 100
+#define MAX_NODES 4
+
+//! Performs test on function nodes with limited concurrency and buffering
+/** Theses tests check:
+    1) that the number of executing copies never exceed the concurreny limit
+    2) that the node never rejects
+    3) that no items are lost
+    and 4) all of this happens even if there are multiple predecessors and successors
+*/
+
+template< typename InputType >
+struct parallel_put_until_limit : private NoAssign {
+
+    harness_counting_sender<InputType> *my_senders;
+
+    parallel_put_until_limit( harness_counting_sender<InputType> *senders ) : my_senders(senders) {}
+
+    void operator()( int i ) const  {
+        if ( my_senders ) {
+            my_senders[i].try_put_until_limit();
+        }
+    }
+
+};
+     
+//! exercise buffered multioutput_function_node.  
+template< typename InputType, typename OutputTuple, typename Body >
+void buffered_levels( size_t concurrency, Body body ) {
+    typedef typename std::tuple_element<0,OutputTuple>::type OutputType;
+    // Do for lc = 1 to concurrency level
+    for ( size_t lc = 1; lc <= concurrency; ++lc ) { 
+        tbb::flow::graph g;
+
+        // Set the execute_counter back to zero in the harness
+        harness_graph_multioutput_executor<InputType, OutputTuple,tbb::spin_mutex>::execute_count = 0;
+        // Set the max allowed executors to lc.  There is a check in the functor to make sure this is never exceeded.
+        harness_graph_multioutput_executor<InputType, OutputTuple,tbb::spin_mutex>::max_executors = lc;
+
+        // Create the function_node with the appropriate concurreny level, and use default buffering
+        tbb::flow::multioutput_function_node< InputType, OutputTuple > exe_node( g, lc, body );
+   
+        //Create a vector of identical exe_nodes
+        std::vector< tbb::flow::multioutput_function_node< InputType, OutputTuple > > exe_vec(2, exe_node);
+
+        // exercise each of the copied nodes
+        for (size_t node_idx=0; node_idx<exe_vec.size(); ++node_idx) {
+            for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
+                // Create num_receivers counting receivers and connect the exe_vec[node_idx] to them.
+                harness_mapped_receiver<OutputType> *receivers = new harness_mapped_receiver<OutputType>[num_receivers];
+                for (size_t r = 0; r < num_receivers; ++r ) {
+                    tbb::flow::make_edge( tbb::flow::output_port<0>(exe_vec[node_idx]), receivers[r] );
+                }
+
+                // Do the test with varying numbers of senders
+                harness_counting_sender<InputType> *senders = NULL;
+                for (size_t num_senders = 1; num_senders <= MAX_NODES; ++num_senders ) {
+                    // Create num_senders senders, set there message limit each to N, and connect them to the exe_vec[node_idx]
+                    senders = new harness_counting_sender<InputType>[num_senders];
+                    for (size_t s = 0; s < num_senders; ++s ) {
+                        senders[s].my_limit = N;
+                        tbb::flow::make_edge( senders[s], exe_vec[node_idx] );
+                    }
+
+                    // Initialize the receivers so they know how many senders and messages to check for
+                    for (size_t r = 0; r < num_receivers; ++r ) {
+                         receivers[r].initialize_map( N, num_senders ); 
+                    }
+
+                    // Do the test
+                    NativeParallelFor( (int)num_senders, parallel_put_until_limit<InputType>(senders) );
+                    g.wait_for_all();
+
+                    // cofirm that each sender was requested from N times 
+                    for (size_t s = 0; s < num_senders; ++s ) {
+                        size_t n = senders[s].my_received;
+                        ASSERT( n == N, NULL ); 
+                        ASSERT( senders[s].my_receiver == &exe_vec[node_idx], NULL );
+                    }
+                    // validate the receivers
+                    for (size_t r = 0; r < num_receivers; ++r ) {
+                        receivers[r].validate();
+                    }
+                    delete [] senders;
+                }
+                for (size_t r = 0; r < num_receivers; ++r ) {
+                    tbb::flow::remove_edge( tbb::flow::output_port<0>(exe_vec[node_idx]), receivers[r] );
+                }
+                ASSERT( exe_vec[node_idx].try_put( InputType() ) == true, NULL );
+                g.wait_for_all();
+                for (size_t r = 0; r < num_receivers; ++r ) {
+                    // since it's detached, nothing should have changed
+                    receivers[r].validate();
+                }
+                delete [] receivers;
+            }
+        } 
+    }
+}
+
+const size_t Offset = 123;
+tbb::atomic<size_t> global_execute_count;
+
+struct inc_functor {
+
+    tbb::atomic<size_t> local_execute_count;
+    inc_functor( ) { local_execute_count = 0; }
+    inc_functor( const inc_functor &f ) { local_execute_count = f.local_execute_count; }
+
+    template<typename ports_type>
+    void operator()( int i, ports_type &p ) {
+       ++global_execute_count;
+       ++local_execute_count;
+       std::get<0>(p).put(i);
+    }
+
+};
+
+template< typename InputType, typename OutputTuple >
+void buffered_levels_with_copy( size_t concurrency ) {
+    typedef typename std::tuple_element<0,OutputTuple>::type OutputType;
+    // Do for lc = 1 to concurrency level
+    for ( size_t lc = 1; lc <= concurrency; ++lc ) { 
+        tbb::flow::graph g;
+
+        inc_functor cf;
+        cf.local_execute_count = Offset;
+        global_execute_count = Offset;
+       
+        tbb::flow::multioutput_function_node< InputType, OutputTuple > exe_node( g, lc, cf );
+
+        for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
+           harness_mapped_receiver<OutputType> *receivers = new harness_mapped_receiver<OutputType>[num_receivers];
+           for (size_t r = 0; r < num_receivers; ++r ) {
+               tbb::flow::make_edge( tbb::flow::output_port<0>(exe_node), receivers[r] );
+            }
+
+            harness_counting_sender<InputType> *senders = NULL;
+            for (size_t num_senders = 1; num_senders <= MAX_NODES; ++num_senders ) {
+                senders = new harness_counting_sender<InputType>[num_senders];
+                for (size_t s = 0; s < num_senders; ++s ) {
+                    senders[s].my_limit = N;
+                    tbb::flow::make_edge( senders[s], exe_node );
+                }
+
+                for (size_t r = 0; r < num_receivers; ++r ) {
+                    receivers[r].initialize_map( N, num_senders ); 
+                }
+
+                NativeParallelFor( (int)num_senders, parallel_put_until_limit<InputType>(senders) );
+                g.wait_for_all();
+
+                for (size_t s = 0; s < num_senders; ++s ) {
+                    size_t n = senders[s].my_received;
+                    ASSERT( n == N, NULL ); 
+                    ASSERT( senders[s].my_receiver == &exe_node, NULL );
+                }
+                for (size_t r = 0; r < num_receivers; ++r ) {
+                    receivers[r].validate();
+                }
+                delete [] senders;
+            }
+            for (size_t r = 0; r < num_receivers; ++r ) {
+                tbb::flow::remove_edge( tbb::flow::output_port<0>(exe_node), receivers[r] );
+            }
+            ASSERT( exe_node.try_put( InputType() ) == true, NULL );
+            g.wait_for_all();
+            for (size_t r = 0; r < num_receivers; ++r ) {
+                receivers[r].validate();
+            }
+            delete [] receivers;
+        }
+
+        // validate that the local body matches the global execute_count and both are correct
+        inc_functor body_copy = tbb::flow::copy_body<inc_functor>( exe_node );
+        const size_t expected_count = N/2 * MAX_NODES * MAX_NODES * ( MAX_NODES + 1 ) + MAX_NODES + Offset; 
+        size_t global_count = global_execute_count;
+        size_t inc_count = body_copy.local_execute_count;
+        ASSERT( global_count == expected_count && global_count == inc_count, NULL ); 
+    }
+}
+
+template< typename InputType, typename OutputTuple >
+void run_buffered_levels( int c ) {
+    typedef typename tbb::flow::multioutput_function_node<InputType,OutputTuple>::ports_type ports_type;
+    harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::max_executors = c;
+    #if __TBB_LAMBDAS_PRESENT
+    buffered_levels<InputType,OutputTuple>( c, []( InputType i, ports_type &p ) { harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::func(i,p); } );
+    #endif
+    buffered_levels<InputType,OutputTuple>( c, &harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::func );
+    buffered_levels<InputType,OutputTuple>( c, typename harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::functor() );
+    buffered_levels_with_copy<InputType,OutputTuple>( c );
+}
+
+
+//! Performs test on executable nodes with limited concurrency
+/** Theses tests check:
+    1) that the nodes will accepts puts up to the concurrency limit,
+    2) the nodes do not exceed the concurrency limit even when run with more threads (this is checked in the harness_graph_executor), 
+    3) the nodes will receive puts from multiple successors simultaneously,
+    and 4) the nodes will send to multiple predecessors.
+    There is no checking of the contents of the messages for corruption.
+*/
+     
+template< typename InputType, typename OutputTuple, typename Body >
+void concurrency_levels( size_t concurrency, Body body ) {
+    typedef typename std::tuple_element<0,OutputTuple>::type OutputType;
+    for ( size_t lc = 1; lc <= concurrency; ++lc ) { 
+        tbb::flow::graph g;
+        harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::execute_count = 0;
+
+        tbb::flow::multioutput_function_node< InputType, OutputTuple, tbb::flow::rejecting > exe_node( g, lc, body );
+
+        for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
+
+            harness_counting_receiver<OutputType> *receivers = new harness_counting_receiver<OutputType>[num_receivers];
+
+            for (size_t r = 0; r < num_receivers; ++r ) {
+                tbb::flow::make_edge( tbb::flow::output_port<0>(exe_node), receivers[r] );
+            }
+
+            harness_counting_sender<InputType> *senders = NULL;
+    
+            for (size_t num_senders = 1; num_senders <= MAX_NODES; ++num_senders ) {
+                {
+                    // lock m to prevent exe_node from finishing
+                    tbb::spin_mutex::scoped_lock l( harness_graph_multioutput_executor< InputType, OutputTuple, tbb::spin_mutex >::mutex );
+    
+                    // put to lc level, it will accept and then block at m
+                    for ( size_t c = 0 ; c < lc ; ++c ) {
+                        ASSERT( exe_node.try_put( InputType() ) == true, NULL );
+                    }
+                    // it only accepts to lc level
+                    ASSERT( exe_node.try_put( InputType() ) == false, NULL );
+    
+                    senders = new harness_counting_sender<InputType>[num_senders];
+                    for (size_t s = 0; s < num_senders; ++s ) {
+                       // register a sender
+                       senders[s].my_limit = N;
+                       exe_node.register_predecessor( senders[s] );
+                    }
+    
+                } // release lock at end of scope, setting the exe node free to continue
+                // wait for graph to settle down
+                g.wait_for_all();
+    
+                // confirm that each sender was requested from N times 
+                for (size_t s = 0; s < num_senders; ++s ) {
+                    size_t n = senders[s].my_received;
+                    ASSERT( n == N, NULL ); 
+                    ASSERT( senders[s].my_receiver == &exe_node, NULL );
+                }
+                // confirm that each receivers got N * num_senders + the initial lc puts
+                for (size_t r = 0; r < num_receivers; ++r ) {
+                    size_t n = receivers[r].my_count;
+                    ASSERT( n == num_senders*N+lc, NULL );
+                    receivers[r].my_count = 0;
+                }
+                delete [] senders;
+            }
+            for (size_t r = 0; r < num_receivers; ++r ) {
+                tbb::flow::remove_edge( tbb::flow::output_port<0>(exe_node), receivers[r] );
+            }
+            ASSERT( exe_node.try_put( InputType() ) == true, NULL );
+            g.wait_for_all();
+            for (size_t r = 0; r < num_receivers; ++r ) {
+                ASSERT( int(receivers[r].my_count) == 0, NULL );
+            }
+            delete [] receivers;
+        }
+    }
+}
+
+template< typename InputType, typename OutputTuple >
+void run_concurrency_levels( int c ) {
+    harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::max_executors = c;
+    typedef typename tbb::flow::multioutput_function_node<InputType,OutputTuple>::ports_type ports_type;
+    #if __TBB_LAMBDAS_PRESENT
+    concurrency_levels<InputType,OutputTuple>( c, []( InputType i, ports_type &p ) { harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::func(i,p); } );
+    #endif
+    concurrency_levels<InputType,OutputTuple>( c, &harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::func );
+    concurrency_levels<InputType,OutputTuple>( c, typename harness_graph_multioutput_executor<InputType, OutputTuple, tbb::spin_mutex>::functor() );
+}
+
+
+struct empty_no_assign { 
+   empty_no_assign() {}
+   empty_no_assign( int ) {}
+   operator int() { return 0; }
+   operator int() const { return 0; }
+};
+
+template< typename InputType >
+struct parallel_puts : private NoAssign {
+
+    tbb::flow::receiver< InputType > * const my_exe_node;
+
+    parallel_puts( tbb::flow::receiver< InputType > &exe_node ) : my_exe_node(&exe_node) {}
+
+    void operator()( int ) const  {
+        for ( int i = 0; i < N; ++i ) {
+            // the nodes will accept all puts
+            ASSERT( my_exe_node->try_put( InputType() ) == true, NULL );
+        }
+    }
+
+};
+
+//! Performs test on executable nodes with unlimited concurrency
+/** These tests check:
+    1) that the nodes will accept all puts
+    2) the nodes will receive puts from multiple predecessors simultaneously,
+    and 3) the nodes will send to multiple successors.
+    There is no checking of the contents of the messages for corruption.
+*/
+
+template< typename InputType, typename OutputTuple, typename Body >
+void unlimited_concurrency( Body body ) {
+    typedef typename std::tuple_element<0,OutputTuple>::type OutputType;
+
+    for (int p = 1; p < 2*MaxThread; ++p) {
+        tbb::flow::graph g;
+        tbb::flow::multioutput_function_node< InputType, OutputTuple, tbb::flow::rejecting > exe_node( g, tbb::flow::unlimited, body );
+
+        for (size_t num_receivers = 1; num_receivers <= MAX_NODES; ++num_receivers ) {
+            harness_counting_receiver<OutputType> *receivers = new harness_counting_receiver<OutputType>[num_receivers];
+            harness_graph_multioutput_executor<InputType, OutputTuple>::execute_count = 0;
+
+            for (size_t r = 0; r < num_receivers; ++r ) {
+                tbb::flow::make_edge( tbb::flow::output_port<0>(exe_node), receivers[r] );
+            }
+
+            NativeParallelFor( p, parallel_puts<InputType>(exe_node) );
+            g.wait_for_all(); 
+
+            // 2) the nodes will receive puts from multiple predecessors simultaneously,
+            size_t ec = harness_graph_multioutput_executor<InputType, OutputTuple>::execute_count;
+            ASSERT( (int)ec == p*N, NULL ); 
+            for (size_t r = 0; r < num_receivers; ++r ) {
+                size_t c = receivers[r].my_count;
+                // 3) the nodes will send to multiple successors.
+                ASSERT( (int)c == p*N, NULL );
+            }
+        }
+    }
+}
+
+template< typename InputType, typename OutputTuple >
+void run_unlimited_concurrency() {
+    typedef typename tbb::flow::multioutput_function_node<InputType,OutputTuple>::ports_type ports_type;
+    harness_graph_multioutput_executor<InputType, OutputTuple>::max_executors = 0;
+    #if __TBB_LAMBDAS_PRESENT
+    unlimited_concurrency<InputType,OutputTuple>( []( InputType i, ports_type &p ) { harness_graph_multioutput_executor<InputType, OutputTuple>::func(i,p); } );
+    #endif
+    unlimited_concurrency<InputType,OutputTuple>( &harness_graph_multioutput_executor<InputType, OutputTuple>::func );
+    unlimited_concurrency<InputType,OutputTuple>( typename harness_graph_multioutput_executor<InputType, OutputTuple>::functor() );
+}
+
+template<typename InputType, typename OutputTuple>
+struct oddEvenBody {
+    typedef typename tbb::flow::multioutput_function_node<InputType,OutputTuple>::ports_type ports_type;
+    typedef typename std::tuple_element<0,OutputTuple>::type EvenType;
+    typedef typename std::tuple_element<1,OutputTuple>::type OddType;
+    void operator() (const InputType &i, ports_type &p) {
+        if((int)i % 2) {
+            std::get<1>(p).put(OddType(i));
+        }
+        else {
+            std::get<0>(p).put(EvenType(i));
+        }
+    }
+};
+
+template<typename InputType, typename OutputTuple >
+void run_multiport_test(int num_threads) {
+    typedef typename tbb::flow::multioutput_function_node<InputType, OutputTuple> mo_node_type;
+    typedef typename std::tuple_element<0,OutputTuple>::type EvenType;
+    typedef typename std::tuple_element<1,OutputTuple>::type OddType;
+    tbb::task_scheduler_init init(num_threads);
+    tbb::flow::graph g;
+    mo_node_type mo_node(g, tbb::flow::unlimited, oddEvenBody<InputType, OutputTuple>() );
+
+    tbb::flow::queue_node<EvenType> q0(g);
+    tbb::flow::queue_node<OddType> q1(g);
+
+    tbb::flow::make_edge(tbb::flow::output_port<0>(mo_node), q0);
+    tbb::flow::make_edge(tbb::flow::output_port<1>(mo_node), q1);
+
+    for(InputType i = 0; i < N; ++i) {
+        mo_node.try_put(i);
+    }
+
+    g.wait_for_all();
+    for(int i = 0; i < N/2; ++i) {
+        EvenType e;
+        OddType o;
+        ASSERT(q0.try_get(e) && (int)e % 2 == 0, NULL);
+        ASSERT(q1.try_get(o) && (int)o % 2 == 1, NULL);
+    }
+}
+
+//! Tests limited concurrency cases for nodes that accept data messages
+void test_concurrency(int num_threads) {
+    tbb::task_scheduler_init init(num_threads);
+    run_concurrency_levels<int,std::tuple<int> >(num_threads);
+    run_concurrency_levels<int,std::tuple<tbb::flow::continue_msg> >(num_threads);
+    run_buffered_levels<int, std::tuple<int> >(num_threads);
+    run_unlimited_concurrency<int, std::tuple<int> >();
+    run_unlimited_concurrency<int,std::tuple<empty_no_assign> >();
+    run_unlimited_concurrency<empty_no_assign,std::tuple<int> >();
+    run_unlimited_concurrency<empty_no_assign,std::tuple<empty_no_assign> >();
+    run_unlimited_concurrency<int,std::tuple<tbb::flow::continue_msg> >();
+    run_unlimited_concurrency<empty_no_assign,std::tuple<tbb::flow::continue_msg> >();
+    run_multiport_test<int, std::tuple<int, int> >(num_threads);
+    run_multiport_test<float, std::tuple<int, double> >(num_threads);
+}
+
+int TestMain() { 
+    current_executors = 0;
+    if( MinThread<1 ) {
+        REPORT("number of threads must be positive\n");
+        exit(1);
+    }
+    for( int p=MinThread; p<=MaxThread; ++p ) {
+       test_concurrency(p);
+   }
+   return Harness::Done;
+}
+#else  // __SUNPRO_CC
+int TestMain() { 
+   return Harness::Skipped;
+}
+#endif  // __SUNPRO_CC
diff --git a/src/test/test_mutex_native_threads.cpp b/src/test/test_mutex_native_threads.cpp
index 4e6fa2f..3aff41f 100644
--- a/src/test/test_mutex_native_threads.cpp
+++ b/src/test/test_mutex_native_threads.cpp
@@ -182,14 +182,16 @@ void Test( const char * name, int nthread ) {
     Counter<M> counter;
     counter.value = 0;
     Order = 0;
-    const long test_size = 100000;
+    // use the macro because of a seeming gcc 4.6 bug
+#define TEST_SIZE 100000
     tbb::tick_count t0 = tbb::tick_count::now();
-    NativeParallelFor( nthread, Work<Counter<M>, test_size>(counter) );
+    NativeParallelFor( nthread, Work<Counter<M>, TEST_SIZE>(counter) );
     tbb::tick_count t1 = tbb::tick_count::now();
 
     REMARK("%s time = %g usec\n",name, (t1-t0).seconds() );
-    if( counter.value!=test_size )
-        REPORT("ERROR for %s: counter.value=%ld != %ld=test_size\n",name,counter.value,test_size);
+    if( counter.value!=TEST_SIZE )
+        REPORT("ERROR for %s: counter.value=%ld != %ld=test_size\n",name,counter.value,TEST_SIZE);
+#undef TEST_SIZE
 }
 
 
@@ -199,15 +201,17 @@ void TestReaderWriter( const char * mutex_name, int nthread ) {
     REMARK("testing %s\n",mutex_name);
     Invariant<M,8> invariant(mutex_name);
     Order = 0;
-    static const long test_size = 1000000;
+    // use the macro because of a seeming gcc 4.6 bug
+#define TEST_SIZE 1000000
     tbb::tick_count t0 = tbb::tick_count::now();
-    NativeParallelFor( nthread, Work<Invariant<M,8>, test_size>(invariant) );
+    NativeParallelFor( nthread, Work<Invariant<M,8>, TEST_SIZE>(invariant) );
     tbb::tick_count t1 = tbb::tick_count::now();
     // There is either a writer or a reader upgraded to a writer for each 4th iteration
-    long expected_value = test_size/4;
+    long expected_value = TEST_SIZE/4;
     if( !invariant.value_is(expected_value) )
         REPORT("ERROR for %s: final invariant value is wrong\n",mutex_name);
     REMARK("%s readers & writers time = %g usec\n",mutex_name,(t1-t0).seconds());
+#undef TEST_SIZE
 }
 
 int TestMain () {
diff --git a/src/test/test_or_node.cpp b/src/test/test_or_node.cpp
new file mode 100644
index 0000000..c53313f
--- /dev/null
+++ b/src/test/test_or_node.cpp
@@ -0,0 +1,458 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#include "harness.h"
+#define TBB_PREVIEW_GRAPH_NODES 1
+#include "tbb/flow_graph.h"
+
+#if !__SUNPRO_CC
+//
+// Tests
+//
+
+const int Count = 150;
+const int MaxPorts = 10;
+const int MaxNSources = 5; // max # of source_nodes to register for each or_node input in parallel test
+bool outputCheck[MaxPorts][Count];  // for checking output
+
+void
+check_outputCheck( int nUsed, int maxCnt) {
+    for(int i=0; i < nUsed; ++i) {
+        for( int j = 0; j < maxCnt; ++j) {
+            ASSERT(outputCheck[i][j], NULL);
+        }
+    }
+}
+
+void
+reset_outputCheck( int nUsed, int maxCnt) {
+    for(int i=0; i < nUsed; ++i) {
+        for( int j = 0; j < maxCnt; ++j) {
+            outputCheck[i][j] = false;
+        }
+    }
+}
+
+class test_class {
+    public:
+        test_class() { my_val = 0; }
+        test_class(int i) { my_val = i; }
+        operator int() { return my_val; }
+    private:
+        int my_val;
+};
+
+template<typename T>
+class name_of {
+public:
+    static const char* name() { return  "Unknown"; }
+};
+template<>
+class name_of<int> {
+public:
+    static const char* name() { return  "int"; }
+};
+template<>
+class name_of<float> {
+public:
+    static const char* name() { return  "float"; }
+};
+template<>
+class name_of<double> {
+public:
+    static const char* name() { return  "double"; }
+};
+template<>
+class name_of<long> {
+public:
+    static const char* name() { return  "long"; }
+};
+template<>
+class name_of<short> {
+public:
+    static const char* name() { return  "short"; }
+};
+template<>
+class name_of<test_class> {
+public:
+    static const char* name() { return  "test_class"; }
+};
+
+// TT must be arithmetic, and shouldn't wrap around for reasonable sizes of Count (which is now 150, and maxPorts is 10,
+// so the max number generated right now is 1500 or so.)  Source will generate a series of TT with value
+// (init_val + (i-1)*addend) * my_mult, where i is the i-th invocation of the body.  We are attaching addend
+// source nodes to a or_port, and each will generate part of the numerical series the port is expecting
+// to receive.  If there is only one source node, the series order will be maintained; if more than one,
+// this is not guaranteed.
+template<typename TT>
+class source_body {
+    const TT my_mult;
+    int my_count;
+    const int addend;
+    source_body& operator=( const source_body& other);
+public:
+    source_body(TT multiplier, int init_val, int addto) : my_mult(multiplier), my_count(init_val), addend(addto) { }
+    bool operator()( TT &v) {
+        int lc = my_count;
+        v = my_mult * (TT)my_count;
+        my_count += addend;
+        return lc < Count;
+    }
+};
+
+// allocator for or_node.
+
+template<typename OType>
+class makeOr {
+public:
+    static OType *create() {
+        OType *temp = new OType();
+        return temp;
+    }
+    static void destroy(OType *p) { delete p; }
+};
+
+template<int ELEM, typename ONT>
+struct getval_helper {
+
+    typedef typename ONT::output_type OT;
+    static int get_integer_val(OT &o) {
+        return int(std::get<ELEM-1>(o.result));
+    }
+};
+
+// holder for source_node pointers for eventual deletion
+
+static void* all_source_nodes[MaxPorts][MaxNSources];
+
+template<int ELEM, typename ONT>
+class source_node_helper {
+public:
+    typedef ONT or_node_type;
+    typedef typename or_node_type::output_type TT;
+    typedef typename std::tuple_element<ELEM-1,typename ONT::tuple_types>::type IT;
+    typedef typename tbb::flow::source_node<IT> my_source_node_type;
+    static void print_remark() {
+        source_node_helper<ELEM-1,ONT>::print_remark();
+        REMARK(", %s", name_of<IT>::name());
+    }
+    static void add_source_nodes(or_node_type &my_or, tbb::flow::graph &g, int nInputs) {
+        for(int i=0; i < nInputs; ++i) {
+            my_source_node_type *new_node = new my_source_node_type(g, source_body<IT>((IT)(ELEM+1), i, nInputs));
+            ASSERT(new_node->register_successor(tbb::flow::input_port<ELEM-1>(my_or)), NULL);
+            all_source_nodes[ELEM-1][i] = (void *)new_node;
+        }
+        // add the next source_node
+        source_node_helper<ELEM-1, ONT>::add_source_nodes(my_or, g, nInputs);
+    }
+    static void check_value(TT &v) {
+        if(v.indx == ELEM-1) {
+            int ival = getval_helper<ELEM,ONT>::get_integer_val(v);
+            ASSERT(!(ival%(ELEM+1)), NULL);
+            ival /= (ELEM+1);
+            ASSERT(!outputCheck[ELEM-1][ival], NULL);
+            outputCheck[ELEM-1][ival] = true;
+        }
+        else {
+            source_node_helper<ELEM-1,ONT>::check_value(v);
+        }
+    }
+
+    static void remove_source_nodes(or_node_type& my_or, int nInputs) {
+        for(int i=0; i< nInputs; ++i) {
+            my_source_node_type *dp = reinterpret_cast<my_source_node_type *>(all_source_nodes[ELEM-1][i]);
+            dp->remove_successor(tbb::flow::input_port<ELEM-1>(my_or));
+            delete dp;
+        }
+        source_node_helper<ELEM-1, ONT>::remove_source_nodes(my_or, nInputs);
+    }
+};
+
+template<typename ONT>
+class source_node_helper<1, ONT> {
+    typedef ONT or_node_type;
+    typedef typename or_node_type::output_type TT;
+    typedef typename std::tuple_element<0, typename ONT::tuple_types>::type IT;
+    typedef typename tbb::flow::source_node<IT> my_source_node_type;
+public:
+    static void print_remark() {
+        REMARK("Parallel test of or_node< %s", name_of<IT>::name());
+    }
+    static void add_source_nodes(or_node_type &my_or, tbb::flow::graph &g, int nInputs) {
+        for(int i=0; i < nInputs; ++i) {
+            my_source_node_type *new_node = new my_source_node_type(g, source_body<IT>((IT)2, i, nInputs));
+            ASSERT(new_node->register_successor(tbb::flow::input_port<0>(my_or)), NULL);
+            all_source_nodes[0][i] = (void *)new_node;
+        }
+    }
+    static void check_value(TT &v) {
+        int ival = getval_helper<1,ONT>::get_integer_val(v);
+        ASSERT(!(ival%2), NULL);
+        ival /= 2;
+        ASSERT(!outputCheck[0][ival], NULL);
+        outputCheck[0][ival] = true;
+    }
+    static void remove_source_nodes(or_node_type& my_or, int nInputs) {
+        for(int i=0; i < nInputs; ++i) {
+            my_source_node_type *dp = reinterpret_cast<my_source_node_type *>(all_source_nodes[0][i]);
+            dp->remove_successor(tbb::flow::input_port<0>(my_or));
+            delete dp;
+        }
+    }
+};
+
+template<typename OType>
+class parallel_test {
+public:
+    typedef typename OType::output_type TType;
+    typedef typename OType::tuple_types union_types;
+    static const int SIZE = std::tuple_size<union_types>::value;
+    static void test() {
+        TType v;
+        source_node_helper<SIZE,OType>::print_remark();
+        REMARK(" >\n");
+        for(int i=0; i < MaxPorts; ++i) {
+            for(int j=0; j < MaxNSources; ++j) {
+                all_source_nodes[i][j] = NULL;
+            }
+        }
+        for(int nInputs = 1; nInputs <= MaxNSources; ++nInputs) {
+            tbb::flow::graph g;
+            OType* my_or = makeOr<OType>::create();
+            tbb::flow::queue_node<TType> outq1(g);
+            tbb::flow::queue_node<TType> outq2(g);
+
+            ASSERT((*my_or).register_successor(outq1), NULL);  // register outputs first, so they both get all
+            ASSERT((*my_or).register_successor(outq2), NULL);  // the results
+
+            source_node_helper<SIZE, OType>::add_source_nodes((*my_or), g, nInputs);
+
+            g.wait_for_all();
+
+            reset_outputCheck(SIZE, Count);
+            for(int i=0; i < Count*SIZE; ++i) {
+                ASSERT(outq1.try_get(v), NULL);
+                source_node_helper<SIZE, OType>::check_value(v);
+            }
+
+            check_outputCheck(SIZE, Count);
+            reset_outputCheck(SIZE, Count);
+
+            for(int i=0; i < Count*SIZE; i++) {
+                ASSERT(outq2.try_get(v), NULL);;
+                source_node_helper<SIZE, OType>::check_value(v);
+            }
+            check_outputCheck(SIZE, Count);
+
+            ASSERT(!outq1.try_get(v), NULL);
+            ASSERT(!outq2.try_get(v), NULL);
+
+            source_node_helper<SIZE, OType>::remove_source_nodes((*my_or), nInputs);
+            (*my_or).remove_successor(outq1);
+            (*my_or).remove_successor(outq2);
+            makeOr<OType>::destroy(my_or);
+        }
+    }
+};
+
+std::vector<int> last_index_seen;
+
+template<int ELEM, typename OType>
+class serial_queue_helper {
+public:
+    typedef typename OType::output_type OT;
+    typedef typename OType::tuple_types TT;
+    typedef typename std::tuple_element<ELEM-1,TT>::type IT;
+    static void print_remark() {
+        serial_queue_helper<ELEM-1,OType>::print_remark();
+        REMARK(", %s", name_of<IT>::name());
+    }
+    static void fill_one_queue(int maxVal, OType &my_or) {
+        // fill queue to "left" of me
+        serial_queue_helper<ELEM-1,OType>::fill_one_queue(maxVal,my_or);
+        for(int i = 0; i < maxVal; ++i) {
+            ASSERT(tbb::flow::input_port<ELEM-1>(my_or).try_put((IT)(i*(ELEM+1))), NULL);
+        }
+    }
+    static void put_one_queue_val(int myVal, OType &my_or) {
+        // put this val to my "left".
+        serial_queue_helper<ELEM-1,OType>::put_one_queue_val(myVal, my_or);
+        ASSERT(tbb::flow::input_port<ELEM-1>(my_or).try_put((IT)(myVal*(ELEM+1))), NULL);
+    }
+    static void check_queue_value(OT &v) {
+        if(ELEM - 1 == v.indx) {
+            // this assumes each or node input is queueing.
+            int rval = getval_helper<ELEM,OType>::get_integer_val(v);
+            ASSERT( rval == (last_index_seen[ELEM-1]+1)*(ELEM+1), NULL);
+            last_index_seen[ELEM-1] = rval / (ELEM+1);
+        }
+        else {
+            serial_queue_helper<ELEM-1,OType>::check_queue_value(v);
+        }
+    }
+};
+
+template<typename OType>
+class serial_queue_helper<1, OType> {
+public:
+    typedef typename OType::output_type OT;
+    typedef typename OType::tuple_types TT;
+    typedef typename std::tuple_element<0,TT>::type IT;
+    static void print_remark() {
+        REMARK("Serial test of or_node< %s", name_of<IT>::name());
+    }
+    static void fill_one_queue(int maxVal, OType &my_or) {
+        for(int i = 0; i < maxVal; ++i) {
+            ASSERT(tbb::flow::input_port<0>(my_or).try_put((IT)(i*2)), NULL);
+        }
+    }
+    static void put_one_queue_val(int myVal, OType &my_or) {
+        ASSERT(tbb::flow::input_port<0>(my_or).try_put((IT)(myVal*2)), NULL);
+    }
+    static void check_queue_value(OT &v) {
+        ASSERT(v.indx == 0, NULL);  // won't get here unless true
+        int rval = getval_helper<1,OType>::get_integer_val(v);
+        ASSERT( rval == (last_index_seen[0]+1)*2, NULL);
+        last_index_seen[0] = rval / 2;
+    }
+};
+
+template<typename OType, typename TType, int SIZE>
+void test_one_serial( OType &my_or, tbb::flow::graph &g) {
+    last_index_seen.clear();
+    for(int ii=0; ii < SIZE; ++ii) last_index_seen.push_back(-1);
+
+    typedef TType q3_input_type;
+    tbb::flow::queue_node< q3_input_type >  q3(g);
+    q3_input_type v;
+
+    ASSERT((my_or).register_successor( q3 ), NULL);
+
+    // fill each queue with its value one-at-a-time
+    for (int i = 0; i < Count; ++i ) {
+        serial_queue_helper<SIZE,OType>::put_one_queue_val(i,my_or);
+    }
+
+    g.wait_for_all();
+    for (int i = 0; i < Count * SIZE; ++i ) {
+        g.wait_for_all();
+        ASSERT(q3.try_get( v ), "Error in try_get()");
+        {
+            serial_queue_helper<SIZE,OType>::check_queue_value(v);
+        }
+    }
+    ASSERT(!q3.try_get( v ), "extra values in output queue");
+    for(int ii=0; ii < SIZE; ++ii) last_index_seen[ii] = -1;
+
+    // fill each queue completely before filling the next.
+    serial_queue_helper<SIZE, OType>::fill_one_queue(Count,my_or);
+
+    g.wait_for_all();
+    for (int i = 0; i < Count*SIZE; ++i ) {
+        g.wait_for_all();
+        ASSERT(q3.try_get( v ), "Error in try_get()");
+        {
+            serial_queue_helper<SIZE,OType>::check_queue_value(v);
+        }
+    }
+    ASSERT(!q3.try_get( v ), "extra values in output queue");
+}
+
+//
+// Single predecessor at each port, single accepting successor
+//   * put to buffer before port0, then put to buffer before port1, ...
+//   * fill buffer before port0 then fill buffer before port1, ...
+
+template<typename OType>
+class serial_test {
+    typedef typename OType::output_type TType;  // this is the union
+    typedef typename OType::tuple_types union_types;
+    static const int SIZE = std::tuple_size<union_types>::value;
+public:
+static void test() {
+    tbb::flow::graph g;
+    static const int ELEMS = 3;
+    OType* my_or = makeOr<OType>::create();
+
+    serial_queue_helper<SIZE, OType>::print_remark(); REMARK(" >\n");
+
+    test_one_serial<OType,TType,SIZE>(*my_or, g);
+
+    std::vector<OType> or_vector(ELEMS, *my_or);
+
+    makeOr<OType>::destroy(my_or);
+
+    for(int e = 0; e < ELEMS; ++e) {
+        test_one_serial<OType,TType,SIZE>(or_vector[e], g);
+    }
+}
+
+}; // serial_test
+
+template<
+      template<typename> class TestType,  // serial_test or parallel_test
+      typename InputTupleType>           // type of the inputs to the or_node
+class generate_test {
+public:
+    typedef tbb::flow::or_node<InputTupleType> or_node_type;
+    static void do_test() {
+        TestType<or_node_type>::test();
+    }
+};
+
+int TestMain() {
+    REMARK("Testing or_node, ");
+#if __TBB_USE_TBB_TUPLE
+    REMARK("using TBB tuple\n");
+#else
+    REMARK("using platform tuple\n");
+#endif
+
+   for (int p = 0; p < 2; ++p) {
+       generate_test<serial_test, std::tuple<float, test_class> >::do_test();
+       generate_test<serial_test, std::tuple<float, double, int, long> >::do_test();
+       generate_test<serial_test, std::tuple<double, double, int, long, int, short> >::do_test();
+#if COMPREHENSIVE_TEST
+       generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long> >::do_test();
+       generate_test<serial_test, std::tuple<float, double, int, double, double, float, long, int, float, long> >::do_test();
+#endif
+       generate_test<parallel_test, std::tuple<float, double> >::do_test();
+       generate_test<parallel_test, std::tuple<float, int, long> >::do_test();
+       generate_test<parallel_test, std::tuple<double, double, int, int, short> >::do_test();
+#if COMPREHENSIVE_TEST
+       generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long> >::do_test();
+       generate_test<parallel_test, std::tuple<float, double, int, double, double, long, int, float, long> >::do_test();
+#endif
+   }
+   return Harness::Done;
+}
+#else  // __SUNPRO_CC
+int TestMain() {
+    return Harness::Skipped;
+}
+#endif  // __SUNPRO_CC
diff --git a/src/test/test_overwrite_node.cpp b/src/test/test_overwrite_node.cpp
index 8d0cdfc..ee38062 100644
--- a/src/test/test_overwrite_node.cpp
+++ b/src/test/test_overwrite_node.cpp
@@ -27,8 +27,6 @@
 */
 
 #include "harness_graph.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
 
 #include "tbb/task_scheduler_init.h"
 
@@ -38,7 +36,7 @@
 
 template< typename R >
 void simple_read_write_tests() {
-    tbb::overwrite_node<R> n;
+    tbb::flow::overwrite_node<R> n;
 
     for ( int t = 0; t < T; ++t ) {
         R v0(N+1);
@@ -54,7 +52,7 @@ void simple_read_write_tests() {
        }
 
         for (int i = 0; i < M; ++i) {
-           ASSERT( n.register_successor(r[i]), NULL );
+           tbb::flow::make_edge( n, r[i] );
         }
 
         for (int i = 0; i < N; ++i ) {
@@ -72,7 +70,7 @@ void simple_read_write_tests() {
              ASSERT( int(c) == N+t%2, NULL );
         }
         for (int i = 0; i < M; ++i) {
-           ASSERT( n.remove_successor(r[i]), NULL );
+           tbb::flow::remove_edge( n, r[i] );
         }
         ASSERT( n.try_put( R(0) ), NULL );
         for (int i = 0; i < M; ++i) {
@@ -87,11 +85,11 @@ void simple_read_write_tests() {
 
 template< typename R >
 class native_body : NoAssign {
-    tbb::overwrite_node<R> &my_node;
+    tbb::flow::overwrite_node<R> &my_node;
 
 public:
 
-     native_body( tbb::overwrite_node<R> &n ) : my_node(n) {}
+     native_body( tbb::flow::overwrite_node<R> &n ) : my_node(n) {}
 
      void operator()( int i ) const {
          R v1(static_cast<R>(i));
@@ -102,35 +100,39 @@ public:
 
 template< typename R >
 void parallel_read_write_tests() {
-    tbb::overwrite_node<R> n;
+    tbb::flow::overwrite_node<R> n;
+    //Create a vector of identical nodes
+    std::vector< tbb::flow::overwrite_node<R> > ow_vec(2, n);
 
+    for (size_t node_idx=0; node_idx<ow_vec.size(); ++node_idx) {
     for ( int t = 0; t < T; ++t ) {
         harness_counting_receiver<R> r[M];
 
         for (int i = 0; i < M; ++i) {
-           ASSERT( n.register_successor(r[i]), NULL );
+           tbb::flow::make_edge( ow_vec[node_idx], r[i] );
         }
         R v0;
-        ASSERT( n.is_valid() == false, NULL );
-        ASSERT( n.try_get( v0 ) == false, NULL );
+        ASSERT( ow_vec[node_idx].is_valid() == false, NULL );
+        ASSERT( ow_vec[node_idx].try_get( v0 ) == false, NULL );
 
-        NativeParallelFor( N, native_body<R>( n ) );
+        NativeParallelFor( N, native_body<R>( ow_vec[node_idx] ) );
 
         for (int i = 0; i < M; ++i) {
              size_t c = r[i].my_count;
              ASSERT( int(c) == N, NULL );
         }
         for (int i = 0; i < M; ++i) {
-           ASSERT( n.remove_successor(r[i]), NULL );
+           tbb::flow::remove_edge( ow_vec[node_idx], r[i] );
         }
-        ASSERT( n.try_put( R(0) ), NULL );
+        ASSERT( ow_vec[node_idx].try_put( R(0) ), NULL );
         for (int i = 0; i < M; ++i) {
              size_t c = r[i].my_count;
              ASSERT( int(c) == N, NULL );
         }
-        n.clear();
-        ASSERT( n.is_valid() == false, NULL );
-        ASSERT( n.try_get( v0 ) == false, NULL );
+        ow_vec[node_idx].clear();
+        ASSERT( ow_vec[node_idx].is_valid() == false, NULL );
+        ASSERT( ow_vec[node_idx].try_get( v0 ) == false, NULL );
+    }
     }
 }
 
diff --git a/src/test/test_parallel_do.cpp b/src/test/test_parallel_do.cpp
index 10f2ff8..195a828 100644
--- a/src/test/test_parallel_do.cpp
+++ b/src/test/test_parallel_do.cpp
@@ -214,6 +214,8 @@ void Run( int nthread ) {
         TestIterator<Harness::InputIterator<value_t> >(nthread, depth);
         // Test for forward iterators
         TestIterator<Harness::ForwardIterator<value_t> >(nthread, depth);
+        // Test for const random access iterators
+        TestIterator_RvalueOnly<Harness::ConstRandomIterator<value_t> >(nthread, depth);
     }
 }
 
diff --git a/src/test/test_parallel_for.cpp b/src/test/test_parallel_for.cpp
index 17a7dbd..e39e4c1 100644
--- a/src/test/test_parallel_for.cpp
+++ b/src/test/test_parallel_for.cpp
@@ -28,6 +28,9 @@
 
 // Test for function template parallel_for.h
 
+// Enable testing of serial subset.
+#define TBB_PREVIEW_SERIAL_SUBSET 1
+
 #if _MSC_VER
 #pragma warning (push)
 #if !defined(__INTEL_COMPILER)
@@ -38,7 +41,9 @@
     // Workaround for overzealous compiler warnings in /Wp64 mode
     #pragma warning (disable: 4267)
 #endif
-#endif //#if _MSC_VER 
+
+#define _SCL_SECURE_NO_WARNINGS
+#endif //#if _MSC_VER
 
 #include "tbb/parallel_for.h"
 #include "tbb/atomic.h"
@@ -47,7 +52,7 @@
 
 static tbb::atomic<int> FooBodyCount;
 
-//! An range object whose only public members are those required by the Range concept.
+//! A range object whose only public members are those required by the Range concept.
 template<size_t Pad>
 class FooRange {
     //! Start of range
@@ -59,7 +64,7 @@ class FooRange {
         zero_fill<char>(pad, Pad);
         pad[Pad-1] = 'x';
     }
-    template<size_t Pad_> friend void Flog( int nthread );
+    template<typename Flavor_, size_t Pad_> friend void Flog( int nthread );
     template<size_t Pad_> friend class FooBody;
     void operator&();
 
@@ -75,14 +80,14 @@ public:
     }
 };
 
-//! An range object whose only public members are those required by the parallel_for.h body concept.
+//! A range object whose only public members are those required by the parallel_for.h body concept.
 template<size_t Pad>
 class FooBody {
     static const int LIVE = 0x1234;
     tbb::atomic<int>* array;
     int state;
     friend class FooRange<Pad>;
-    template<size_t Pad_> friend void Flog( int nthread );
+    template<typename Flavor_, size_t Pad_> friend void Flog( int nthread );
     FooBody( tbb::atomic<int>* array_ ) : array(array_), state(LIVE) {}
 public:
     ~FooBody() {
@@ -90,58 +95,117 @@ public:
         for( size_t i=0; i<sizeof(*this); ++i )
             reinterpret_cast<char*>(this)[i] = -1;
     }
-    //! Copy constructor 
+    //! Copy constructor
     FooBody( const FooBody& other ) : array(other.array), state(other.state) {
         ++FooBodyCount;
         ASSERT( state==LIVE, NULL );
     }
     void operator()( FooRange<Pad>& r ) const {
-        for( int k=0; k<r.size; ++k )
-            array[r.start+k]++;
+        for( int k=0; k<r.size; ++k ) {
+            const int i = array[r.start+k]++;
+            ASSERT( i==0, NULL );
+        }
     }
 };
 
 #include "tbb/tick_count.h"
 
-static const int N = 1000;
+static const int N = 500;
 static tbb::atomic<int> Array[N];
 
-template<size_t Pad>
+struct serial_tag {};
+struct parallel_tag {};
+
+template <typename Flavor, typename Range, typename Body>
+struct Invoker;
+
+template <typename Range, typename Body>
+struct Invoker<serial_tag, Range, Body> {
+    void operator()( const Range& r, const Body& body, const tbb::simple_partitioner& p ) {
+        tbb::serial:: parallel_for( r, body, p );
+    }
+    void operator()( const Range& r, const Body& body, const tbb::auto_partitioner& p ) {
+        tbb::serial:: parallel_for( r, body, p );
+    }
+    void operator()( const Range& r, const Body& body, tbb::affinity_partitioner& p ) {
+        tbb::serial:: parallel_for( r, body, p );
+    }
+    void operator()( const Range& r, const Body& body ) {
+        tbb::serial:: parallel_for( r, body, tbb::auto_partitioner() );
+    }
+};
+
+template <typename Range, typename Body>
+struct Invoker<parallel_tag, Range, Body> {
+    void operator()( const Range& r, const Body& body, const tbb::simple_partitioner& p ) {
+        tbb:: parallel_for( r, body, p );
+    }
+    void operator()( const Range& r, const Body& body, const tbb::auto_partitioner& p ) {
+        tbb:: parallel_for( r, body, p );
+    }
+    void operator()( const Range& r, const Body& body, tbb::affinity_partitioner& p ) {
+        tbb:: parallel_for( r, body, p );
+    }
+    void operator()( const Range& r, const Body& body ) {
+        tbb:: parallel_for( r, body, tbb::auto_partitioner() );
+    }
+};
+
+template <typename Flavor, typename T, typename Body>
+struct InvokerStep;
+
+template <typename T, typename Body>
+struct InvokerStep<serial_tag, T, Body> {
+    void operator()( const T& first, const T& last, const Body& f ) {
+        tbb::serial:: parallel_for( first, last, f );
+    }
+    void operator()( const T& first, const T& last, const T& step, const Body& f ) {
+        tbb::serial:: parallel_for( first, last, step, f );
+    }
+};
+
+template <typename T, typename Body>
+struct InvokerStep<parallel_tag, T, Body> {
+    void operator()( const T& first, const T& last, const Body& f ) {
+        tbb:: parallel_for( first, last, f );
+    }
+    void operator()( const T& first, const T& last, const T& step, const Body& f ) {
+        tbb:: parallel_for( first, last, step, f );
+    }
+};
+
+template<typename Flavor, size_t Pad>
 void Flog( int nthread ) {
     tbb::tick_count T0 = tbb::tick_count::now();
     for( int i=0; i<N; ++i ) {
-        for ( int mode = 0; mode < 4; ++mode) 
-        {
+        for ( int mode = 0; mode < 4; ++mode) {
             FooRange<Pad> r( 0, i );
             const FooRange<Pad> rc = r;
             FooBody<Pad> f( Array );
             const FooBody<Pad> fc = f;
             memset( Array, 0, sizeof(Array) );
             FooBodyCount = 1;
+            Invoker< Flavor, FooRange<Pad>, FooBody<Pad> > invoke_for;
             switch (mode) {
                 case 0:
-                    tbb::parallel_for( rc, fc );
+                    invoke_for( rc, fc );
                 break;
                 case 1:
-                    tbb::parallel_for( rc, fc, tbb::simple_partitioner() );
+                    invoke_for( rc, fc, tbb::simple_partitioner() );
                 break;
                 case 2:
-                    tbb::parallel_for( rc, fc, tbb::auto_partitioner() );
+                    invoke_for( rc, fc, tbb::auto_partitioner() );
                 break;
                 case 3: {
                     static tbb::affinity_partitioner affinity;
-                    tbb::parallel_for( rc, fc, affinity );
+                    invoke_for( rc, fc, affinity );
                 }
                 break;
             }
-            for( int j=0; j<i; ++j ) 
+            for( int j=0; j<i; ++j )
                 ASSERT( Array[j]==1, NULL );
-            for( int j=i; j<N; ++j ) 
+            for( int j=i; j<N; ++j )
                 ASSERT( Array[j]==0, NULL );
-            // Destruction of bodies might take a while, but there should be at most one body per thread
-            // at this point.
-            while( FooBodyCount>1 && FooBodyCount<=nthread )
-                __TBB_Yield();
             ASSERT( FooBodyCount==1, NULL );
         }
     }
@@ -151,8 +215,8 @@ void Flog( int nthread ) {
 
 // Testing parallel_for with step support
 const size_t PFOR_BUFFER_TEST_SIZE = 1024;
-// test_buffer has some extra items beyound right bound
-const size_t PFOR_BUFFER_ACTUAL_SIZE = PFOR_BUFFER_TEST_SIZE + 1024; 
+// test_buffer has some extra items beyond its right bound
+const size_t PFOR_BUFFER_ACTUAL_SIZE = PFOR_BUFFER_TEST_SIZE + 1024;
 size_t pfor_buffer[PFOR_BUFFER_ACTUAL_SIZE];
 
 template<typename T>
@@ -175,20 +239,21 @@ public:
     #pragma warning (pop)
 #endif
 
-template <typename T>
+template <typename Flavor, typename T>
 void TestParallelForWithStepSupport()
 {
     const T pfor_buffer_test_size = static_cast<T>(PFOR_BUFFER_TEST_SIZE);
     const T pfor_buffer_actual_size = static_cast<T>(PFOR_BUFFER_ACTUAL_SIZE);
     // Testing parallel_for with different step values
+    InvokerStep< Flavor, T, TestFunctor<T> > invoke_for;
     for (T begin = 0; begin < pfor_buffer_test_size - 1; begin += pfor_buffer_test_size / 10 + 1) {
         T step;
         for (step = 1; step < pfor_buffer_test_size; step++) {
             memset(pfor_buffer, 0, pfor_buffer_actual_size * sizeof(size_t));
             if (step == 1){
-                tbb::parallel_for(begin, pfor_buffer_test_size, TestFunctor<T>());
+                invoke_for(begin, pfor_buffer_test_size, TestFunctor<T>());
             } else {
-                tbb::parallel_for(begin, pfor_buffer_test_size, step, TestFunctor<T>());
+                invoke_for(begin, pfor_buffer_test_size, step, TestFunctor<T>());
             }
             // Verifying that parallel_for processed all items it should
             for (T i = begin; i < pfor_buffer_test_size; i = i + step) {
@@ -216,6 +281,7 @@ void TestParallelForWithStepSupport()
 #endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
 }
 
+#if __TBB_TASK_GROUP_CONTEXT
 // Exception support test
 #define HARNESS_EH_SIMPLE_MODE 1
 #include "tbb/tbb_exception.h"
@@ -283,31 +349,65 @@ void TestCancellation()
     ResetEhGlobals();
     RunCancellationTest<my_worker_pfor_step_task, CancellatorTask>();
 }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
 #include "harness_m128.h"
 
-#if HAVE_m128 && !__TBB_SSE_STACK_ALIGNMENT_BROKEN
+#if (HAVE_m128 || HAVE_m256) && !__TBB_SSE_STACK_ALIGNMENT_BROKEN
+template<typename ClassWithVectorType>
 struct SSE_Functor {
-    ClassWithSSE* Src, * Dst;
-    SSE_Functor( ClassWithSSE* src, ClassWithSSE* dst ) : Src(src), Dst(dst) {}
+    ClassWithVectorType* Src, * Dst;
+    SSE_Functor( ClassWithVectorType* src, ClassWithVectorType* dst ) : Src(src), Dst(dst) {}
 
     void operator()( tbb::blocked_range<int>& r ) const {
         for( int i=r.begin(); i!=r.end(); ++i )
             Dst[i] = Src[i];
-    }     
+    }
 };
 
 //! Test that parallel_for works with stack-allocated __m128
-void TestSSE() {
-    ClassWithSSE Array1[N], Array2[N];
-    for( int i=0; i<N; ++i )
-        Array1[i] = ClassWithSSE(i);
-    tbb::parallel_for( tbb::blocked_range<int>(0,N), SSE_Functor(Array1, Array2) );
-    for( int i=0; i<N; ++i )
-        ASSERT( Array2[i]==ClassWithSSE(i), NULL ) ;
+template<typename ClassWithVectorType>
+void TestVectorTypes() {
+    ClassWithVectorType Array1[N], Array2[N];
+    for( int i=0; i<N; ++i ) {
+        // VC8 does not properly align a temporary value; to work around, use explicit variable
+        ClassWithVectorType foo(i);
+        Array1[i] = foo;
+    }
+    tbb::parallel_for( tbb::blocked_range<int>(0,N), SSE_Functor<ClassWithVectorType>(Array1, Array2) );
+    for( int i=0; i<N; ++i ) {
+        ClassWithVectorType foo(i);
+        ASSERT( Array2[i]==foo, NULL ) ;
+    }
+}
+#endif /* HAVE_m128 || HAVE_m256 */
+
+#include <vector>
+#include <tbb/blocked_range.h>
+#include <sstream>
+struct TestSimplePartitionerStabilityFunctor:NoAssign{
+  std::vector<int> & ranges;
+  TestSimplePartitionerStabilityFunctor(std::vector<int> & theRanges):ranges(theRanges){}
+  void operator()(tbb::blocked_range<size_t>& r)const{
+      ranges.at(r.begin())=true;
+  }
+};
+void TestSimplePartitionerStability(){
+    const std::size_t repeat_count= 10;
+    const std::size_t rangeToSplitSize=1000000;
+    const std::size_t grainsizeStep=rangeToSplitSize/repeat_count;
+    typedef TestSimplePartitionerStabilityFunctor FunctorType;
+
+    for (std::size_t i=0 , grainsize=grainsizeStep; i<repeat_count;i++, grainsize+=grainsizeStep){
+        std::vector<int> firstSeries(rangeToSplitSize,0);
+        std::vector<int> secondSeries(rangeToSplitSize,0);
+
+        tbb::parallel_for(tbb::blocked_range<size_t>(0,rangeToSplitSize,grainsize),FunctorType(firstSeries),tbb::simple_partitioner());
+        tbb::parallel_for(tbb::blocked_range<size_t>(0,rangeToSplitSize,grainsize),FunctorType(secondSeries),tbb::simple_partitioner());
+        std::stringstream str; str<<i;
+        ASSERT(firstSeries==secondSeries,("splitting range with tbb::simple_partitioner must be reproducible; i=" +str.str()).c_str() );
+    }
 }
-#endif /* HAVE_m128 */
-
 #include <cstdio>
 #include "tbb/task_scheduler_init.h"
 #include "harness_cpu.h"
@@ -320,39 +420,64 @@ int TestMain () {
     for( int p=MinThread; p<=MaxThread; ++p ) {
         if( p>0 ) {
             tbb::task_scheduler_init init( p );
-            Flog<1>(p);
-            Flog<10>(p);
-            Flog<100>(p);
-            Flog<1000>(p);
-            Flog<10000>(p);
+            Flog<parallel_tag,1>(p);
+            Flog<parallel_tag,10>(p);
+            Flog<parallel_tag,100>(p);
+            Flog<parallel_tag,1000>(p);
+            Flog<parallel_tag,10000>(p);
 
             // Testing with different integer types
-            TestParallelForWithStepSupport<short>();
-            TestParallelForWithStepSupport<unsigned short>();
-            TestParallelForWithStepSupport<int>();
-            TestParallelForWithStepSupport<unsigned int>();
-            TestParallelForWithStepSupport<long>();
-            TestParallelForWithStepSupport<unsigned long>();
-            TestParallelForWithStepSupport<long long>();
-            TestParallelForWithStepSupport<unsigned long long>();
-            TestParallelForWithStepSupport<size_t>();
+            TestParallelForWithStepSupport<parallel_tag,short>();
+            TestParallelForWithStepSupport<parallel_tag,unsigned short>();
+            TestParallelForWithStepSupport<parallel_tag,int>();
+            TestParallelForWithStepSupport<parallel_tag,unsigned int>();
+            TestParallelForWithStepSupport<parallel_tag,long>();
+            TestParallelForWithStepSupport<parallel_tag,unsigned long>();
+            TestParallelForWithStepSupport<parallel_tag,long long>();
+            TestParallelForWithStepSupport<parallel_tag,unsigned long long>();
+            TestParallelForWithStepSupport<parallel_tag,size_t>();
+
+            // This is for testing serial implementation.
+            if( p == MaxThread ) {
+                Flog<serial_tag,1>(p);
+                Flog<serial_tag,10>(p);
+                Flog<serial_tag,100>(p);
+                TestParallelForWithStepSupport<serial_tag,short>();
+                TestParallelForWithStepSupport<serial_tag,unsigned short>();
+                TestParallelForWithStepSupport<serial_tag,int>();
+                TestParallelForWithStepSupport<serial_tag,unsigned int>();
+                TestParallelForWithStepSupport<serial_tag,long>();
+                TestParallelForWithStepSupport<serial_tag,unsigned long>();
+                TestParallelForWithStepSupport<serial_tag,long long>();
+                TestParallelForWithStepSupport<serial_tag,unsigned long long>();
+                TestParallelForWithStepSupport<serial_tag,size_t>();
+            }
+
 #if TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
             TestExceptionsSupport();
 #endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
-            if (p>1) TestCancellation();
-#if HAVE_m128 && !__TBB_SSE_STACK_ALIGNMENT_BROKEN
-            TestSSE();
-#endif /* HAVE_m128 */
-
+#if __TBB_TASK_GROUP_CONTEXT
+            if ( p > 1 )
+                TestCancellation();
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+#if !__TBB_SSE_STACK_ALIGNMENT_BROKEN
+    #if HAVE_m128
+            TestVectorTypes<ClassWithSSE>();
+    #endif
+    #if HAVE_m256
+            if (have_AVX()) TestVectorTypes<ClassWithAVX>();
+    #endif
+#endif /*!__TBB_SSE_STACK_ALIGNMENT_BROKEN*/
             // Test that all workers sleep when no work
             TestCPUUserTime(p);
+            TestSimplePartitionerStability();
         }
     }
 #if __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN
     REPORT("Known issue: exception handling tests are skipped.\n");
 #endif
-#if HAVE_m128 && __TBB_SSE_STACK_ALIGNMENT_BROKEN
-    REPORT("Known issue: stack alignment for SSE not tested.\n");
+#if (HAVE_m128 || HAVE_m256) && __TBB_SSE_STACK_ALIGNMENT_BROKEN
+    REPORT("Known issue: stack alignment for SSE/AVX not tested.\n");
 #endif
     return Harness::Done;
 }
diff --git a/src/test/test_parallel_for_each.cpp b/src/test/test_parallel_for_each.cpp
index 4d8038f..00742de 100644
--- a/src/test/test_parallel_for_each.cpp
+++ b/src/test/test_parallel_for_each.cpp
@@ -93,6 +93,7 @@ void RunMutablePForEachTests() {
         ASSERT( test_vector[i]==1, "parallel_for_each did not process each element exactly once" );
 }
 
+#if __TBB_TASK_GROUP_CONTEXT
 #define HARNESS_EH_SIMPLE_MODE 1
 #include "tbb/tbb_exception.h"
 #include "harness_eh.h"
@@ -155,6 +156,7 @@ void TestCancellation()
     ResetEhGlobals();
     RunCancellationTest<my_worker_pforeach_task<Iterator>, CancellatorTask>();
 }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
 #include "harness_cpu.h"
 
@@ -165,9 +167,12 @@ int TestMain () {
     }
     for( int p=MinThread; p<=MaxThread; ++p ) {
         tbb::task_scheduler_init init( p );
+
         RunPForEachTests<Harness::RandomIterator<size_t> >();
+        RunPForEachTests<Harness::ConstRandomIterator<size_t> >();
         RunPForEachTests<Harness::InputIterator<size_t> >();
         RunPForEachTests<Harness::ForwardIterator<size_t> >();
+
         RunMutablePForEachTests<Harness::RandomIterator<size_t> >();
         RunMutablePForEachTests<Harness::ForwardIterator<size_t> >();
 
@@ -176,11 +181,15 @@ int TestMain () {
         TestExceptionsSupport<Harness::InputIterator<size_t> >();
         TestExceptionsSupport<Harness::ForwardIterator<size_t> >();
 #endif /* TBB_USE_EXCEPTIONS && !__TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN */
+
+#if __TBB_TASK_GROUP_CONTEXT
         if (p > 1) {
             TestCancellation<Harness::RandomIterator<size_t> >();
             TestCancellation<Harness::InputIterator<size_t> >();
             TestCancellation<Harness::ForwardIterator<size_t> >();
         }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+
         // Test that all workers sleep when no work
         TestCPUUserTime(p);
     }
diff --git a/src/test/test_parallel_invoke.cpp b/src/test/test_parallel_invoke.cpp
index 55d15bf..8f24c2e 100644
--- a/src/test/test_parallel_invoke.cpp
+++ b/src/test/test_parallel_invoke.cpp
@@ -36,11 +36,9 @@
 #include "tbb/tbb_exception.h"
 #include "harness.h"
 
-#if !defined(__INTEL_COMPILER)
-#if defined(_MSC_VER) && _MSC_VER <= 1400  ||  __GNUC__==3 && __GNUC_MINOR__<=3  ||  __SUNPRO_CC
+#if !__INTEL_COMPILER && (_MSC_VER && _MSC_VER <= 1400 || __GNUC__==3 && __GNUC_MINOR__<=3 || __SUNPRO_CC)
     #define __TBB_FUNCTION_BY_CONSTREF_IN_TEMPLATE_BROKEN 1
 #endif
-#endif
 
 static const size_t MAX_NUMBER_OF_PINVOKE_ARGS = 10;
 tbb::atomic<size_t> function_counter;
@@ -211,6 +209,7 @@ void test_parallel_invoke()
 
 // Exception handling support test
 
+#if __TBB_TASK_GROUP_CONTEXT
 #define HARNESS_EH_SIMPLE_MODE 1
 #include "harness_eh.h"
 
@@ -297,6 +296,7 @@ void TestCancellation ()
         }
     }
 }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
 //------------------------------------------------------------------------
 // Entry point
@@ -316,7 +316,9 @@ int TestMain () {
 #elif TBB_USE_EXCEPTIONS
             TestExceptionHandling();
 #endif /* TBB_USE_EXCEPTIONS */
+#if __TBB_TASK_GROUP_CONTEXT
             TestCancellation();
+#endif /* __TBB_TASK_GROUP_CONTEXT */
         }
         TestCPUUserTime(p);
     }
diff --git a/src/test/test_parallel_reduce.cpp b/src/test/test_parallel_reduce.cpp
index e246413..5ec3ba0 100644
--- a/src/test/test_parallel_reduce.cpp
+++ b/src/test/test_parallel_reduce.cpp
@@ -26,6 +26,7 @@
     the GNU General Public License.
 */
 
+#define TBB_PREVIEW_DETERMINISTIC_REDUCE 1
 #include "tbb/parallel_reduce.h"
 #include "tbb/atomic.h"
 #include "harness_assert.h"
@@ -147,7 +148,7 @@ void Flog( int nthread, bool interference=false ) {
         }
         tbb::tick_count T1 = tbb::tick_count::now();
         REMARK("time=%g join_count=%ld ForkCount=%ld nthread=%d%s\n",
-                   (T1-T0).seconds(),join_count,long(ForkCount), nthread, interference ? " with interference)":"");
+                   (T1-T0).seconds(),join_count,long(ForkCount), nthread, interference ? " with interference":"");
     }
 }
 
@@ -165,7 +166,7 @@ public:
 };
 
 //! Test for problem in TBB 2.1 parallel_reduce where middle of a range is stolen.
-/** Warning: this test is a somewhat abusive use of TBB somewhat because 
+/** Warning: this test is a somewhat abusive use of TBB because 
     it requires two or more threads to avoid deadlock. */
 void FlogWithInterference( int nthread ) {
     ASSERT( nthread>=2, "requires too or more threads" );
@@ -250,6 +251,74 @@ void ParallelSum () {
     delete array;
 }
 
+const int N = 1000;
+
+#include "harness_concurrency_tracker.h"
+
+template <class Op>
+struct ReduceBody {
+    typename Op::Type my_value;
+
+    ReduceBody() : my_value() {}
+    ReduceBody( ReduceBody &, tbb::split ) : my_value() {}
+
+    void operator() ( const tbb::blocked_range<int>& r ) {
+        Harness::ConcurrencyTracker ct;
+        for ( int i = r.begin(); i != r.end(); ++i ) {
+            Op op;
+            my_value = op(my_value, i);
+        }
+    }
+
+    void join( const ReduceBody& y ) {
+        Op op;
+        my_value = op.join(my_value, y.my_value);
+    }
+};
+
+template <class Op>
+void TestDeterministicReduction () {
+    typedef typename Op::Type Type;
+    const tbb::blocked_range<int> range(0, N);
+    ReduceBody<Op> body;
+    tbb::parallel_deterministic_reduce( range,body );
+    Type R = body.my_value;
+    for ( int i=0; i<100; ++i ) {
+        ReduceBody<Op> body2;
+        tbb::parallel_deterministic_reduce( range,body2 );
+        ASSERT( body2.my_value == R, NULL );
+#if __TBB_LAMBDAS_PRESENT
+        Type r = tbb::parallel_deterministic_reduce( range, Type(), 
+            [](const tbb::blocked_range<int>& r, Type value) -> Type {
+                Harness::ConcurrencyTracker ct;
+                for ( int i = r.begin(); i != r.end(); ++i ) {
+                    Op op;
+                    value = op(value, i);
+                }
+                return value;
+        },
+            [](const Type& v1, const Type& v2) -> Type {
+                Op op;
+                return op.join(v1,v2);
+        }
+            );
+        ASSERT( r == R, NULL );
+#endif /* LAMBDAS */
+    }
+    ASSERT_WARNING((Harness::ConcurrencyTracker::PeakParallelism() > 1), "no parallel execution\n");
+}
+
+class RotOp {
+public:
+    typedef int Type;
+    int operator() ( int x, int i ) const {
+        return ( x<<1 ) ^ i;
+    }
+    int join( int x, int y ) const {
+        return operator()( x, y );
+    }
+};
+
 #include "tbb/task_scheduler_init.h"
 #include "harness_cpu.h"
 
@@ -264,6 +333,8 @@ int TestMain () {
         if( p>=2 )
             FlogWithInterference(p);
         ParallelSum();
+        if ( p>=2 )
+            TestDeterministicReduction<RotOp>();
         // Test that all workers sleep when no work
         TestCPUUserTime(p);
     }
diff --git a/src/test/test_parallel_sort.cpp b/src/test/test_parallel_sort.cpp
index daf8812..886d8ac 100644
--- a/src/test/test_parallel_sort.cpp
+++ b/src/test/test_parallel_sort.cpp
@@ -311,11 +311,13 @@ bool init_iter(std::string *iter, std::string *sorted_list, size_t n, const std:
                 test_type = "sin";
                 for (size_t i = 0; i < n; i++) {
                     char buffer[20];
-#if __STDC_SECURE_LIB__>=200411
+// Getting rid of secure warning issued by C++ 14.00 and newer
+// sprintf_s is not defined in msvcrt.dll in windows XP and windows 2003 (used by MinGW gcc 4.5.2 with default spec)
+#if __STDC_SECURE_LIB__>=200411 && !__MINGW64__
                     sprintf_s(buffer, sizeof(buffer), "%f", float(sin(float(i))));
 #else
                     sprintf(buffer, "%f", float(sin(float(i))));
-#endif /* _MSC_VER>=1400 */
+#endif /* __STDC_SECURE_LIB__>=200411 || && !__MINGW64__ */
                     sorted_list[i] = iter[i] = std::string(buffer);
                 }
                 break;
diff --git a/src/test/test_priority_queue_node.cpp b/src/test/test_priority_queue_node.cpp
index c30a656..60f1833 100644
--- a/src/test/test_priority_queue_node.cpp
+++ b/src/test/test_priority_queue_node.cpp
@@ -28,8 +28,7 @@
 
 // TO DO: Add overlapping put / receive tests
 
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
 #include "tbb/task_scheduler_init.h"
 #include "tbb/tick_count.h"
 #include "harness.h"
@@ -40,7 +39,7 @@
 #define C 10
 
 template< typename T >
-void spin_try_get( tbb::priority_queue_node<T> &q, T &value ) {
+void spin_try_get( tbb::flow::priority_queue_node<T> &q, T &value ) {
     while ( q.try_get(value) != true ) ;
 }
 
@@ -54,8 +53,8 @@ void check_item( T* next_value, T &value ) {
 
 template< typename T >
 struct parallel_puts : NoAssign {
-    tbb::priority_queue_node<T> &my_q;
-    parallel_puts( tbb::priority_queue_node<T> &q ) : my_q(q) {}
+    tbb::flow::priority_queue_node<T> &my_q;
+    parallel_puts( tbb::flow::priority_queue_node<T> &q ) : my_q(q) {}
     void operator()(int i) const {
         for (int j = 0; j < N; ++j) {
             bool msg = my_q.try_put( T(N*i + j) );
@@ -66,8 +65,8 @@ struct parallel_puts : NoAssign {
 
 template< typename T >
 struct parallel_gets : NoAssign {
-    tbb::priority_queue_node<T> &my_q;
-    parallel_gets( tbb::priority_queue_node<T> &q) : my_q(q) {}
+    tbb::flow::priority_queue_node<T> &my_q;
+    parallel_gets( tbb::flow::priority_queue_node<T> &q) : my_q(q) {}
     void operator()(int) const {
         T prev;
         spin_try_get( my_q, prev );
@@ -81,8 +80,8 @@ struct parallel_gets : NoAssign {
 
 template< typename T >
 struct parallel_put_get : NoAssign {
-    tbb::priority_queue_node<T> &my_q;
-    parallel_put_get( tbb::priority_queue_node<T> &q ) : my_q(q) {}
+    tbb::flow::priority_queue_node<T> &my_q;
+    parallel_put_get( tbb::flow::priority_queue_node<T> &q ) : my_q(q) {}
     void operator()(int tid) const {
         for ( int i = 0; i < N; i+=C ) {
             int j_end = ( N < i + C ) ? N : i + C; 
@@ -106,11 +105,11 @@ struct parallel_put_get : NoAssign {
 //
 template< typename T >
 int test_reservation(int) {
-    tbb::graph g;
+    tbb::flow::graph g;
     T bogus_value(-1);
 
     // Simple tests
-    tbb::priority_queue_node<T> q(g);
+    tbb::flow::priority_queue_node<T> q(g);
 
     q.try_put(T(1));
     q.try_put(T(2));
@@ -162,10 +161,10 @@ int test_reservation(int) {
 //
 template< typename T >
 int test_parallel(int num_threads) {
-    tbb::graph g;
-    tbb::priority_queue_node<T> q(g);
-    tbb::priority_queue_node<T> q2(g);
-    tbb::priority_queue_node<T> q3(g);
+    tbb::flow::graph g;
+    tbb::flow::priority_queue_node<T> q(g);
+    tbb::flow::priority_queue_node<T> q2(g);
+    tbb::flow::priority_queue_node<T> q3(g);
     T bogus_value(-1);
     T j = bogus_value;
 
@@ -193,9 +192,8 @@ int test_parallel(int num_threads) {
     ASSERT( q.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
-
-    ASSERT( q.register_successor( q2 ) == true, NULL );
-    ASSERT( q2.register_successor( q3 ) == true, NULL );
+    tbb::flow::make_edge( q, q2 );
+    tbb::flow::make_edge( q2, q3 );
     NativeParallelFor( num_threads, parallel_puts<T>(q) );
     g.wait_for_all();
     NativeParallelFor( num_threads, parallel_gets<T>(q3) );
@@ -208,6 +206,25 @@ int test_parallel(int num_threads) {
     ASSERT( q3.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
+    // test copy constructor
+    ASSERT( q.remove_successor( q2 ) == true, NULL );
+    NativeParallelFor( num_threads, parallel_puts<T>(q) );
+    tbb::flow::priority_queue_node<T> q_copy(q);
+    g.wait_for_all();
+    j = bogus_value;
+    ASSERT( q_copy.try_get( j ) == false, NULL );
+    ASSERT( q.register_successor( q_copy ) == true, NULL );
+    for (int i = num_threads*N -1; i>=0; --i) {
+        spin_try_get( q_copy, j );
+        ASSERT(j == i, NULL);
+        j = bogus_value;
+    }
+    g.wait_for_all();
+    ASSERT( q.try_get( j ) == false, NULL );
+    ASSERT( j == bogus_value, NULL );
+    ASSERT( q_copy.try_get( j ) == false, NULL );
+    ASSERT( j == bogus_value, NULL );
+
     return 0;
 }
 
@@ -222,11 +239,11 @@ int test_parallel(int num_threads) {
 
 template< typename T >
 int test_serial() {
-    tbb::graph g;
+    tbb::flow::graph g;
     T bogus_value(-1);
 
-    tbb::priority_queue_node<T> q(g);
-    tbb::priority_queue_node<T> q2(g);
+    tbb::flow::priority_queue_node<T> q(g);
+    tbb::flow::priority_queue_node<T> q2(g);
     T j = bogus_value;
 
     //
@@ -254,7 +271,7 @@ int test_serial() {
     ASSERT( q.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
-    ASSERT( q.register_successor( q2 ) == true, NULL );
+    tbb::flow::make_edge( q, q2 );
 
     for (int i = 0; i < N; ++i)
         ASSERT( q.try_put( T(i) ), NULL );
@@ -271,7 +288,7 @@ int test_serial() {
     ASSERT( q2.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
-    ASSERT( q.remove_successor( q2 ) == true, NULL );
+    tbb::flow::remove_edge( q, q2 );
     ASSERT( q.try_put( 1 ) == true, NULL );
     g.wait_for_all();
     ASSERT( q2.try_get( j ) == false, NULL );
@@ -280,9 +297,9 @@ int test_serial() {
     ASSERT( q.try_get( j ) == true, NULL );
     ASSERT( j == 1, NULL );
 
-    tbb::priority_queue_node<T> q3(g);
-    ASSERT( q.register_successor( q2 ) == true, NULL );
-    ASSERT( q2.register_successor( q3 ) == true, NULL );
+    tbb::flow::priority_queue_node<T> q3(g);
+    tbb::flow::make_edge( q, q2 );
+    tbb::flow::make_edge( q2, q3 );
 
     for (int i = 0; i < N; ++i)
         ASSERT(  q.try_put( T(i) ), NULL );
@@ -301,7 +318,7 @@ int test_serial() {
     ASSERT( q3.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
-    ASSERT( q.remove_successor( q2 ) == true, NULL );
+    tbb::flow::remove_edge( q,  q2 );
     ASSERT( q.try_put( 1 ) == true, NULL );
     g.wait_for_all();
     ASSERT( q2.try_get( j ) == false, NULL );
diff --git a/src/test/test_queue_node.cpp b/src/test/test_queue_node.cpp
index ecc617a..350bfb5 100644
--- a/src/test/test_queue_node.cpp
+++ b/src/test/test_queue_node.cpp
@@ -28,8 +28,7 @@
 
 // TO DO: Add overlapping put / receive tests
 
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
 #include "tbb/task_scheduler_init.h"
 #include "tbb/tick_count.h"
 #include "harness.h"
@@ -40,7 +39,7 @@
 #define C 10
 
 template< typename T >
-void spin_try_get( tbb::queue_node<T> &q, T &value ) {
+void spin_try_get( tbb::flow::queue_node<T> &q, T &value ) {
     while ( q.try_get(value) != true ) ;
 }
 
@@ -55,9 +54,9 @@ void check_item( T* next_value, T &value ) {
 template< typename T >
 struct parallel_puts : NoAssign {
 
-    tbb::queue_node<T> &my_q;
+    tbb::flow::queue_node<T> &my_q;
 
-    parallel_puts( tbb::queue_node<T> &q ) : my_q(q) {}
+    parallel_puts( tbb::flow::queue_node<T> &q ) : my_q(q) {}
 
     void operator()(int i) const {
         for (int j = 0; j < N; ++j) {
@@ -142,10 +141,10 @@ struct touches {
 template< typename T >
 struct parallel_gets : NoAssign {
 
-    tbb::queue_node<T> &my_q;
+    tbb::flow::queue_node<T> &my_q;
     touches<T> &my_touches;
 
-    parallel_gets( tbb::queue_node<T> &q, touches<T> &t) : my_q(q), my_touches(t) {}
+    parallel_gets( tbb::flow::queue_node<T> &q, touches<T> &t) : my_q(q), my_touches(t) {}
 
     void operator()(int tid) const {
         for (int j = 0; j < N; ++j) {
@@ -160,10 +159,10 @@ struct parallel_gets : NoAssign {
 template< typename T >
 struct parallel_put_get : NoAssign {
 
-    tbb::queue_node<T> &my_q;
+    tbb::flow::queue_node<T> &my_q;
     touches<T> &my_touches;
 
-    parallel_put_get( tbb::queue_node<T> &q, touches<T> &t ) : my_q(q), my_touches(t) {}
+    parallel_put_get( tbb::flow::queue_node<T> &q, touches<T> &t ) : my_q(q), my_touches(t) {}
 
     void operator()(int tid) const {
 
@@ -191,11 +190,11 @@ struct parallel_put_get : NoAssign {
 //
 template< typename T >
 int test_reservation(int num_threads) {
-    tbb::graph g;
+    tbb::flow::graph g;
     T bogus_value(-1);
 
     // Simple tests
-    tbb::queue_node<T> q(g);
+    tbb::flow::queue_node<T> q(g);
 
     q.try_put(T(1));
     q.try_put(T(2));
@@ -242,10 +241,10 @@ int test_reservation(int num_threads) {
 //
 template< typename T >
 int test_parallel(int num_threads) {
-    tbb::graph g;
-    tbb::queue_node<T> q(g);
-    tbb::queue_node<T> q2(g);
-    tbb::queue_node<T> q3(g);
+    tbb::flow::graph g;
+    tbb::flow::queue_node<T> q(g);
+    tbb::flow::queue_node<T> q2(g);
+    tbb::flow::queue_node<T> q3(g);
     T bogus_value(-1);
     T j = bogus_value;
 
@@ -291,8 +290,8 @@ int test_parallel(int num_threads) {
     ASSERT( q.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
-    ASSERT( q.register_successor( q2 ) == true, NULL );
-    ASSERT( q2.register_successor( q3 ) == true, NULL );
+    tbb::flow::make_edge( q, q2 );
+    tbb::flow::make_edge( q2, q3 );
 
     NativeParallelFor( num_threads, parallel_puts<T>(q) );
     {
@@ -310,6 +309,26 @@ int test_parallel(int num_threads) {
     ASSERT( q3.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
+    // test copy constructor
+    ASSERT( q.remove_successor( q2 ), NULL );
+    NativeParallelFor( num_threads, parallel_puts<T>(q) );
+    tbb::flow::queue_node<T> q_copy(q);
+    j = bogus_value;
+    g.wait_for_all();
+    ASSERT( q_copy.try_get( j ) == false, NULL );
+    ASSERT( q.register_successor( q_copy ) == true, NULL );
+    {
+        touches< T > t( num_threads );
+        NativeParallelFor( num_threads, parallel_gets<T>(q_copy, t) );
+        g.wait_for_all();
+        ASSERT( t.validate_touches(), NULL );
+    }
+    j = bogus_value;
+    ASSERT( q.try_get( j ) == false, NULL );
+    ASSERT( j == bogus_value, NULL );
+    ASSERT( q_copy.try_get( j ) == false, NULL );
+    ASSERT( j == bogus_value, NULL );
+
     return 0;
 }
 
@@ -324,11 +343,11 @@ int test_parallel(int num_threads) {
 
 template< typename T >
 int test_serial() {
-    tbb::graph g;
+    tbb::flow::graph g;
     T bogus_value(-1);
 
-    tbb::queue_node<T> q(g);
-    tbb::queue_node<T> q2(g);
+    tbb::flow::queue_node<T> q(g);
+    tbb::flow::queue_node<T> q2(g);
     T j = bogus_value;
 
     //
@@ -360,7 +379,7 @@ int test_serial() {
     ASSERT( q.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
-    ASSERT( q.register_successor( q2 ) == true, NULL );
+    tbb::flow::make_edge( q, q2 );
 
     for (int i = 0; i < N; ++i) {
         bool msg = q.try_put( T(i) );
@@ -380,7 +399,7 @@ int test_serial() {
     ASSERT( q2.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
-    ASSERT( q.remove_successor( q2 ) == true, NULL );
+    tbb::flow::remove_edge( q, q2 );
     ASSERT( q.try_put( 1 ) == true, NULL );
     g.wait_for_all();
     ASSERT( q2.try_get( j ) == false, NULL );
@@ -389,9 +408,9 @@ int test_serial() {
     ASSERT( q.try_get( j ) == true, NULL );
     ASSERT( j == 1, NULL );
 
-    tbb::queue_node<T> q3(g);
-    ASSERT( q.register_successor( q2 ) == true, NULL );
-    ASSERT( q2.register_successor( q3 ) == true, NULL );
+    tbb::flow::queue_node<T> q3(g);
+    tbb::flow::make_edge( q, q2 );
+    tbb::flow::make_edge( q2, q3 );
 
     for (int i = 0; i < N; ++i) {
         bool msg = q.try_put( T(i) );
@@ -412,7 +431,7 @@ int test_serial() {
     ASSERT( q3.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
 
-    ASSERT( q.remove_successor( q2 ) == true, NULL );
+    tbb::flow::remove_edge( q,  q2 );
     ASSERT( q.try_put( 1 ) == true, NULL );
     g.wait_for_all();
     ASSERT( q2.try_get( j ) == false, NULL );
diff --git a/src/test/test_runtime_loader.cpp b/src/test/test_runtime_loader.cpp
new file mode 100644
index 0000000..1c2b06b
--- /dev/null
+++ b/src/test/test_runtime_loader.cpp
@@ -0,0 +1,300 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#if !(_WIN32||_WIN64)
+
+#include "harness.h"
+
+int TestMain () {
+    return Harness::Skipped;
+}
+
+#else // !(_WIN32||_WIN64)
+
+#define TBB_PREVIEW_RUNTIME_LOADER 1
+#include "tbb/runtime_loader.h"
+#include "tbb/tbb_stddef.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/tbb_exception.h"
+
+#include <cstdio>
+#include <cstdlib>
+#include <cerrno>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    // Suppress "C++ exception handler used, but unwind semantics are not enabled" warning in STL headers
+    #pragma warning (push)
+    #pragma warning (disable: 4530)
+#endif
+
+#include <vector>
+#include <string>
+#include <utility>
+#include <typeinfo>
+
+#if !TBB_USE_EXCEPTIONS && _MSC_VER
+    #pragma warning (pop)
+#endif
+
+#ifdef HARNESS_USE_RUNTIME_LOADER
+    #undef HARNESS_USE_RUNTIME_LOADER    // We do not want harness to preload tbb.
+#endif
+#include "harness.h"
+
+static int errors = 0;
+
+#define CHECK( cond ) {                                                  \
+    if ( ! (cond) ) {                                                    \
+        ++ errors;                                                       \
+        REPORT( "%s:%d: --- TEST FAILED ---\n", __FILE__, __LINE__ );    \
+    };                                                                   \
+}
+
+#define SAY( msg ) \
+    REMARK( "%s:%d: %s\n", __FILE__, __LINE__, msg )
+
+typedef int (*int_func_t)();
+
+namespace tbb {
+namespace interface6 {
+namespace internal {
+namespace runtime_loader {
+    extern tbb::runtime_loader::error_mode stub_mode;
+} } } } // namespaces runtime_loader, internal, interface6, tbb
+
+using tbb::interface6::internal::runtime_loader::stub_mode;
+
+#define _CHECK_TBB( code ) {                           \
+    stub_mode = tbb::runtime_loader::em_status;        \
+    int ver = tbb::TBB_runtime_interface_version();    \
+    stub_mode = tbb::runtime_loader::em_abort;         \
+    CHECK( ver == code );                              \
+}
+
+#define CHECK_TBB_IS_LOADED()                          \
+    _CHECK_TBB( TBB_INTERFACE_VERSION )
+
+#define CHECK_TBB_IS_NOT_LOADED()                      \
+    _CHECK_TBB( tbb::runtime_loader::ec_no_lib )
+
+int TestMain() {
+
+
+    __TBB_TRY {
+
+        {
+            SAY( "Call a function when library is not yet loaded, stub should return a error." );
+            CHECK_TBB_IS_NOT_LOADED();
+        }
+
+        {
+            SAY( "Create a runtime_loader object, do not load library but make some bad calls." );
+            tbb::runtime_loader rtl( tbb::runtime_loader::em_status );
+            SAY( "After creating status should be ok." );
+            CHECK( rtl.status() == tbb::runtime_loader::ec_ok );
+            SAY( "Call a function, stub should return a error." );
+            CHECK_TBB_IS_NOT_LOADED();
+        }
+
+        {
+            SAY( "Create a runtime_loader object and call load() with bad arguments." );
+            char const * path[] = { ".", NULL };
+            tbb::runtime_loader rtl( tbb::runtime_loader::em_status );
+            SAY( "Min version is bad." );
+            rtl.load( path, -1 );
+            CHECK( rtl.status() == tbb::runtime_loader::ec_bad_arg );
+            SAY( "Max version is bad." );
+            rtl.load( path, TBB_INTERFACE_VERSION, -1 );
+            CHECK( rtl.status() == tbb::runtime_loader::ec_bad_arg );
+            SAY( "Both versions are bad." );
+            rtl.load( path, -1, -1 );
+            CHECK( rtl.status() == tbb::runtime_loader::ec_bad_arg );
+            SAY( "Min is bigger than max." );
+            rtl.load( path, TBB_INTERFACE_VERSION + 1, TBB_INTERFACE_VERSION - 1 );
+            CHECK( rtl.status() == tbb::runtime_loader::ec_bad_arg );
+        }
+
+        {
+            SAY( "Create a proxy object and call load() with good arguments but not availabe version." );
+            char const * path[] = { ".", NULL };
+            tbb::runtime_loader rtl( tbb::runtime_loader::em_status );
+            SAY( "Min version too big." );
+            rtl.load( path, TBB_INTERFACE_VERSION + 1, TBB_INTERFACE_VERSION + 1 );
+            CHECK( rtl.status() == tbb::runtime_loader::ec_no_lib );
+            SAY( "Max version is too small." );
+            rtl.load( path, TBB_INTERFACE_VERSION - 1, TBB_INTERFACE_VERSION - 1 );
+            CHECK( rtl.status() == tbb::runtime_loader::ec_no_lib );
+        }
+
+        {
+            SAY( "Test em_throw mode." );
+            char const * path[] = { ".", NULL };
+            tbb::runtime_loader rtl( tbb::runtime_loader::em_throw );
+            tbb::runtime_loader::error_code code = tbb::runtime_loader::ec_ok;
+            __TBB_TRY {
+                rtl.load( path, -1 );
+            } __TBB_CATCH ( tbb::runtime_loader::error_code c ) {
+                code = c;
+            }; // __TBB_TRY
+            CHECK( code == tbb::runtime_loader::ec_bad_arg );
+            __TBB_TRY {
+                rtl.load( path, TBB_INTERFACE_VERSION + 1 );
+            } __TBB_CATCH ( tbb::runtime_loader::error_code c ) {
+                code = c;
+            }; // __TBB_TRY
+            CHECK( code == tbb::runtime_loader::ec_no_lib );
+        }
+
+        {
+            SAY( "Load current version, but specify wrong directories." );
+            tbb::runtime_loader rtl( tbb::runtime_loader::em_status );
+            SAY( "Specify no directories." );
+            char const * path0[] = { NULL };
+            rtl.load( path0 );
+            CHECK( rtl.status() == tbb::runtime_loader::ec_no_lib );
+            SAY( "Specify directories without library." );
+            char const * path1[] = { "..", "/", NULL };
+            rtl.load( path1 );
+            CHECK( rtl.status() == tbb::runtime_loader::ec_no_lib );
+        }
+
+        {
+            SAY( "Now really load library and do various tests." );
+            char const * path[] = { ".", NULL };
+            tbb::runtime_loader rtl( tbb::runtime_loader::em_status );
+            SAY( "Load current version." );
+            rtl.load( path, TBB_INTERFACE_VERSION, TBB_INTERFACE_VERSION );
+            CHECK( rtl.status() == tbb::runtime_loader::ec_ok );
+            if ( rtl.status() == tbb::runtime_loader::ec_ok ) {
+                {
+                    SAY( "Make sure the library really loaded." );
+                    CHECK_TBB_IS_LOADED();
+                }
+                SAY( "Call load() again, it should return a error." );
+                rtl.load( path, TBB_INTERFACE_VERSION, TBB_INTERFACE_VERSION );
+                CHECK( rtl.status() == tbb::runtime_loader::ec_bad_call );
+                {
+                    SAY( "Initialize task_scheduler." );
+                    tbb::task_scheduler_init init( 1 );
+                    // Check what?
+                }
+
+                // There was a problem on Linux, and still a problem on Mac OS X.
+                SAY( "Throw an exception." );
+                // Iterate thru all the ids first.
+                for ( int id = 1; id < tbb::internal::eid_max; ++ id ) {
+                    bool ex_caught = false;
+                    __TBB_TRY {
+                        tbb::internal::throw_exception( tbb::internal::exception_id( id ) );
+                    } __TBB_CATCH ( std::exception const & ) {
+                        SAY( "Expected exception caught." );
+                        ex_caught = true;
+                    } __TBB_CATCH ( ... ) {
+                        SAY( "Unexpected exception caught." );
+                    }; // try
+                    CHECK( ex_caught );
+                }; // for
+                // Now try to catch exceptions of specific types.
+                #define CHECK_EXCEPTION( id, type )                                 \
+                    {                                                               \
+                        SAY( "Trowing " #id " exception of " #type " type..." );    \
+                        bool ex_caught = false;                                     \
+                        __TBB_TRY {                                                 \
+                            tbb::internal::throw_exception( tbb::internal::id );    \
+                        } __TBB_CATCH ( type const & ) {                            \
+                            SAY( #type " exception caught." );                      \
+                            ex_caught = true;                                       \
+                        } __TBB_CATCH ( ... ) {                                     \
+                            SAY( "Unexpected exception caught." );                  \
+                        }; /* try */                                                \
+                        CHECK( ex_caught );                                         \
+                    }
+                CHECK_EXCEPTION( eid_bad_alloc,                   std::bad_alloc                   );
+                CHECK_EXCEPTION( eid_bad_last_alloc,              tbb::bad_last_alloc              );
+                CHECK_EXCEPTION( eid_nonpositive_step,            std::invalid_argument            );
+                CHECK_EXCEPTION( eid_out_of_range,                std::out_of_range                );
+                CHECK_EXCEPTION( eid_segment_range_error,         std::range_error                 );
+                CHECK_EXCEPTION( eid_missing_wait,                tbb::missing_wait                );
+                CHECK_EXCEPTION( eid_invalid_multiple_scheduling, tbb::invalid_multiple_scheduling );
+                CHECK_EXCEPTION( eid_improper_lock,               tbb::improper_lock               );
+                CHECK_EXCEPTION( eid_possible_deadlock,           std::runtime_error               );
+                CHECK_EXCEPTION( eid_reservation_length_error,    std::length_error                );
+                #undef CHECK_EXCEPTION
+                {
+                    bool ex_caught = false;
+                    __TBB_TRY {
+                        tbb::internal::handle_perror( EAGAIN, "apple" );
+                    } __TBB_CATCH ( std::runtime_error const & ) {
+                        SAY( "Expected exception caught." );
+                        ex_caught = true;
+                    } __TBB_CATCH ( ... ) {
+                        SAY( "Unexpected exception caught." );
+                    }; // try
+                    CHECK( ex_caught );
+                }
+            }; // if
+        }
+
+        {
+            SAY( "Test multiple proxies." );
+            char const * path[] = { ".", NULL };
+            tbb::runtime_loader rtl0( tbb::runtime_loader::em_status );
+            tbb::runtime_loader rtl1( tbb::runtime_loader::em_status );
+            CHECK( rtl0.status() == tbb::runtime_loader::ec_ok );
+            CHECK( rtl1.status() == tbb::runtime_loader::ec_ok );
+            SAY( "Load current version with the first rtl." );
+            rtl0.load( path );
+            CHECK( rtl0.status() == tbb::runtime_loader::ec_ok );
+            CHECK_TBB_IS_LOADED();
+            SAY( "Load another version with the second proxy, it should return a error." );
+            rtl1.load( path, TBB_INTERFACE_VERSION + 1 );
+            CHECK( rtl1.status() == tbb::runtime_loader::ec_bad_ver );
+            SAY( "Load the same version with the second proxy, it should return ok." );
+            rtl1.load( path );
+            CHECK( rtl1.status() == tbb::runtime_loader::ec_ok );
+            CHECK_TBB_IS_LOADED();
+        }
+
+    } __TBB_CATCH( ... ) {
+
+        ASSERT( 0, "unexpected exception" );
+
+    }; // __TBB_TRY
+
+    if ( errors > 0 ) {
+        REPORT( "Some tests failed.\n" );
+        exit( 1 );
+    }; // if
+
+    return Harness::Done;
+
+} // main
+
+#endif // !(_WIN32||_WIN64)
+
+// end of file //
diff --git a/src/test/test_semaphore.cpp b/src/test/test_semaphore.cpp
index e3ebd79..d94be4f 100644
--- a/src/test/test_semaphore.cpp
+++ b/src/test/test_semaphore.cpp
@@ -41,6 +41,7 @@
 
 #include "tbb/semaphore.h"
 #include "tbb/atomic.h"
+#include "tbb/blocked_range.h"
 
 #include <vector>
 using std::vector;
@@ -123,6 +124,41 @@ void testSemaphore( int semInitCnt, int extraThreads ) {
     }
 }
 
+#include "tbb/semaphore.cpp"
+#include "tbb/dynamic_link.cpp"
+
+#define N_TIMES 1000
+
+template<typename S>
+struct Counter {
+    volatile long value;
+    S my_sem;
+    Counter() : value(0) {}
+};
+
+//! Function object for use with parallel_for.h.
+template<typename C>
+struct AddOne: NoAssign { 
+    C& my_counter;
+    /** Increments counter once for each iteration in the iteration space. */
+    void operator()( int /*tid*/ ) const {
+        for( size_t i=0; i<N_TIMES; ++i ) {
+            my_counter.my_sem.P();
+            my_counter.value = my_counter.value + 1;
+            my_counter.my_sem.V();
+        }
+    }
+    AddOne( C& c_ ) : my_counter(c_) { my_counter.my_sem.V(); }
+};
+
+void testBinarySemaphore( int nThreads ) {
+    REMARK("Testing binary semaphore\n");
+    Counter<tbb::internal::binary_semaphore> counter;
+    AddOne<Counter<tbb::internal::binary_semaphore> > myAddOne(counter);
+    NativeParallelFor( nThreads, myAddOne );
+    ASSERT( nThreads*N_TIMES==counter.value, "Binary semaphore operations P()/V() have a race");
+}
+
 // Power of 2, the most tokens that can be in flight.
 #define MAX_TOKENS 32
 enum FilterType { imaProducer, imaConsumer };
@@ -240,6 +276,7 @@ void testProducerConsumer( unsigned totTokens, unsigned nTokens, unsigned pWait,
 int TestMain() {
     REMARK("Started\n");
     if(MaxThread > 0) {
+        testBinarySemaphore( MaxThread );
         for(int semSize = 1; semSize <= MaxThread; ++semSize) {
             for(int exThreads = 0; exThreads <= MaxThread - semSize; ++exThreads) {
                 testSemaphore( semSize, exThreads );
diff --git a/src/test/test_sequencer_node.cpp b/src/test/test_sequencer_node.cpp
index 8df6374..2651157 100644
--- a/src/test/test_sequencer_node.cpp
+++ b/src/test/test_sequencer_node.cpp
@@ -27,8 +27,7 @@
 */
 
 #include "harness.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
+#include "tbb/flow_graph.h"
 #include "tbb/task_scheduler_init.h"
 #include "tbb/tick_count.h"
 #include "tbb/atomic.h"
@@ -40,27 +39,27 @@
 
 template< typename T >
 struct seq_inspector {
-    size_t operator()(T &v) const { return size_t(v); }
+    size_t operator()(const T &v) const { return size_t(v); }
 };
 
 template< typename T >
-bool wait_try_get( tbb::graph &g, tbb::sequencer_node<T> &q, T &value ) {
+bool wait_try_get( tbb::flow::graph &g, tbb::flow::sequencer_node<T> &q, T &value ) {
     g.wait_for_all();
     return q.try_get(value);
 }
 
 template< typename T >
-void spin_try_get( tbb::queue_node<T> &q, T &value ) {
+void spin_try_get( tbb::flow::queue_node<T> &q, T &value ) {
     while ( q.try_get(value) != true ) ;
 }
 
 template< typename T >
 struct parallel_puts : NoAssign {
 
-    tbb::sequencer_node<T> &my_q;
+    tbb::flow::sequencer_node<T> &my_q;
     int my_num_threads;
 
-    parallel_puts( tbb::sequencer_node<T> &q, int num_threads ) : my_q(q), my_num_threads(num_threads) {}
+    parallel_puts( tbb::flow::sequencer_node<T> &q, int num_threads ) : my_q(q), my_num_threads(num_threads) {}
 
     void operator()(int tid) const {
         for (int j = tid; j < N; j+=my_num_threads) {
@@ -138,11 +137,11 @@ struct touches {
 template< typename T >
 struct parallel_gets : NoAssign {
 
-    tbb::sequencer_node<T> &my_q;
+    tbb::flow::sequencer_node<T> &my_q;
     int my_num_threads;
     touches<T> &my_touches;
 
-    parallel_gets( tbb::sequencer_node<T> &q, int num_threads, touches<T> &t ) : my_q(q), my_num_threads(num_threads), my_touches(t) {}
+    parallel_gets( tbb::flow::sequencer_node<T> &q, int num_threads, touches<T> &t ) : my_q(q), my_num_threads(num_threads), my_touches(t) {}
 
     void operator()(int tid) const {
         for (int j = tid; j < N; j+=my_num_threads) {
@@ -157,13 +156,13 @@ struct parallel_gets : NoAssign {
 template< typename T >
 struct parallel_put_get : NoAssign {
 
-    tbb::sequencer_node<T> &my_s1;
-    tbb::sequencer_node<T> &my_s2;
+    tbb::flow::sequencer_node<T> &my_s1;
+    tbb::flow::sequencer_node<T> &my_s2;
     int my_num_threads;
     tbb::atomic< int > &my_counter;    
     touches<T> &my_touches; 
 
-    parallel_put_get( tbb::sequencer_node<T> &s1, tbb::sequencer_node<T> &s2, int num_threads, 
+    parallel_put_get( tbb::flow::sequencer_node<T> &s1, tbb::flow::sequencer_node<T> &s2, int num_threads, 
                       tbb::atomic<int> &counter, touches<T> &t ) : my_s1(s1), my_s2(s2), my_num_threads(num_threads), my_counter(counter), my_touches(t) {}
 
     void operator()(int tid) const {
@@ -195,9 +194,9 @@ struct parallel_put_get : NoAssign {
 
 template< typename T >
 int test_parallel(int num_threads) {
-    tbb::graph g;
+    tbb::flow::graph g;
 
-    tbb::sequencer_node<T> s(g, seq_inspector<T>());
+    tbb::flow::sequencer_node<T> s(g, seq_inspector<T>());
     NativeParallelFor( num_threads, parallel_puts<T>(s, num_threads) );
     {
         touches<T> t( num_threads );
@@ -211,11 +210,11 @@ int test_parallel(int num_threads) {
     ASSERT( j == bogus_value, NULL );
     g.wait_for_all();
 
-    tbb::sequencer_node<T> s1(g, seq_inspector<T>());
-    tbb::sequencer_node<T> s2(g, seq_inspector<T>());
-    tbb::sequencer_node<T> s3(g, seq_inspector<T>());
-    ASSERT( s1.register_successor( s2 ) == true, NULL );
-    ASSERT( s2.register_successor( s3 ) == true, NULL );
+    tbb::flow::sequencer_node<T> s1(g, seq_inspector<T>());
+    tbb::flow::sequencer_node<T> s2(g, seq_inspector<T>());
+    tbb::flow::sequencer_node<T> s3(g, seq_inspector<T>());
+    tbb::flow::make_edge( s1, s2 );
+    tbb::flow::make_edge( s2, s3 );
 
     {
         touches<T> t( num_threads );
@@ -232,6 +231,20 @@ int test_parallel(int num_threads) {
     g.wait_for_all();
     ASSERT( s3.try_get( j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
+
+    // test copy constructor
+    tbb::flow::sequencer_node<T> s_copy(s);
+    NativeParallelFor( num_threads, parallel_puts<T>(s_copy, num_threads) );
+    for (int i = 0; i < N; ++i) {
+        j = bogus_value;
+        spin_try_get( s_copy, j );
+        ASSERT( i == j, NULL );
+    }
+    j = bogus_value;
+    g.wait_for_all();
+    ASSERT( s_copy.try_get( j ) == false, NULL );
+    ASSERT( j == bogus_value, NULL );
+
     return 0;
 }
 
@@ -248,11 +261,11 @@ int test_parallel(int num_threads) {
 
 template< typename T >
 int test_serial() {
-    tbb::graph g;
+    tbb::flow::graph g;
     T bogus_value(-1);
 
-    tbb::sequencer_node<T> s(g, seq_inspector<T>());
-    tbb::sequencer_node<T> s2(g, seq_inspector<T>());
+    tbb::flow::sequencer_node<T> s(g, seq_inspector<T>());
+    tbb::flow::sequencer_node<T> s2(g, seq_inspector<T>());
     T j = bogus_value;
 
     //
@@ -307,11 +320,11 @@ int test_serial() {
     // Chained in-order simple puts and gets
     //
 
-    tbb::sequencer_node<T> s3(g, seq_inspector<T>());
-    tbb::sequencer_node<T> s4(g, seq_inspector<T>());
-    tbb::sequencer_node<T> s5(g, seq_inspector<T>());
-    ASSERT( s3.register_successor( s4 ) == true, NULL );
-    ASSERT( s4.register_successor( s5 ) == true, NULL );
+    tbb::flow::sequencer_node<T> s3(g, seq_inspector<T>());
+    tbb::flow::sequencer_node<T> s4(g, seq_inspector<T>());
+    tbb::flow::sequencer_node<T> s5(g, seq_inspector<T>());
+    tbb::flow::make_edge( s3, s4 );
+    tbb::flow::make_edge( s4, s5 );
 
     for (int i = 0; i < N; ++i) {
         bool msg = s3.try_put( T(i) );
@@ -330,7 +343,7 @@ int test_serial() {
     ASSERT( j == bogus_value, NULL );
 
     g.wait_for_all();
-    ASSERT( s3.remove_successor( s4 ) == true, NULL );
+    tbb::flow::remove_edge( s3, s4 );
     ASSERT( s3.try_put( N ) == true, NULL );
     ASSERT( wait_try_get( g, s4, j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
@@ -343,11 +356,11 @@ int test_serial() {
     // Chained reverse-order simple puts and gets
     //
 
-    tbb::sequencer_node<T> s6(g, seq_inspector<T>());
-    tbb::sequencer_node<T> s7(g, seq_inspector<T>());
-    tbb::sequencer_node<T> s8(g, seq_inspector<T>());
-    ASSERT( s6.register_successor( s7 ) == true, NULL );
-    ASSERT( s7.register_successor( s8 ) == true, NULL );
+    tbb::flow::sequencer_node<T> s6(g, seq_inspector<T>());
+    tbb::flow::sequencer_node<T> s7(g, seq_inspector<T>());
+    tbb::flow::sequencer_node<T> s8(g, seq_inspector<T>());
+    tbb::flow::make_edge( s6, s7 );
+    tbb::flow::make_edge( s7, s8 );
 
     for (int i = N-1; i >= 0; --i) {
         bool msg = s6.try_put( T(i) );
@@ -366,7 +379,7 @@ int test_serial() {
     ASSERT( j == bogus_value, NULL );
 
     g.wait_for_all();
-    ASSERT( s6.remove_successor( s7 ) == true, NULL );
+    tbb::flow::remove_edge( s6, s7 );
     ASSERT( s6.try_put( N ) == true, NULL );
     ASSERT( wait_try_get( g, s7, j ) == false, NULL );
     ASSERT( j == bogus_value, NULL );
diff --git a/src/test/test_source_node.cpp b/src/test/test_source_node.cpp
index a403430..c0f0e3c 100644
--- a/src/test/test_source_node.cpp
+++ b/src/test/test_source_node.cpp
@@ -33,7 +33,7 @@
 const int N = 1000;
 
 template< typename T >
-class test_push_receiver : public tbb::receiver<T> {
+class test_push_receiver : public tbb::flow::receiver<T> {
 
     tbb::atomic<int> my_counters[N];
 
@@ -49,7 +49,7 @@ public:
        return v;
     }
 
-    bool try_put( T v ) {
+    bool try_put( const T &v ) {
        int i = (int)v;
        ++my_counters[i];
        return true;
@@ -99,10 +99,10 @@ template< typename T >
 void test_single_dest() {
 
    // push only
-   tbb::graph g;
-   tbb::source_node<T> src(g, source_body<T>() );
+   tbb::flow::graph g;
+   tbb::flow::source_node<T> src(g, source_body<T>() );
    test_push_receiver<T> dest;
-   ASSERT( src.register_successor(dest), NULL );
+   tbb::flow::make_edge( src, dest );
    g.wait_for_all();
    for (int i = 0; i < N; ++i ) {
        ASSERT( dest.get_count(i) == 1, NULL ); 
@@ -110,10 +110,10 @@ void test_single_dest() {
 
    // push only
    tbb::atomic<int> counters3[N];
-   tbb::source_node<T> src3(g, source_body<T>() );
+   tbb::flow::source_node<T> src3(g, source_body<T>() );
    function_body<T> b3( counters3 );
-   tbb::function_node<T,bool> dest3(g, tbb::graph::unlimited, b3 );
-   ASSERT( src3.register_successor(dest3), NULL );
+   tbb::flow::function_node<T,bool> dest3(g, tbb::flow::unlimited, b3 );
+   tbb::flow::make_edge( src3, dest3 );
    g.wait_for_all();
    for (int i = 0; i < N; ++i ) {
        int v = counters3[i];
@@ -121,17 +121,25 @@ void test_single_dest() {
    }
 
    // push & pull 
-   tbb::source_node<T> src2(g, source_body<T>() );
+   tbb::flow::source_node<T> src2(g, source_body<T>() );
    tbb::atomic<int> counters2[N];
    function_body<T> b2( counters2 );
-   tbb::function_node<T,bool> dest2(g, tbb::graph::serial, b2 );
-   ASSERT( src2.register_successor(dest2), NULL );
+   tbb::flow::function_node<T,bool> dest2(g, tbb::flow::serial, b2 );
+   tbb::flow::make_edge( src2, dest2 );
    g.wait_for_all();
    for (int i = 0; i < N; ++i ) {
        int v = counters2[i];
        ASSERT( v == 1, NULL ); 
    }
 
+   // test copy constructor
+   tbb::flow::source_node<T> src_copy(src);
+   test_push_receiver<T> dest_c;
+   ASSERT( src_copy.register_successor(dest_c), NULL );
+   g.wait_for_all();
+   for (int i = 0; i < N; ++i ) {
+       ASSERT( dest_c.get_count(i) == 1, NULL ); 
+   }
 }
 
 int TestMain() { 
diff --git a/src/test/test_split_node.cpp b/src/test/test_split_node.cpp
new file mode 100644
index 0000000..6996ef9
--- /dev/null
+++ b/src/test/test_split_node.cpp
@@ -0,0 +1,363 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#if _MSC_VER
+#pragma warning (disable : 4503)      // decorated name length exceeded, name was truncated
+#endif
+
+#include "harness.h"
+#define TBB_PREVIEW_GRAPH_NODES 1
+#include "tbb/flow_graph.h"
+#include "tbb/task_scheduler_init.h"
+
+#if !__SUNPRO_CC
+
+//
+// Tests
+//
+
+const int Count = 300;
+const int MaxPorts = 10;
+const int MaxNSources = 5; // max # of source_nodes to register for each split_node input in parallel test
+
+std::vector<bool> flags;   // for checking output
+
+template<typename T>
+class name_of {
+public:
+    static const char* name() { return  "Unknown"; }
+};
+template<>
+class name_of<int> {
+public:
+    static const char* name() { return  "int"; }
+};
+template<>
+class name_of<float> {
+public:
+    static const char* name() { return  "float"; }
+};
+template<>
+class name_of<double> {
+public:
+    static const char* name() { return  "double"; }
+};
+template<>
+class name_of<long> {
+public:
+    static const char* name() { return  "long"; }
+};
+template<>
+class name_of<short> {
+public:
+    static const char* name() { return  "short"; }
+};
+
+// T must be arithmetic, and shouldn't wrap around for reasonable sizes of Count (which is now 150, and maxPorts is 10,
+// so the max number generated right now is 1500 or so.)  Source will generate a series of TT with value
+// (init_val + (i-1)*addend) * my_mult, where i is the i-th invocation of the body.  We are attaching addend
+// source nodes to a join_port, and each will generate part of the numerical series the port is expecting
+// to receive.  If there is only one source node, the series order will be maintained; if more than one,
+// this is not guaranteed.
+
+template<int N>
+struct tuple_helper {
+    template<typename TupleType>
+    static void set_element( TupleType &t, int i) {
+        std::get<N-1>(t) = (typename std::tuple_element<N-1,TupleType>::type)(i * (N+1));
+        tuple_helper<N-1>::set_element(t, i);
+    }
+};
+
+template<>
+struct tuple_helper<1> {
+    template<typename TupleType>
+    static void set_element(TupleType &t, int i) {
+        std::get<0>(t) = (typename std::tuple_element<0,TupleType>::type)(i * 2);
+    }
+};
+
+// if we start N source_bodys they will all have the addend N, and my_count should be initialized to 0 .. N-1.
+// the output tuples should have all the sequence, but the order will in general vary.
+template<typename TupleType>
+class source_body {
+    typedef TupleType TT;
+    static const int N = std::tuple_size<TT>::value;
+    int my_count;
+    const int addend;
+    source_body& operator=( const source_body& other);
+public:
+    source_body(int init_val, int addto) : my_count(init_val), addend(addto) { }
+    bool operator()( TT &v) {
+        if(my_count >= Count) return false;
+        tuple_helper<N>::set_element(v, my_count);
+        my_count += addend;
+        return true;
+    }
+};
+
+// allocator for split_node.
+
+template<int N, typename SType>
+class makeSplit {
+public:
+    static SType *create(tbb::flow::graph& g) {
+        SType *temp = new SType(g);
+        return temp;
+    }
+    static void destroy(SType *p) { delete p; }
+};
+
+// holder for sink_node pointers for eventual deletion
+
+static void* all_sink_nodes[MaxPorts];
+
+
+template<int ELEM, typename SType>
+class sink_node_helper {
+public:
+    typedef typename SType::input_type TT;
+    typedef typename std::tuple_element<ELEM-1,TT>::type IT;
+    typedef typename tbb::flow::queue_node<IT> my_sink_node_type;
+    static void print_parallel_remark() {
+        sink_node_helper<ELEM-1,SType>::print_parallel_remark();
+        REMARK(", %s", name_of<IT>::name());
+    }
+    static void print_serial_remark() {
+        sink_node_helper<ELEM-1,SType>::print_serial_remark();
+        REMARK(", %s", name_of<IT>::name());
+    }
+    static void add_sink_nodes(SType &my_split, tbb::flow::graph &g) {
+        my_sink_node_type *new_node = new my_sink_node_type(g);
+        tbb::flow::make_edge( tbb::flow::output_port<ELEM-1>(my_split) , *new_node);
+        all_sink_nodes[ELEM-1] = (void *)new_node;
+        sink_node_helper<ELEM-1, SType>::add_sink_nodes(my_split, g);
+    }
+
+    static void check_sink_values() {
+        my_sink_node_type *dp = reinterpret_cast<my_sink_node_type *>(all_sink_nodes[ELEM-1]);
+        for(int i = 0; i < Count; ++i) {
+            IT v;
+            ASSERT(dp->try_get(v), NULL);
+            flags[((int)v) / (ELEM+1)] = true;
+        }
+        for(int i = 0; i < Count; ++i) {
+            ASSERT(flags[i], NULL);
+            flags[i] = false;  // reset for next test
+        }
+        sink_node_helper<ELEM-1,SType>::check_sink_values();
+    }
+    static void remove_sink_nodes(SType& my_split) {
+        my_sink_node_type *dp = reinterpret_cast<my_sink_node_type *>(all_sink_nodes[ELEM-1]);
+        tbb::flow::remove_edge( tbb::flow::output_port<ELEM-1>(my_split) , *dp);
+        delete dp;
+        sink_node_helper<ELEM-1, SType>::remove_sink_nodes(my_split);
+    }
+};
+
+template<typename SType>
+class sink_node_helper<1, SType> {
+    typedef typename SType::input_type TT;
+    typedef typename std::tuple_element<0,TT>::type IT;
+    typedef typename tbb::flow::queue_node<IT> my_sink_node_type;
+public:
+    static void print_parallel_remark() {
+        REMARK("Parallel test of split_node< %s", name_of<IT>::name());
+    }
+    static void print_serial_remark() {
+        REMARK("Serial test of split_node< %s", name_of<IT>::name());
+    }
+    static void add_sink_nodes(SType &my_split, tbb::flow::graph &g) {
+        my_sink_node_type *new_node = new my_sink_node_type(g);
+        tbb::flow::make_edge( tbb::flow::output_port<0>(my_split) , *new_node);
+        all_sink_nodes[0] = (void *)new_node;
+    }
+    static void check_sink_values() {
+        my_sink_node_type *dp = reinterpret_cast<my_sink_node_type *>(all_sink_nodes[0]);
+        for(int i = 0; i < Count; ++i) {
+            IT v;
+            ASSERT(dp->try_get(v), NULL);
+            flags[((int)v) / 2] = true;
+        }
+        for(int i = 0; i < Count; ++i) {
+            ASSERT(flags[i], NULL);
+            flags[i] = false;  // reset for next test
+        }
+    }
+    static void remove_sink_nodes(SType& my_split) {
+        my_sink_node_type *dp = reinterpret_cast<my_sink_node_type *>(all_sink_nodes[0]);
+        tbb::flow::remove_edge( tbb::flow::output_port<0>(my_split) , *dp);
+        delete dp;
+    }
+};
+
+// parallel_test: create source_nodes that feed tuples into the split node
+//    and queue_nodes that receive the output.
+template<typename SType>
+class parallel_test {
+public:
+    typedef typename SType::input_type TType;
+    typedef tbb::flow::source_node<TType> source_type;
+    static const int N = std::tuple_size<TType>::value;
+    static void test() {
+        TType v;
+        source_type* all_source_nodes[MaxNSources];
+        sink_node_helper<N,SType>::print_parallel_remark();
+        REMARK(" >\n");
+        for(int i=0; i < MaxPorts; ++i) {
+            all_sink_nodes[i] = NULL;
+        }
+        // try test for # sources 1 .. MaxNSources
+        for(int nInputs = 1; nInputs <= MaxNSources; ++nInputs) {
+            tbb::flow::graph g;
+            SType* my_split = makeSplit<N,SType>::create(g);
+
+            // add sinks first so when sources start spitting out values they are there to catch them
+            sink_node_helper<N, SType>::add_sink_nodes((*my_split), g);
+
+            // now create nInputs source_nodes, each spitting out i, i+nInputs, i+2*nInputs ...
+            // each element of the tuple is i*(n+1), where n is the tuple element index (1-N)
+            for(int i = 0; i < nInputs; ++i) {
+                // create source node
+                source_type *s = new source_type(g, source_body<TType>(i, nInputs) );
+                tbb::flow::make_edge(*s, *my_split);
+                all_source_nodes[i] = s;
+            }
+
+            g.wait_for_all();
+
+            // check that we got Count values in each output queue, and all the index values
+            // are there.
+            sink_node_helper<N, SType>::check_sink_values();
+
+            sink_node_helper<N, SType>::remove_sink_nodes(*my_split);
+            for(int i = 0; i < nInputs; ++i) {
+                delete all_source_nodes[i];
+            }
+            makeSplit<N,SType>::destroy(my_split);
+        }
+    }
+};
+
+//
+// Single predecessor, single accepting successor at each port
+
+template<typename SType>
+void test_one_serial( SType &my_split, tbb::flow::graph &g) {
+    typedef typename SType::input_type TType;
+    static const int SIZE = std::tuple_size<TType>::value;
+    sink_node_helper<SIZE, SType>::add_sink_nodes(my_split,g);
+    typedef TType q3_input_type;
+    tbb::flow::queue_node< q3_input_type >  q3(g);
+
+    tbb::flow::make_edge( q3, my_split );
+
+    // fill the  queue with its value one-at-a-time
+    flags.clear();
+    for (int i = 0; i < Count; ++i ) {
+        TType v;
+        tuple_helper<SIZE>::set_element(v, i);
+        ASSERT(my_split.try_put(v), NULL);
+        flags.push_back(false);
+    }
+
+    g.wait_for_all();
+
+    sink_node_helper<SIZE,SType>::check_sink_values();
+
+    sink_node_helper<SIZE, SType>::remove_sink_nodes(my_split);
+
+}
+
+template<typename SType>
+class serial_test {
+    typedef typename SType::input_type TType;
+    static const int SIZE = std::tuple_size<TType>::value;
+    static const int ELEMS = 3;
+public:
+static void test() {
+    tbb::flow::graph g;
+    flags.reserve(Count);
+    SType* my_split = makeSplit<SIZE,SType>::create(g);
+    sink_node_helper<SIZE, SType>::print_serial_remark(); REMARK(" >\n");
+
+    test_one_serial<SType>( *my_split, g);
+    // build the vector with copy construction from the used split node.
+    std::vector<SType>split_vector(ELEMS, *my_split);
+    // destroy the tired old split_node in case we're accidentally reusing pieces of it.
+    makeSplit<SIZE,SType>::destroy(my_split);
+
+
+    for(int e = 0; e < ELEMS; ++e) {  // exercise each of the vector elements
+        test_one_serial<SType>( split_vector[e], g);
+    }
+}
+
+}; // serial_test
+
+template<
+      template<typename> class TestType,  // serial_test or parallel_test
+      typename TupleType >                               // type of the input of the split
+struct generate_test {
+    typedef tbb::flow::split_node<TupleType> split_node_type;
+    static void do_test() {
+        TestType<split_node_type>::test();
+    }
+}; // generate_test
+
+int TestMain() {
+#if __TBB_USE_TBB_TUPLE
+    REMARK("  Using TBB tuple\n");
+#else
+    REMARK("  Using platform tuple\n");
+#endif
+   for (int p = 0; p < 2; ++p) {
+       generate_test<serial_test, std::tuple<float, double> >::do_test();
+       generate_test<serial_test, std::tuple<float, double, int, long> >::do_test();
+       generate_test<serial_test, std::tuple<double, double, int, long, int, short> >::do_test();
+#if COMPREHENSIVE_TEST
+       generate_test<serial_test, std::tuple<float, double, double, double, float, int, float, long> >::do_test();
+       generate_test<serial_test, std::tuple<float, double, int, double, double, float, long, int, float, long> >::do_test();
+#endif
+       generate_test<parallel_test, std::tuple<float, double> >::do_test();
+       generate_test<parallel_test, std::tuple<float, int, long> >::do_test();
+       generate_test<parallel_test, std::tuple<double, double, int, int, short> >::do_test();
+#if COMPREHENSIVE_TEST
+       generate_test<parallel_test, std::tuple<float, int, double, float, long, float, long> >::do_test();
+       generate_test<parallel_test, std::tuple<float, double, int, double, double, long, int, float, long> >::do_test();
+#endif
+   }
+   return Harness::Done;
+}
+#else  // __SUNPRO_CC
+
+int TestMain() {
+    return Harness::Skipped;
+}
+
+#endif  // SUNPRO_CC
diff --git a/src/test/test_task.cpp b/src/test/test_task.cpp
index 9d5442d..c951a6e 100644
--- a/src/test/test_task.cpp
+++ b/src/test/test_task.cpp
@@ -26,21 +26,13 @@
     the GNU General Public License.
 */
 
-#include "tbb/task.h"
+#include "harness_task.h"
 #include "tbb/atomic.h"
 #include "tbb/tbb_thread.h"
-#include "harness_assert.h"
+#include "tbb/task_scheduler_init.h"
 #include <cstdlib>
 
 //------------------------------------------------------------------------
-// Helper for verifying that old use cases of spawn syntax still work.
-//------------------------------------------------------------------------
-tbb::task* GetTaskPtr( int& counter ) {
-    ++counter;
-    return NULL;
-}
- 
-//------------------------------------------------------------------------
 // Test for task::spawn_children and task_list
 //------------------------------------------------------------------------
 
@@ -133,9 +125,6 @@ static int Expected( int child_count, int depth ) {
     return depth<=0 ? 1 : 1+child_count*Expected(child_count/2,depth-1);
 }
 
-#include "tbb/task_scheduler_init.h"
-#include "harness.h"
-
 void TestStealLimit( int nthread ) {
     REMARK( "testing steal limiting heuristics for %d threads\n", nthread );
     tbb::task_scheduler_init init(nthread);
@@ -176,33 +165,6 @@ void TestSpawnRootList( int nthread ) {
 // Test for task::recycle_as_safe_continuation
 //------------------------------------------------------------------------
 
-class TaskGenerator: public tbb::task {
-    int m_ChildCount;
-    int m_Depth;
-    
-public:
-    TaskGenerator( int child_count, int _depth ) : m_ChildCount(child_count), m_Depth(_depth) {}
-    ~TaskGenerator( ) { m_ChildCount = m_Depth = -125; }
-
-    /*override*/ tbb::task* execute() {
-        ASSERT( m_ChildCount>=0 && m_Depth>=0, NULL );
-        if( m_Depth>0 ) {
-            recycle_as_safe_continuation();
-            set_ref_count( m_ChildCount+1 );
-            int k=0; 
-            for( int j=0; j<m_ChildCount; ++j ) {
-                tbb::task& t = *new( allocate_child() ) TaskGenerator(m_ChildCount/2,m_Depth-1);
-                GetTaskPtr(k)->spawn(t);
-            }
-            ASSERT(k==m_ChildCount,NULL);
-            --m_Depth;
-            __TBB_Yield();
-            ASSERT( state()==recycle && ref_count()>0, NULL);
-        }
-        return NULL;
-    }
-};
-
 void TestSafeContinuation( int nthread ) {
     REMARK("testing task::recycle_as_safe_continuation for %d threads\n",nthread);
     tbb::task_scheduler_init init(nthread);
@@ -429,7 +391,10 @@ void TestAlignment() {
     TestAlignmentOfOneClass<double>();
 #if HAVE_m128
     TestAlignmentOfOneClass<__m128>();
-#endif /* HAVE_m128 */
+#endif
+#if HAVE_m256
+    if (have_AVX()) TestAlignmentOfOneClass<__m256>();
+#endif
 }
 
 //------------------------------------------------------------------------
@@ -625,7 +590,6 @@ void TestUserThread( int p ) {
     }
 }
 
-
 class TaskWithChildToSteal : public tbb::task {
     const int m_Depth; 
     volatile bool m_GoAhead;
@@ -657,6 +621,7 @@ public:
     }
 }; // TaskWithChildToSteal
 
+// Success criterion of this test is not hanging
 void TestDispatchLoopResponsiveness() {
     REMARK("testing that dispatch loops do not go into eternal sleep when all remaining children are stolen\n");
     // Recursion depth values test the following sorts of dispatch loops
@@ -670,7 +635,6 @@ void TestDispatchLoopResponsiveness() {
         t.SpawnAndWaitOnParent();
     }
     r.destroy(r);
-    // The success criteria of this test is not hanging
 }
 
 void TestWaitDiscriminativenessWithoutStealing() {
@@ -815,143 +779,6 @@ void TestMastersIsolation ( int p ) {
     }
 }
 
-//------------------------------------------------------------------------
-// Test for tbb::task::enqueue
-//------------------------------------------------------------------------
-
-const int PairsPerTrack = 100;
-
-class EnqueuedTask : public tbb::task {
-    task* my_successor;
-    int my_enqueue_order;
-    int* my_track;
-    tbb::task* execute() {
-        // Capture execution order in the very beginning
-        int execution_order = 2 - my_successor->decrement_ref_count();
-        // Create some local work.
-        TaskGenerator& p = *new( allocate_root() ) TaskGenerator(2,2);
-        spawn_root_and_wait(p);
-        if( execution_order==2 ) { // the "slower" of two peer tasks
-            ++nCompletedPairs;
-            // Of course execution order can differ from dequeue order.
-            // But there is no better approximation at hand; and a single worker
-            // will execute in dequeue order, which is enough for our check.
-            if (my_enqueue_order==execution_order)
-                ++nOrderedPairs;
-            FireTwoTasks(my_track);
-            destroy(*my_successor);
-        }
-        return NULL;
-    }
-public:
-    EnqueuedTask( task* successor, int enq_order, int* track )
-    : my_successor(successor), my_enqueue_order(enq_order), my_track(track) {}
-
-    // Create and enqueue two tasks
-    static void FireTwoTasks( int* track ) {
-        int progress = ++*track;
-        if( progress < PairsPerTrack ) {
-            task* successor = new (allocate_root()) tbb::empty_task;
-            successor->set_ref_count(2);
-            enqueue( *new (allocate_root()) EnqueuedTask(successor, 1, track) );
-            enqueue( *new (allocate_root()) EnqueuedTask(successor, 2, track) );
-        }
-    }
-
-    static tbb::atomic<int> nCompletedPairs;
-    static tbb::atomic<int> nOrderedPairs;
-};
-
-tbb::atomic<int> EnqueuedTask::nCompletedPairs;
-tbb::atomic<int> EnqueuedTask::nOrderedPairs;
-
-const int nTracks = 10;
-static int TaskTracks[nTracks];
-const int stall_threshold = 100000;
-
-void TimedYield( double pause_time );
-
-class ProgressMonitor {
-public:
-    void operator() ( ) {
-        int track_snapshot[nTracks];
-        int stall_count = 0, uneven_progress_count = 0, last_progress_mask = 0;
-        for(int i=0; i<nTracks; ++i)
-            track_snapshot[i]=0;
-        bool completed;
-        do {
-            // Yield repeatedly for at least 1 usec
-            TimedYield( 1E-6 );
-            int overall_progress = 0, progress_mask = 0;
-            const int all_progressed = (1<<nTracks) - 1;
-            completed = true;
-            for(int i=0; i<nTracks; ++i) {
-                int ti = TaskTracks[i];
-                int pi = ti-track_snapshot[i];
-                if( pi ) progress_mask |= 1<<i;
-                overall_progress += pi;
-                completed = completed && ti==PairsPerTrack;
-                track_snapshot[i]=ti;
-            }
-            // The constants in the next asserts are subjective and may need correction.
-            if( overall_progress )
-                stall_count=0;
-            else {
-                ++stall_count;
-                // no progress for at least 0.1 s; consider it dead.
-                ASSERT(stall_count < stall_threshold, "no progress on enqueued tasks; deadlock, or the machine is oversubsribed?");
-            }
-            if( progress_mask==all_progressed || progress_mask^last_progress_mask ) {
-                uneven_progress_count = 0;
-                last_progress_mask = progress_mask;
-            }
-            else if ( overall_progress > 2 ) {
-                ++uneven_progress_count;
-                ASSERT(uneven_progress_count < 5, "some enqueued tasks seem stalling; no simultaneous progress?");
-            }
-        } while( !completed );
-    }
-};
-
-void TestEnqueue( int p ) {
-    REMARK("testing task::enqueue for %d threads\n", p);
-    for(int mode=0;mode<3;++mode) {
-        tbb::task_scheduler_init init(p);
-        EnqueuedTask::nCompletedPairs = EnqueuedTask::nOrderedPairs = 0;
-        for(int i=0; i<nTracks; ++i) {
-            TaskTracks[i] = -1; // to accomodate for the starting call
-            EnqueuedTask::FireTwoTasks(TaskTracks+i);
-        }
-        ProgressMonitor pm;
-        tbb::tbb_thread thr( pm );
-        if(mode==1) {
-            // do some parallel work in the meantime
-            for(int i=0; i<10; i++) {
-                TaskGenerator& g = *new( tbb::task::allocate_root() ) TaskGenerator(2,5);
-                tbb::task::spawn_root_and_wait(g);
-                TimedYield( 1E-6 );
-            }
-        }
-        if( mode==2 ) {
-            // Additionally enqueue a bunch of empty tasks. The goal is to test that tasks
-            // allocated and enqueued by a thread are safe to use after the thread leaves TBB.
-            tbb::task* root = new (tbb::task::allocate_root()) tbb::empty_task;
-            root->set_ref_count(100);
-            for( int i=0; i<100; ++i )
-                tbb::task::enqueue( *new (root->allocate_child()) tbb::empty_task );
-            init.terminate(); // master thread deregistered
-        }
-        thr.join();
-        ASSERT(EnqueuedTask::nCompletedPairs==nTracks*PairsPerTrack, NULL);
-        ASSERT(EnqueuedTask::nOrderedPairs<EnqueuedTask::nCompletedPairs,
-            "all task pairs executed in enqueue order; de facto guarantee is too strong?");
-    }
-}
-
-//------------------------------------------------------------------------
-// Run all tests.
-//------------------------------------------------------------------------
-
 int TestMain () {
 #if TBB_USE_EXCEPTIONS
     TestUnconstructibleTask<1>();
@@ -966,7 +793,6 @@ int TestMain () {
         TestSpawnChildren( p );
         TestSpawnRootList( p );
         TestSafeContinuation( p );
-        TestEnqueue( p );
         TestLeftRecursion( p );
         TestDag( p );
         TestAffinity( p );
@@ -977,11 +803,3 @@ int TestMain () {
     }
     return Harness::Done;
 }
-
-#include "tbb/tick_count.h"
-void TimedYield( double pause_time ) {
-    tbb::tick_count start = tbb::tick_count::now();
-    while( (tbb::tick_count::now()-start).seconds() < pause_time )
-        __TBB_Yield();
-}
-
diff --git a/src/test/test_task_assertions.cpp b/src/test/test_task_assertions.cpp
index 2646ca3..a271682 100644
--- a/src/test/test_task_assertions.cpp
+++ b/src/test/test_task_assertions.cpp
@@ -26,6 +26,21 @@
     the GNU General Public License.
 */
 
+#if HARNESS_USE_PROXY
+
+// The test includes injects scheduler directly, so skip it when proxy tested.
+
+#undef HARNESS_USE_PROXY
+#include "harness.h"
+#undef __TBB_DYNAMIC_LOAD_ENABLED
+#include "harness_tbb_independence.h"
+
+int TestMain () {
+    return Harness::Skipped;
+}
+
+#else // HARNESS_USE_PROXY
+
 // Test correctness of forceful TBB initialization before any dynamic initialization
 // of static objects inside the library took place.
 namespace tbb { 
@@ -84,7 +99,7 @@ void TestTaskAssertions() {
     AbusedTask = new( tbb::task::allocate_root() ) tbb::empty_task;
     NativeParallelFor( 1, AbuseOneTask() );
     ASSERT( AbuseOneTaskRan==1, NULL );
-    AbusedTask->destroy(*AbusedTask);
+    tbb::task::destroy(*AbusedTask);
     // Restore normal assertion handling
     tbb::set_assertion_handler( NULL );
 }
@@ -101,3 +116,5 @@ int TestMain () {
 }
 
 #endif /* !TRY_BAD_EXPR_ENABLED */
+
+#endif // HARNESS_USE_PROXY
diff --git a/src/test/test_task_auto_init.cpp b/src/test/test_task_auto_init.cpp
index 1008fbe..64e4635 100644
--- a/src/test/test_task_auto_init.cpp
+++ b/src/test/test_task_auto_init.cpp
@@ -43,7 +43,10 @@ static tbb::task *g_Root1 = NULL,
                  *g_Root2 = NULL,
                  *g_Root3 = NULL,
                  *g_Task = NULL;
+
+#if __TBB_TASK_GROUP_CONTEXT
 static tbb::task_group_context* g_Ctx = NULL;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
 
 void TestTaskSelf () {
@@ -72,10 +75,11 @@ void TestChildAllocation () {
 
 void TestAdditionalChildAllocation () {
     TEST_PROLOGUE();
-    tbb::task &t = *new( g_Root2->allocate_additional_child_of(*g_Root2) ) tbb::empty_task;
+    tbb::task &t = *new( tbb::task::allocate_additional_child_of(*g_Root2) ) tbb::empty_task;
     ExecuteChildAndCleanup( *g_Root2, t );
 }
 
+#if __TBB_TASK_GROUP_CONTEXT
 void TestTaskGroupContextCreation () {
     TEST_PROLOGUE();
     tbb::task_group_context ctx;
@@ -88,23 +92,27 @@ void TestRootAllocationWithContext () {
     tbb::task* root = new( tbb::task::allocate_root(*g_Ctx) ) tbb::empty_task;
     tbb::task::spawn_root_and_wait(*root);
 }
+#endif /* __TBB_TASK_GROUP_CONTEXT */
 
 void TestSpawn () {
     TEST_PROLOGUE();
-    g_Task->spawn(*g_Task);
+    tbb::task::spawn(*g_Task);
 }
 
 void TestWaitForAll () {
     TEST_PROLOGUE();
     g_Root3->wait_for_all();
-    g_Root3->destroy( *g_Root3 );
+    tbb::task::destroy(*g_Root3);
 }
 
 typedef void (*TestFnPtr)();
 
 const TestFnPtr TestFuncsTable[] = {
         TestTaskSelf, TestRootAllocation, TestChildAllocation, TestAdditionalChildAllocation, 
-        TestTaskGroupContextCreation, TestRootAllocationWithContext, TestSpawn, TestWaitForAll };
+#if __TBB_TASK_GROUP_CONTEXT
+        TestTaskGroupContextCreation, TestRootAllocationWithContext,
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+        TestSpawn, TestWaitForAll };
 
 const int NumTestFuncs = sizeof(TestFuncsTable) / sizeof(TestFnPtr);
 
@@ -174,12 +182,18 @@ struct DriverThreadBody : NoAssign, Harness::NoAfterlife {
             // auto-initialized master thread (in governor::auto_terminate). 
             // If anything goes wrong, generic_scheduler::cleanup_master() will assert.
             // The context for this task must be valid till the task completion.
+#if __TBB_TASK_GROUP_CONTEXT
             tbb::task &r = *new( tbb::task::allocate_root(*g_Ctx) ) FireAndForgetTask;
-            r.spawn(r);
+#else
+            tbb::task &r = *new( tbb::task::allocate_root() ) FireAndForgetTask;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
+            tbb::task::spawn(r);
         }
         else {
+#if __TBB_TASK_GROUP_CONTEXT
             tbb::task_group_context ctx;
             g_Ctx = &ctx;
+#endif /* __TBB_TASK_GROUP_CONTEXT */
             driver_barrier.wait();
             spin_wait_until_eq( FafStarted, true );
             UseAFewNewTlsKeys();
diff --git a/src/test/test_task_enqueue.cpp b/src/test/test_task_enqueue.cpp
new file mode 100644
index 0000000..0e1a238
--- /dev/null
+++ b/src/test/test_task_enqueue.cpp
@@ -0,0 +1,329 @@
+/*
+    Copyright 2005-2011 Intel Corporation.  All Rights Reserved.
+
+    This file is part of Threading Building Blocks.
+
+    Threading Building Blocks is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+    version 2 as published by the Free Software Foundation.
+
+    Threading Building Blocks is distributed in the hope that it will be
+    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with Threading Building Blocks; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    As a special exception, you may use this file as part of a free software
+    library without restriction.  Specifically, if other files instantiate
+    templates or use macros or inline functions from this file, or you compile
+    this file and link it with other files to produce an executable, this
+    file does not by itself cause the resulting executable to be covered by
+    the GNU General Public License.  This exception does not however
+    invalidate any other reasons why the executable file might be covered by
+    the GNU General Public License.
+*/
+
+#include "harness_task.h"
+#include "harness_barrier.h"
+#include "tbb/atomic.h"
+#include "tbb/tbb_thread.h"
+#include "tbb/task_scheduler_init.h"
+#include "tbb/tick_count.h"
+
+////////////////////////////////////////////////////////////////////////////////
+// Test for basic FIFO scheduling functionality
+
+const int PairsPerTrack = 100;
+
+class EnqueuedTask : public tbb::task {
+    task* my_successor;
+    int my_enqueue_order;
+    int* my_track;
+    tbb::task* execute() {
+        // Capture execution order in the very beginning
+        int execution_order = 2 - my_successor->decrement_ref_count();
+        // Create some local work.
+        TaskGenerator& p = *new( allocate_root() ) TaskGenerator(2,2);
+        spawn_root_and_wait(p);
+        if( execution_order==2 ) { // the "slower" of two peer tasks
+            ++nCompletedPairs;
+            // Of course execution order can differ from dequeue order.
+            // But there is no better approximation at hand; and a single worker
+            // will execute in dequeue order, which is enough for our check.
+            if (my_enqueue_order==execution_order)
+                ++nOrderedPairs;
+            FireTwoTasks(my_track);
+            destroy(*my_successor);
+        }
+        return NULL;
+    }
+public:
+    EnqueuedTask( task* successor, int enq_order, int* track )
+    : my_successor(successor), my_enqueue_order(enq_order), my_track(track) {}
+
+    // Create and enqueue two tasks
+    static void FireTwoTasks( int* track ) {
+        int progress = ++*track;
+        if( progress < PairsPerTrack ) {
+            task* successor = new (allocate_root()) tbb::empty_task;
+            successor->set_ref_count(2);
+            enqueue( *new (allocate_root()) EnqueuedTask(successor, 1, track) );
+            enqueue( *new (allocate_root()) EnqueuedTask(successor, 2, track) );
+        }
+    }
+
+    static tbb::atomic<int> nCompletedPairs;
+    static tbb::atomic<int> nOrderedPairs;
+};
+
+tbb::atomic<int> EnqueuedTask::nCompletedPairs;
+tbb::atomic<int> EnqueuedTask::nOrderedPairs;
+
+const int nTracks = 10;
+static int TaskTracks[nTracks];
+const int stall_threshold = 100000;
+
+void TimedYield( double pause_time ) {
+    tbb::tick_count start = tbb::tick_count::now();
+    while( (tbb::tick_count::now()-start).seconds() < pause_time )
+        __TBB_Yield();
+}
+
+class ProgressMonitor {
+public:
+    void operator() ( ) {
+        int track_snapshot[nTracks];
+        int stall_count = 0, uneven_progress_count = 0, last_progress_mask = 0;
+        for(int i=0; i<nTracks; ++i)
+            track_snapshot[i]=0;
+        bool completed;
+        do {
+            // Yield repeatedly for at least 1 usec
+            TimedYield( 1E-6 );
+            int overall_progress = 0, progress_mask = 0;
+            const int all_progressed = (1<<nTracks) - 1;
+            completed = true;
+            for(int i=0; i<nTracks; ++i) {
+                int ti = TaskTracks[i];
+                int pi = ti-track_snapshot[i];
+                if( pi ) progress_mask |= 1<<i;
+                overall_progress += pi;
+                completed = completed && ti==PairsPerTrack;
+                track_snapshot[i]=ti;
+            }
+            // The constants in the next asserts are subjective and may need correction.
+            if( overall_progress )
+                stall_count=0;
+            else {
+                ++stall_count;
+                // no progress for at least 0.1 s; consider it dead.
+                ASSERT(stall_count < stall_threshold, "no progress on enqueued tasks; deadlock, or the machine is oversubsribed?");
+            }
+            if( progress_mask==all_progressed || progress_mask^last_progress_mask ) {
+                uneven_progress_count = 0;
+                last_progress_mask = progress_mask;
+            }
+            else if ( overall_progress > 2 ) {
+                ++uneven_progress_count;
+                ASSERT(uneven_progress_count < 5, "some enqueued tasks seem stalling; no simultaneous progress?");
+            }
+        } while( !completed );
+    }
+};
+
+void TestEnqueue( int p ) {
+    REMARK("Testing task::enqueue for %d threads\n", p);
+    for(int mode=0;mode<3;++mode) {
+        tbb::task_scheduler_init init(p);
+        EnqueuedTask::nCompletedPairs = EnqueuedTask::nOrderedPairs = 0;
+        for(int i=0; i<nTracks; ++i) {
+            TaskTracks[i] = -1; // to accomodate for the starting call
+            EnqueuedTask::FireTwoTasks(TaskTracks+i);
+        }
+        ProgressMonitor pm;
+        tbb::tbb_thread thr( pm );
+        if(mode==1) {
+            // do some parallel work in the meantime
+            for(int i=0; i<10; i++) {
+                TaskGenerator& g = *new( tbb::task::allocate_root() ) TaskGenerator(2,5);
+                tbb::task::spawn_root_and_wait(g);
+                TimedYield( 1E-6 );
+            }
+        }
+        if( mode==2 ) {
+            // Additionally enqueue a bunch of empty tasks. The goal is to test that tasks
+            // allocated and enqueued by a thread are safe to use after the thread leaves TBB.
+            tbb::task* root = new (tbb::task::allocate_root()) tbb::empty_task;
+            root->set_ref_count(100);
+            for( int i=0; i<100; ++i )
+                tbb::task::enqueue( *new (root->allocate_child()) tbb::empty_task );
+            init.terminate(); // master thread deregistered
+        }
+        thr.join();
+        ASSERT(EnqueuedTask::nCompletedPairs==nTracks*PairsPerTrack, NULL);
+        ASSERT(EnqueuedTask::nOrderedPairs<EnqueuedTask::nCompletedPairs,
+            "all task pairs executed in enqueue order; de facto guarantee is too strong?");
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Tests for Fire-And-Forget scheduling functionality
+
+const int NumRepeats = 200;
+const int MaxNumThreads = 16;
+static volatile bool Finished[MaxNumThreads] = {};
+
+static volatile bool CanStart;
+
+//! Custom user task interface
+class ITask {
+public: 
+	virtual ~ITask() {} 
+	virtual void Execute() = 0;
+	virtual void Release() { delete this; }
+};
+
+class TestTask : public ITask {
+	volatile bool *m_pDone;
+public:
+    TestTask ( volatile bool *pDone ) : m_pDone(pDone) {}
+
+	/* override */ void Execute() {
+		*m_pDone = true;
+	}
+};
+
+class CarrierTask : public tbb::task {
+	ITask* m_pTask;
+public:
+    CarrierTask(ITask* pTask) : m_pTask(pTask) {}
+
+	/*override*/ task* execute() {
+		m_pTask->Execute();
+		m_pTask->Release();
+		return NULL;
+	}
+};
+
+class SpawnerTask : public ITask {
+	ITask* m_taskToSpawn;
+public:
+	SpawnerTask(ITask* job) : m_taskToSpawn(job) {}
+
+	void Execute() {
+		while ( !CanStart )
+		    __TBB_Yield();
+		tbb::task::enqueue( *new( tbb::task::allocate_root() ) CarrierTask(m_taskToSpawn) );
+	}
+};
+
+class EnqueuerBody {
+public:
+    void operator() ( int id ) const {
+	    tbb::task_scheduler_init init(tbb::task_scheduler_init::default_num_threads() + 1);
+
+	    SpawnerTask* pTask = new SpawnerTask( new TestTask(Finished + id) );
+	    tbb::task::enqueue( *new( tbb::task::allocate_root() ) CarrierTask(pTask) );
+    }
+};
+
+//! Regression test for a bug that caused premature arena destruction
+void TestCascadedEnqueue () {
+    REMARK("Testing cascaded enqueue\n");
+	tbb::task_scheduler_init init(tbb::task_scheduler_init::default_num_threads() + 1);
+
+    int minNumThreads = min(tbb::task_scheduler_init::default_num_threads(), MaxNumThreads) / 2;
+	int maxNumThreads = min(tbb::task_scheduler_init::default_num_threads() * 2, MaxNumThreads);
+
+	for ( int numThreads = minNumThreads; numThreads <= maxNumThreads; ++numThreads ) {
+		for ( int i = 0; i < NumRepeats; ++i ) {
+			CanStart = false;
+            __TBB_Yield();
+			NativeParallelFor( numThreads, EnqueuerBody() );
+			CanStart = true;
+            int j = 0;
+			while ( j < numThreads ) {
+                if ( Finished[j] )
+                    ++j;
+                else
+    				__TBB_Yield();
+			}
+            for ( j = 0; j < numThreads; ++j )
+                Finished[j] = false;
+            REMARK("%02d threads; Iteration %03d\r", numThreads, i);
+		}
+	}
+    REMARK( "                                 \r" );
+}
+
+class DummyTask : public tbb::task {
+public:
+    task *execute() {
+        Harness::Sleep(1);
+        return NULL;
+    }
+};
+
+class SharedRootBody {
+    tbb::task *my_root;
+public:
+	SharedRootBody ( tbb::task *root ) : my_root(root) {}
+
+	void operator() ( int ) const {
+	    tbb::task::enqueue( *new( tbb::task::allocate_additional_child_of(*my_root) ) DummyTask );
+	}
+};
+
+//! Test for enqueuing children of the same root from different master threads
+void TestSharedRoot ( int p ) { 
+    REMARK("Testing enqueuing siblings from different masters\n");
+    tbb::task_scheduler_init init(p);
+    tbb::task *root =  new ( tbb::task::allocate_root() ) tbb::empty_task; 
+    root->set_ref_count(1);
+    for( int n = MinThread; n <= MaxThread; ++n ) {
+        REMARK("%d masters, %d requested workers\r", n, p-1);
+        NativeParallelFor( n, SharedRootBody(root) );
+    }
+    REMARK( "                                    \r" );
+    root->wait_for_all();
+    tbb::task::destroy(*root);
+}
+
+class BlockingTask : public tbb::task {
+    Harness::SpinBarrier &m_Barrier;
+
+    tbb::task* execute () {
+        m_Barrier.wait();
+        return 0;
+    }
+
+public:
+    BlockingTask ( Harness::SpinBarrier& bar ) : m_Barrier(bar) {}
+};
+
+//! Test making sure that masters can dequeue tasks
+/** Success criterion is not hanging. **/
+void TestDequeueByMaster () {
+    REMARK("Testing task dequeuing by master\n");
+    tbb::task_scheduler_init init(1);
+    Harness::SpinBarrier bar(2);
+    tbb::task &r = *new ( tbb::task::allocate_root() ) tbb::empty_task; 
+    r.set_ref_count(3);
+    tbb::task::enqueue( *new(r.allocate_child()) BlockingTask(bar) ); 
+    tbb::task::enqueue( *new(r.allocate_child()) BlockingTask(bar) ); 
+    r.wait_for_all();
+    tbb::task::destroy(r);
+}
+
+int TestMain () {
+    TestDequeueByMaster();
+    TestCascadedEnqueue();
+    for( int p=MinThread; p<=MaxThread; ++p ) {
+        TestEnqueue(p);
+        TestSharedRoot(p);
+    }
+    return Harness::Done;
+}
diff --git a/src/test/test_task_group.cpp b/src/test/test_task_group.cpp
index da036ba..647feef 100644
--- a/src/test/test_task_group.cpp
+++ b/src/test/test_task_group.cpp
@@ -68,6 +68,7 @@
 
 #endif /* !TBBTEST_USE_TBB */
 
+#if __TBB_TASK_GROUP_CONTEXT
 
 #include "tbb/atomic.h"
 #include "harness_concurrency_tracker.h"
@@ -134,7 +135,7 @@ class  SharedGroupBodyImpl : NoCopy, Harness::NoAfterlife {
             __TBB_Yield();
         const uint_t numSpawned = c_numTasks0 + c_numTasks1 * (m_numThreads - 1);
         ASSERT ( m_tasksSpawned == numSpawned, "Wrong number of spawned tasks. The test is broken" );
-        REMARK("Max spawning parallelism is %u out of %u", Harness::ConcurrencyTracker::PeakParallelism(), g_MaxConcurrency);
+        REMARK("Max spawning parallelism is %u out of %u\n", Harness::ConcurrencyTracker::PeakParallelism(), g_MaxConcurrency);
         if ( m_sharingMode & ParallelWait ) {
             m_barrier.wait( &Harness::ConcurrencyTracker::Reset );
             {
@@ -203,7 +204,7 @@ atomic_t SharedGroupBodyImpl::s_tasksExecuted;
 
 class  SharedGroupBody : NoAssign, Harness::NoAfterlife {
     bool m_bOwner;
-    mutable SharedGroupBodyImpl *m_pImpl;
+    SharedGroupBodyImpl *m_pImpl;
 public:
     SharedGroupBody ( uint_t numThreads, uint_t sharingMode = 0 )
         : m_bOwner(true)
@@ -250,7 +251,7 @@ atomic_t g_Sum;
 
 #define FIB_TEST_EPILOGUE(sum) \
     ASSERT( sum == numRepeats * F, NULL ); \
-    REMARK("Realized parallelism in Fib test is %u out of %u", Harness::ConcurrencyTracker::PeakParallelism(), g_MaxConcurrency)
+    REMARK("Realized parallelism in Fib test is %u out of %u\n", Harness::ConcurrencyTracker::PeakParallelism(), g_MaxConcurrency)
 
 //------------------------------------------------------------------------
 // Test for a complex tree of task groups
@@ -484,7 +485,7 @@ void TestFibWithLambdas () {
 //------------------------------------------------------------------------
 
 void TestFibWithMakeTask () {
-    REMARK ("Make_task test");
+    REMARK ("Make_task test\n");
     atomic_t sum;
     sum = 0;
     Concurrency::task_group rg;
@@ -679,12 +680,12 @@ void StructuredLaunchChildren () {
     count = 0;
     Concurrency::structured_task_group g;
     bool exceptionCaught = false;
-    typedef Concurrency::task_handle<ThrowingTask> handle_type;
-    static const unsigned hSize = sizeof(handle_type);
+    typedef Concurrency::task_handle<ThrowingTask> throwing_handle_type;
+    static const unsigned hSize = sizeof(throwing_handle_type);
     char handles[NUM_CHORES * hSize];
     for( unsigned i = 0; i < NUM_CHORES; ++i ) {
-        handle_type *h = (handle_type*)(handles + i * hSize);
-        new ( h ) handle_type( ThrowingTask(count) );
+        throwing_handle_type *h = (throwing_handle_type*)(handles + i * hSize);
+        new ( h ) throwing_handle_type( ThrowingTask(count) );
         g.run( *h );
     }
     __TBB_TRY {
@@ -704,7 +705,7 @@ void StructuredLaunchChildren () {
     } CATCH_ANY();
     ASSERT( !g_Throw || exceptionCaught, "No exception in the child task group" );
     for( unsigned i = 0; i < NUM_CHORES; ++i )
-        ((handle_type*)(handles + i * hSize))->~handle_type();
+        ((throwing_handle_type*)(handles + i * hSize))->~throwing_handle_type();
     if ( g_Rethrow && g_ExceptionCount > SKIP_GROUPS ) {
 #if __TBB_SILENT_CANCELLATION_BROKEN
         g_CancellationPropagationInProgress = true;
@@ -846,3 +847,13 @@ int TestMain () {
 #endif
     return Harness::Done;
 }
+
+#else /* !__TBB_TASK_GROUP_CONTEXT */
+
+#include "harness.h"
+
+int TestMain () {
+    return Harness::Skipped;
+}
+
+#endif /* !__TBB_TASK_GROUP_CONTEXT */
diff --git a/src/test/test_task_leaks.cpp b/src/test/test_task_leaks.cpp
index 07cbee7..5a7c629 100644
--- a/src/test/test_task_leaks.cpp
+++ b/src/test/test_task_leaks.cpp
@@ -38,6 +38,21 @@
     switching producer thread, and the check is repeated.
 */
 
+#if HARNESS_USE_PROXY
+
+// The test includes injects scheduler directly, so skip it when proxy tested.
+
+#undef HARNESS_USE_PROXY
+#include "harness.h"
+#undef __TBB_DYNAMIC_LOAD_ENABLED
+#include "harness_tbb_independence.h"
+
+int TestMain () {
+    return Harness::Skipped;
+}
+
+#else // HARNESS_USE_PROXY
+
 #define  __TBB_COUNT_TASK_NODES 1
 #include "harness_inject_scheduler.h"
 
@@ -92,7 +107,7 @@ public:
         if( my_depth>0 ) {
             int child_count = my_child_count;
             scheduler* my_sched = internal::governor::local_scheduler();
-            tbb::task& c  = *new( tbb::task::allocate_continuation() ) tbb::empty_task;
+            tbb::task& c  = *new( allocate_continuation() ) tbb::empty_task;
             c.set_ref_count( child_count );
             recycle_as_child_of(c);
             --child_count;
@@ -140,9 +155,9 @@ void RunTaskGenerators( bool switchProducer = false, bool checkProducer = false
     dummy_root->set_ref_count( 2 );
     // If no producer, start elections; some worker will take the role
     if( Producer )
-        dummy_root->spawn( *new( dummy_root->allocate_child() ) tbb::empty_task );
+        tbb::task::spawn( *new( dummy_root->allocate_child() ) tbb::empty_task );
     else
-        dummy_root->spawn( *new( dummy_root->allocate_child() ) ChangeProducer );
+        tbb::task::spawn( *new( dummy_root->allocate_child() ) ChangeProducer );
     if( checkProducer && !Producer )
         REPORT("Warning: producer has not changed after 10 attempts; running on a single core?\n");
     for( int j=0; j<100; ++j ) {
@@ -150,13 +165,13 @@ void RunTaskGenerators( bool switchProducer = false, bool checkProducer = false
             tbb::task& t = *new( tbb::task::allocate_root() ) TaskGenerator(/*child_count=*/4, /*depth=*/6);
             tbb::task::spawn_root_and_wait(t);
         } else {
-            tbb::task& t = *new (dummy_root->allocate_additional_child_of(*dummy_root))
+            tbb::task& t = *new (tbb::task::allocate_additional_child_of(*dummy_root))
                                 TaskGenerator(/*child_count=*/4, /*depth=*/6);
             tbb::task::enqueue(t);
         }
     }
     dummy_root->wait_for_all();
-    dummy_root->destroy( *dummy_root );
+    tbb::task::destroy( *dummy_root );
 }
 
 class TaskList: public tbb::task {
@@ -276,3 +291,5 @@ int TestMain () {
     return Harness::Done;
 }
 
+#endif  // HARNESS_USE_PROXY
+
diff --git a/src/test/test_task_priority.cpp b/src/test/test_task_priority.cpp
index 056c685..9050ca2 100644
--- a/src/test/test_task_priority.cpp
+++ b/src/test/test_task_priority.cpp
@@ -28,19 +28,17 @@
 
 #include "harness.h"
 
-#ifndef TBB_PREVIEW_TASK_PRIORITY
-    #define TBB_PREVIEW_TASK_PRIORITY __TBB_TASK_PRIORITY
-#endif
+#if __TBB_TASK_GROUP_CONTEXT
 
 #include "tbb/task.h"
 #include "tbb/task_scheduler_init.h"
 #include "tbb/atomic.h"
 #include <cstdlib>
 
-const int NumIterations = 1000;
+const int NumIterations = 100;
 const int NumLeafTasks = 2;
-int MinBaseDepth = 8;
-int MaxBaseDepth = 12;
+int MinBaseDepth = 9;
+int MaxBaseDepth = 11;
 int BaseDepth = 0;
 
 const int NumTests = 8;
@@ -102,14 +100,14 @@ class LeafTask : public tbb::task {
         for ( int i = 0; i < NumIterations; ++i )
             anchor += i;
         __TBB_FetchAndAddW(g_LeavesExecuted + m_tid, 1);
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
         ASSERT( !m_opts || (m_opts & Flog) || (!(m_opts & TestPreemption) ^ (m_tid == PreemptionActivatorId)), NULL );
         if ( (m_opts & TestPreemption) && g_LeavesExecuted[0] > P && group_priority() == tbb::priority_normal ) {
             ASSERT( m_tid == PreemptionActivatorId, NULL );
             ASSERT( (PreemptionActivatorId == 1 ? High > tbb::priority_normal : Low < tbb::priority_normal), NULL );
             set_group_priority( PreemptionActivatorId == 1 ? High : Low );
         }
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
         return NULL;
     }
 public:
@@ -130,11 +128,11 @@ protected:
         ASSERT( m_depth > 0, NULL );
         if ( g_LeavesExecuted[m_tid] % (100 / m_depth) == 0 ) {
             if ( m_opts & Flog ) {
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
                 task *r = m_opts & FlogEncloser ? this : m_root;
                 tbb::priority_t p = r->group_priority();
                 r->set_group_priority( p == Low ? High : Low );
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
             }
             else
                 __TBB_Yield();
@@ -208,7 +206,7 @@ public:
         tbb::task_scheduler_init init(P-1);
         tbb::task_group_context ctx (tbb::task_group_context::isolated);
         tbb::empty_task &r = *new( tbb::task::allocate_root(ctx) ) tbb::empty_task;
-        const int R = 8;
+        const int R = 4;
         r.set_ref_count( R * P + 1 );
         // Only thread 1 changes its task tree priority in preemption test mode
         uintptr_t opts = m_opts & (id == PreemptionActivatorId ? ~0u : ~(uintptr_t)TestPreemption);
@@ -293,19 +291,27 @@ void TestPrioritySwitchBetweenTwoMasters () {
             RunPrioritySwitchBetweenTwoMasters<BlockingNodeTask>( 1, TestPreemption );
             RunPrioritySwitchBetweenTwoMasters<NonblockingNodeTask>( 2, NoPriorities );
             RunPrioritySwitchBetweenTwoMasters<NonblockingNodeTask>( 3, TestPreemption );
-            RunPrioritySwitchBetweenTwoMasters<BlockingNodeTask>( 4, Flog );
-            RunPrioritySwitchBetweenTwoMasters<NonblockingNodeTask>( 5, Flog );
-            RunPrioritySwitchBetweenTwoMasters<NestedGroupNodeTask>( 6, Flog );
-            RunPrioritySwitchBetweenTwoMasters<NestedGroupNodeTask>( 7, FlogEncloser );
+            if ( i == 0 ) {
+                RunPrioritySwitchBetweenTwoMasters<BlockingNodeTask>( 4, Flog );
+                RunPrioritySwitchBetweenTwoMasters<NonblockingNodeTask>( 5, Flog );
+                RunPrioritySwitchBetweenTwoMasters<NestedGroupNodeTask>( 6, Flog );
+                RunPrioritySwitchBetweenTwoMasters<NestedGroupNodeTask>( 7, FlogEncloser );
+            }
         }
     }
+#if __TBB_TASK_PRIORITY
     const int NumRuns = TestRepeats * (MaxBaseDepth - MinBaseDepth + 1);
     for ( int i = 0; i < NumTests; ++i ) {
         if ( g_TestFailures[i] )
             REMARK( "Test %d: %d failures in %d runs\n", i, g_TestFailures[i], NumRuns );
-        if ( g_TestFailures[i] * 100 / NumRuns > 45 )
-            REPORT( "Warning: test %d misbehaved too often (%d out of %d)\n", i, g_TestFailures[i], NumRuns );
+        if ( g_TestFailures[i] * 100 / NumRuns > 50 ) {
+            if ( i == 1 )
+                REPORT( "Known issue: priority effect is limited in case of blocking-style nesting\n" );
+            else
+                REPORT( "Warning: test %d misbehaved too often (%d out of %d)\n", i, g_TestFailures[i], NumRuns );
+        }
     }
+#endif /* __TBB_TASK_PRIORITY */
     ClearGlobals();
 }
 
@@ -345,13 +351,13 @@ int TestSimplePriorityOps ( tbb::priority_t prio ) {
 void EmulateWork( int ) {
     for ( int i = 0; i < 1000; ++i )
         __TBB_Yield();
-};
+}
 
 class PeriodicActivitiesBody {
 public:
     void operator() ( int id ) const {
         tbb::task_group_context ctx;
-#if TBB_PREVIEW_TASK_PRIORITY
+#if __TBB_TASK_PRIORITY
         ctx.set_priority( id ? High : Low );
 #else /* !__TBB_TASK_PRIORITY */
         (void)id;
@@ -371,7 +377,7 @@ void TestPeriodicConcurrentActivities () {
 #include "harness_bad_expr.h"
 
 void TestPriorityAssertions () {
-#if TRY_BAD_EXPR_ENABLED && TBB_PREVIEW_TASK_PRIORITY
+#if TRY_BAD_EXPR_ENABLED && __TBB_TASK_PRIORITY
     REMARK( "TestPriorityAssertions\n" );
     tbb::priority_t bad_low_priority = tbb::priority_t( tbb::priority_low - 1 ),
                     bad_high_priority = tbb::priority_t( tbb::priority_high + 1 );
@@ -383,17 +389,17 @@ void TestPriorityAssertions () {
     TRY_BAD_EXPR( tbb::task::enqueue( t, bad_high_priority ), "Invalid priority level value" );
     // Restore normal assertion handling
     tbb::set_assertion_handler( NULL );
-#endif /* TRY_BAD_EXPR_ENABLED && TBB_PREVIEW_TASK_PRIORITY */
+#endif /* TRY_BAD_EXPR_ENABLED && __TBB_TASK_PRIORITY */
 }
 
 int TestMain () {
-#if !TBB_PREVIEW_TASK_PRIORITY
+#if !__TBB_TASK_PRIORITY
     REMARK( "Priorities disabled: Running as just yet another task scheduler test\n" );
-#endif /* TBB_PREVIEW_TASK_PRIORITY */
+#endif /* __TBB_TASK_PRIORITY */
     TestPriorityAssertions();
     TestSimplePriorityOps(tbb::priority_low);
     TestSimplePriorityOps(tbb::priority_high);
-    P = min( tbb::task_scheduler_init::default_num_threads(), 8 );
+    P = tbb::task_scheduler_init::default_num_threads();
     if ( P < 3 )
         return Harness::Skipped;
     TestPeriodicConcurrentActivities();
@@ -410,3 +416,11 @@ int TestMain () {
     TestPrioritySwitchBetweenTwoMasters();
     return Harness::Done;
 }
+
+#else /* !__TBB_TASK_GROUP_CONTEXT */
+
+int TestMain () {
+    return Harness::Skipped;
+}
+
+#endif /* !__TBB_TASK_GROUP_CONTEXT */
diff --git a/src/test/test_task_scheduler_observer.cpp b/src/test/test_task_scheduler_observer.cpp
index 715d0ae..3d8894c 100644
--- a/src/test/test_task_scheduler_observer.cpp
+++ b/src/test/test_task_scheduler_observer.cpp
@@ -81,8 +81,8 @@ public:
         ASSERT( !(~LocalState->MyFlags & flags), NULL );
         if( n>=2 ) {
             set_ref_count(3);
-            spawn(*new( tbb::task::allocate_child() ) FibTask(n-1,flags));
-            spawn_and_wait_for_all(*new( tbb::task::allocate_child() ) FibTask(n-2,flags));
+            spawn(*new( allocate_child() ) FibTask(n-1,flags));
+            spawn_and_wait_for_all(*new( allocate_child() ) FibTask(n-2,flags));
         }
         return NULL;
     }
diff --git a/src/test/test_tbb_header.cpp b/src/test/test_tbb_header.cpp
index fdea4d2..727610d 100644
--- a/src/test/test_tbb_header.cpp
+++ b/src/test/test_tbb_header.cpp
@@ -148,12 +148,17 @@ int TestMain ()
     TestTypeDefinitionPresence( spin_rw_mutex );
     TestTypeDefinitionPresence( critical_section );
     TestTypeDefinitionPresence( reader_writer_lock );
+#if __TBB_TASK_GROUP_CONTEXT
     TestTypeDefinitionPresence( tbb_exception );
     TestTypeDefinitionPresence( captured_exception );
     TestTypeDefinitionPresence( movable_exception<int> );
 #if !TBB_USE_CAPTURED_EXCEPTION
     TestTypeDefinitionPresence( internal::tbb_exception_ptr );
 #endif /* !TBB_USE_CAPTURED_EXCEPTION */
+    TestTypeDefinitionPresence( task_group_context );
+    TestTypeDefinitionPresence( task_group );
+    TestTypeDefinitionPresence( task_handle<Body> );
+#endif /* __TBB_TASK_GROUP_CONTEXT */
     TestTypeDefinitionPresence( blocked_range3d<int> );
     TestFuncDefinitionPresence( parallel_invoke, (const Body&, const Body&), void );
     TestFuncDefinitionPresence( parallel_do, (int*, int*, const Body1&), void );
@@ -169,9 +174,6 @@ int TestMain ()
     TestTypeDefinitionPresence( task );
     TestTypeDefinitionPresence( empty_task );
     TestTypeDefinitionPresence( task_list );
-    TestTypeDefinitionPresence( task_group_context );
-    TestTypeDefinitionPresence( task_group );
-    TestTypeDefinitionPresence( task_handle<Body> );
     TestTypeDefinitionPresence( task_scheduler_init );
     TestTypeDefinitionPresence( task_scheduler_observer );
     TestTypeDefinitionPresence( tbb_thread );
diff --git a/src/test/test_tbb_version.cpp b/src/test/test_tbb_version.cpp
index 94c55ad..4fabf3c 100644
--- a/src/test/test_tbb_version.cpp
+++ b/src/test/test_tbb_version.cpp
@@ -81,6 +81,9 @@ int main(int argc, char *argv[] ) {
     ASSERT(tbb::TBB_runtime_interface_version()==TBB_INTERFACE_VERSION,
            "Running with the library of different version than the test was compiled against");
 #endif
+#if __TBB_MPI_INTEROP
+    REPORT("skip\n");
+#else
     __TBB_TRY {
         FILE *stream_out;
         FILE *stream_err;   
@@ -205,6 +208,7 @@ int main(int argc, char *argv[] ) {
         ASSERT( 0,"unexpected exception" );
     }
     REPORT("done\n");
+#endif //__TBB_MPI_INTEROP
     return 0;
 }
 
@@ -212,8 +216,8 @@ int main(int argc, char *argv[] ) {
 // Fill dictionary with version strings for platforms 
 void initialize_strings_vector(std::vector <string_pair>* vector)
 {
-    vector->push_back(string_pair("TBB: VERSION\t\t3.0", required));          // check TBB_VERSION
-    vector->push_back(string_pair("TBB: INTERFACE VERSION\t5006", required)); // check TBB_INTERFACE_VERSION
+    vector->push_back(string_pair("TBB: VERSION\t\t4.0", required));          // check TBB_VERSION
+    vector->push_back(string_pair("TBB: INTERFACE VERSION\t6000", required)); // check TBB_INTERFACE_VERSION
     vector->push_back(string_pair("TBB: BUILD_DATE", required));
     vector->push_back(string_pair("TBB: BUILD_HOST", required));
     vector->push_back(string_pair("TBB: BUILD_OS", required));
diff --git a/src/test/test_tuple.cpp b/src/test/test_tuple.cpp
index 7ecfeaf..5708937 100644
--- a/src/test/test_tuple.cpp
+++ b/src/test/test_tuple.cpp
@@ -29,9 +29,17 @@
 // tbb::tuple
 
 #include "harness.h"
+// this test should match that in graph.h, so we test whatever tuple is
+// being used by the join_node.
+#if !__SUNPRO_CC
+#if TBB_IMPLEMENT_CPP0X && (!defined(_MSC_VER) || _MSC_VER < 1600)
+#define __TESTING_STD_TUPLE__ 0
 #define TBB_PREVIEW_TUPLE 1
-#define TBB_IMPLEMENT_CPP0X 1
 #include "tbb/compat/tuple"
+#else
+#define __TESTING_STD_TUPLE__ 1
+#include <tuple>
+#endif
 #include <string>
 #include <iostream>
 
@@ -53,6 +61,11 @@ private:
 
 void RunTests() {
 
+#if __TESTING_STD_TUPLE__
+    REMARK("Testing platform tuple\n");
+#else
+    REMARK("Testing compat/tuple\n");
+#endif
     tuple<int> ituple1(3);
     tuple<int> ituple2(5);
     tuple<double> ftuple2(4.1);
@@ -142,3 +155,10 @@ int TestMain() {
     RunTests();
     return Harness::Done;
 }
+#else  // __SUNPRO_CC
+
+int TestMain() {
+    return Harness::Skipped;
+}
+
+#endif  // __SUNPRO_CC
diff --git a/src/test/test_write_once_node.cpp b/src/test/test_write_once_node.cpp
index 906b497..f618560 100644
--- a/src/test/test_write_once_node.cpp
+++ b/src/test/test_write_once_node.cpp
@@ -27,8 +27,6 @@
 */
 
 #include "harness_graph.h"
-#define TBB_PREVIEW_GRAPH 1
-#include "tbb/graph.h"
 
 #include "tbb/task_scheduler_init.h"
 
@@ -38,7 +36,7 @@
 
 template< typename R >
 void simple_read_write_tests() {
-    tbb::write_once_node<R> n;
+    tbb::flow::write_once_node<R> n;
 
     for ( int t = 0; t < T; ++t ) {
         R v0(0);
@@ -55,7 +53,7 @@ void simple_read_write_tests() {
        }
 
         for (int i = 0; i < M; ++i) {
-           ASSERT( n.register_successor(r[i]), NULL );
+           tbb::flow::make_edge( n, r[i] );
         }
       
         if ( t%2 ) {
@@ -90,7 +88,7 @@ void simple_read_write_tests() {
              ASSERT( int(c) == 1, NULL );
         }
         for (int i = 0; i < M; ++i) {
-           ASSERT( n.remove_successor(r[i]), NULL );
+           tbb::flow::remove_edge( n, r[i] );
         }
         ASSERT( n.try_put( R(0) ) == false, NULL );
         for (int i = 0; i < M; ++i) {
@@ -105,11 +103,11 @@ void simple_read_write_tests() {
 
 template< typename R >
 class native_body : NoAssign {
-    tbb::write_once_node<R> &my_node;
+    tbb::flow::write_once_node<R> &my_node;
 
 public:
 
-     native_body( tbb::write_once_node<R> &n ) : my_node(n) {}
+     native_body( tbb::flow::write_once_node<R> &n ) : my_node(n) {}
 
      void operator()( int i ) const {
          R v1(static_cast<R>(i));
@@ -122,37 +120,41 @@ public:
 
 template< typename R >
 void parallel_read_write_tests() {
-    tbb::write_once_node<R> n;
+    tbb::flow::write_once_node<R> n;
+    //Create a vector of identical nodes
+    std::vector< tbb::flow::write_once_node<R> > wo_vec(2, n);
 
+    for (size_t node_idx=0; node_idx<wo_vec.size(); ++node_idx) {
     for ( int t = 0; t < T; ++t ) {
         harness_counting_receiver<R> r[M];
 
         for (int i = 0; i < M; ++i) {
-           ASSERT( n.register_successor(r[i]), NULL );
+           tbb::flow::make_edge( wo_vec[node_idx], r[i] );
         }
         R v0;
-        ASSERT( n.is_valid() == false, NULL );
-        ASSERT( n.try_get( v0 ) == false, NULL );
+        ASSERT( wo_vec[node_idx].is_valid() == false, NULL );
+        ASSERT( wo_vec[node_idx].try_get( v0 ) == false, NULL );
 
-        ASSERT( n.try_put( R(-1) ), NULL );
+        ASSERT( wo_vec[node_idx].try_put( R(-1) ), NULL );
 
-        NativeParallelFor( N, native_body<R>( n ) );
+        NativeParallelFor( N, native_body<R>( wo_vec[node_idx] ) );
 
         for (int i = 0; i < M; ++i) {
              size_t c = r[i].my_count;
              ASSERT( int(c) == 1, NULL );
         }
         for (int i = 0; i < M; ++i) {
-           ASSERT( n.remove_successor(r[i]), NULL );
+           tbb::flow::remove_edge( wo_vec[node_idx], r[i] );
         }
-        ASSERT( n.try_put( R(0) ) == false, NULL );
+        ASSERT( wo_vec[node_idx].try_put( R(0) ) == false, NULL );
         for (int i = 0; i < M; ++i) {
              size_t c = r[i].my_count;
              ASSERT( int(c) == 1, NULL );
         }
-        n.clear();
-        ASSERT( n.is_valid() == false, NULL );
-        ASSERT( n.try_get( v0 ) == false, NULL );
+        wo_vec[node_idx].clear();
+        ASSERT( wo_vec[node_idx].is_valid() == false, NULL );
+        ASSERT( wo_vec[node_idx].try_get( v0 ) == false, NULL );
+    }
     }
 }
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/tbb.git



More information about the debian-science-commits mailing list