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:237
 
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.