From 8256a3ba43a46b22a8ea467416ee809e33d65171 Mon Sep 17 00:00:00 2001 From: sithlord48 Date: Wed, 12 Nov 2025 20:29:03 -0500 Subject: [PATCH] refactor: allow for movable events based on: https://github.com/input-leap/input-leap/pull/1554/commits/2f5c612ade0e99a4f1d200244a17bea9608bcc31 --- src/lib/base/Event.h | 6 ++++- src/lib/base/EventQueue.cpp | 24 +++++++++---------- src/lib/base/EventQueue.h | 6 ++--- src/lib/base/IEventQueue.h | 2 +- src/lib/client/Client.cpp | 4 ++-- src/lib/server/InputFilter.cpp | 2 +- .../mock/deskflow/MockEventQueue.h | 2 +- 7 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/lib/base/Event.h b/src/lib/base/Event.h index f4c9341eb..e349c4ce1 100644 --- a/src/lib/base/Event.h +++ b/src/lib/base/Event.h @@ -23,7 +23,7 @@ public: //! Event /*! -A \c Event holds an event type and a pointer to event data. + \c Event holds an event type and a pointer to event data. It is movable, but not copyable */ class Event { @@ -37,6 +37,10 @@ public: }; Event() = default; + Event(const Event &) = delete; + Event(Event &&other) = default; + Event &operator=(const Event &) = delete; + Event &operator=(Event &&) = default; //! Create \c Event with data (POD) /*! diff --git a/src/lib/base/EventQueue.cpp b/src/lib/base/EventQueue.cpp index b5e3feac1..423b7e4cb 100644 --- a/src/lib/base/EventQueue.cpp +++ b/src/lib/base/EventQueue.cpp @@ -54,8 +54,8 @@ void EventQueue::loop() LOG_DEBUG("event queue is ready"); while (!m_pending.empty()) { LOG_DEBUG("add pending events to buffer"); - const Event &event = m_pending.front(); - addEventToBuffer(event); + Event &event = m_pending.front(); + addEventToBuffer(std::move(event)); m_pending.pop(); } @@ -171,7 +171,7 @@ bool EventQueue::dispatchEvent(const Event &event) return false; } -void EventQueue::addEvent(const Event &event) +void EventQueue::addEvent(Event &&event) { // discard bogus event types switch (event.getType()) { @@ -188,24 +188,24 @@ void EventQueue::addEvent(const Event &event) dispatchEvent(event); Event::deleteData(event); } else if (!(*m_readyCondVar)) { - m_pending.push(event); + m_pending.push(std::move(event)); } else { - addEventToBuffer(event); + addEventToBuffer(std::move(event)); } } -void EventQueue::addEventToBuffer(const Event &event) +void EventQueue::addEventToBuffer(Event &&event) { std::scoped_lock lock{m_mutex}; // store the event's data locally - auto eventID = saveEvent(event); + auto eventID = saveEvent(std::move(event)); // add it if (!m_buffer->addEvent(eventID)) { // failed to send event - removeEvent(eventID); - Event::deleteData(event); + auto removedEvent = removeEvent(eventID); + Event::deleteData(removedEvent); } } @@ -302,7 +302,7 @@ const EventQueue::EventHandler *EventQueue::getHandler(EventTypes type, void *ta return nullptr; } -uint32_t EventQueue::saveEvent(const Event &event) +uint32_t EventQueue::saveEvent(Event &&event) { // choose id uint32_t id; @@ -316,7 +316,7 @@ uint32_t EventQueue::saveEvent(const Event &event) } // save data - m_events[id] = event; + m_events[id] = std::move(event); return id; } @@ -329,7 +329,7 @@ Event EventQueue::removeEvent(uint32_t eventID) } // get data - Event event = index->second; + Event event = std::move(index->second); m_events.erase(index); // save old id for reuse diff --git a/src/lib/base/EventQueue.h b/src/lib/base/EventQueue.h index e5ebd2bdc..e40a99f23 100644 --- a/src/lib/base/EventQueue.h +++ b/src/lib/base/EventQueue.h @@ -39,7 +39,7 @@ public: void adoptBuffer(IEventQueueBuffer *) override; bool getEvent(Event &event, double timeout = -1.0) override; bool dispatchEvent(const Event &event) override; - void addEvent(const Event &event) override; + void addEvent(Event &&event) override; EventQueueTimer *newTimer(double duration, void *target) override; EventQueueTimer *newOneShotTimer(double duration, void *target) override; void deleteTimer(EventQueueTimer *) override; @@ -51,11 +51,11 @@ public: private: const EventHandler *getHandler(EventTypes type, void *target) const; - uint32_t saveEvent(const Event &event); + uint32_t saveEvent(Event &&event); Event removeEvent(uint32_t eventID); bool hasTimerExpired(Event &event); double getNextTimerTimeout() const; - void addEventToBuffer(const Event &event); + void addEventToBuffer(Event &&event); //! //! \brief processEvent Internal event proccessing diff --git a/src/lib/base/IEventQueue.h b/src/lib/base/IEventQueue.h index 6d0eaa459..69cdf2597 100644 --- a/src/lib/base/IEventQueue.h +++ b/src/lib/base/IEventQueue.h @@ -76,7 +76,7 @@ public: /*! Adds \p event to the end of the queue. */ - virtual void addEvent(const Event &event) = 0; + virtual void addEvent(Event &&event) = 0; //! Create a recurring timer /*! diff --git a/src/lib/client/Client.cpp b/src/lib/client/Client.cpp index a385381cb..8fd74548f 100644 --- a/src/lib/client/Client.cpp +++ b/src/lib/client/Client.cpp @@ -149,7 +149,7 @@ void Client::refuseConnection(const char *msg) auto info = new FailInfo(msg); info->m_retry = true; Event event(EventTypes::ClientConnectionRefused, getEventTarget(), info, Event::EventFlags::DontFreeData); - m_events->addEvent(event); + m_events->addEvent(std::move(event)); } } @@ -372,7 +372,7 @@ void Client::sendConnectionFailedEvent(const char *msg) auto *info = new FailInfo(msg); info->m_retry = true; Event event(EventTypes::ClientConnectionFailed, getEventTarget(), info, Event::EventFlags::DontFreeData); - m_events->addEvent(event); + m_events->addEvent(std::move(event)); } void Client::setupConnecting() diff --git a/src/lib/server/InputFilter.cpp b/src/lib/server/InputFilter.cpp index 85e53cd8e..8df52151c 100644 --- a/src/lib/server/InputFilter.cpp +++ b/src/lib/server/InputFilter.cpp @@ -909,5 +909,5 @@ void InputFilter::handleEvent(const Event &event) } // not handled so pass through - m_events->addEvent(myEvent); + m_events->addEvent(std::move(myEvent)); } diff --git a/src/unittests/legacytests/mock/deskflow/MockEventQueue.h b/src/unittests/legacytests/mock/deskflow/MockEventQueue.h index 7d1903ac3..14e4d2b84 100644 --- a/src/unittests/legacytests/mock/deskflow/MockEventQueue.h +++ b/src/unittests/legacytests/mock/deskflow/MockEventQueue.h @@ -22,7 +22,7 @@ public: MOCK_METHOD(void, removeHandlers, (void *), (override)); MOCK_METHOD(EventTypes, registerType, (const char *)); MOCK_METHOD(void, addHandler, (EventTypes, void *, const EventHandler &), (override)); - MOCK_METHOD(void, addEvent, (const Event &), (override)); + MOCK_METHOD(void, addEvent, (Event &&), (override)); MOCK_METHOD(void, removeHandler, (EventTypes, void *), (override)); MOCK_METHOD(bool, dispatchEvent, (const Event &), (override)); MOCK_METHOD(void, deleteTimer, (EventQueueTimer *), (override));