On 13/11/18 22:59 +0000, Jonathan Wakely wrote:
@@ -898,9 +907,10 @@ namespace pmr
  {
    auto p = std::lower_bound(std::begin(pool_sizes), std::end(pool_sizes),
                              opts.largest_required_pool_block);
-    if (int npools = p - std::begin(pool_sizes))
-      return npools;
-    return 1;
+    const int n = p - std::begin(pool_sizes);
+    if (p == std::end(pool_sizes) || *p == opts.largest_required_pool_block)

This is wrong, it still chooses one pool too few when the block_size
matches an element of pool_sizes[].

+      return n;
+    return n + 1;
  }

Fixed by this patch, tested x86_64-linux and committed to trunk.


commit 01882ab88871d2bcb34ad141505b96b317eefccb
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Tue Nov 13 23:26:08 2018 +0000

    Fix error when selecting number of memory pools
    
            * src/c++17/memory_resource.cc (select_num_pools): Fix off-by-one
            error when block_size is equal to one of the values in the array.

diff --git a/libstdc++-v3/src/c++17/memory_resource.cc b/libstdc++-v3/src/c++17/memory_resource.cc
index cb91e5147ce..605bdd53950 100644
--- a/libstdc++-v3/src/c++17/memory_resource.cc
+++ b/libstdc++-v3/src/c++17/memory_resource.cc
@@ -892,7 +892,7 @@ namespace pmr
     auto p = std::lower_bound(std::begin(pool_sizes), std::end(pool_sizes),
 			      opts.largest_required_pool_block);
     const int n = p - std::begin(pool_sizes);
-    if (p == std::end(pool_sizes) || *p == opts.largest_required_pool_block)
+    if (p == std::end(pool_sizes))
       return n;
     return n + 1;
   }

Reply via email to