From d597d023b16af04104896d1dd9020c4be9f3fc87 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Sat, 24 May 2025 21:47:21 -0400 Subject: [PATCH] chore: use std::unique_ptr for eventQueueHandlers ports input-leap/5044b79a4f98ea5da0b8cbe950123f061d4c1c5f ported-by sithlord48 --- src/lib/base/EventQueue.cpp | 24 +++++++++--------------- src/lib/base/EventQueue.h | 2 +- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/lib/base/EventQueue.cpp b/src/lib/base/EventQueue.cpp index d992e08fc..4060c7a17 100644 --- a/src/lib/base/EventQueue.cpp +++ b/src/lib/base/EventQueue.cpp @@ -262,14 +262,12 @@ void EventQueue::deleteTimer(EventQueueTimer *timer) void EventQueue::adoptHandler(EventTypes type, void *target, IEventJob *handler) { ArchMutexLock lock(m_mutex); - IEventJob *&job = m_handlers[target][type]; - delete job; - job = handler; + m_handlers[target][type].reset(handler); } void EventQueue::removeHandler(EventTypes type, void *target) { - IEventJob *handler = nullptr; + std::unique_ptr handler; { ArchMutexLock lock(m_mutex); HandlerTable::iterator index = m_handlers.find(target); @@ -277,34 +275,30 @@ void EventQueue::removeHandler(EventTypes type, void *target) TypeHandlerTable &typeHandlers = index->second; TypeHandlerTable::iterator index2 = typeHandlers.find(type); if (index2 != typeHandlers.end()) { - handler = index2->second; + handler = std::move(index2->second); typeHandlers.erase(index2); } } } - delete handler; + // handler is erased here. It is done outside of lock in order to avoid potential deadlock. } void EventQueue::removeHandlers(void *target) { - std::vector handlers; + std::vector> handlers; { ArchMutexLock lock(m_mutex); HandlerTable::iterator index = m_handlers.find(target); if (index != m_handlers.end()) { // copy to handlers array and clear table for target TypeHandlerTable &typeHandlers = index->second; - for (const auto &[key, value] : typeHandlers) { - handlers.push_back(value); + for (auto &[key, value] : typeHandlers) { + handlers.push_back(std::move(value)); } typeHandlers.clear(); } } - - // delete handlers - for (auto index : handlers) { - delete index; - } + // handler is erased here. It is done outside of lock in order to avoid potential deadlock. } bool EventQueue::isEmpty() const @@ -319,7 +313,7 @@ IEventJob *EventQueue::getHandler(EventTypes type, void *target) const const TypeHandlerTable &typeHandlers = index->second; TypeHandlerTable::const_iterator index2 = typeHandlers.find(type); if (index2 != typeHandlers.end()) { - return index2->second; + return index2->second.get(); } } return nullptr; diff --git a/src/lib/base/EventQueue.h b/src/lib/base/EventQueue.h index d2015d61a..d417c9a94 100644 --- a/src/lib/base/EventQueue.h +++ b/src/lib/base/EventQueue.h @@ -100,7 +100,7 @@ private: using TimerQueue = PriorityQueue; using EventTable = std::map; using EventIDList = std::vector; - using TypeHandlerTable = std::map; + using TypeHandlerTable = std::map>; using HandlerTable = std::map; int m_systemTarget = 0;