3#ifdef ROO_THREADS_USE_FREERTOS
10#if (defined(ESP32) || defined(ESP8266) || defined(ESP_PLATFORM)) && defined(configNUM_CORES)
11#if configNUM_CORES > 1
12static portMUX_TYPE s_cond_lock = portMUX_INITIALIZER_UNLOCKED;
13#define condENTER_CRITICAL() portENTER_CRITICAL(&s_cond_lock)
14#define condEXIT_CRITICAL() portEXIT_CRITICAL(&s_cond_lock)
16#define condENTER_CRITICAL() vPortEnterCritical()
17#define condEXIT_CRITICAL() vPortExitCritical()
20#define condENTER_CRITICAL() portENTER_CRITICAL()
21#define condEXIT_CRITICAL() portEXIT_CRITICAL()
24condition_variable_opt::condition_variable_opt() noexcept {
25 for (
int i = 0; i < kMaxWaitingThreads; ++i) {
26 tasks_waiting_[i] =
nullptr;
30void condition_variable_opt::notify_one() noexcept {
31 TaskHandle_t* task_to_notify =
nullptr;
33 for (
int i = 0; i < kMaxWaitingThreads; ++i) {
34 if (tasks_waiting_[i] !=
nullptr) {
35 if (task_to_notify ==
nullptr ||
36 uxTaskPriorityGet(*task_to_notify) <
37 uxTaskPriorityGet(tasks_waiting_[i])) {
38 task_to_notify = &tasks_waiting_[i];
42 if (task_to_notify !=
nullptr) {
43 xTaskNotify(*task_to_notify, 0, eNoAction);
44 *task_to_notify =
nullptr;
49void condition_variable_opt::notify_all() noexcept {
51 for (
int i = 0; i < kMaxWaitingThreads; ++i) {
52 if (tasks_waiting_[i] !=
nullptr) {
53 xTaskNotify(tasks_waiting_[i], 0, eNoAction);
54 tasks_waiting_[i] =
nullptr;
60void condition_variable_opt::wait(unique_lock<mutex>& lock)
noexcept {
61 TaskHandle_t me = xTaskGetCurrentTaskHandle();
64 for (
int i = 0; i < kMaxWaitingThreads; ++i) {
65 if (tasks_waiting_[i] ==
nullptr) {
66 tasks_waiting_[i] = me;
77 xTaskNotifyWait(0, 0,
nullptr, portMAX_DELAY);
80 for (
int i = 0; i < kMaxWaitingThreads; ++i) {
81 if (tasks_waiting_[i] == me) {
82 tasks_waiting_[i] =
nullptr;
89cv_status condition_variable_opt::wait_until_impl(unique_lock<mutex>& lock,
90 TickType_t when)
noexcept {
91 TickType_t now = xTaskGetTickCount();
92 TickType_t delay = when - now;
93 if (delay == 0 || delay > internal::kMaxTicksDelay) {
94 return cv_status::timeout;
96 TaskHandle_t me = xTaskGetCurrentTaskHandle();
99 for (
int i = 0; i < kMaxWaitingThreads; ++i) {
100 if (tasks_waiting_[i] ==
nullptr) {
101 tasks_waiting_[i] = me;
112 bool signaled = (xTaskNotifyWait(0, 0,
nullptr, delay) == pdPASS);
114 status = cv_status::no_timeout;
117 TickType_t now = xTaskGetTickCount();
119 if (delay == 0 || delay > internal::kMaxTicksDelay)
break;
122 condENTER_CRITICAL();
123 for (
int i = 0; i < kMaxWaitingThreads; ++i) {
124 if (tasks_waiting_[i] == me) {
125 tasks_waiting_[i] =
nullptr;
cv_status
Status returned from timed wait operations.