libpromeki main
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
waitcondition.h
Go to the documentation of this file.
1
8#pragma once
9
10#include <chrono>
11#include <type_traits>
12#include <condition_variable>
14#include <promeki/core/error.h>
15#include <promeki/core/mutex.h>
16
18
27 public:
29 WaitCondition() = default;
30
32 ~WaitCondition() = default;
33
34 WaitCondition(const WaitCondition &) = delete;
35 WaitCondition &operator=(const WaitCondition &) = delete;
36 WaitCondition(WaitCondition &&) = delete;
37 WaitCondition &operator=(WaitCondition &&) = delete;
38
50 Error wait(Mutex &mutex, unsigned int timeoutMs = 0) {
51 std::unique_lock<std::mutex> lock(mutex._mutex, std::adopt_lock);
52 if(timeoutMs == 0) {
53 _cv.wait(lock);
54 lock.release();
55 return Error::Ok;
56 }
57 std::cv_status status = _cv.wait_for(lock,
58 std::chrono::milliseconds(timeoutMs));
59 lock.release();
60 return status == std::cv_status::no_timeout
62 }
63
78 template <typename Predicate,
79 typename = std::enable_if_t<std::is_invocable_r_v<bool, Predicate>>>
80 Error wait(Mutex &mutex, Predicate pred, unsigned int timeoutMs = 0) {
81 std::unique_lock<std::mutex> lock(mutex._mutex, std::adopt_lock);
82 if(timeoutMs == 0) {
83 _cv.wait(lock, pred);
84 lock.release();
85 return Error::Ok;
86 }
87 bool result = _cv.wait_for(lock,
88 std::chrono::milliseconds(timeoutMs), pred);
89 lock.release();
90 return result ? Error::Ok : Error::Timeout;
91 }
92
94 void wakeOne() {
95 _cv.notify_one();
96 }
97
99 void wakeAll() {
100 _cv.notify_all();
101 }
102
103 private:
104 std::condition_variable _cv;
105};
106
Lightweight error code wrapper for the promeki library.
Definition error.h:39
@ Timeout
Operation timed out.
Definition error.h:78
@ Ok
No error.
Definition error.h:51
Dynamic array container wrapping std::vector.
Definition list.h:40
Mutual exclusion lock wrapping std::mutex.
Definition mutex.h:33
Condition variable wrapping std::condition_variable.
Definition waitcondition.h:26
Error wait(Mutex &mutex, Predicate pred, unsigned int timeoutMs=0)
Waits until a predicate becomes true or the timeout expires.
Definition waitcondition.h:80
void wakeAll()
Wakes all waiting threads.
Definition waitcondition.h:99
Error wait(Mutex &mutex, unsigned int timeoutMs=0)
Waits until woken or the timeout expires.
Definition waitcondition.h:50
~WaitCondition()=default
Destructor.
WaitCondition()=default
Constructs a WaitCondition.
void wakeOne()
Wakes one waiting thread.
Definition waitcondition.h:94
#define PROMEKI_NAMESPACE_BEGIN
Starts a promeki namespace block.
Definition namespace.h:14
#define PROMEKI_NAMESPACE_END
Ends a promeki namespace block.
Definition namespace.h:19