3#ifdef ROO_THREADS_USE_FREERTOS
7#include "freertos/FreeRTOS.h"
8#include "freertos/semphr.h"
9#include "freertos/task.h"
15mutex::mutex() noexcept {
16#if !ROO_THREADS_FREERTOS_LAZY_INITIALIZE
17 xSemaphoreCreateMutexStatic(&mutex_);
21#if ROO_THREADS_FREERTOS_LAZY_INITIALIZE
23#if (defined(ESP32) || defined(ESP8266) || defined(ESP_PLATFORM)) && defined(configNUM_CORES)
24#if configNUM_CORES > 1
25static portMUX_TYPE s_mutex_init_lock = portMUX_INITIALIZER_UNLOCKED;
26#define mutexENTER_CRITICAL() portENTER_CRITICAL(&s_mutex_init_lock)
27#define mutexEXIT_CRITICAL() portEXIT_CRITICAL(&s_mutex_init_lock)
29#define mutexENTER_CRITICAL() vPortEnterCritical()
30#define mutexEXIT_CRITICAL() vPortExitCritical()
33#define mutexENTER_CRITICAL() portENTER_CRITICAL()
34#define mutexEXIT_CRITICAL() portEXIT_CRITICAL()
37void mutex::ensureInitialized() noexcept {
39 mutexENTER_CRITICAL();
41 xSemaphoreCreateMutexStatic(&mutex_);
48void mutex::ensureInitialized() noexcept {}
53 if (xTaskGetCurrentTaskHandle() ==
nullptr) {
57 xSemaphoreTake((SemaphoreHandle_t)&mutex_, portMAX_DELAY);
60bool mutex::try_lock() {
62 if (xTaskGetCurrentTaskHandle() ==
nullptr) {
66 return xSemaphoreTake((SemaphoreHandle_t)&mutex_, 0);
71 if (xTaskGetCurrentTaskHandle() ==
nullptr) {
75 xSemaphoreGive((SemaphoreHandle_t)&mutex_);
80void checkLockUnowned(
const void* lock,
bool owns) {
81 assert(lock !=
nullptr && !owns);
84void checkLockOwned(
bool owns) { assert(owns); }