On 15/08/18 10:40 +0100, Szabolcs Nagy wrote:
On 14/08/18 14:13, Jonathan Wakely wrote:
Define a class using std::mutex for when std::atomic<memory_resource*>
cannot be used to implement the default memory resource.
When std::mutex constructor is not constexpr the constant_init trick
won't work, so just define a global and use init_priority for it. The
compiler warns about using reserved priority, so put the definition in a
header file using #pragma GCC system_header to suppress the warning.
PR libstdc++/86846
* src/c++17/default_resource.h: New file, defining default_res.
* src/c++17/memory_resource.cc [ATOMIC_POINTER_LOCK_FREE != 2]
(atomic_mem_res): Define alternative for atomic<memory_resource*>
using a mutex instead of atomics.
Tested x86_64-linux, committed to trunk.
build fails with arm-none-eabi target:
Making all in c++17
make[4]: Entering directory '/B/arm-none-eabi/libstdc++-v3/src/c++17'
/bin/sh ../../libtool --tag CXX --tag disable-shared --mode=compile
/B/./gcc/xgcc -shared-libgcc -B/B/./gcc -nostdinc++
-L/B/arm-none-eabi/libstdc++-v3/src
-L/B/arm-none-eabi/libstdc++-v3/src/.libs
-L/B/arm-none-eabi/libstdc++-v3/libsupc++/.libs
-B/P/arm-none-eabi/bin/ -B/P/arm-none-eabi/lib/ -isystem
/P/arm-none-eabi/include -isystem /P/arm-none-eabi/sys-include
-I/S/libstdc++-v3/../libgcc
-I/B/arm-none-eabi/libstdc++-v3/include/arm-none-eabi
-I/B/arm-none-eabi/libstdc++-v3/include -I/S/libstdc++-v3/libsupc++
-std=gnu++17 -fno-implicit-templates -Wall -Wextra -Wwrite-strings
-Wcast-qual -Wabi=2 -fdiagnostics-show-location=once
-ffunction-sections -fdata-sections -frandom-seed=memory_resource.lo
-g -ffunction-sections -fdata-sections -O2 -c -o memory_resource.lo
/S/libstdc++-v3/src/c++17/memory_resource.cc
libtool: compile: /B/./gcc/xgcc -shared-libgcc -B/B/./gcc -nostdinc++
-L/B/arm-none-eabi/libstdc++-v3/src
-L/B/arm-none-eabi/libstdc++-v3/src/.libs
-L/B/arm-none-eabi/libstdc++-v3/libsupc++/.libs
-B/P/arm-none-eabi/bin/ -B/P/arm-none-eabi/lib/ -isystem
/P/arm-none-eabi/include -isystem /P/arm-none-eabi/sys-include
-I/S/libstdc++-v3/../libgcc
-I/B/arm-none-eabi/libstdc++-v3/include/arm-none-eabi
-I/B/arm-none-eabi/libstdc++-v3/include -I/S/libstdc++-v3/libsupc++
-std=gnu++17 -fno-implicit-templates -Wall -Wextra -Wwrite-strings
-Wcast-qual -Wabi=2 -fdiagnostics-show-location=once
-ffunction-sections -fdata-sections -frandom-seed=memory_resource.lo
-g -ffunction-sections -fdata-sections -O2 -c
/S/libstdc++-v3/src/c++17/memory_resource.cc -o memory_resource.o
/S/libstdc++-v3/src/c++17/memory_resource.cc:102:7: error: 'mutex' does not
name a type
102 | mutex mx;
Sorry about that, it should be fixed at r263554 by the commit of this
patch.
commit 21cebbbedfbbe8fc5c4b1ebc59bef1b8f090bc6b
Author: Jonathan Wakely <jwak...@redhat.com>
Date: Wed Aug 15 10:55:31 2018 +0100
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.
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