parent
e011351aad
commit
8256a3ba43
7 changed files with 25 additions and 21 deletions
|
|
@ -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)
|
||||||
/*!
|
/*!
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
/*!
|
/*!
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue