Skip to content

Commit a8ed700

Browse files
committed
CI
1 parent 7c24d67 commit a8ed700

File tree

3 files changed

+67
-73
lines changed

3 files changed

+67
-73
lines changed

libcxx/include/__atomic/atomic_sync.h

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,20 @@
99
#ifndef _LIBCPP___ATOMIC_ATOMIC_SYNC_H
1010
#define _LIBCPP___ATOMIC_ATOMIC_SYNC_H
1111

12+
#include <__algorithm/ranges_find.h>
1213
#include <__atomic/contention_t.h>
1314
#include <__atomic/memory_order.h>
1415
#include <__atomic/to_gcc_order.h>
1516
#include <__chrono/duration.h>
1617
#include <__config>
1718
#include <__memory/addressof.h>
19+
#include <__ranges/access.h>
1820
#include <__thread/poll_with_backoff.h>
1921
#include <__type_traits/conjunction.h>
2022
#include <__type_traits/decay.h>
23+
#include <__type_traits/has_unique_object_representation.h>
2124
#include <__type_traits/invoke.h>
25+
#include <__type_traits/is_same.h>
2226
#include <__type_traits/void_t.h>
2327
#include <__utility/declval.h>
2428
#include <cstring>
@@ -88,7 +92,7 @@ __libcpp_atomic_notify_all_global_table(void const volatile*) _NOEXCEPT;
8892
template <std::size_t _Size>
8993
_LIBCPP_AVAILABILITY_NEW_SYNC _LIBCPP_EXPORTED_FROM_ABI void
9094

91-
__libcpp_atomic_wait_native(void const volatile* __address, void const volatile* __old_value) _NOEXCEPT;
95+
__libcpp_atomic_wait_native(void const volatile* __address, void const* __old_value) _NOEXCEPT;
9296
template <std::size_t _Size>
9397
_LIBCPP_AVAILABILITY_NEW_SYNC _LIBCPP_EXPORTED_FROM_ABI void
9498
__libcpp_atomic_notify_one_native(const volatile void*) _NOEXCEPT;
@@ -97,6 +101,48 @@ template <std::size_t _Size>
97101
_LIBCPP_AVAILABILITY_NEW_SYNC _LIBCPP_EXPORTED_FROM_ABI void
98102
__libcpp_atomic_notify_all_native(const volatile void*) _NOEXCEPT;
99103

