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<T>::is_lock_free): Build a fake pointer indicating type alignment. (__atomic_base<T *>::is_lock_free): Likewise. * include/std/atomic (atomic<T>::is_lock_free): Likewise. From-SVN: r221701
This commit is contained in:
parent
41b38772cc
commit
8be568519b
@ -1,3 +1,11 @@
|
||||
2015-03-26 Richard Henderson <rth@redhat.com>
|
||||
|
||||
PR libstdc++/65033
|
||||
* include/bits/atomic_base.h (__atomic_base<T>::is_lock_free): Build
|
||||
a fake pointer indicating type alignment.
|
||||
(__atomic_base<T *>::is_lock_free): Likewise.
|
||||
* include/std/atomic (atomic<T>::is_lock_free): Likewise.
|
||||
|
||||
2015-03-25 Alan Lawrence <alan.lawrence@arm.com>
|
||||
|
||||
PR libstdc++/33394
|
||||
|
@ -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<void *>(-__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<void *>(-__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<void *>(-__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<void *>(-__alignof(_M_p));
|
||||
return __atomic_is_lock_free(sizeof(_M_p), __a);
|
||||
}
|
||||
|
||||
_GLIBCXX_ALWAYS_INLINE void
|
||||
store(__pointer_type __p,
|
||||
|
@ -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<void *>(-__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<void *>(-__alignof(_M_i));
|
||||
return __atomic_is_lock_free(sizeof(_M_i), __a);
|
||||
}
|
||||
|
||||
void
|
||||
store(_Tp __i, memory_order __m = memory_order_seq_cst) noexcept
|
||||
|
Loading…
Reference in New Issue
Block a user