diff mbox series

PR libstdc++/70966 fix lifetime bug for default resource

Message ID 20180724130516.GA11979@redhat.com
State New
Headers show
Series PR libstdc++/70966 fix lifetime bug for default resource | expand

Commit Message

Jonathan Wakely July 24, 2018, 1:05 p.m. UTC
Similar to what I did for the new_delete_resource and
null_memory_resource objects, this makes the atomic<memory_resource*>
immortal. This ensure it can still be used after static destructors
start running.

	PR libstdc++/70966
	* include/experimental/memory_resource (__get_default_resource): Use
	placement new to create an object with dynamic storage duration.

Tested powerpc64le-linux, committed to trunk.
commit 5e51f3630b506d993737c95c65b251acaa433076
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Mon Jul 23 23:30:38 2018 +0100

    PR libstdc++/70966 fix lifetime bug for default resource
    
            PR libstdc++/70966
            * include/experimental/memory_resource (__get_default_resource): Use
            placement new to create an object with dynamic storage duration.
diff mbox series

Patch

diff --git a/libstdc++-v3/include/experimental/memory_resource b/libstdc++-v3/include/experimental/memory_resource
index 61273fc2c85..83379d1367a 100644
--- a/libstdc++-v3/include/experimental/memory_resource
+++ b/libstdc++-v3/include/experimental/memory_resource
@@ -459,12 +459,6 @@  namespace pmr {
     };
 
   // Global memory resources
-  inline std::atomic<memory_resource*>&
-  __get_default_resource()
-  {
-    static atomic<memory_resource*> _S_default_resource(new_delete_resource());
-    return _S_default_resource;
-  }
 
   inline memory_resource*
   new_delete_resource() noexcept
@@ -499,6 +493,16 @@  namespace pmr {
   }
 
   // The default memory resource
+
+  inline std::atomic<memory_resource*>&
+  __get_default_resource()
+  {
+    using type = atomic<memory_resource*>;
+    alignas(type) static unsigned char __buf[sizeof(type)];
+    static type* __r = new(__buf) type(new_delete_resource());
+    return *__r;
+  }
+
   inline memory_resource*
   get_default_resource() noexcept
   { return __get_default_resource().load(); }