Skip to content

Commit

Permalink
refactor(NetworkEvents) add mutex lock for container operations
Browse files Browse the repository at this point in the history
provide thread safety for dual core SoCs
  • Loading branch information
vortigont committed Sep 26, 2024
1 parent 06bf619 commit 28b93b9
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 0 deletions.
48 changes: 48 additions & 0 deletions libraries/Network/src/NetworkEvents.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,10 @@ void NetworkEvents::_checkForEvent() {
}
log_v("Network Event: %d - %s", event->event_id, eventName(event->event_id));

#if SOC_CPU_CORES_NUM > 1
std::unique_lock<std::mutex> lock(_mtx);
#endif // SOC_CPU_CORES_NUM > 1

// iterate over registered callbacks
for (auto &i : _cbEventList){
if (i.cb || i.fcb || i.scb) {
Expand All @@ -130,6 +134,10 @@ void NetworkEvents::_checkForEvent() {
}
}

#if SOC_CPU_CORES_NUM > 1
lock.unlock();
#endif // SOC_CPU_CORES_NUM > 1

// release the event object's memory
delete event;
}
Expand All @@ -151,6 +159,10 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventCb cbEvent, arduino_ev
return 0;
}

#if SOC_CPU_CORES_NUM > 1
std::lock_guard<std::mutex> lock(_mtx);
#endif // SOC_CPU_CORES_NUM > 1

_cbEventList.emplace_back(++_current_id, cbEvent, nullptr, nullptr, event);
return _cbEventList.back().id;
}
Expand All @@ -160,6 +172,10 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduin
return 0;
}

#if SOC_CPU_CORES_NUM > 1
std::lock_guard<std::mutex> lock(_mtx);
#endif // SOC_CPU_CORES_NUM > 1

_cbEventList.emplace_back(++_current_id, nullptr, cbEvent, nullptr, event);
return _cbEventList.back().id;
}
Expand All @@ -169,6 +185,10 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino
return 0;
}

#if SOC_CPU_CORES_NUM > 1
std::lock_guard<std::mutex> lock(_mtx);
#endif // SOC_CPU_CORES_NUM > 1

_cbEventList.emplace_back(++_current_id, nullptr, nullptr, cbEvent, event);
return _cbEventList.back().id;
}
Expand All @@ -178,6 +198,10 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino
return 0;
}

#if SOC_CPU_CORES_NUM > 1
std::lock_guard<std::mutex> lock(_mtx);
#endif // SOC_CPU_CORES_NUM > 1

_cbEventList.emplace(_cbEventList.begin(), ++_current_id, cbEvent, nullptr, nullptr, event);
return _cbEventList.front().id;
}
Expand All @@ -187,6 +211,10 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, ard
return 0;
}

#if SOC_CPU_CORES_NUM > 1
std::lock_guard<std::mutex> lock(_mtx);
#endif // SOC_CPU_CORES_NUM > 1

_cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, cbEvent, nullptr, event);
return _cbEventList.front().id;
}
Expand All @@ -196,6 +224,10 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu
return 0;
}

#if SOC_CPU_CORES_NUM > 1
std::lock_guard<std::mutex> lock(_mtx);
#endif // SOC_CPU_CORES_NUM > 1

_cbEventList.emplace(_cbEventList.begin(), ++_current_id, nullptr, nullptr, cbEvent, event);
return _cbEventList.front().id;
}
Expand All @@ -205,6 +237,10 @@ void NetworkEvents::removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event
return;
}

#if SOC_CPU_CORES_NUM > 1
std::lock_guard<std::mutex> lock(_mtx);
#endif // SOC_CPU_CORES_NUM > 1

_cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.cb == cbEvent && e.event == event; }), _cbEventList.end());
}

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

#if SOC_CPU_CORES_NUM > 1
std::lock_guard<std::mutex> lock(_mtx);
#endif // SOC_CPU_CORES_NUM > 1

_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());
}

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

#if SOC_CPU_CORES_NUM > 1
std::lock_guard<std::mutex> lock(_mtx);
#endif // SOC_CPU_CORES_NUM > 1

_cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [cbEvent, event](const NetworkEventCbList_t& e) { return e.scb == cbEvent && e.event == event; }), _cbEventList.end());
}

void NetworkEvents::removeEvent(network_event_handle_t id) {
#if SOC_CPU_CORES_NUM > 1
std::lock_guard<std::mutex> lock(_mtx);
#endif // SOC_CPU_CORES_NUM > 1

_cbEventList.erase(std::remove_if(_cbEventList.begin(), _cbEventList.end(), [id](const NetworkEventCbList_t& e) { return e.id == id; }), _cbEventList.end());
}

Expand Down
8 changes: 8 additions & 0 deletions libraries/Network/src/NetworkEvents.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
#include "freertos/queue.h"
#include "freertos/semphr.h"
#include "freertos/event_groups.h"
#if SOC_CPU_CORES_NUM > 1
#include <mutex>
#endif // SOC_CPU_CORES_NUM > 1

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

#if SOC_CPU_CORES_NUM > 1
// containter access mutex
std::mutex _mtx;
#endif // SOC_CPU_CORES_NUM > 1

/**
* @brief task function that picks events from an event queue and calls registered callbacks
*
Expand Down

0 comments on commit 28b93b9

Please sign in to comment.