From 26b9bbf537d5690ee2ae028c6a8a612d4d35af9a Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Thu, 10 Nov 2022 18:26:01 +0100 Subject: [PATCH] Prevent null pointer exception when deleting inverter The removeInverterBySerial can be called in a webserver callback method. This is maybe executed on another core which can then run in parallel to the radio loop hoymiles loop. Accessing inverters which are already removed can lead to exceptions. The Semaphore prevents that parallel execution --- lib/Hoymiles/src/Hoymiles.cpp | 11 +++++++++++ lib/Hoymiles/src/Hoymiles.h | 2 ++ 2 files changed, 13 insertions(+) diff --git a/lib/Hoymiles/src/Hoymiles.cpp b/lib/Hoymiles/src/Hoymiles.cpp index 6107789d..b355ea52 100644 --- a/lib/Hoymiles/src/Hoymiles.cpp +++ b/lib/Hoymiles/src/Hoymiles.cpp @@ -4,10 +4,16 @@ #include "inverters/HM_4CH.h" #include +#define HOY_SEMAPHORE_TAKE() xSemaphoreTake(_xSemaphore, portMAX_DELAY) +#define HOY_SEMAPHORE_GIVE() xSemaphoreGive(_xSemaphore) + HoymilesClass Hoymiles; void HoymilesClass::init() { + _xSemaphore = xSemaphoreCreateMutex(); + HOY_SEMAPHORE_GIVE(); // release before first use + _pollInterval = 0; _radio.reset(new HoymilesRadio()); _radio->init(); @@ -15,6 +21,7 @@ void HoymilesClass::init() void HoymilesClass::loop() { + HOY_SEMAPHORE_TAKE(); _radio->loop(); if (getNumInverters() > 0) { @@ -66,6 +73,8 @@ void HoymilesClass::loop() _lastPoll = millis(); } } + + HOY_SEMAPHORE_GIVE(); } std::shared_ptr HoymilesClass::addInverter(const char* name, uint64_t serial) @@ -135,7 +144,9 @@ void HoymilesClass::removeInverterBySerial(uint64_t serial) { for (uint8_t i = 0; i < _inverters.size(); i++) { if (_inverters[i]->serial() == serial) { + HOY_SEMAPHORE_TAKE(); _inverters.erase(_inverters.begin() + i); + HOY_SEMAPHORE_GIVE(); return; } } diff --git a/lib/Hoymiles/src/Hoymiles.h b/lib/Hoymiles/src/Hoymiles.h index 072f1965..4b6d37d6 100644 --- a/lib/Hoymiles/src/Hoymiles.h +++ b/lib/Hoymiles/src/Hoymiles.h @@ -31,6 +31,8 @@ private: std::vector> _inverters; std::unique_ptr _radio; + SemaphoreHandle_t _xSemaphore; + uint32_t _pollInterval = 0; uint32_t _lastPoll = 0; };