Skip to content

Commit 096f85e

Browse files
[libc] add more APIs of cmgxchg variants (#91208)
Such APIs are useful in lock implementations
1 parent ee9ca12 commit 096f85e

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

libc/src/__support/CPP/atomic.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,36 @@ template <typename T> struct Atomic {
101101
int(mem_ord), int(mem_ord));
102102
}
103103

104+
// Atomic compare exchange (separate success and failure memory orders)
105+
bool compare_exchange_strong(
106+
T &expected, T desired, MemoryOrder success_order,
107+
MemoryOrder failure_order,
108+
[[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
109+
return __atomic_compare_exchange_n(&val, &expected, desired, false,
110+
static_cast<int>(success_order),
111+
static_cast<int>(failure_order));
112+
}
113+
114+
// Atomic compare exchange (weak version)
115+
bool compare_exchange_weak(
116+
T &expected, T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
117+
[[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
118+
return __atomic_compare_exchange_n(&val, &expected, desired, true,
119+
static_cast<int>(mem_ord),
120+
static_cast<int>(mem_ord));
121+
}
122+
123+
// Atomic compare exchange (weak version with separate success and failure
124+
// memory orders)
125+
bool compare_exchange_weak(
126+
T &expected, T desired, MemoryOrder success_order,
127+
MemoryOrder failure_order,
128+
[[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
129+
return __atomic_compare_exchange_n(&val, &expected, desired, true,
130+
static_cast<int>(success_order),
131+
static_cast<int>(failure_order));
132+
}
133+
104134
T exchange(T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST,
105135
[[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) {
106136
#if __has_builtin(__scoped_atomic_exchange_n)

0 commit comments

Comments
 (0)