public inbox for libstdc++@gcc.gnu.org
 help / color / mirror / Atom feed
From: "François Dumont" <frs.dumont@gmail.com>
To: Jonathan Wakely <jwakely.gcc@gmail.com>
Cc: libstdc++ <libstdc++@gcc.gnu.org>, gcc-patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH] Fix tests sensitive to internal library allocations
Date: Mon, 21 Aug 2023 22:20:57 +0200	[thread overview]
Message-ID: <b8962988-d17e-5d6c-fcdc-e46a8658fb13@gmail.com> (raw)
In-Reply-To: <CAH6eHdRRp7Bz8oqoQMMYSqDnb694piJ8DCJ=czDkyQKZSkQ1qQ@mail.gmail.com>

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

Here is the updated and tested patch.

On 21/08/2023 20:07, Jonathan Wakely wrote:
> On Mon, 21 Aug 2023 at 18:05, François Dumont via Libstdc++
> <libstdc++@gcc.gnu.org> wrote:
>> Hi
>>
>> Here is a propocal to fix tests sensitive to libstdc++ internal allocations.
> Surely the enter() and exit() calls should be a constructor and destructor?
>
> The constructor could use count() to get the count, and then restore
> it in the destructor. Something like:
>
> --- a/libstdc++-v3/testsuite/util/replacement_memory_operators.h
> +++ b/libstdc++-v3/testsuite/util/replacement_memory_operators.h
> @@ -75,12 +75,30 @@ namespace __gnu_test
>        counter& cntr = get();
>        cntr._M_increments = cntr._M_decrements = 0;
>      }
> +
> +    struct scope
> +    {
> +      scope() : _M_count(counter::count()) { }
> +      ~scope() { counter::get()._M_count = _M_count; }
> +
> +    private:
> +      std::size_t _M_count;
> +
> +#if __cplusplus >= 201103L
> +      scope(const scope&) = delete;
> +      scope& operator=(const scope&) = delete;
> +#else
> +      scope(const scope&);
> +      scope& operator=(const scope&);
> +#endif
> +    };
>    };
>
>    template<typename Alloc, bool uses_global_new>
>      bool
>      check_new(Alloc a = Alloc())
>      {
> +      __gnu_test::counter::scope s;
>        __gnu_test::counter::exceptions(false);
>        __gnu_test::counter::reset();
>        (void) a.allocate(10);
>
>
>
>
>
>
>> 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.
> The test is a good idea. I think 17_intro/no_library_allocation.cc
> would be a better place for it.
>
>>       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: 6027 bytes --]

diff --git a/libstdc++-v3/testsuite/17_intro/no_library_allocation.cc b/libstdc++-v3/testsuite/17_intro/no_library_allocation.cc
new file mode 100644
index 00000000000..278d4757c93
--- /dev/null
+++ b/libstdc++-v3/testsuite/17_intro/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/23_containers/unordered_map/96088.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/96088.cc
index c6d50c20fbf..cdf00c93d80 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::scope s;
   test01();
   test02();
   test11();
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc
index 214bc91a559..d8b9a40c174 100644
--- a/libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc
+++ b/libstdc++-v3/testsuite/23_containers/unordered_multimap/96088.cc
@@ -61,6 +61,7 @@ test02()
 int
 main()
 {
+  __gnu_test::counter::scope s;
   test01();
   test02();
   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..db17cda0ddd 100644
--- a/libstdc++-v3/testsuite/23_containers/unordered_multiset/96088.cc
+++ b/libstdc++-v3/testsuite/23_containers/unordered_multiset/96088.cc
@@ -61,6 +61,7 @@ test02()
 int
 main()
 {
+  __gnu_test::counter::scope s;
   test01();
   test02();
   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..831f2aa1210 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::scope s;
   test01();
   test02();
   test11();
diff --git a/libstdc++-v3/testsuite/ext/malloc_allocator/deallocate_local.cc b/libstdc++-v3/testsuite/ext/malloc_allocator/deallocate_local.cc
index 79b583bd716..29eb4032ad9 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::scope s;
   {
     string_t s;
     s += "bayou bend";
@@ -34,5 +35,6 @@ int main()
 
   if (__gnu_test::counter::count() != 0)
     throw std::runtime_error("count not zero");
+
   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..e4a94604f43 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::scope s;
   {
     string_t s;
     s += "bayou bend";
@@ -34,5 +35,6 @@ int main()
 
   if (__gnu_test::counter::count() != 0)
     throw std::runtime_error("count not zero");
+
   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..2a675e8b6b4 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::scope s;
   {
     string_t s;
     s += "bayou bend";
diff --git a/libstdc++-v3/testsuite/util/replacement_memory_operators.h b/libstdc++-v3/testsuite/util/replacement_memory_operators.h
index 6b1b3a82364..6f19fbb8f6f 100644
--- a/libstdc++-v3/testsuite/util/replacement_memory_operators.h
+++ b/libstdc++-v3/testsuite/util/replacement_memory_operators.h
@@ -75,12 +75,32 @@ namespace __gnu_test
       counter& cntr = get();
       cntr._M_increments = cntr._M_decrements = 0;
     }
+
+    struct scope
+    {
+      scope() : _M_count(counter::count())
+      { counter::get()._M_count = 0; }
+      ~scope()
+      { counter::get()._M_count = _M_count; }
+
+    private:
+      std::size_t _M_count;
+
+#if __cplusplus >= 201103L
+      scope(const scope&) = delete;
+      scope& operator=(const scope&) = delete;
+#else
+      scope(const scope&);
+      scope& operator=(const scope&);
+#endif
+    };
   };
 
   template<typename Alloc, bool uses_global_new>
     bool
     check_new(Alloc a = Alloc())
     {
+      __gnu_test::counter::scope s;
       __gnu_test::counter::exceptions(false);
       (void) a.allocate(10);
       const bool __b((__gnu_test::counter::count() > 0) == uses_global_new);

  reply	other threads:[~2023-08-21 20:21 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-21 17:04 François Dumont
2023-08-21 18:07 ` Jonathan Wakely
2023-08-21 20:20   ` François Dumont [this message]
2023-08-21 21:26     ` Jonathan Wakely
2023-08-23 16:48       ` François Dumont

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b8962988-d17e-5d6c-fcdc-e46a8658fb13@gmail.com \
    --to=frs.dumont@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jwakely.gcc@gmail.com \
    --cc=libstdc++@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).