public inbox for libstdc++@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Fix tests sensitive to internal library allocations
@ 2023-08-21 17:04 François Dumont
  2023-08-21 18:07 ` Jonathan Wakely
  0 siblings, 1 reply; 5+ messages in thread
From: François Dumont @ 2023-08-21 17:04 UTC (permalink / raw)
  To: libstdc++; +Cc: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 1772 bytes --]

Hi

Here is a propocal to fix tests sensitive to libstdc++ internal allocations.

Tested by restoring allocation in tzdb.cc.

As announced I'm also adding a test to detect such allocations. If it is 
ok let me know if you prefer to see it in a different place.

     libstdc++: Fix tests relying on operator new/delete overload

     Fix tests that are checking for an allocation plan. They are failing if
     an allocation is taking place outside the test.

     libstdc++-v3/ChangeLog

             * testsuite/util/replacement_memory_operators.h
             (counter::_M_pre_enter_count): New.
             (counter::enter, counter::exit): New static methods to call 
on main() enter/exit.
             * testsuite/23_containers/unordered_map/96088.cc (main):
             Call __gnu_test::counter::enter/exit.
             * testsuite/23_containers/unordered_multimap/96088.cc 
(main): Likewise.
             * testsuite/23_containers/unordered_multiset/96088.cc 
(main): Likewise.
             * testsuite/23_containers/unordered_set/96088.cc (main): 
Likewise.
             * testsuite/ext/malloc_allocator/deallocate_local.cc 
(main): Likewise.
             * testsuite/ext/new_allocator/deallocate_local.cc (main): 
Likewise.
             * testsuite/ext/throw_allocator/deallocate_local.cc (main): 
Likewise.
             * testsuite/ext/pool_allocator/allocate_chunk.cc (started): 
New global.
             (operator new(size_t)): Check started.
             (main): Set/Unset started.
             * testsuite/ext/no_library_allocation.cc: New test case.

Ok to commit ?

François

[-- Attachment #2: alloc_aware_tests.patch --]
[-- Type: text/x-patch, Size: 6940 bytes --]

diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc
index c6d50c20fbf..bcae891e5ec 100644
--- a/libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc
+++ b/libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc
@@ -268,6 +268,7 @@ test03()
 int
 main()
 {
+  __gnu_test::counter::enter();
   test01();
   test02();
   test11();
@@ -275,5 +276,6 @@ main()
   test21();
   test22();
   test03();
+  __gnu_test::counter::exit();
   return 0;
 }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc
index 214bc91a559..9f16ad68218 100644
--- a/libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc
+++ b/libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc
@@ -61,7 +61,9 @@ test02()
 int
 main()
 {
+  __gnu_test::counter::enter();
   test01();
   test02();
+  __gnu_test::counter::exit();
   return 0;
 }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multiset/96088.cc b/libstdc++-v3/testsuite/23_containers/unordered_multiset/96088.cc
index 838ce8d5bc5..b34cfe67092 100644
--- a/libstdc++-v3/testsuite/23_containers/unordered_multiset/96088.cc
+++ b/libstdc++-v3/testsuite/23_containers/unordered_multiset/96088.cc
@@ -61,7 +61,9 @@ test02()
 int
 main()
 {
+  __gnu_test::counter::enter();
   test01();
   test02();
+  __gnu_test::counter::exit();
   return 0;
 }
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/96088.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/96088.cc
index 0f7dce2b38c..d5717fcec2b 100644
--- a/libstdc++-v3/testsuite/23_containers/unordered_set/96088.cc
+++ b/libstdc++-v3/testsuite/23_containers/unordered_set/96088.cc
@@ -269,6 +269,7 @@ test03()
 int
 main()
 {
+  __gnu_test::counter::enter();
   test01();
   test02();
   test11();
@@ -277,5 +278,6 @@ main()
   test22();
   test23();
   test03();
+  __gnu_test::counter::exit();
   return 0;
 }
diff --git a/libstdc++-v3/testsuite/ext/malloc_allocator/deallocate_local.cc b/libstdc++-v3/testsuite/ext/malloc_allocator/deallocate_local.cc
index 79b583bd716..3aa65f298b1 100644
--- a/libstdc++-v3/testsuite/ext/malloc_allocator/deallocate_local.cc
+++ b/libstdc++-v3/testsuite/ext/malloc_allocator/deallocate_local.cc
@@ -27,6 +27,7 @@ typedef std::basic_string<char_t, traits_t, allocator_t> string_t;
 
 int main()
 {
+  __gnu_test::counter::enter();
   {
     string_t s;
     s += "bayou bend";
@@ -34,5 +35,7 @@ int main()
 
   if (__gnu_test::counter::count() != 0)
     throw std::runtime_error("count not zero");
+
+  __gnu_test::counter::exit();
   return 0;
 }
diff --git a/libstdc++-v3/testsuite/ext/new_allocator/deallocate_local.cc b/libstdc++-v3/testsuite/ext/new_allocator/deallocate_local.cc
index fcde46e6e10..ac4996698c7 100644
--- a/libstdc++-v3/testsuite/ext/new_allocator/deallocate_local.cc
+++ b/libstdc++-v3/testsuite/ext/new_allocator/deallocate_local.cc
@@ -27,6 +27,7 @@ typedef std::basic_string<char_t, traits_t, allocator_t> string_t;
 
 int main()
 {
+  __gnu_test::counter::enter();
   {
     string_t s;
     s += "bayou bend";
@@ -34,5 +35,7 @@ int main()
 
   if (__gnu_test::counter::count() != 0)
     throw std::runtime_error("count not zero");
+
+  __gnu_test::counter::exit();
   return 0;
 }
diff --git a/libstdc++-v3/testsuite/ext/no_library_allocation.cc b/libstdc++-v3/testsuite/ext/no_library_allocation.cc
new file mode 100644
index 00000000000..278d4757c93
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/no_library_allocation.cc
@@ -0,0 +1,8 @@
+#include <testsuite_hooks.h>
+#include <replacement_memory_operators.h>
+
+int main()
+{
+  VERIFY( __gnu_test::counter::count() == 0 );
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/ext/pool_allocator/allocate_chunk.cc b/libstdc++-v3/testsuite/ext/pool_allocator/allocate_chunk.cc
index 17f8e3c7dcb..b11b450bf9e 100644
--- a/libstdc++-v3/testsuite/ext/pool_allocator/allocate_chunk.cc
+++ b/libstdc++-v3/testsuite/ext/pool_allocator/allocate_chunk.cc
@@ -32,16 +32,29 @@ struct big
   char c[64];
 };
 
+bool started = false;
+
 void*
 operator new(size_t n) THROW(std::bad_alloc)
 {
-  static bool first = true;
-  if (!first)
-    throw std::bad_alloc();
-  first = false;
+  if (started)
+    {
+      static bool first = true;
+      if (!first)
+	throw std::bad_alloc();
+      first = false;
+    }
+
   return std::malloc(n);
 }
 
+void
+operator delete(void* p) throw()
+{
+  if (p)
+    std::free(p);
+}
+
 // http://gcc.gnu.org/ml/libstdc++/2004-10/msg00098.html
 void test01()
 {
@@ -59,5 +72,7 @@ void test01()
 
 int main()
 {
+  started = true;
   test01();
+  started = false;
 }
diff --git a/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_local.cc b/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_local.cc
index c6fd3538b82..268ae91f1ff 100644
--- a/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_local.cc
+++ b/libstdc++-v3/testsuite/ext/throw_allocator/deallocate_local.cc
@@ -30,6 +30,7 @@ typedef std::basic_string<char_t, traits_t, allocator_t> string_t;
 
 int main()
 {
+  __gnu_test::counter::enter();
   {
     string_t s;
     s += "bayou bend";
@@ -38,5 +39,6 @@ int main()
   if (__gnu_test::counter::count() != 0)
     throw std::runtime_error("count not zero");
 
+  __gnu_test::counter::exit();
   return 0;
 }
diff --git a/libstdc++-v3/testsuite/util/replacement_memory_operators.h b/libstdc++-v3/testsuite/util/replacement_memory_operators.h
index 6b1b3a82364..c2d1315691a 100644
--- a/libstdc++-v3/testsuite/util/replacement_memory_operators.h
+++ b/libstdc++-v3/testsuite/util/replacement_memory_operators.h
@@ -28,11 +28,11 @@ namespace __gnu_test
 
   struct counter
   {
-    std::size_t _M_count;
+    std::size_t _M_count, _M_pre_enter_count;
     std::size_t _M_increments, _M_decrements;
     bool	_M_throw;
 
-    counter() : _M_count(0), _M_throw(true) { }
+    counter() : _M_count(0), _M_pre_enter_count(0), _M_throw(true) { }
 
     ~counter() THROW (counter_error)
     {
@@ -75,17 +75,35 @@ namespace __gnu_test
       counter& cntr = get();
       cntr._M_increments = cntr._M_decrements = 0;
     }
+
+    static void
+    enter()
+    {
+      counter& cntr = get();
+      cntr._M_pre_enter_count = cntr._M_count;
+      cntr._M_count = 0;
+    }
+
+    static void
+    exit()
+    {
+      counter& cntr = get();
+      cntr._M_count = cntr._M_pre_enter_count;
+      cntr._M_pre_enter_count = 0;
+    }
   };
 
   template<typename Alloc, bool uses_global_new>
     bool
     check_new(Alloc a = Alloc())
     {
+      __gnu_test::counter::enter();
       __gnu_test::counter::exceptions(false);
       (void) a.allocate(10);
       const bool __b((__gnu_test::counter::count() > 0) == uses_global_new);
       if (!__b)
 	throw std::logic_error("counter not incremented");
+      __gnu_test::counter::exit();
       return __b;
     }
 

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-08-23 16:48 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-21 17:04 [PATCH] Fix tests sensitive to internal library allocations François Dumont
2023-08-21 18:07 ` Jonathan Wakely
2023-08-21 20:20   ` François Dumont
2023-08-21 21:26     ` Jonathan Wakely
2023-08-23 16:48       ` François Dumont

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).