From 4a30e2acd9bb6d871d547f929cefce1d47c08931 Mon Sep 17 00:00:00 2001 From: Tom Englund Date: Thu, 3 Jul 2025 21:20:46 +0200 Subject: [PATCH] eventloop: RAII the even source on readable fd RAII remove the event source and honor rule by 5 --- src/managers/eventLoop/EventLoopManager.cpp | 5 ----- src/managers/eventLoop/EventLoopManager.hpp | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/managers/eventLoop/EventLoopManager.cpp b/src/managers/eventLoop/EventLoopManager.cpp index 6233a2d0..5b2e09d1 100644 --- a/src/managers/eventLoop/EventLoopManager.cpp +++ b/src/managers/eventLoop/EventLoopManager.cpp @@ -77,11 +77,6 @@ void CEventLoopManager::onFdReadable(SReadableWaiter* waiter) { UP taken = std::move(*it); m_readableWaiters.erase(it); - if (taken->source) { - wl_event_source_remove(taken->source); - taken->source = nullptr; - } - if (taken->fn) taken->fn(); } diff --git a/src/managers/eventLoop/EventLoopManager.hpp b/src/managers/eventLoop/EventLoopManager.hpp index 977d2b01..0835b242 100644 --- a/src/managers/eventLoop/EventLoopManager.hpp +++ b/src/managers/eventLoop/EventLoopManager.hpp @@ -42,6 +42,23 @@ class CEventLoopManager { wl_event_source* source; Hyprutils::OS::CFileDescriptor fd; std::function fn; + + SReadableWaiter(wl_event_source* src, Hyprutils::OS::CFileDescriptor f, std::function func) : source(src), fd(std::move(f)), fn(std::move(func)) {} + + ~SReadableWaiter() { + if (source) { + wl_event_source_remove(source); + source = nullptr; + } + } + + // copy + SReadableWaiter(const SReadableWaiter&) = delete; + SReadableWaiter& operator=(const SReadableWaiter&) = delete; + + // move + SReadableWaiter(SReadableWaiter&& other) noexcept = default; + SReadableWaiter& operator=(SReadableWaiter&& other) noexcept = default; }; // schedule function to when fd is readable (WL_EVENT_READABLE / POLLIN),