diff --git a/NAM/wavenet/slimmable.cpp b/NAM/wavenet/slimmable.cpp index 69f077bc..6248618b 100644 --- a/NAM/wavenet/slimmable.cpp +++ b/NAM/wavenet/slimmable.cpp @@ -291,45 +291,45 @@ bool is_full_size(const std::vector& params, const st } // anonymous namespace -#ifdef _LIBCPP_VERSION +#if NAM_HAS_ATOMIC_SHARED_PTR void SlimmableWavenet::_pending_clear_release() { - std::atomic_store_explicit(&_pending_staged, std::shared_ptr{}, std::memory_order_release); + _pending_staged.store({}, std::memory_order_release); } std::shared_ptr SlimmableWavenet::_pending_load_acquire() const { - return std::atomic_load_explicit(&_pending_staged, std::memory_order_acquire); + return _pending_staged.load(std::memory_order_acquire); } void SlimmableWavenet::_pending_store_release(std::shared_ptr p) { - std::atomic_store_explicit(&_pending_staged, std::move(p), std::memory_order_release); + _pending_staged.store(std::move(p), std::memory_order_release); } std::shared_ptr SlimmableWavenet::_pending_exchange_take_acq_rel() { - return std::atomic_exchange_explicit(&_pending_staged, std::shared_ptr{}, std::memory_order_acq_rel); + return _pending_staged.exchange({}, std::memory_order_acq_rel); } #else void SlimmableWavenet::_pending_clear_release() { - _pending_staged.store({}, std::memory_order_release); + std::atomic_store_explicit(&_pending_staged, std::shared_ptr{}, std::memory_order_release); } std::shared_ptr SlimmableWavenet::_pending_load_acquire() const { - return _pending_staged.load(std::memory_order_acquire); + return std::atomic_load_explicit(&_pending_staged, std::memory_order_acquire); } void SlimmableWavenet::_pending_store_release(std::shared_ptr p) { - _pending_staged.store(std::move(p), std::memory_order_release); + std::atomic_store_explicit(&_pending_staged, std::move(p), std::memory_order_release); } std::shared_ptr SlimmableWavenet::_pending_exchange_take_acq_rel() { - return _pending_staged.exchange({}, std::memory_order_acq_rel); + return std::atomic_exchange_explicit(&_pending_staged, std::shared_ptr{}, std::memory_order_acq_rel); } #endif diff --git a/NAM/wavenet/slimmable.h b/NAM/wavenet/slimmable.h index 28a3ab57..df57b052 100644 --- a/NAM/wavenet/slimmable.h +++ b/NAM/wavenet/slimmable.h @@ -3,9 +3,19 @@ #include #include -#ifdef _LIBCPP_VERSION -// libc++: std::atomic> is not viable; staging uses deprecated atomic_* free functions. +// std::atomic> requires C++20 library support (libstdc++ >= GCC 12). +// Where it is unavailable -- libc++ (any version so far) and older libstdc++ such as the +// one shipped with GCC 9 -- fall back to the deprecated std::atomic_* free-function +// overloads for shared_ptr, which provide the same acquire/release semantics. Keyed on the +// C++20 feature-test macro rather than on a specific standard library so the right path is +// chosen for every compiler. +#if defined(__cpp_lib_atomic_shared_ptr) && __cpp_lib_atomic_shared_ptr >= 201711L + #define NAM_HAS_ATOMIC_SHARED_PTR 1 #else + #define NAM_HAS_ATOMIC_SHARED_PTR 0 +#endif + +#if NAM_HAS_ATOMIC_SHARED_PTR #include #endif @@ -71,11 +81,11 @@ class SlimmableWavenet : public DSP, public SlimmableModel std::shared_ptr model; std::vector channels; }; -#ifdef _LIBCPP_VERSION +#if NAM_HAS_ATOMIC_SHARED_PTR + std::atomic> _pending_staged; +#else /// Staged model; synchronized via deprecated std::atomic_* overloads for shared_ptr only. std::shared_ptr _pending_staged; -#else - std::atomic> _pending_staged; #endif std::vector _current_channels;