Skip to content

Commit 28b93b9

Browse files
committed
refactor(NetworkEvents) add mutex lock for container operations
provide thread safety for dual core SoCs
1 parent 06bf619 commit 28b93b9

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

libraries/Network/src/NetworkEvents.cpp

+48
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ void NetworkEvents::_checkForEvent() {
111111
}
112112
log_v("Network Event: %d - %s", event->event_id, eventName(event->event_id));
113113

114+
#if SOC_CPU_CORES_NUM > 1
115+
std::unique_lock<std::mutex> lock(_mtx);
116+
#endif // SOC_CPU_CORES_NUM > 1
117+
114118
// iterate over registered callbacks
115119
for (auto &i : _cbEventList){
116120
if (i.cb || i.fcb || i.scb) {
@@ -130,6 +134,10 @@ void NetworkEvents::_checkForEvent() {
130134
}
131135
}
132136

137+
#if SOC_CPU_CORES_NUM > 1
138+
lock.unlock();
139+
#endif // SOC_CPU_CORES_NUM > 1
140+
133141
// release the event object's memory
134142
delete event;
135143
}
@@ -151,6 +159,10 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventCb cbEvent, arduino_ev
151159
return 0;
152160
}
153161

162+
#if SOC_CPU_CORES_NUM > 1
163+
std::lock_guard<std::mutex> lock(_mtx);
164+
#endif // SOC_CPU_CORES_NUM > 1
165+
154166
_cbEventList.emplace_back(++_current_id, cbEvent, nullptr, nullptr, event);
155167
return _cbEventList.back().id;
156168
}
@@ -160,6 +172,10 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduin
160172
return 0;
161173
}
162174

175+
#if SOC_CPU_CORES_NUM > 1
176+
std::lock_guard<std::mutex> lock(_mtx);
177+
#endif // SOC_CPU_CORES_NUM > 1
178+
163179
_cbEventList.emplace_back(++_current_id, nullptr, cbEvent, nullptr, event);
164180
return _cbEventList.back().id;
165181
}
@@ -169,6 +185,10 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino
169185
return 0;
170186
}
171187

188+
#if SOC_CPU_CORES_NUM > 1
189+
std::lock_guard<std::mutex> lock(_mtx);
190+
#endif // SOC_CPU_CORES_NUM > 1
191+
172192
_cbEventList.emplace_back(++_current_id, nullptr, nullptr, cbEvent, event);
173193
return _cbEventList.back().id;
174194
}
@@ -178,6 +198,10 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino
178198
return 0;
179199
}
180200

201+
#if SOC_CPU_CORES_NUM > 1
202+
std::lock_guard<std::mutex> lock(_mtx);
203+
#endif // SOC_CPU_CORES_NUM > 1
204+
181205
_cbEventList.emplace(_cbEventList.begin(), ++_current_id, cbEvent, nullptr, nullptr, event);
182206
return _cbEventList.front().id;
183207
}
@@ -187,6 +211,10 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, ard
187211
return 0;
188212
}
189213

214+
#if SOC_CPU_CORES_NUM > 1
215+
std::lock_guard<std::mutex> lock(_mtx);
216+
#endif // SOC_CPU_CORES_NUM > 1
217+
190218
_cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, cbEvent, nullptr, event);
191219
return _cbEventList.front().id;
192220
}
@@ -196,6 +224,10 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu
196224
return 0;
197225
}
198226

227+
#if SOC_CPU_CORES_NUM > 1
228+
std::lock_guard<std::mutex> lock(_mtx);
229+
#endif // SOC_CPU_CORES_NUM > 1
230+
199231
_cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, nullptr, cbEvent, event);
200232
return _cbEventList.front().id;
201233
}
@@ -205,6 +237,10 @@ void NetworkEvents::removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event
205237
return;
206238
}
207239

240+
#if SOC_CPU_CORES_NUM > 1
241+
std::lock_guard<std::mutex> lock(_mtx);
242+
#endif // SOC_CPU_CORES_NUM > 1
243+
208244
_cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.cb == cbEvent && e.event == event; }), _cbEventList.end());
209245
}
210246

@@ -213,6 +249,10 @@ void NetworkEvents::removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t e
213249
return;
214250
}
215251

252+
#if SOC_CPU_CORES_NUM > 1
253+
std::lock_guard<std::mutex> lock(_mtx);
254+
#endif // SOC_CPU_CORES_NUM > 1
255+
216256
_cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return getStdFunctionAddress(e.fcb) == getStdFunctionAddress(cbEvent) && e.event == event; }), _cbEventList.end());
217257
}
218258

@@ -221,10 +261,18 @@ void NetworkEvents::removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t ev
221261
return;
222262
}
223263

264+
#if SOC_CPU_CORES_NUM > 1
265+
std::lock_guard<std::mutex> lock(_mtx);
266+
#endif // SOC_CPU_CORES_NUM > 1
267+
224268
_cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.scb == cbEvent && e.event == event; }), _cbEventList.end());
225269
}
226270

227271
void NetworkEvents::removeEvent(network_event_handle_t id) {
272+
#if SOC_CPU_CORES_NUM > 1
273+
std::lock_guard<std::mutex> lock(_mtx);
274+
#endif // SOC_CPU_CORES_NUM > 1
275+
228276
_cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [id](const NetworkEventCbList_t& e) { return e.id == id; }), _cbEventList.end());
229277
}
230278

libraries/Network/src/NetworkEvents.h

+8
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
#include "freertos/queue.h"
1717
#include "freertos/semphr.h"
1818
#include "freertos/event_groups.h"
19+
#if SOC_CPU_CORES_NUM > 1
20+
#include <mutex>
21+
#endif // SOC_CPU_CORES_NUM > 1
1922

2023
#if SOC_WIFI_SUPPORTED
2124
#include "esp_wifi_types.h"
@@ -277,6 +280,11 @@ class NetworkEvents {
277280
// registred events callbacks containter
278281
std::vector<NetworkEventCbList_t> _cbEventList;
279282

283+
#if SOC_CPU_CORES_NUM > 1
284+
// containter access mutex
285+
std::mutex _mtx;
286+
#endif // SOC_CPU_CORES_NUM > 1
287+
280288
/**
281289
* @brief task function that picks events from an event queue and calls registered callbacks
282290
*

0 commit comments

Comments
 (0)