11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
15#include <condition_variable>
20PROMEKI_NAMESPACE_BEGIN
37 WaitCondition() =
default;
40 ~WaitCondition() =
default;
42 WaitCondition(
const WaitCondition &) =
delete;
43 WaitCondition &operator=(
const WaitCondition &) =
delete;
44 WaitCondition(WaitCondition &&) =
delete;
45 WaitCondition &operator=(WaitCondition &&) =
delete;
58 Error wait(Mutex &mutex,
unsigned int timeoutMs = 0) {
59 std::unique_lock<std::mutex> lock(mutex._mutex, std::adopt_lock);
65 std::cv_status status = _cv.wait_for(lock, std::chrono::milliseconds(timeoutMs));
67 return status == std::cv_status::no_timeout ? Error::Ok : Error::Timeout;
84 template <
typename Predicate,
typename = std::enable_if_t<std::is_invocable_r_v<
bool, Predicate>>>
85 Error wait(Mutex &mutex, Predicate pred,
unsigned int timeoutMs = 0) {
86 std::unique_lock<std::mutex> lock(mutex._mutex, std::adopt_lock);
92 bool result = _cv.wait_for(lock, std::chrono::milliseconds(timeoutMs), pred);
94 return result ? Error::Ok : Error::Timeout;
98 void wakeOne() { _cv.notify_one(); }
101 void wakeAll() { _cv.notify_all(); }
104 std::condition_variable _cv;