104+
// concepts defines the types are supported natively by the platform's wait
105+
106+
# if defined(_LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE)
107+
108+
# ifdef __linux__
109+
110+
# define _LIBCPP_ATOMIC_WAIT_SIZES_LIST(_APPLY) _APPLY(4)
111+
112+
# elif defined(__APPLE__)
113+
114+
# define _LIBCPP_ATOMIC_WAIT_SIZES_LIST(_APPLY) \
115+
_APPLY(4) \
116+
_APPLY(8)
117+
118+
# elif defined(__FreeBSD__) && __SIZEOF_LONG__ == 8
119+
120+
# define _LIBCPP_ATOMIC_WAIT_SIZES_LIST(_APPLY) _APPLY(8)
121+
122+
# else
123+
124+
# define _LIBCPP_ATOMIC_WAIT_SIZES_LIST(_APPLY) _APPLY(sizeof(__cxx_contention_t))
125+
126+
# endif // __linux__
127+
128+
inline constexpr std::size_t __supported_native_wait_sizes[] = {
129+
# define _IDENTITY(_SIZE) _SIZE,
130+
_LIBCPP_ATOMIC_WAIT_SIZES_LIST(_IDENTITY)
131+
# undef _IDENTITY
132+
};
133+
134+
template <class _Tp>
135+
concept __atomic_wait_native_type =
136+
has_unique_object_representations_v<_Tp> &&
137+
std::ranges::find(__supported_native_wait_sizes, sizeof(_Tp)) != ranges::end(__supported_native_wait_sizes);
138+
139+
# else // _LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE
140+
141+
template <class _Tp>
142+
concept __atomic_wait_native_type = is_same_v<_Tp, __cxx_contention_t>;
143+
144+
# endif // _LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE
145+
100146
template <class _AtomicWaitable, class _Poll>
101147
struct __atomic_wait_backoff_impl {
102148
const _AtomicWaitable& __a_;
@@ -110,7 +156,7 @@ struct __atomic_wait_backoff_impl {
110156
if (__elapsed > chrono::microseconds(4)) {
111157
auto __contention_address = __waitable_traits::__atomic_contention_address(__a_);
112158

113-
if constexpr (__is_atomic_wait_native_type<__value_type>::value) {
159+
if constexpr (__atomic_wait_native_type<__value_type>) {
114160
auto __atomic_value = __waitable_traits::__atomic_load(__a_, __order_);
115161
if (__poll_(__atomic_value))
116162
return true;
@@ -153,7 +199,7 @@ template <class _AtomicWaitable>
153199
_LIBCPP_HIDE_FROM_ABI void __atomic_notify_one(const _AtomicWaitable& __a) {
154200
static_assert(__atomic_waitable<_AtomicWaitable>::value, "");
155201
using __value_type _LIBCPP_NODEBUG = typename __atomic_waitable_traits<__decay_t<_AtomicWaitable> >::__value_type;
156-
if constexpr (__is_atomic_wait_native_type<__value_type>::value) {
202+
if constexpr (__atomic_wait_native_type<__value_type>) {
157203
std::__libcpp_atomic_notify_one_native<sizeof(__value_type)>(
158204
__atomic_waitable_traits<__decay_t<_AtomicWaitable> >::__atomic_contention_address(__a));
159205
} else {
@@ -166,7 +212,7 @@ template <class _AtomicWaitable>
166212
_LIBCPP_HIDE_FROM_ABI void __atomic_notify_all(const _AtomicWaitable& __a) {
167213
static_assert(__atomic_waitable<_AtomicWaitable>::value, "");
168214
using __value_type _LIBCPP_NODEBUG = typename __atomic_waitable_traits<__decay_t<_AtomicWaitable> >::__value_type;
169-
if constexpr (__is_atomic_wait_native_type<__value_type>::value) {
215+
if constexpr (__atomic_wait_native_type<__value_type>) {
170216
std::__libcpp_atomic_notify_all_native<sizeof(__value_type)>(
171217
__atomic_waitable_traits<__decay_t<_AtomicWaitable> >::__atomic_contention_address(__a));
172218
} else {

libcxx/include/__atomic/contention_t.h

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@
1111

1212
#include <__atomic/support.h>
1313
#include <__config>
14-
#include <__type_traits/enable_if.h>
15-
#include <__type_traits/has_unique_object_representation.h>
16-
#include <__type_traits/integral_constant.h>
17-
#include <__type_traits/is_same.h>
18-
#include <cstddef>
1914
#include <cstdint>
2015

2116
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
@@ -24,38 +19,10 @@
2419

2520
_LIBCPP_BEGIN_NAMESPACE_STD
2621

27-
template <class _Tp, class = void>
28-
struct __is_atomic_wait_native_type : false_type {};
29-
3022
#if defined(__linux__) || (defined(_AIX) && !defined(__64BIT__))
3123
using __cxx_contention_t _LIBCPP_NODEBUG = int32_t;
32-
33-
# if defined(_LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE)
34-
template <class _Tp>
35-
struct __is_atomic_wait_native_type<_Tp,
36-
__enable_if_t<has_unique_object_representations<_Tp>::value && sizeof(_Tp) == 4> >
37-
: true_type {};
38-
# else
39-
template <class _Tp>
40-
struct __is_atomic_wait_native_type<_Tp, __enable_if_t<is_same<_Tp, int32_t>::value && sizeof(_Tp) == 4> > : true_type {
41-
};
42-
# endif // _LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE
43-
4424
#else
4525
using __cxx_contention_t _LIBCPP_NODEBUG = int64_t;
46-
47-
# if defined(_LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE)
48-
template <class _Tp>
49-
struct __is_atomic_wait_native_type<
50-
_Tp,
51-
__enable_if_t<has_unique_object_representations<_Tp>::value && (sizeof(_Tp) == 4 || sizeof(_Tp) == 8)> >
52-
: true_type {};
53-
# else
54-
template <class _Tp>
55-
struct __is_atomic_wait_native_type<_Tp, __enable_if_t<is_same<_Tp, int64_t>::value && sizeof(_Tp) == 4> > : true_type {
56-
};
57-
# endif // _LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE
58-
5926
#endif // __linux__ || (_AIX && !__64BIT__)
6027

6128
using __cxx_atomic_contention_t _LIBCPP_NODEBUG = __cxx_atomic_impl<__cxx_contention_t>;

libcxx/src/atomic.cpp

Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@
55
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66
//
77
//===----------------------------------------------------------------------===//
8-
9-
#include <__atomic/contention_t.h>
10-
#include <__thread/timed_backoff_policy.h>
118
#include <atomic>
129
#include <climits>
1310
#include <cstddef>
1411
#include <cstring>
1512
#include <functional>
1613
#include <thread>
14+
#include <type_traits>
1715

1816
#include "include/apple_availability.h"
1917

@@ -260,51 +258,34 @@ _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_notify_all_native(void const vola
260258
__contention_notify<_Size>(__get_native_waiter_count(__location), __location, false);
261259
}
262260

261+
// ==================================================
263262
// Instantiation of the templates with supported size
264-
#ifdef __linux__
265-
266-
template _LIBCPP_EXPORTED_FROM_ABI void
267-
__libcpp_atomic_wait_native<4>(void const volatile* __address, void const* __old_value) noexcept;
268-
269-
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_notify_one_native<4>(void const volatile* __location) noexcept;
263+
// ==================================================
270264

271-
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_notify_all_native<4>(void const volatile* __location) noexcept;
265+
#if defined(_LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE)
272266

273-
#elif defined(__APPLE__) && defined(_LIBCPP_USE_ULOCK)
274-
275-
template _LIBCPP_EXPORTED_FROM_ABI void
276-
__libcpp_atomic_wait_native<4>(void const volatile* __address, void const* __old_value) noexcept;
277-
278-
template _LIBCPP_EXPORTED_FROM_ABI void
279-
__libcpp_atomic_wait_native<8>(void const volatile* __address, void const* __old_value) noexcept;
267+
# define _INSTANTIATE(_SIZE) \
268+
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_wait_native<_SIZE>( \
269+
void const volatile*, void const*) noexcept; \
270+
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_notify_one_native<_SIZE>(void const volatile*) noexcept; \
271+
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_notify_all_native<_SIZE>(void const volatile*) noexcept;
280272

281-
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_notify_one_native<4>(void const volatile* __location) noexcept;
273+
_LIBCPP_ATOMIC_WAIT_SIZES_LIST(_INSTANTIATE)
282274

283-
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_notify_one_native<8>(void const volatile* __location) noexcept;
275+
# undef _INSTANTIATE
284276

285-
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_notify_all_native<4>(void const volatile* __location) noexcept;
277+
#else // _LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE
286278

287-
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_notify_all_native<8>(void const volatile* __location) noexcept;
288-
289-
#elif defined(__FreeBSD__) && __SIZEOF_LONG__ == 8
279+
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_wait_native<sizeof(__cxx_contention_t)>(
280+
void const volatile* __address, void const* __old_value) noexcept;
290281

291282
template _LIBCPP_EXPORTED_FROM_ABI void
292-
__libcpp_atomic_wait_native<8>(void const volatile* __address, void const* __old_value) noexcept;
293-
294-
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_notify_one_native<8>(void const volatile* __location) noexcept;
295-
296-
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_notify_all_native<8>(void const volatile* __location) noexcept;
297-
298-
#else // <- Add other operating systems here
283+
__libcpp_atomic_notify_one_native<sizeof(__cxx_contention_t)>(void const volatile* __location) noexcept;
299284

300285
template _LIBCPP_EXPORTED_FROM_ABI void
301-
__libcpp_atomic_wait_native<8>(void const volatile* __address, void const* __old_value) noexcept;
302-
303-
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_notify_one_native<8>(void const volatile* __location) noexcept;
286+
__libcpp_atomic_notify_all_native<sizeof(__cxx_contention_t)>(void const volatile* __location) noexcept;
304287

305-
template _LIBCPP_EXPORTED_FROM_ABI void __libcpp_atomic_notify_all_native<8>(void const volatile* __location) noexcept;
306-
307-
#endif // __linux__
288+
#endif // _LIBCPP_ABI_ATOMIC_WAIT_NATIVE_BY_SIZE
308289

309290
// =============================================================
310291
// Old dylib exported symbols, for backwards compatibility

0 commit comments

Comments
 (0)