mirror of
https://github.com/boostorg/filesystem.git
synced 2026-01-19 04:12:09 +00:00
Instead of using atomic<> to access global function pointers, use raw pointers and atomic_ref to access them safely in multi-threaded builds. This allows to ensure constant initialization of the function pointers, even in C++03. This also solves the problem of undefined dynamic initialization order that we previously tried to solve with the init_priority attribute. The attribute turns out to not work if the pointers were raw pointers (in single-threaded builds). It is also not supported by Intel Compiler and possibly other, which required us to avoid using the function pointer for fill_random. The resulting code should be simpler and more portable. In order to check for C++20 std::atomic_ref availability, the older check for <atomic> header was replaced with a check for std::atomic_ref. If not available, we're using Boost.Atomic, as before.
20 lines
443 B
C++
20 lines
443 B
C++
// Copyright 2021 Andrey Semashev
|
|
|
|
// Distributed under the Boost Software License, Version 1.0.
|
|
// See http://www.boost.org/LICENSE_1_0.txt
|
|
|
|
// See library home page at http://www.boost.org/libs/filesystem
|
|
|
|
#include <atomic>
|
|
|
|
typedef void func_t();
|
|
|
|
int main()
|
|
{
|
|
func_t* func = 0;
|
|
std::atomic_ref< func_t* > ref(func);
|
|
ref.load(std::memory_order_relaxed);
|
|
ref.store((func_t*)0, std::memory_order_relaxed);
|
|
return 0;
|
|
}
|