11#pragma once
22#include " AudioConfig.h"
33#include " AudioTools/CoreAudio/AudioLogger.h"
4-
5- #ifdef USE_STD_CONCURRENCY
6- # include < mutex>
7- #endif
8-
9- #ifdef ESP32
10- # include " freertos/FreeRTOS.h"
11- # include " freertos/semphr.h"
12- #else
13- # include " FreeRTOS.h"
14- # include " semphr.h"
15- #endif
4+ #include " Mutex.h"
165
176namespace audio_tools {
187
19- /* *
20- * @brief Empty Mutex implementation which does nothing
21- * @ingroup concurrency
22- * @author Phil Schatzmann
23- * @copyright GPLv3
24- */
25- class MutexBase {
26- public:
27- virtual void lock () {}
28- virtual void unlock () {}
29- };
30-
31- #if defined(USE_STD_CONCURRENCY)
32-
33- /* *
34- * @brief Mutex implemntation based on std::mutex
35- * @ingroup concurrency
36- * @author Phil Schatzmann
37- * @copyright GPLv3
38- */
39- class StdMutex : public MutexBase {
40- public:
41- void lock () override { std_mutex.lock (); }
42- void unlock () override { std_mutex.unlock (); }
43-
44- protected:
45- std::mutex std_mutex;
46- };
47-
48- #endif
49-
50-
51- /* *
52- * @brief Mutex implemntation using FreeRTOS
53- * @ingroup concurrency
54- * @author Phil Schatzmann
55- * @copyright GPLv3 *
56- */
57- class Mutex : public MutexBase {
58- public:
59- Mutex () {
60- TRACED ();
61- xSemaphore = xSemaphoreCreateBinary ();
62- xSemaphoreGive (xSemaphore);
63- }
64- ~Mutex () {
65- TRACED ();
66- vSemaphoreDelete (xSemaphore);
67- }
68- void lock () override {
69- TRACED ();
70- xSemaphoreTake (xSemaphore, portMAX_DELAY);
71- }
72- void unlock () override {
73- TRACED ();
74- xSemaphoreGive (xSemaphore);
75- }
76-
77- protected:
78- SemaphoreHandle_t xSemaphore = NULL ;
79- };
80-
818
829/* *
8310 * @brief RAII implementaion using a Mutex: Only a few microcontrollers provide
@@ -90,23 +17,25 @@ class Mutex : public MutexBase {
9017 */
9118class LockGuard {
9219public:
93- LockGuard (Mutex &mutex) {
20+ LockGuard (MutexBase &mutex) {
9421 TRACED ();
9522 p_mutex = &mutex;
9623 p_mutex->lock ();
9724 }
98- LockGuard (Mutex *mutex) {
25+ LockGuard (MutexBase *mutex) {
9926 TRACED ();
10027 p_mutex = mutex;
101- p_mutex->lock ();
28+ if (p_mutex != nullptr )
29+ p_mutex->lock ();
10230 }
10331 ~LockGuard () {
10432 TRACED ();
105- p_mutex->unlock ();
33+ if (p_mutex != nullptr )
34+ p_mutex->unlock ();
10635 }
10736
10837protected:
109- Mutex *p_mutex = nullptr ;
38+ MutexBase *p_mutex = nullptr ;
11039};
11140
11241}
0 commit comments