Skip to content

Commit

Permalink
Fix(NetworkEvents): Don't skip event callbacks in NetworkEvents::remo… (
Browse files Browse the repository at this point in the history
#10337)

* Fix(NetworkEvents): Don't skip event callbacks in NetworkEvents::removeEvent

Fixes Issue 10318
Includes pull request 10321 that fixes 10316

This change:
* Adds code to find the event callbacks
* Issues error when duplicate callbacks insertion attempts are made
* Issues error when callbacks are not found during removal

* Fix(NetworkEvents): Don't skip event callbacks in NetworkEvents::removeEvent

Fixes Issue 10318
Includes pull request 10321 that fixes 10316

This change:
* Adds code to find the event callbacks
* Issues warning when duplicate callbacks insertion attempts are made
* Issues warning when callbacks are not found during removal

---------

Co-authored-by: Me No Dev <[email protected]>
  • Loading branch information
LeeLeahy2 and me-no-dev authored Sep 16, 2024
1 parent 3978870 commit 2f89026
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 23 deletions.
141 changes: 118 additions & 23 deletions libraries/Network/src/NetworkEvents.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,10 +134,73 @@ void NetworkEvents::checkForEvent() {
free(event);
}

uint32_t NetworkEvents::findEvent(NetworkEventCb cbEvent, arduino_event_id_t event) {
uint32_t i;

if (!cbEvent) {
return cbEventList.size();
}

for (i = 0; i < cbEventList.size(); i++) {
NetworkEventCbList_t entry = cbEventList[i];
if (entry.cb == cbEvent && entry.event == event) {
break;
}
}
return i;
}

template<typename T, typename... U> static size_t getStdFunctionAddress(std::function<T(U...)> f) {
typedef T(fnType)(U...);
fnType **fnPointer = f.template target<fnType *>();
if (fnPointer != nullptr) {
return (size_t)*fnPointer;
}
return (size_t)fnPointer;
}

uint32_t NetworkEvents::findEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
uint32_t i;

if (!cbEvent) {
return cbEventList.size();
}

for (i = 0; i < cbEventList.size(); i++) {
NetworkEventCbList_t entry = cbEventList[i];
if (getStdFunctionAddress(entry.fcb) == getStdFunctionAddress(cbEvent) && entry.event == event) {
break;
}
}
return i;
}

uint32_t NetworkEvents::findEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) {
uint32_t i;

if (!cbEvent) {
return cbEventList.size();
}

for (i = 0; i < cbEventList.size(); i++) {
NetworkEventCbList_t entry = cbEventList[i];
if (entry.scb == cbEvent && entry.event == event) {
break;
}
}
return i;
}

network_event_handle_t NetworkEvents::onEvent(NetworkEventCb cbEvent, arduino_event_id_t event) {
if (!cbEvent) {
return 0;
}

if (findEvent(cbEvent, event) < cbEventList.size()) {
log_w("Attempt to add duplicate event handler!");
return 0;
}

NetworkEventCbList_t newEventHandler;
newEventHandler.cb = cbEvent;
newEventHandler.fcb = NULL;
Expand All @@ -151,6 +214,12 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduin
if (!cbEvent) {
return 0;
}

if (findEvent(cbEvent, event) < cbEventList.size()) {
log_w("Attempt to add duplicate event handler!");
return 0;
}

NetworkEventCbList_t newEventHandler;
newEventHandler.cb = NULL;
newEventHandler.fcb = cbEvent;
Expand All @@ -164,6 +233,12 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino
if (!cbEvent) {
return 0;
}

if (findEvent(cbEvent, event) < cbEventList.size()) {
log_w("Attempt to add duplicate event handler!");
return 0;
}

NetworkEventCbList_t newEventHandler;
newEventHandler.cb = NULL;
newEventHandler.fcb = NULL;
Expand All @@ -177,6 +252,12 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino
if (!cbEvent) {
return 0;
}

if (findEvent(cbEvent, event) < cbEventList.size()) {
log_w("Attempt to add duplicate event handler!");
return 0;
}

NetworkEventCbList_t newEventHandler;
newEventHandler.cb = cbEvent;
newEventHandler.fcb = NULL;
Expand All @@ -190,6 +271,12 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, ard
if (!cbEvent) {
return 0;
}

if (findEvent(cbEvent, event) < cbEventList.size()) {
log_w("Attempt to add duplicate event handler!");
return 0;
}

NetworkEventCbList_t newEventHandler;
newEventHandler.cb = NULL;
newEventHandler.fcb = cbEvent;
Expand All @@ -203,6 +290,12 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu
if (!cbEvent) {
return 0;
}

if (findEvent(cbEvent, event) < cbEventList.size()) {
log_w("Attempt to add duplicate event handler!");
return 0;
}

NetworkEventCbList_t newEventHandler;
newEventHandler.cb = NULL;
newEventHandler.fcb = NULL;
Expand All @@ -213,60 +306,62 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu
}

