aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2018-08-15 09:56:33 +0000
committerredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2018-08-15 09:56:33 +0000
commit43b7f53ffd096de36ab3761f2f8aeb229dbc8416 (patch)
tree8170f9c08c76323ca31a106dd69615c9c7c0ee2f
parent0c913f2d5396f2a0f635859e7170411b8b65ac53 (diff)
Fix single-threaded build for targets without atomics
* src/c++17/memory_resource.cc [!_GLIBCXX_HAS_GTHREADS] (atomic_mem_res): Add unsynchronized definition for single-threaded. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@263554 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libstdc++-v3/ChangeLog5
-rw-r--r--libstdc++-v3/src/c++17/memory_resource.cc22
2 files changed, 26 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 182c0ed2ff3..15d2eb5eee9 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,8 @@
+2018-08-15 Jonathan Wakely <jwakely@redhat.com>
+
+ * src/c++17/memory_resource.cc [!_GLIBCXX_HAS_GTHREADS]
+ (atomic_mem_res): Add unsynchronized definition for single-threaded.
+
2018-08-14 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/86954
diff --git a/libstdc++-v3/src/c++17/memory_resource.cc b/libstdc++-v3/src/c++17/memory_resource.cc
index bd8f32d931e..aa82813e645 100644
--- a/libstdc++-v3/src/c++17/memory_resource.cc
+++ b/libstdc++-v3/src/c++17/memory_resource.cc
@@ -88,7 +88,7 @@ namespace pmr
#if ATOMIC_POINTER_LOCK_FREE == 2
using atomic_mem_res = atomic<memory_resource*>;
# define _GLIBCXX_ATOMIC_MEM_RES_CAN_BE_CONSTANT_INITIALIZED
-#else
+#elif defined(_GLIBCXX_HAS_GTHREADS)
// Can't use pointer-width atomics, define a type using a mutex instead:
struct atomic_mem_res
{
@@ -114,6 +114,26 @@ namespace pmr
return std::exchange(val, r);
}
};
+#else
+# define _GLIBCXX_ATOMIC_MEM_RES_CAN_BE_CONSTANT_INITIALIZED
+ // Single-threaded, no need for synchronization
+ struct atomic_mem_res
+ {
+ constexpr
+ atomic_mem_res(memory_resource* r) : val(r) { }
+
+ memory_resource* val;
+
+ memory_resource* load() const
+ {
+ return val;
+ }
+
+ memory_resource* exchange(memory_resource* r)
+ {
+ return std::exchange(val, r);
+ }
+ };
#endif // ATOMIC_POINTER_LOCK_FREE == 2
#ifdef _GLIBCXX_ATOMIC_MEM_RES_CAN_BE_CONSTANT_INITIALIZED