[libcxx-commits] [libcxx] [libc++] Update the status for lwg-3143 (PR #116971)

via libcxx-commits libcxx-commits at lists.llvm.org
Wed Nov 20 05:37:13 PST 2024


https://github.com/love1angel created https://github.com/llvm/llvm-project/pull/116971

Current implementation use the larger one either requested bytes or growth factor multiply previous buffer size.

This patch update the lwg 3143 issue latest status.

Close #104258 

>From 5091283ea9a0ae3c8fb73b259df5de4d83dc14fd Mon Sep 17 00:00:00 2001
From: Peng Xie <helianthus547 at gmail.com>
Date: Wed, 20 Nov 2024 21:28:36 +0800
Subject: [PATCH] [libc++] Update the status for lwg-3143

Current implementation use the larger one either requested bytes or growth
factor multiply previous buffer size.

This patch update the lwg 3143 issue latest status.
---
 libcxx/docs/Status/Cxx23Issues.csv                 |  2 +-
 .../__memory_resource/monotonic_buffer_resource.h  |  4 ++--
 libcxx/src/memory_resource.cpp                     |  2 +-
 ...ssion.pass.cpp => allocate_growth_capacity.cpp} | 14 +++++++-------
 4 files changed, 11 insertions(+), 11 deletions(-)
 rename libcxx/test/std/utilities/utility/mem.res/mem.res.monotonic.buffer/mem.res.monotonic.buffer.mem/{allocate_in_geometric_progression.pass.cpp => allocate_growth_capacity.cpp} (80%)

diff --git a/libcxx/docs/Status/Cxx23Issues.csv b/libcxx/docs/Status/Cxx23Issues.csv
index 1215f21985eb94..f6aae79c00b884 100644
--- a/libcxx/docs/Status/Cxx23Issues.csv
+++ b/libcxx/docs/Status/Cxx23Issues.csv
@@ -1,7 +1,7 @@
 "Issue #","Issue Name","Meeting","Status","First released version","Notes"
 "`LWG2839 <https://wg21.link/LWG2839>`__","Self-move-assignment of library types, again","2020-11 (Virtual)","|Nothing To Do|","",""
 "`LWG3117 <https://wg21.link/LWG3117>`__","Missing ``packaged_task`` deduction guides","2020-11 (Virtual)","|Complete|","16",""
-"`LWG3143 <https://wg21.link/LWG3143>`__","``monotonic_buffer_resource`` growth policy is unclear","2020-11 (Virtual)","","",""
+"`LWG3143 <https://wg21.link/LWG3143>`__","``monotonic_buffer_resource`` growth policy is unclear","2020-11 (Virtual)","|Complete|","16",""
 "`LWG3195 <https://wg21.link/LWG3195>`__","What is the stored pointer value of an empty ``weak_ptr``?","2020-11 (Virtual)","|Nothing To Do|","",""
 "`LWG3211 <https://wg21.link/LWG3211>`__","``std::tuple<>`` should be trivially constructible","2020-11 (Virtual)","|Complete|","9",""
 "`LWG3236 <https://wg21.link/LWG3236>`__","Random access iterator requirements lack limiting relational operators domain to comparing those from the same range","2020-11 (Virtual)","|Nothing To Do|","",""