void NetworkEvents::removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event) {
uint32_t i;

if (!cbEvent) {
return;
}

for (uint32_t i = 0; i < cbEventList.size(); i++) {
NetworkEventCbList_t entry = cbEventList[i];
if (entry.cb == cbEvent && entry.event == event) {
cbEventList.erase(cbEventList.begin() + i);
}
i = findEvent(cbEvent, event);
if (i >= cbEventList.size()) {
log_w("Event handler not found!");
return;
}
}

template<typename T, typename... U> static size_t getStdFunctionAddress(std::function<T(U...)> f) {
typedef T(fnType)(U...);
fnType **fnPointer = f.template target<fnType *>();
if (fnPointer != nullptr) {
return (size_t)*fnPointer;
}
return (size_t)fnPointer;
cbEventList.erase(cbEventList.begin() + i);
}

void NetworkEvents::removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
uint32_t i;

if (!cbEvent) {
return;
}

for (uint32_t i = 0; i < cbEventList.size(); i++) {
NetworkEventCbList_t entry = cbEventList[i];
if (getStdFunctionAddress(entry.fcb) == getStdFunctionAddress(cbEvent) && entry.event == event) {
cbEventList.erase(cbEventList.begin() + i);
}
i = findEvent(cbEvent, event);
if (i >= cbEventList.size()) {
log_w("Event handler not found!");
return;
}

cbEventList.erase(cbEventList.begin() + i);
}

void NetworkEvents::removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) {
uint32_t i;

if (!cbEvent) {
return;
}

for (uint32_t i = 0; i < cbEventList.size(); i++) {
NetworkEventCbList_t entry = cbEventList[i];
if (entry.scb == cbEvent && entry.event == event) {
cbEventList.erase(cbEventList.begin() + i);
}
i = findEvent(cbEvent, event);
if (i >= cbEventList.size()) {
log_w("Event handler not found!");
return;
}

cbEventList.erase(cbEventList.begin() + i);
}

void NetworkEvents::removeEvent(network_event_handle_t id) {
for (uint32_t i = 0; i < cbEventList.size(); i++) {
NetworkEventCbList_t entry = cbEventList[i];
if (entry.id == id) {
cbEventList.erase(cbEventList.begin() + i);
return;
}
}
log_w("Event handler not found!");
}

int NetworkEvents::setStatusBits(int bits) {
Expand Down
3 changes: 3 additions & 0 deletions libraries/Network/src/NetworkEvents.h
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,9 @@ class NetworkEvents {

protected:
bool initNetworkEvents();
uint32_t findEvent(NetworkEventCb cbEvent, arduino_event_id_t event);
uint32_t findEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event);
uint32_t findEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event);
network_event_handle_t onSysEvent(NetworkEventCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
network_event_handle_t onSysEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
network_event_handle_t onSysEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
Expand Down

0 comments on commit 2f89026

Please sign in to comment.