On 25/07/18 12:01 +0100, Jonathan Wakely wrote:
On 24/07/18 22:12 +0100, Jonathan Wakely wrote:
This is missing the synchronized_pool_resource and
unsynchronized_pool_resource classes but is otherwise complete.

This is a new implementation, not based on the existing code in
<experimental/memory_resource>, but memory_resource and
polymorphic_allocator ended up looking almost the same anyway.

The constant_init kluge in src/c++17/memory_resource.cc is apparently
due to Richard Smith and ensures that the objects are constructed during
constant initialiation phase and not destroyed (because the
constant_init destructor doesn't destroy the union member and the
storage is not reused).

        * config/abi/pre/gnu.ver: Export new symbols.
        * configure: Regenerate.
        * include/Makefile.am: Add new <memory_resource> header.
        * include/Makefile.in: Regenerate.
        * include/precompiled/stdc++.h: Include <memory_resource> for C++17.
        * include/std/memory_resource: New header.
        (memory_resource, polymorphic_allocator, new_delete_resource)
        (null_memory_resource, set_default_resource, get_default_resource)
        (pool_options, monotonic_buffer_resource): Define.
        * src/Makefile.am: Add c++17 directory.
        * src/Makefile.in: Regenerate.
        * src/c++11/Makefile.am: Fix comment.
        * src/c++17/Makefile.am: Add makefile for new sub-directory.
        * src/c++17/Makefile.in: Generate.
        * src/c++17/memory_resource.cc: New.
        (newdel_res_t, null_res_t, constant_init, newdel_res, null_res)
        (default_res, new_delete_resource, null_memory_resource)
        (set_default_resource, get_default_resource): Define.
        * testsuite/20_util/memory_resource/1.cc: New test.
        * testsuite/20_util/memory_resource/2.cc: New test.
        * testsuite/20_util/monotonic_buffer_resource/1.cc: New test.
        * testsuite/20_util/monotonic_buffer_resource/allocate.cc: New test.
        * testsuite/20_util/monotonic_buffer_resource/deallocate.cc: New test.
        * testsuite/20_util/monotonic_buffer_resource/release.cc: New test.
        * testsuite/20_util/monotonic_buffer_resource/upstream_resource.cc:
        New test.
        * testsuite/20_util/polymorphic_allocator/1.cc: New test.
        * testsuite/20_util/polymorphic_allocator/resource.cc: New test.
        * testsuite/20_util/polymorphic_allocator/select.cc: New test.
        * testsuite/util/testsuite_allocator.h (__gnu_test::memory_resource):
        Define concrete memory resource for testing.
        (__gnu_test::default_resource_mgr): Define RAII helper for changing
        default resource.

Tested powerpc64le-linux, committed to trunk.

I missed a change to acinclude.m4 that should have gone with this
patch. Now also committed to trunk.

One of the tests also needs this fix.

Committed to trunk.


commit 4875590bba5e5b77878264870671071016ab7ca2
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Wed Jul 25 21:22:19 2018 +0100

    PR libstdc++/86676 Do not assume stack buffer is aligned
    
            PR libstdc++/86676
            * testsuite/20_util/monotonic_buffer_resource/release.cc: Allow for
            buffer being misaligned and so returned pointer not being at start.

diff --git a/libstdc++-v3/testsuite/20_util/monotonic_buffer_resource/release.cc b/libstdc++-v3/testsuite/20_util/monotonic_buffer_resource/release.cc
index 0c7f31789e6..ac70385961d 100644
--- a/libstdc++-v3/testsuite/20_util/monotonic_buffer_resource/release.cc
+++ b/libstdc++-v3/testsuite/20_util/monotonic_buffer_resource/release.cc
@@ -115,10 +115,12 @@ test04()
   unsigned char buffer[1024];
   std::pmr::monotonic_buffer_resource mbr(buffer, sizeof(buffer), &r);
   void* p = mbr.allocate(800, 16);
-  VERIFY( p == buffer );
+  VERIFY( p >= buffer && p < (buffer + 16) );
+  void* const p_in_buffer = p;
   VERIFY( r.allocate_calls == 0 );
   p = mbr.allocate(300, 1);
   VERIFY( p != buffer );
+  VERIFY( p != buffer );
   VERIFY( r.allocate_calls == 1 );
   mbr.release();
   VERIFY( r.deallocate_calls == 1 );
@@ -126,7 +128,7 @@ test04()
   VERIFY( r.number_of_active_allocations() == 0 );
   // initial buffer should be used again now:
   p = mbr.allocate(1000);
-  VERIFY( p == buffer );
+  VERIFY( p == p_in_buffer );
   VERIFY( r.allocate_calls == 1 );
 }
 

Reply via email to