From 02e568b77aabc4a418902d8177085d33ebf8f8d7 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 22 Jan 2025 12:37:00 -0600 Subject: [PATCH] fix memory leak --- .../include/events/t_event_system.hpp | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/repertory/librepertory/include/events/t_event_system.hpp b/repertory/librepertory/include/events/t_event_system.hpp index c19e937d..ec3027f0 100644 --- a/repertory/librepertory/include/events/t_event_system.hpp +++ b/repertory/librepertory/include/events/t_event_system.hpp @@ -95,6 +95,12 @@ private: std::vector> events; unique_mutex_lock lock(event_mutex_); + const auto lock_and_notify = [this, &lock]() { + lock.lock(); + event_notify_.notify_all(); + lock.unlock(); + }; + if (not get_stop_requested() && event_list_.empty()) { event_notify_.wait_for(lock, 4s); } @@ -107,6 +113,7 @@ private: lock.unlock(); if (events.empty()) { + lock_and_notify(); return; } @@ -133,12 +140,38 @@ private: notify_events("", *evt.get()); notify_events(evt->get_name(), *evt.get()); } + + lock_and_notify(); } void queue_event(std::shared_ptr evt) { - mutex_lock lock(event_mutex_); + static constexpr const auto max_retry{ + 30U, + }; + + static const auto max_size{ + std::thread::hardware_concurrency() * 4UL, + }; + + unique_mutex_lock lock(event_mutex_); event_list_.push_back(std::move(evt)); + auto size = event_list_.size(); event_notify_.notify_all(); + lock.unlock(); + + for (auto retry{0U}; + size > max_size && retry < max_retry && not get_stop_requested(); + ++retry) { + lock.lock(); + size = event_list_.size(); + if (size > max_size) { + event_notify_.wait_for(lock, 1s); + size = event_list_.size(); + } + + event_notify_.notify_all(); + lock.unlock(); + } } public: