summaryrefslogtreecommitdiff
path: root/libstdc++-v3/src
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-08-15 10:56:33 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2018-08-15 10:56:33 +0100
commit25b030b85a03c86a010c1d2e4bc8db25958b0515 (patch)
tree8170f9c08c76323ca31a106dd69615c9c7c0ee2f /libstdc++-v3/src
parent89bcf3fffe13eb125a14340953dbe8dd37dcd60f (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. From-SVN: r263554
Diffstat (limited to 'libstdc++-v3/src')
-rw-r--r--libstdc++-v3/src/c++17/memory_resource.cc22
1 files changed, 21 insertions, 1 deletions
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