Open Model Railroad Network (OpenMRN)
Loading...
Searching...
No Matches
Atomic.hxx
Go to the documentation of this file.
1
37#ifndef _UTILS_ATOMIC_HXX_
38#define _UTILS_ATOMIC_HXX_
39
40#ifdef __FreeRTOS__
41#include <stdint.h>
42#include "FreeRTOS.h"
43#include "portmacro.h"
44
59class Atomic
60{
61public:
63 void lock()
64 {
65 portENTER_CRITICAL();
66 }
68 void unlock()
69 {
70 portEXIT_CRITICAL();
71 }
72};
73
74#elif defined(ESP_PLATFORM)
75
76#include "freertos_includes.h"
77
92class Atomic
93{
94public:
96 void lock()
97 {
98 portENTER_CRITICAL_SAFE(&mux);
99 }
101 void unlock()
102 {
103 portEXIT_CRITICAL_SAFE(&mux);
104 }
105
106private:
108 portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;
109};
110
111#else
112
113#include "os/OS.hxx"
114
130{
131public:
132 void lock()
133 {
135 }
136 void unlock()
137 {
139 }
140private:
146 os_mutex_t mu_ = OS_RECURSIVE_MUTEX_INITIALIZER;
147};
148
149#endif
150
153{
154public:
160 : parent_(parent)
161 {
162 parent_->lock();
163 }
166 {
167 parent_->unlock();
168 }
169
170private:
173};
174
187#define AtomicHolder(l) int error_omitted_lock_holder_variable[-1]
188
189#endif // _UTILS_LOCK_HXX_
See OSMutexLock in os/OS.hxx.
Definition Atomic.hxx:153
Atomic * parent_
Parent mutex we are holding.
Definition Atomic.hxx:172
AtomicHolder(Atomic *parent)
Constructor.
Definition Atomic.hxx:159
~AtomicHolder()
Destructor. Releases the mutex as a side effect.
Definition Atomic.hxx:165
Lightweight locking class for protecting small critical sections.
Definition Atomic.hxx:130
os_mutex_t mu_
Mutex that protects.
Definition Atomic.hxx:146
OS_INLINE int os_mutex_lock(os_mutex_t *mutex)
Lock a mutex.
Definition os.h:533
OS_INLINE int os_mutex_unlock(os_mutex_t *mutex)
Unock a mutex.
Definition os.h:575