refactor: allow for movable events

based on: 2f5c612ade
This commit is contained in:
sithlord48 2025-11-12 20:29:03 -05:00 committed by Chris Rizzitello
parent e011351aad
commit 8256a3ba43
7 changed files with 25 additions and 21 deletions

View file

@ -23,7 +23,7 @@ public:
//! Event //! 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 class Event
{ {
@ -37,6 +37,10 @@ public:
}; };
Event() = default; 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) //! Create \c Event with data (POD)
/*! /*!

View file

@ -54,8 +54,8 @@ void EventQueue::loop()
LOG_DEBUG("event queue is ready"); LOG_DEBUG("event queue is ready");
while (!m_pending.empty()) { while (!m_pending.empty()) {
LOG_DEBUG("add pending events to buffer"); LOG_DEBUG("add pending events to buffer");
const Event &event = m_pending.front(); Event &event = m_pending.front();
addEventToBuffer(event); addEventToBuffer(std::move(event));
m_pending.pop(); m_pending.pop();
} }
@ -171,7 +171,7 @@ bool EventQueue::dispatchEvent(const Event &event)
return false; return false;
} }
void EventQueue::addEvent(const Event &event) void EventQueue::addEvent(Event &&event)
{ {
// discard bogus event types // discard bogus event types
switch (event.getType()) { switch (event.getType()) {
@ -188,24 +188,24 @@ void EventQueue::addEvent(const Event &event)
dispatchEvent(event); dispatchEvent(event);
Event::deleteData(event); Event::deleteData(event);
} else if (!(*m_readyCondVar)) { } else if (!(*m_readyCondVar)) {
m_pending.push(event); m_pending.push(std::move(event));
} else { } else {
addEventToBuffer(event); addEventToBuffer(std::move(event));
} }
} }
void EventQueue::addEventToBuffer(const Event &event) void EventQueue::addEventToBuffer(Event &&event)
{ {
std::scoped_lock lock{m_mutex}; std::scoped_lock lock{m_mutex};
// store the event's data locally // store the event's data locally
auto eventID = saveEvent(event); auto eventID = saveEvent(std::move(event));
// add it // add it
if (!m_buffer->addEvent(eventID)) { if (!m_buffer->addEvent(eventID)) {
// failed to send event // failed to send event
removeEvent(eventID); auto removedEvent = removeEvent(eventID);
Event::deleteData(event); Event::deleteData(removedEvent);
} }
} }
@ -302,7 +302,7 @@ const EventQueue::EventHandler *EventQueue::getHandler(EventTypes type, void *ta
return nullptr; return nullptr;
} }
uint32_t EventQueue::saveEvent(const Event &event) uint32_t EventQueue::saveEvent(Event &&event)
{ {
// choose id // choose id
uint32_t id; uint32_t id;
@ -316,7 +316,7 @@ uint32_t EventQueue::saveEvent(const Event &event)
} }
// save data // save data
m_events[id] = event; m_events[id] = std::move(event);
return id; return id;
} }
@ -329,7 +329,7 @@ Event EventQueue::removeEvent(uint32_t eventID)
} }
// get data // get data
Event event = index->second; Event event = std::move(index->second);
m_events.erase(index); m_events.erase(index);
// save old id for reuse // save old id for reuse

View file

@ -39,7 +39,7 @@ public:
void adoptBuffer(IEventQueueBuffer *) override; void adoptBuffer(IEventQueueBuffer *) override;
bool getEvent(Event &event, double timeout = -1.0) override; bool getEvent(Event &event, double timeout = -1.0) override;
bool dispatchEvent(const Event &event) 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 *newTimer(double duration, void *target) override;
EventQueueTimer *newOneShotTimer(double duration, void *target) override; EventQueueTimer *newOneShotTimer(double duration, void *target) override;
void deleteTimer(EventQueueTimer *) override; void deleteTimer(EventQueueTimer *) override;
@ -51,11 +51,11 @@ public:
private: private:
const EventHandler *getHandler(EventTypes type, void *target) const; const EventHandler *getHandler(EventTypes type, void *target) const;
uint32_t saveEvent(const Event &event); uint32_t saveEvent(Event &&event);
Event removeEvent(uint32_t eventID); Event removeEvent(uint32_t eventID);
bool hasTimerExpired(Event &event); bool hasTimerExpired(Event &event);
double getNextTimerTimeout() const; double getNextTimerTimeout() const;
void addEventToBuffer(const Event &event); void addEventToBuffer(Event &&event);
//! //!
//! \brief processEvent Internal event proccessing //! \brief processEvent Internal event proccessing

View file

@ -76,7 +76,7 @@ public:
/*! /*!
Adds \p event to the end of the queue. 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 //! Create a recurring timer
/*! /*!

View file

@ -149,7 +149,7 @@ void Client::refuseConnection(const char *msg)
auto info = new FailInfo(msg); auto info = new FailInfo(msg);
info->m_retry = true; info->m_retry = true;
Event event(EventTypes::ClientConnectionRefused, getEventTarget(), info, Event::EventFlags::DontFreeData); 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); auto *info = new FailInfo(msg);
info->m_retry = true; info->m_retry = true;
Event event(EventTypes::ClientConnectionFailed, getEventTarget(), info, Event::EventFlags::DontFreeData); Event event(EventTypes::ClientConnectionFailed, getEventTarget(), info, Event::EventFlags::DontFreeData);
m_events->addEvent(event); m_events->addEvent(std::move(event));
} }
void Client::setupConnecting() void Client::setupConnecting()

View file

@ -909,5 +909,5 @@ void InputFilter::handleEvent(const Event &event)
} }
// not handled so pass through // not handled so pass through
m_events->addEvent(myEvent); m_events->addEvent(std::move(myEvent));
} }

View file

@ -22,7 +22,7 @@ public:
MOCK_METHOD(void, removeHandlers, (void *), (override)); MOCK_METHOD(void, removeHandlers, (void *), (override));
MOCK_METHOD(EventTypes, registerType, (const char *)); MOCK_METHOD(EventTypes, registerType, (const char *));
MOCK_METHOD(void, addHandler, (EventTypes, void *, const EventHandler &), (override)); 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(void, removeHandler, (EventTypes, void *), (override));
MOCK_METHOD(bool, dispatchEvent, (const Event &), (override)); MOCK_METHOD(bool, dispatchEvent, (const Event &), (override));
MOCK_METHOD(void, deleteTimer, (EventQueueTimer *), (override)); MOCK_METHOD(void, deleteTimer, (EventQueueTimer *), (override));