roo_threads
API Documentation for roo_threads
Loading...
Searching...
No Matches
condition_variable_opt.h
Go to the documentation of this file.
1#pragma once
2
4
5#ifdef ROO_THREADS_USE_FREERTOS
6
7#include "freertos/FreeRTOS.h"
8#include "freertos/task.h"
12
13namespace roo_threads {
14/// @brief Backend namespace using FreeRTOS synchronization primitives.
15namespace freertos {
16
17#ifndef ROO_THREADS_FREERTOS_CONDITION_VARIABLE_MAX_WAITING_THREADS
18#define ROO_THREADS_FREERTOS_CONDITION_VARIABLE_MAX_WAITING_THREADS 8
19#endif
20
21static constexpr int kMaxWaitingThreads =
22 ROO_THREADS_FREERTOS_CONDITION_VARIABLE_MAX_WAITING_THREADS;
23
24/// @ingroup roo_threads_api_condition_variable
25/// @brief FreeRTOS optimized implementation of `roo::condition_variable`.
26/// @copydoc roo_threads::doc::condition_variable
27class condition_variable_opt {
28 public:
29 /// @copydoc roo_threads::doc::condition_variable::condition_variable
30 condition_variable_opt() noexcept;
31
32 condition_variable_opt(const condition_variable_opt&) = delete;
33 condition_variable_opt& operator=(const condition_variable_opt&) = delete;
34
35 /// @copydoc roo_threads::doc::condition_variable::wait
36 void wait(unique_lock<mutex>& lock) noexcept;
37
38 /// @copydoc roo_threads::doc::condition_variable::wait
39 template <class Predicate>
40 void wait(unique_lock<mutex>& lock, Predicate pred) {
41 while (!pred()) wait(lock);
42 }
43
44 /// @copydoc roo_threads::doc::condition_variable::notify_one
45 void notify_one() noexcept;
46
47 /// @copydoc roo_threads::doc::condition_variable::notify_all
48 void notify_all() noexcept;
49
50 /// @copydoc roo_threads::doc::condition_variable::wait_until
51 cv_status wait_until(unique_lock<mutex>& lock, const roo_time::Uptime& when) {
52 return wait_until_impl(
53 lock, xTaskGetTickCount() +
54 internal::ToTicks(when - roo_time::Uptime::Now()));
55 }
56
57 /// @copydoc roo_threads::doc::condition_variable::wait_until
58 template <typename Predicate>
59 bool wait_until(unique_lock<mutex>& lock, const roo_time::Uptime& when,
60 Predicate p) {
61 TickType_t deadline =
62 xTaskGetTickCount() + internal::ToTicks(when - roo_time::Uptime::Now());
63 while (!p())
64 if (wait_until_impl(lock, deadline) == cv_status::timeout) return p();
65 return true;
66 }
67
68 /// @copydoc roo_threads::doc::condition_variable::wait_for
69 cv_status wait_for(unique_lock<mutex>& lock,
70 const roo_time::Duration& duration) {
71 return wait_until_impl(lock,
72 xTaskGetTickCount() + internal::ToTicks(duration));
73 }
74
75 /// @copydoc roo_threads::doc::condition_variable::wait_for
76 template <typename Predicate>
77 bool wait_for(unique_lock<mutex>& lock, const roo_time::Duration& duration,
78 Predicate p) {
79 TickType_t deadline = xTaskGetTickCount() + internal::ToTicks(duration);
80 while (!p()) {
81 if (wait_until_impl(lock, deadline) == cv_status::timeout) return p();
82 }
83 return true;
84 }
85
86 private:
87 cv_status wait_until_impl(unique_lock<mutex>& lock, TickType_t when) noexcept;
88
89 TaskHandle_t tasks_waiting_[kMaxWaitingThreads];
90};
91
92} // namespace freertos
93} // namespace roo_threads
94
95#endif // ROO_THREADS_USE_FREERTOS
cv_status
Status returned from timed wait operations.