FastLED 3.10.6
Loading...
Searching...
No Matches
slab_mutex.h
Go to the documentation of this file.
1#pragma once
2// allow-include-after-namespace
3
4// IWYU pragma: private
5
16
17#include "fl/stl/noexcept.h"
18
19#if defined(ESP32) || defined(ESP_PLATFORM)
20
22// IWYU pragma: begin_keep
23#include "freertos/FreeRTOS.h"
24#include "freertos/semphr.h"
25#include "freertos/task.h"
26// IWYU pragma: end_keep
28
29namespace fl {
30namespace detail {
31
32class slab_mutex {
33 public:
34 slab_mutex() FL_NO_EXCEPT : mHandle(xSemaphoreCreateMutex()) {}
36 if (mHandle) {
37 vSemaphoreDelete(mHandle);
38 }
39 }
40 slab_mutex(const slab_mutex &) FL_NO_EXCEPT = delete;
41 slab_mutex &operator=(const slab_mutex &) FL_NO_EXCEPT = delete;
42
43 void lock() FL_NO_EXCEPT {
44 // Scheduler not running yet (static init) → single-threaded,
45 // skip. Never called from ISRs by contract.
46 if (mHandle && xTaskGetSchedulerState() == taskSCHEDULER_RUNNING) {
47 (void)xSemaphoreTake(mHandle, portMAX_DELAY);
48 }
49 }
50 void unlock() FL_NO_EXCEPT {
51 if (mHandle && xTaskGetSchedulerState() == taskSCHEDULER_RUNNING) {
52 (void)xSemaphoreGive(mHandle);
53 }
54 }
55
56 private:
57 SemaphoreHandle_t mHandle;
58};
59
60} // namespace detail
61} // namespace fl
62
63#elif defined(FASTLED_TESTING) || defined(FL_IS_STUB) || defined(_WIN32) || \
64 defined(__linux__) || defined(__APPLE__)
65
66#include "fl/stl/atomic.h"
67
68namespace fl {
69namespace detail {
70
75class slab_mutex {
76 public:
77 slab_mutex() FL_NO_EXCEPT : mFlag(0) {}
78 slab_mutex(const slab_mutex &) FL_NO_EXCEPT = delete;
79 slab_mutex &operator=(const slab_mutex &) FL_NO_EXCEPT = delete;
80
81 void lock() FL_NO_EXCEPT {
82 int expected = 0;
83 while (!mFlag.compare_exchange_weak(expected, 1)) {
84 expected = 0;
85 }
86 }
87 void unlock() FL_NO_EXCEPT { mFlag.store(0); }
88
89 private:
90 fl::atomic<int> mFlag;
91};
92
93} // namespace detail
94} // namespace fl
95
96#else
97
98namespace fl {
99namespace detail {
100
103 public:
107};
108
109} // namespace detail
110} // namespace fl
111
112#endif
113
114namespace fl {
115namespace detail {
116
119 public:
121 mMutex.lock();
122 }
126
127 private:
129};
130
131} // namespace detail
132} // namespace fl
~slab_lock_guard() FL_NO_EXCEPT
Definition slab_mutex.h:123
slab_lock_guard & operator=(const slab_lock_guard &) FL_NO_EXCEPT=delete
slab_lock_guard(const slab_lock_guard &) FL_NO_EXCEPT=delete
slab_lock_guard(slab_mutex &m) FL_NO_EXCEPT
Definition slab_mutex.h:120
slab_mutex() FL_NO_EXCEPT=default
void unlock() FL_NO_EXCEPT
Definition slab_mutex.h:106
void lock() FL_NO_EXCEPT
Definition slab_mutex.h:105
Single-threaded MCUs: no-op.
Definition slab_mutex.h:102
#define FL_EXTERN_C_BEGIN
#define FL_EXTERN_C_END
Compile-time linker keep-alive hook for a single fl::Bus.
Definition bus_info.h:57
AtomicFake< T > atomic
Definition atomic.h:26
InputGamut g FL_NO_EXCEPT
Definition rgbw.h:121
Base definition for an LED controller.
Definition crgb.hpp:179