The kernel doesn't care what we store in those 32 bits, only that they are comparable. This commit adds: * pointers and long on 32-bit architectures * unsigned * untyped enums and typed enums on int & unsigned int * float
We're not using FUTEX_OP anywhere today. The kernel reserves 4 bits for this field but has only used 6 values so far, so it can be extended to unsigned compares in the future, if needed. libstdc++-v3/ChangeLog: * include/bits/atomic_wait.h: Update __platform_wait_uses_type --- libstdc++-v3/include/bits/atomic_wait.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libstdc++-v3/include/bits/atomic_wait.h b/libstdc++-v3/include/bits/atomic_wait.h index 424fccbe4c5..4b4573df691 100644 --- a/libstdc++-v3/include/bits/atomic_wait.h +++ b/libstdc++-v3/include/bits/atomic_wait.h @@ -65,7 +65,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> inline constexpr bool __platform_wait_uses_type #ifdef _GLIBCXX_HAVE_LINUX_FUTEX - = is_same_v<remove_cv_t<_Tp>, __platform_wait_t>; + = sizeof(_Tp) == sizeof(__platform_wait_t) && + alignof(_Tp) >= alignof(__platform_wait_t); #else = false; #endif @@ -91,13 +92,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> void - __platform_wait(const _Tp* __addr, __platform_wait_t __val) noexcept + __platform_wait(const _Tp* __addr, _Tp __val) noexcept { for(;;) { auto __e = syscall (SYS_futex, static_cast<const void*>(__addr), static_cast<int>(__futex_wait_flags::__wait_private), - __val, nullptr); + static_cast<__platform_wait_t>(__val), nullptr); if (!__e || errno == EAGAIN) break; else if (errno != EINTR) -- 2.30.1