From 8be568519bf08098e056567d57a75c3f38416ac2 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 26 Mar 2015 11:31:11 -0700 Subject: [PATCH] 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 --- libstdc++-v3/ChangeLog | 8 ++++++++ libstdc++-v3/include/bits/atomic_base.h | 24 ++++++++++++++++++++---- libstdc++-v3/include/std/atomic | 12 ++++++++++-- 3 files changed, 38 insertions(+), 6 deletions(-) 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 -- 2.30.2