aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-07-24 14:03:11 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2018-07-24 14:03:11 +0100
commit0568ade6f8456715ee7ed8902f8e308b0ab3dbb5 (patch)
tree5adafb6d766e178537c917eef0b05e531587a813
parentffb164c7df6931b92cf2ad2ef4bd102cec8e6be3 (diff)
downloadgcc-0568ade6f8456715ee7ed8902f8e308b0ab3dbb5.zip
gcc-0568ade6f8456715ee7ed8902f8e308b0ab3dbb5.tar.gz
gcc-0568ade6f8456715ee7ed8902f8e308b0ab3dbb5.tar.bz2
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. From-SVN: r262943
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/include/experimental/memory_resource16
2 files changed, 16 insertions, 6 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index ba78ab8..1f87a12 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-24 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/70966
+ * include/experimental/memory_resource (__get_default_resource): Use
+ placement new to create an object with dynamic storage duration.
+
2018-07-23 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/70940
diff --git a/libstdc++-v3/include/experimental/memory_resource b/libstdc++-v3/include/experimental/memory_resource
index 61273fc..83379d1 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(); }