roo_threads
API Documentation for roo_threads
Loading...
Searching...
No Matches
condition_variable_classic.h
Go to the documentation of this file.
1#pragma once
2
4
5#ifdef ROO_THREADS_USE_FREERTOS
6
7#include <limits>
8
9#include "freertos/FreeRTOS.h"
10#include "freertos/task.h"
15
16static constexpr int kMaxWaitingThreads = 8;
17
18namespace roo_threads {
19/// @brief Backend namespace using FreeRTOS synchronization primitives.
20namespace freertos {
21
22/// @ingroup roo_threads_api_condition_variable
23/// @brief FreeRTOS classic implementation of `roo::condition_variable`.
24/// @copydoc roo_threads::doc::condition_variable
25class condition_variable_classic {
26 public:
27 /// @copydoc roo_threads::doc::condition_variable::condition_variable
28 condition_variable_classic() noexcept;
29
30 condition_variable_classic(const condition_variable_classic&) = delete;
31 condition_variable_classic& operator=(const condition_variable_classic&) =
32 delete;
33
34 /// @copydoc roo_threads::doc::condition_variable::wait
35 void wait(unique_lock<mutex>& lock) noexcept;
36
37 /// @copydoc roo_threads::doc::condition_variable::wait
38 template <class Predicate>
39 void wait(unique_lock<mutex>& lock, Predicate pred) {
40 while (!pred()) wait(lock);
41 }
42
43 /// @copydoc roo_threads::doc::condition_variable::notify_one
44 void notify_one() noexcept;
45
46 /// @copydoc roo_threads::doc::condition_variable::notify_all
47 void notify_all() noexcept;
48
49 /// @copydoc roo_threads::doc::condition_variable::wait_until
50 cv_status wait_until(unique_lock<mutex>& lock, const roo_time::Uptime& when);
51
52 /// @copydoc roo_threads::doc::condition_variable::wait_until
53 template <typename Predicate>
54 bool wait_until(unique_lock<mutex>& lock, const roo_time::Uptime& when,
55 Predicate p) {
56 while (!p())
57 if (wait_until(lock, when) == cv_status::timeout) return p();
58 return true;
59 }
60
61 /// @copydoc roo_threads::doc::condition_variable::wait_for
62 cv_status wait_for(unique_lock<mutex>& lock,
63 const roo_time::Duration& duration) {
64 return wait_until(lock, internal::CalculateDeadlineFromDuration(duration));
65 }
66
67 /// @copydoc roo_threads::doc::condition_variable::wait_for
68 template <typename Predicate>
69 bool wait_for(unique_lock<mutex>& lock, const roo_time::Duration& duration,
70 Predicate p) {
71 return wait_until(lock, internal::CalculateDeadlineFromDuration(duration),
72 std::move(p));
73 }
74
75 private:
76 mutex mutex_;
77 counting_semaphore<std::numeric_limits<BaseType_t>::max()> waitlist_;
78 int waitcount_;
79};
80
81} // namespace freertos
82} // namespace roo_threads
83
84#endif // ROO_THREADS_USE_FREERTOS
cv_status
Status returned from timed wait operations.