From 67b8186658a72def4e63d6e62313be39f5bf1fa1 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Fri, 12 Dec 2014 17:09:16 +0100 Subject: [PATCH] logic: added sleep time of 25ms to messaging loop --- src/lib/utility/messaging/MessageQueue.cpp | 30 +++++++++++++++++++--- src/lib/utility/messaging/MessageQueue.h | 8 +++--- src/test/MessageQueueTestSuite.h | 5 +++- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/lib/utility/messaging/MessageQueue.cpp b/src/lib/utility/messaging/MessageQueue.cpp index e9ecb6e6..c9eb52fd 100644 --- a/src/lib/utility/messaging/MessageQueue.cpp +++ b/src/lib/utility/messaging/MessageQueue.cpp @@ -1,5 +1,6 @@ #include "utility/messaging/MessageQueue.h" +#include #include #include "utility/logging/logging.h" @@ -97,6 +98,9 @@ void MessageQueue::startMessageLoop() } processMessages(); + + const int SLEEP_TIME_MS = 25; + std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_MS)); } } @@ -118,6 +122,13 @@ bool MessageQueue::loopIsRunning() const return m_loopIsRunning; } +bool MessageQueue::hasMessagesQueued() const +{ + std::lock_guard lock(m_frontMessageBufferMutex); + std::lock_guard lock2(m_backMessageBufferMutex); + return m_backMessageBuffer->size() + m_frontMessageBuffer->size() > 0; +} + std::shared_ptr MessageQueue::s_instance; MessageQueue::MessageQueue() @@ -132,14 +143,25 @@ MessageQueue::MessageQueue() void MessageQueue::processMessages() { { - std::lock_guard lock(m_backMessageBufferMutex); + std::lock_guard lock(m_frontMessageBufferMutex); + std::lock_guard lock2(m_backMessageBufferMutex); m_backMessageBuffer.swap(m_frontMessageBuffer); } - while (m_frontMessageBuffer->size()) + while (true) { - std::shared_ptr message = m_frontMessageBuffer->front(); - m_frontMessageBuffer->pop(); + std::shared_ptr message; + { + std::lock_guard lock(m_frontMessageBufferMutex); + + if (!m_frontMessageBuffer->size()) + { + break; + } + + message = m_frontMessageBuffer->front(); + m_frontMessageBuffer->pop(); + } std::lock_guard lock(m_listenersMutex); diff --git a/src/lib/utility/messaging/MessageQueue.h b/src/lib/utility/messaging/MessageQueue.h index b836ae81..0059f02d 100644 --- a/src/lib/utility/messaging/MessageQueue.h +++ b/src/lib/utility/messaging/MessageQueue.h @@ -23,9 +23,10 @@ public: void stopMessageLoop(); bool loopIsRunning() const; + bool hasMessagesQueued() const; private: - typedef std::queue > MessageBufferType; + typedef std::queue> MessageBufferType; static std::shared_ptr s_instance; @@ -43,8 +44,9 @@ private: size_t m_listenersLength; bool m_loopIsRunning; - std::mutex m_backMessageBufferMutex; - std::mutex m_listenersMutex; + mutable std::mutex m_frontMessageBufferMutex; + mutable std::mutex m_backMessageBufferMutex; + mutable std::mutex m_listenersMutex; mutable std::mutex m_loopMutex; }; diff --git a/src/test/MessageQueueTestSuite.h b/src/test/MessageQueueTestSuite.h index e7ddaa44..ad80cc1d 100644 --- a/src/test/MessageQueueTestSuite.h +++ b/src/test/MessageQueueTestSuite.h @@ -240,6 +240,9 @@ private: void waitForThread() const { static const int THREAD_WAIT_TIME_MS = 5; - std::this_thread::sleep_for(std::chrono::milliseconds(THREAD_WAIT_TIME_MS)); + while (MessageQueue::getInstance()->hasMessagesQueued()) + { + std::this_thread::sleep_for(std::chrono::milliseconds(THREAD_WAIT_TIME_MS)); + } } };