From: Richard Henderson Date: Thu, 26 Mar 2015 18:31:11 +0000 (-0700) Subject: re PR libstdc++/65033 (C++11 atomics: is_lock_free result does not always match the... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8be568519bf08098e056567d57a75c3f38416ac2;p=gcc.git re PR libstdc++/65033 (C++11 atomics: is_lock_free result does not always match the real lock-free property) PR libstdc++/65033 * include/bits/atomic_base.h (__atomic_base::is_lock_free): Build a fake pointer indicating type alignment. (__atomic_base::is_lock_free): Likewise. * include/std/atomic (atomic::is_lock_free): Likewise. From-SVN: r221701 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 6793e9d39d6..cd4640a39e3 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2015-03-26 Richard Henderson + + PR libstdc++/65033 + * include/bits/atomic_base.h (__atomic_base::is_lock_free): Build + a fake pointer indicating type alignment. + (__atomic_base::is_lock_free): Likewise. + * include/std/atomic (atomic::is_lock_free): Likewise. + 2015-03-25 Alan Lawrence PR libstdc++/33394 diff --git a/libstdc++-v3/include/bits/atomic_base.h b/libstdc++-v3/include/bits/atomic_base.h index fe6524f41b7..8104c986b52 100644 --- a/libstdc++-v3/include/bits/atomic_base.h +++ b/libstdc++-v3/include/bits/atomic_base.h @@ -346,11 +346,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool is_lock_free() const noexcept - { return __atomic_is_lock_free(sizeof(_M_i), nullptr); } + { + // Produce a fake, minimally aligned pointer. + void *__a = reinterpret_cast(-__alignof(_M_i)); + return __atomic_is_lock_free(sizeof(_M_i), __a); + } bool is_lock_free() const volatile noexcept - { return __atomic_is_lock_free(sizeof(_M_i), nullptr); } + { + // Produce a fake, minimally aligned pointer. + void *__a = reinterpret_cast(-__alignof(_M_i)); + return __atomic_is_lock_free(sizeof(_M_i), __a); + } _GLIBCXX_ALWAYS_INLINE void store(__int_type __i, memory_order __m = memory_order_seq_cst) noexcept @@ -653,11 +661,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool is_lock_free() const noexcept - { return __atomic_is_lock_free(sizeof(__pointer_type), nullptr); } + { + // Produce a fake, minimally aligned pointer. + void *__a = reinterpret_cast(-__alignof(_M_p)); + return __atomic_is_lock_free(sizeof(_M_p), __a); + } bool is_lock_free() const volatile noexcept - { return __atomic_is_lock_free(sizeof(__pointer_type), nullptr); } + { + // Produce a fake, minimally aligned pointer. + void *__a = reinterpret_cast(-__alignof(_M_p)); + return __atomic_is_lock_free(sizeof(_M_p), __a); + } _GLIBCXX_ALWAYS_INLINE void store(__pointer_type __p, diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic index 1a17427e231..cc4b5f1a94c 100644 --- a/libstdc++-v3/include/std/atomic +++ b/libstdc++-v3/include/std/atomic @@ -198,11 +198,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool is_lock_free() const noexcept - { return __atomic_is_lock_free(sizeof(_M_i), nullptr); } + { + // Produce a fake, minimally aligned pointer. + void *__a = reinterpret_cast(-__alignof(_M_i)); + return __atomic_is_lock_free(sizeof(_M_i), __a); + } bool is_lock_free() const volatile noexcept - { return __atomic_is_lock_free(sizeof(_M_i), nullptr); } + { + // Produce a fake, minimally aligned pointer. + void *__a = reinterpret_cast(-__alignof(_M_i)); + return __atomic_is_lock_free(sizeof(_M_i), __a); + } void store(_Tp __i, memory_order __m = memory_order_seq_cst) noexcept