5#ifdef ROO_THREADS_USE_FREERTOS
7#include "freertos/FreeRTOS.h"
8#include "freertos/task.h"
17#ifndef ROO_THREADS_FREERTOS_CONDITION_VARIABLE_MAX_WAITING_THREADS
18#define ROO_THREADS_FREERTOS_CONDITION_VARIABLE_MAX_WAITING_THREADS 8
21static constexpr int kMaxWaitingThreads =
22 ROO_THREADS_FREERTOS_CONDITION_VARIABLE_MAX_WAITING_THREADS;
27class condition_variable_opt {
30 condition_variable_opt() noexcept;
32 condition_variable_opt(const condition_variable_opt&) = delete;
33 condition_variable_opt& operator=(const condition_variable_opt&) = delete;
36 void wait(unique_lock<mutex>& lock) noexcept;
39 template <class Predicate>
40 void wait(unique_lock<mutex>& lock, Predicate pred) {
41 while (!pred()) wait(lock);
45 void notify_one() noexcept;
48 void notify_all() noexcept;
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()));
58 template <
typename Predicate>
59 bool wait_until(unique_lock<mutex>& lock,
const roo_time::Uptime& when,
62 xTaskGetTickCount() + internal::ToTicks(when - roo_time::Uptime::Now());
64 if (wait_until_impl(lock, deadline) == cv_status::timeout)
return p();
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));
76 template <
typename Predicate>
77 bool wait_for(unique_lock<mutex>& lock,
const roo_time::Duration& duration,
79 TickType_t deadline = xTaskGetTickCount() + internal::ToTicks(duration);
81 if (wait_until_impl(lock, deadline) == cv_status::timeout)
return p();
87 cv_status wait_until_impl(unique_lock<mutex>& lock, TickType_t when)
noexcept;
89 TaskHandle_t tasks_waiting_[kMaxWaitingThreads];
cv_status
Status returned from timed wait operations.