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;
    |       ^~~~~
/S/libstdc++-v3/src/c++17/memory_resource.cc: In member function 
'std::pmr::memory_resource* std::pmr::{anonymous}::atomic_mem_res::load()':
/S/libstdc++-v3/src/c++17/memory_resource.cc:107:13: error: 'mutex' was not 
declared in this scope
107 |  lock_guard<mutex> lock(mx);
    |             ^~~~~
/S/libstdc++-v3/src/c++17/memory_resource.cc:107:18: error: template argument 1 
is invalid
107 |  lock_guard<mutex> lock(mx);
    |                  ^
/S/libstdc++-v3/src/c++17/memory_resource.cc:107:25: error: 'mx' was not 
declared in this scope
107 |  lock_guard<mutex> lock(mx);
    |                         ^~
/S/libstdc++-v3/src/c++17/memory_resource.cc:107:25: note: suggested 
alternative: 'max'
107 |  lock_guard<mutex> lock(mx);
    |                         ^~
    |                         max
/S/libstdc++-v3/src/c++17/memory_resource.cc:107:20: warning: unused variable 
'lock' [-Wunused-variable]
107 |  lock_guard<mutex> lock(mx);
    |                    ^~~~
/S/libstdc++-v3/src/c++17/memory_resource.cc: In member function 'std::pmr::memory_resource* std::pmr::{anonymous}::atomic_mem_res::exchange(std::pmr::memory_resource*)':
/S/libstdc++-v3/src/c++17/memory_resource.cc:113:13: error: 'mutex' was not 
declared in this scope
113 |  lock_guard<mutex> lock(mx);
    |             ^~~~~
/S/libstdc++-v3/src/c++17/memory_resource.cc:113:18: error: template argument 1 
is invalid
113 |  lock_guard<mutex> lock(mx);
    |                  ^
/S/libstdc++-v3/src/c++17/memory_resource.cc:113:25: error: 'mx' was not 
declared in this scope
113 |  lock_guard<mutex> lock(mx);
    |                         ^~
/S/libstdc++-v3/src/c++17/memory_resource.cc:113:25: note: suggested 
alternative: 'max'
113 |  lock_guard<mutex> lock(mx);
    |                         ^~
    |                         max
/S/libstdc++-v3/src/c++17/memory_resource.cc:113:20: warning: unused variable 
'lock' [-Wunused-variable]
113 |  lock_guard<mutex> lock(mx);
    |                    ^~~~
make[4]: *** [Makefile:471: memory_resource.lo] Error 1
make[4]: Leaving directory '/B/arm-none-eabi/libstdc++-v3/src/c++17'
make[3]: *** [Makefile:643: all-recursive] Error 1
make[3]: Leaving directory '/B/arm-none-eabi/libstdc++-v3/src'
make[2]: *** [Makefile:510: all-recursive] Error 1
make[2]: Leaving directory '/B/arm-none-eabi/libstdc++-v3'
make[1]: *** [Makefile:417: all] Error 2
make[1]: Leaving directory '/B/arm-none-eabi/libstdc++-v3'
make: *** [Makefile:10864: all-target-libstdc++-v3] Error 2
make: *** Waiting for unfinished jobs....

Reply via email to