10#include <system_error>
18#if _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
23# include <semaphore.h>
32 int ret = sem_init(&sem, 0, 0);
33 if(ret != 0)
throw std::system_error(std::error_code(errno, std::generic_category()));
38 ~semaphore() { sem_destroy(&sem); }
45 int ret = sem_post(&sem);
46 if(ret != 0)
throw std::system_error(std::error_code(errno, std::generic_category()));
49 ret = sem_getvalue(&sem, &value);
50 if(ret != 0 || value > 1)
throw std::system_error(std::error_code(errno, std::generic_category()));
57 int ret = sem_getvalue(&sem, &value);
58 if(ret != 0)
throw std::system_error(std::error_code(errno, std::generic_category()));
68 int ret = sem_wait(&sem);
69 if(ret != 0)
throw std::system_error(std::error_code(errno, std::generic_category()));
75 int ret = sem_trywait(&sem);
77 if(errno != EAGAIN)
throw std::system_error(std::error_code(errno, std::generic_category()));
96# include <condition_variable>
106 std::unique_lock<
decltype(_mutex)>
lock(_mutex);
109 if(_count == 0) _condition.notify_one();
113 std::unique_lock<
decltype(_mutex)>
lock(_mutex);
118 std::unique_lock<
decltype(_mutex)>
lock(_mutex);
119 while(_count > 0) _condition.wait(
lock);
124 std::unique_lock<
decltype(_mutex)>
lock(_mutex);
137 std::condition_variable _condition;
bool is_ready_and_reset()