13#include <atomic_queue/defs.h>
19 m_sem(SDL_CreateSemaphore(0)),
25 SDL_DestroySemaphore(m_sem);
29 int32_t
count()
const {
return -m_count.load(std::memory_order_acquire); }
33 int value = m_count.load(std::memory_order_relaxed);
34 return (value > 0 && m_count.compare_exchange_strong(value, value - 1, std::memory_order_acquire));
47 int value = m_count.fetch_sub(1, std::memory_order_acquire);
55 int value = m_count.fetch_add(
count, std::memory_order_release);
56 int toRelease = -value <
count ? -value :
count;
57 while (toRelease-- > 0) {
63 void wait_with_spinlock()
65 uint32_t spinCount = 1000;
69 value = m_count.load(std::memory_order_relaxed);
70 if ((value > 0) && m_count.compare_exchange_strong(value, value - 1, std::memory_order_acquire))
72 atomic_queue::spin_loop_pause();
74 std::atomic_signal_fence(std::memory_order_acquire);
77 value = m_count.fetch_sub(1, std::memory_order_acquire);
83 std::atomic<int32_t> m_count;
Definition Semaphore.h:16
void signal(int count=1)
Definition Semaphore.h:53
int32_t count() const
Definition Semaphore.h:29
void waitonly()
Definition Semaphore.h:44
Semaphore(uint32_t initialCount=0)
Definition Semaphore.h:18
~Semaphore()
Definition Semaphore.h:23
void wait()
Definition Semaphore.h:37
bool try_wait()
Definition Semaphore.h:31