diff --git a/libcxx/include/__memory_resource/monotonic_buffer_resource.h b/libcxx/include/__memory_resource/monotonic_buffer_resource.h
index c5a2b556707f6a..08c0745c8d084e 100644
--- a/libcxx/include/__memory_resource/monotonic_buffer_resource.h
+++ b/libcxx/include/__memory_resource/monotonic_buffer_resource.h
@@ -27,8 +27,8 @@ namespace pmr {
 // [mem.res.monotonic.buffer]
 
 class _LIBCPP_AVAILABILITY_PMR _LIBCPP_EXPORTED_FROM_ABI monotonic_buffer_resource : public memory_resource {
-  static const size_t __default_buffer_capacity  = 1024;
-  static const size_t __default_buffer_alignment = 16;
+  static constexpr size_t __default_buffer_capacity  = 1024;
+  static constexpr size_t __default_growth_factor = 2;
 
   struct __chunk_footer {
     __chunk_footer* __next_;
diff --git a/libcxx/src/memory_resource.cpp b/libcxx/src/memory_resource.cpp
index 0cd575e995c0ff..a9207a7d814822 100644
--- a/libcxx/src/memory_resource.cpp
+++ b/libcxx/src/memory_resource.cpp
@@ -478,7 +478,7 @@ void* monotonic_buffer_resource::do_allocate(size_t bytes, size_t align) {
   size_t previous_capacity = previous_allocation_size();
 
   if (aligned_capacity <= previous_capacity) {
-    size_t newsize   = 2 * (previous_capacity - footer_size);
+    size_t newsize   = __default_growth_factor * (previous_capacity - footer_size);
     aligned_capacity = roundup(newsize, footer_align) + footer_size;
   }
 
diff --git a/libcxx/test/std/utilities/utility/mem.res/mem.res.monotonic.buffer/mem.res.monotonic.buffer.mem/allocate_in_geometric_progression.pass.cpp b/libcxx/test/std/utilities/utility/mem.res/mem.res.monotonic.buffer/mem.res.monotonic.buffer.mem/allocate_growth_capacity.cpp
similarity index 80%
rename from libcxx/test/std/utilities/utility/mem.res/mem.res.monotonic.buffer/mem.res.monotonic.buffer.mem/allocate_in_geometric_progression.pass.cpp
rename to libcxx/test/std/utilities/utility/mem.res/mem.res.monotonic.buffer/mem.res.monotonic.buffer.mem/allocate_growth_capacity.cpp
index 7892b182297ea0..024e8f676864e4 100644
--- a/libcxx/test/std/utilities/utility/mem.res/mem.res.monotonic.buffer/mem.res.monotonic.buffer.mem/allocate_in_geometric_progression.pass.cpp
+++ b/libcxx/test/std/utilities/utility/mem.res/mem.res.monotonic.buffer/mem.res.monotonic.buffer.mem/allocate_growth_capacity.cpp
@@ -20,10 +20,10 @@
 #include "count_new.h"
 #include "test_macros.h"
 
-void test_geometric_progression() {
+// LWG 3143: https://cplusplus.github.io/LWG/issue3143
+void test_growth_capacity() {
   // mem.res.monotonic.buffer 1.3
-  // Each additional buffer is larger than the previous one, following a
-  // geometric progression.
+  // Each additional buffer is larger than the previous one
 
   globalMemCounter.reset();
   std::pmr::monotonic_buffer_resource mono1(100, std::pmr::new_delete_resource());
@@ -35,15 +35,15 @@ void test_geometric_progression() {
   assert(ret != nullptr);
   assert(globalMemCounter.checkNewCalledEq(1));
   assert(globalMemCounter.last_new_size >= next_buffer_size);
-  next_buffer_size = globalMemCounter.last_new_size + 1;
+  next_buffer_size = globalMemCounter.last_new_size;
 
   int new_called = 1;
   while (new_called < 5) {
     ret = r1.allocate(10, 1);
     if (globalMemCounter.new_called > new_called) {
       assert(globalMemCounter.new_called == new_called + 1);
-      assert(globalMemCounter.last_new_size >= next_buffer_size);
-      next_buffer_size = globalMemCounter.last_new_size + 1;
+      next_buffer_size = next_buffer_size * 2 - 4 * sizeof(void*);
+      assert(globalMemCounter.last_new_size == next_buffer_size);
       new_called += 1;
     }
   }
@@ -51,7 +51,7 @@ void test_geometric_progression() {
 
 int main(int, char**) {
 #if TEST_SUPPORTS_LIBRARY_INTERNAL_ALLOCATIONS && !defined(DISABLE_NEW_COUNT)
-  test_geometric_progression();
+  test_growth_capacity();
 #endif
 
   return 0;



More information about the libcxx-commits mailing list