}
inline __wait_result_type
- __wait_until_impl(const __platform_wait_t* __addr,
- const __wait_args_base& __a,
+ __wait_until_impl(const void* __addr, const __wait_args_base& __a,
const __wait_clock_t::time_point& __atime)
{
__wait_args_base __args = __a;
__atomic_load(__wait_addr, &__args._M_old, __args._M_order);
}
else
- __wait_addr = __addr;
+ __wait_addr = static_cast<const __platform_wait_t*>(__addr);
if (__args & __wait_flags::__do_spin)
{
// Returns {true, val} if wait ended before a timeout.
template<typename _Clock, typename _Dur>
__wait_result_type
- __wait_until(const __platform_wait_t* __addr, const __wait_args_base& __args,
+ __wait_until(const void* __addr, const __wait_args_base& __args,
const chrono::time_point<_Clock, _Dur>& __atime) noexcept
{
auto __at = __detail::__to_wait_clock(__atime);
// Returns {true, val} if wait ended before a timeout.
template<typename _Rep, typename _Period>
__wait_result_type
- __wait_for(const __platform_wait_t* __addr, const __wait_args_base& __args,
+ __wait_for(const void* __addr, const __wait_args_base& __args,
const chrono::duration<_Rep, _Period>& __rtime) noexcept
{
if (!__rtime.count())
const chrono::time_point<_Clock, _Dur>& __atime,
bool __bare_wait = false) noexcept
{
- const auto __wait_addr =
- reinterpret_cast<const __detail::__platform_wait_t*>(__addr);
__detail::__wait_args __args{ __addr, __bare_wait };
_Tp __val = __vfn();
while (!__pred(__val))
{
- auto __res = __detail::__wait_until(__wait_addr, __args, __atime);
+ auto __res = __detail::__wait_until(__addr, __args, __atime);
if (!__res.first)
// timed out
return __res.first; // C++26 will also return last observed __val
const chrono::duration<_Rep, _Period>& __rtime,
bool __bare_wait = false) noexcept
{
- const auto __wait_addr =
- reinterpret_cast<const __detail::__platform_wait_t*>(__addr);
__detail::__wait_args __args{ __addr, __bare_wait };
_Tp __val = __vfn();
while (!__pred(__val))
{
- auto __res = __detail::__wait_for(__wait_addr, __args, __rtime);
+ auto __res = __detail::__wait_for(__addr, __args, __rtime);
if (!__res.first)
// timed out
return __res.first; // C++26 will also return last observed __val
}
inline __wait_result_type
- __wait_impl(const __platform_wait_t* __addr, const __wait_args_base& __a)
+ __wait_impl(const void* __addr, const __wait_args_base& __a)
{
__wait_args_base __args = __a;
__waiter_pool_impl* __pool = nullptr;
__atomic_load(__wait_addr, &__args._M_old, __args._M_order);
}
else
- __wait_addr = __addr;
+ __wait_addr = static_cast<const __platform_wait_t*>(__addr);
if (__args & __wait_flags::__do_spin)
{
}
inline void
- __notify_impl(const __platform_wait_t* __addr, [[maybe_unused]] bool __all,
+ __notify_impl(const void* __addr, [[maybe_unused]] bool __all,
const __wait_args_base& __args)
{
__waiter_pool_impl* __pool = nullptr;
__all = true;
}
else // Use the atomic variable's own address.
- __wait_addr = __addr;
+ __wait_addr = static_cast<const __platform_wait_t*>(__addr);
if (__args & __wait_flags::__track_contention)
{
__atomic_wait_address(const _Tp* __addr, _Pred&& __pred, _ValFn&& __vfn,
bool __bare_wait = false) noexcept
{
- const auto __wait_addr =
- reinterpret_cast<const __detail::__platform_wait_t*>(__addr);
__detail::__wait_args __args{ __addr, __bare_wait };
_Tp __val = __vfn();
while (!__pred(__val))
__val);
// Otherwise, it's a proxy wait and the proxy's _M_ver is used.
- __detail::__wait_impl(__wait_addr, __args);
+ __detail::__wait_impl(__addr, __args);
__val = __vfn();
}
// C++26 will return __val
__atomic_notify_address(const _Tp* __addr, bool __all,
bool __bare_wait = false) noexcept
{
- const auto __wait_addr =
- reinterpret_cast<const __detail::__platform_wait_t*>(__addr);
__detail::__wait_args __args{ __addr, __bare_wait };
- __detail::__notify_impl(__wait_addr, __all, __args);
+ __detail::__notify_impl(__addr, __all, __args);
}
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std