summaryrefslogtreecommitdiffstats
path: root/include/atomic
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2015-06-13 00:23:07 +0000
committerEric Fiselier <eric@efcs.ca>2015-06-13 00:23:07 +0000
commit7726a348df3f4708959eeb75cb7f283f8ed3b3dd (patch)
treef4fe989e48d8b8d44709b6cb441ceb312af0b5a0 /include/atomic
parent56a599b97645e92df891bf6d84ba806677132d5c (diff)
downloadexternal_libcxx-7726a348df3f4708959eeb75cb7f283f8ed3b3dd.tar.gz
external_libcxx-7726a348df3f4708959eeb75cb7f283f8ed3b3dd.tar.bz2
external_libcxx-7726a348df3f4708959eeb75cb7f283f8ed3b3dd.zip
Prevent dependancy on libatomic when using GCC to provide <atomic>.
The __atomic_is_lock_free(...) function sometimes requires linkage to libatomic if it cannot be evaluated at compile time. Remove __c11_atomic_is_lock_free and use __atomic_is_lock_free(sizeof(Tp)) directly so that it can be evaluated at compile time. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@239648 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/atomic')
-rw-r--r--include/atomic14
1 files changed, 8 insertions, 6 deletions
diff --git a/include/atomic b/include/atomic
index 0427a9133..5bc71f003 100644
--- a/include/atomic
+++ b/include/atomic
@@ -633,10 +633,6 @@ static inline void __c11_atomic_signal_fence(memory_order __order) {
__atomic_signal_fence(__gcc_atomic::__to_gcc_order(__order));
}
-static inline bool __c11_atomic_is_lock_free(size_t __size) {
- return __atomic_is_lock_free(__size, 0);
-}
-
template <typename _Tp>
static inline void __c11_atomic_store(volatile _Atomic(_Tp)* __a, _Tp __val,
memory_order __order) {
@@ -827,10 +823,16 @@ struct __atomic_base // false
_LIBCPP_INLINE_VISIBILITY
bool is_lock_free() const volatile _NOEXCEPT
- {return __c11_atomic_is_lock_free(sizeof(_Tp));}
+ {
+#if __has_feature(cxx_atomic)
+ return __c11_atomic_is_lock_free(sizeof(_Tp));
+#else
+ return __atomic_is_lock_free(sizeof(_Tp), 0);
+#endif
+ }
_LIBCPP_INLINE_VISIBILITY
bool is_lock_free() const _NOEXCEPT
- {return __c11_atomic_is_lock_free(sizeof(_Tp));}
+ {return static_cast<__atomic_base const volatile*>(this)->is_lock_free();}
_LIBCPP_INLINE_VISIBILITY
void store(_Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
{__c11_atomic_store(&__a_, __d, __m);}