From eb088c8520eef39345a0f7c421b78fa5f3b62d96 Mon Sep 17 00:00:00 2001 From: zekageri Date: Wed, 25 Feb 2026 11:27:49 +0100 Subject: [PATCH] Fix ESPEventBus taskLoop snapshot leak on shutdown --- src/esp_eventbus/eventbus.cpp | 69 ++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/src/esp_eventbus/eventbus.cpp b/src/esp_eventbus/eventbus.cpp index 6f2c8f3..20a7ee4 100644 --- a/src/esp_eventbus/eventbus.cpp +++ b/src/esp_eventbus/eventbus.cpp @@ -236,50 +236,53 @@ void ESPEventBus::taskLoop() { } task_ = currentTaskHandle(); - EventBusVector snapshot{ EventBusAllocator(config_.usePSRAMBuffers) }; - snapshot.reserve(4); + { + // Scope dynamic containers so they release memory before the task self-deletes. + EventBusVector snapshot{ EventBusAllocator(config_.usePSRAMBuffers) }; + snapshot.reserve(4); - QueuedEvent ev; + QueuedEvent ev; - while (running_) { - if (xQueueReceive(queue_, &ev, portMAX_DELAY) != pdTRUE) { - continue; - } - - if (ev.stop) { - stopEventPending_ = false; - break; - } + while (running_) { + if (xQueueReceive(queue_, &ev, portMAX_DELAY) != pdTRUE) { + continue; + } - snapshot.clear(); + if (ev.stop) { + stopEventPending_ = false; + break; + } - if (xSemaphoreTake(subMutex_, portMAX_DELAY) == pdTRUE) { - bool needsCompact = false; - for (auto& sub : subs_) { - if (!sub.active) { - needsCompact = true; - continue; - } + snapshot.clear(); - if (sub.eventId == ev.eventId) { - snapshot.push_back(sub); - if (sub.oneshot) { - sub.active = false; + if (xSemaphoreTake(subMutex_, portMAX_DELAY) == pdTRUE) { + bool needsCompact = false; + for (auto& sub : subs_) { + if (!sub.active) { needsCompact = true; + continue; + } + + if (sub.eventId == ev.eventId) { + snapshot.push_back(sub); + if (sub.oneshot) { + sub.active = false; + needsCompact = true; + } } } - } - if (needsCompact) { - compactSubscriptionsLocked(); - } + if (needsCompact) { + compactSubscriptionsLocked(); + } - xSemaphoreGive(subMutex_); - } + xSemaphoreGive(subMutex_); + } - for (auto& sub : snapshot) { - if (sub.cb) { - sub.cb(ev.payload, sub.userArg); + for (auto& sub : snapshot) { + if (sub.cb) { + sub.cb(ev.payload, sub.userArg); + } } } }