roo_threads
API Documentation for roo_threads
Loading...
Searching...
No Matches
condition_variable_classic.cpp
Go to the documentation of this file.
2
3#ifdef ROO_THREADS_USE_FREERTOS
4
5#include <assert.h>
6
7namespace roo_threads {
8namespace freertos {
9
10condition_variable_classic::condition_variable_classic() noexcept
11 : waitlist_(0), waitcount_(0) {}
12
13void condition_variable_classic::notify_one() noexcept {
14 lock_guard<mutex> guard(mutex_);
15 if (waitcount_ > 0) {
16 waitlist_.release();
17 --waitcount_;
18 }
19}
20
21void condition_variable_classic::notify_all() noexcept {
22 lock_guard<mutex> guard(mutex_);
23 for (int i = 0; i < waitcount_; ++i) {
24 waitlist_.release();
25 }
26 waitcount_ = 0;
27}
28
29void condition_variable_classic::wait(unique_lock<mutex>& lock) noexcept {
30 {
31 lock_guard<mutex> guard(mutex_);
32 ++waitcount_;
33 lock.unlock();
34 }
35 waitlist_.acquire();
36 lock.lock();
37}
38
39cv_status condition_variable_classic::wait_until(unique_lock<mutex>& lock,
40 const roo_time::Uptime& when) {
41 {
42 lock_guard<mutex> guard(mutex_);
43 ++waitcount_;
44 lock.unlock();
45 }
46 bool acquired = waitlist_.try_acquire_until(when);
47 lock.lock();
48 if (acquired) {
49 return cv_status::no_timeout;
50 }
51 lock_guard<mutex> guard(mutex_);
52 --waitcount_;
53 return cv_status::timeout;
54}
55
56} // namespace freertos
57} // namespace roo_threads
58
59#endif // ROO_THREADS_USE_FREERTOS
cv_status
Status returned from timed wait operations.