31#include <condition_variable>
46template <
typename,
typename =
void>
75 : m_counter{initial_value}, m_waiters{0} {}
79 for (
auto seen = m_counter.load();;) {
81 std::forward<F>(execute_when_zero)();
82 m_waiters.fetch_add(1);
129 m_waiters.fetch_sub(1);
130 seen = m_counter.load();
131 }
else if (m_counter.compare_exchange_weak(seen, seen - 1)) {
138 m_counter.fetch_add(1);
139 if (0 < m_waiters.load()) {
140 m_counter.notify_one();
157 : m_counter{initial_value}, m_waiters{0} {}
158 template <
typename F>
160 std::unique_lock guard{m_mutex};
208 m_is_non_zero.wait(guard, [&]() {
212 std::forward<F>(execute_when_zero)();
219 std::lock_guard guard{m_mutex};
222 m_is_non_zero.notify_one();
A utility class which, if inherited from, prevents the descendant class from being copied,...
Definition: ut0class_life_cycle.h:41
size_t m_waiters
Definition: ut0counting_semaphore.h:230
counting_semaphore_base(T initial_value)
Definition: ut0counting_semaphore.h:156
T m_counter
Definition: ut0counting_semaphore.h:229
std::mutex m_mutex
Definition: ut0counting_semaphore.h:227
std::condition_variable m_is_non_zero
Definition: ut0counting_semaphore.h:228
void acquire(F &&execute_when_zero)
Definition: ut0counting_semaphore.h:159
void release()
Definition: ut0counting_semaphore.h:218
void release()
Increments the counter by one.
Definition: ut0counting_semaphore.h:137
counting_semaphore_base(T initial_value)
Initializes the counter to initial_value.
Definition: ut0counting_semaphore.h:74
std::atomic< T > m_counter
Definition: ut0counting_semaphore.h:145
std::atomic< size_t > m_waiters
Definition: ut0counting_semaphore.h:146
void acquire(F &&execute_when_zero)
Waits until the counter is positive, and decrements it by one.
Definition: ut0counting_semaphore.h:78
A SFINAE helper from which ut::counting_semaphore inherits whole behaviour.
Definition: ut0counting_semaphore.h:62
#define T
Definition: jit_executor_value.cc:373
#define F
Definition: jit_executor_value.cc:374
Definition: fts0fts.cc:238
ValueType value(const std::optional< ValueType > &v)
Definition: gtid.h:83
Definition: gcs_xcom_synode.h:64
This file contains a set of libraries providing overloads for regular dynamic allocation routines whi...
Definition: aligned_alloc.h:48
A SFINAE helper type which has value=true if and only if std::atomic<T> supports wait(T).
Definition: ut0counting_semaphore.h:47
Utilities related to class lifecycle.