This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Add initial version of C++17 <memory_resource> header


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 <jwakely@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 );
 }
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]