diff options
author | Artem Nosach <ANosach@luxoft.com> | 2015-08-03 21:28:03 +0300 |
---|---|---|
committer | Artem Nosach <ANosach@luxoft.com> | 2015-10-04 18:08:49 +0300 |
commit | cbe8c0c4efe065c211141a76dc016efd7ceb5d31 (patch) | |
tree | 32b1fefbe8fe8f9bac1e228f5d99ddef1b1bd6be /src/components | |
parent | 065c5b6508b59e08b758fef58d770b828dab11f8 (diff) | |
download | sdl_core-cbe8c0c4efe065c211141a76dc016efd7ceb5d31.tar.gz |
Check for empty queue in MessageQueue::pop() method
Return bool value from MessageQueue::pop() method that shows
if pop operation was successful. Add default constructors to all
classes used as message for message queue.
Closes-bug: APPLINK-14928
Diffstat (limited to 'src/components')
10 files changed, 36 insertions, 25 deletions
diff --git a/src/components/application_manager/include/application_manager/application_manager_impl.h b/src/components/application_manager/include/application_manager/application_manager_impl.h index e14d6d4cad..f5111e6658 100644 --- a/src/components/application_manager/include/application_manager/application_manager_impl.h +++ b/src/components/application_manager/include/application_manager/application_manager_impl.h @@ -120,6 +120,7 @@ using namespace threads; * when we have them. */ struct MessageFromMobile: public utils::SharedPtr<Message> { + MessageFromMobile() {} explicit MessageFromMobile(const utils::SharedPtr<Message>& message) : utils::SharedPtr<Message>(message) { } @@ -130,6 +131,7 @@ struct MessageFromMobile: public utils::SharedPtr<Message> { }; struct MessageToMobile: public utils::SharedPtr<Message> { + MessageToMobile() : is_final(false) {} explicit MessageToMobile(const utils::SharedPtr<Message>& message, bool final_message) : utils::SharedPtr<Message>(message), @@ -144,6 +146,7 @@ struct MessageToMobile: public utils::SharedPtr<Message> { }; struct MessageFromHmi: public utils::SharedPtr<Message> { + MessageFromHmi() {} explicit MessageFromHmi(const utils::SharedPtr<Message>& message) : utils::SharedPtr<Message>(message) { } @@ -154,6 +157,7 @@ struct MessageFromHmi: public utils::SharedPtr<Message> { }; struct MessageToHmi: public utils::SharedPtr<Message> { + MessageToHmi() {} explicit MessageToHmi(const utils::SharedPtr<Message>& message) : utils::SharedPtr<Message>(message) { } diff --git a/src/components/hmi_message_handler/include/hmi_message_handler/hmi_message_handler_impl.h b/src/components/hmi_message_handler/include/hmi_message_handler/hmi_message_handler_impl.h index d638f370d8..9e275be047 100644 --- a/src/components/hmi_message_handler/include/hmi_message_handler/hmi_message_handler_impl.h +++ b/src/components/hmi_message_handler/include/hmi_message_handler/hmi_message_handler_impl.h @@ -55,14 +55,16 @@ namespace impl { * when we have them. */ struct MessageFromHmi: public MessageSharedPointer { - MessageFromHmi(const MessageSharedPointer& message) + MessageFromHmi() {} + explicit MessageFromHmi(const MessageSharedPointer& message) : MessageSharedPointer(message) {} // PrioritizedQueue requres this method to decide which priority to assign size_t PriorityOrder() const { return (*this)->Priority().OrderingValue(); } }; struct MessageToHmi: public MessageSharedPointer { - MessageToHmi(const MessageSharedPointer& message) + MessageToHmi() {} + explicit MessageToHmi(const MessageSharedPointer& message) : MessageSharedPointer(message) {} // PrioritizedQueue requres this method to decide which priority to assign size_t PriorityOrder() const { return (*this)->Priority().OrderingValue(); } diff --git a/src/components/include/transport_manager/transport_adapter/transport_adapter_event.h b/src/components/include/transport_manager/transport_adapter/transport_adapter_event.h index 525a69fbb7..cb29edbbfe 100644 --- a/src/components/include/transport_manager/transport_adapter/transport_adapter_event.h +++ b/src/components/include/transport_manager/transport_adapter/transport_adapter_event.h @@ -41,6 +41,7 @@ namespace transport_manager { class TransportAdapterEvent { public: + TransportAdapterEvent() {} /** * @brief Constructor. * diff --git a/src/components/include/utils/message_queue.h b/src/components/include/utils/message_queue.h index 6355b1555c..53d2c3ab70 100644 --- a/src/components/include/utils/message_queue.h +++ b/src/components/include/utils/message_queue.h @@ -38,7 +38,6 @@ #include "utils/conditional_variable.h" #include "utils/lock.h" -#include "utils/logger.h" #include "utils/prioritized_queue.h" /** @@ -85,10 +84,11 @@ template<typename T, class Q = std::queue<T> > class MessageQueue { void push(const T& element); /** - * \brief Removes element from the queue and returns it. - * \return To element of the queue. + * \brief Removes element from the queue and returns it + * \param element Element to be returned + * \return True on success, false if queue is empty */ - T pop(); + bool pop(T& element); /** * \brief Conditional wait. @@ -128,10 +128,6 @@ template<typename T, class Q> MessageQueue<T, Q>::MessageQueue() } template<typename T, class Q> MessageQueue<T, Q>::~MessageQueue() { - if (!queue_.empty()) { - CREATE_LOGGERPTR_LOCAL(logger_, "Utils") - LOG4CXX_ERROR(logger_, "Destruction of non-drained queue"); - } } template<typename T, class Q> void MessageQueue<T, Q>::wait() { @@ -159,26 +155,21 @@ template<typename T, class Q> void MessageQueue<T, Q>::push(const T& element) { { sync_primitives::AutoLock auto_lock(queue_lock_); if (shutting_down_) { - CREATE_LOGGERPTR_LOCAL(logger_, "Utils") - LOG4CXX_ERROR(logger_, "Runtime error, pushing into queue" - " that is being shut down"); - return; + return; } - queue_.push(element); + queue_.push(element); } queue_new_items_.Broadcast(); } -template<typename T, class Q> T MessageQueue<T, Q>::pop() { +template<typename T, class Q> bool MessageQueue<T, Q>::pop(T& element) { sync_primitives::AutoLock auto_lock(queue_lock_); if (queue_.empty()) { - CREATE_LOGGERPTR_LOCAL(logger_, "Utils") - LOG4CXX_ERROR(logger_, "Runtime error, popping out of empty queue"); - NOTREACHED(); + return false; } - T result = queue_.front(); + element = queue_.front(); queue_.pop(); - return result; + return true; } template<typename T, class Q> void MessageQueue<T, Q>::Shutdown() { diff --git a/src/components/include/utils/threads/message_loop_thread.h b/src/components/include/utils/threads/message_loop_thread.h index 6f90df209c..6d8caaf2f5 100644 --- a/src/components/include/utils/threads/message_loop_thread.h +++ b/src/components/include/utils/threads/message_loop_thread.h @@ -180,7 +180,10 @@ void MessageLoopThread<Q>::LoopThreadDelegate::exitThreadMain() { template<class Q> void MessageLoopThread<Q>::LoopThreadDelegate::DrainQue() { while (!message_queue_.empty()) { - handler_.Handle(message_queue_.pop()); + Message msg; + if (message_queue_.pop(msg)) { + handler_.Handle(msg); + } } } } // namespace threads diff --git a/src/components/media_manager/src/streamer_adapter.cc b/src/components/media_manager/src/streamer_adapter.cc index ef128a4417..3246744ba9 100644 --- a/src/components/media_manager/src/streamer_adapter.cc +++ b/src/components/media_manager/src/streamer_adapter.cc @@ -131,7 +131,11 @@ void StreamerAdapter::Streamer::threadMain() { while (!stop_flag_) { adapter_->messages_.wait(); while (!adapter_->messages_.empty()) { - protocol_handler::RawMessagePtr msg = adapter_->messages_.pop(); + protocol_handler::RawMessagePtr msg; + if (!adapter_->messages_.pop(msg)) { + LOG4CXX_ERROR(logger, "Empty message queue"); + continue; + } if (!msg) { LOG4CXX_ERROR(logger, "Null pointer message"); continue; diff --git a/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h b/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h index bff972ede4..46155c4c67 100644 --- a/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h +++ b/src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h @@ -85,6 +85,7 @@ namespace impl { * when we have them. */ struct RawFordMessageFromMobile: public ProtocolFramePtr { + RawFordMessageFromMobile() {} explicit RawFordMessageFromMobile(const ProtocolFramePtr message) : ProtocolFramePtr(message) {} // PrioritizedQueue requires this method to decide which priority to assign @@ -95,6 +96,7 @@ struct RawFordMessageFromMobile: public ProtocolFramePtr { }; struct RawFordMessageToMobile: public ProtocolFramePtr { + RawFordMessageToMobile() : is_final(false) {} explicit RawFordMessageToMobile(const ProtocolFramePtr message, bool final_message) : ProtocolFramePtr(message), is_final(final_message) {} diff --git a/src/components/security_manager/include/security_manager/security_manager_impl.h b/src/components/security_manager/include/security_manager/security_manager_impl.h index 2aa03087eb..a2f33a1235 100644 --- a/src/components/security_manager/include/security_manager/security_manager_impl.h +++ b/src/components/security_manager/include/security_manager/security_manager_impl.h @@ -52,6 +52,7 @@ namespace security_manager { * for thread working */ struct SecurityMessage: public SecurityQueryPtr { + SecurityMessage() {} explicit SecurityMessage(const SecurityQueryPtr &message) : SecurityQueryPtr(message) {} // PrioritizedQueue requires this method to decide which priority to assign diff --git a/src/components/time_tester/src/time_manager.cc b/src/components/time_tester/src/time_manager.cc index 19a272bb32..a0b90a8495 100644 --- a/src/components/time_tester/src/time_manager.cc +++ b/src/components/time_tester/src/time_manager.cc @@ -121,7 +121,10 @@ void TimeManager::Streamer::threadMain() { is_client_connected_ = true; while (is_client_connected_) { while (!messages_.empty()) { - utils::SharedPtr<MetricWrapper> metric = messages_.pop(); + utils::SharedPtr<MetricWrapper> metric; + if (!messages_.pop(metric)) { + continue; + } is_client_connected_ = Send(metric->GetStyledString()); } diff --git a/src/components/utils/test/message_queue_test.cc b/src/components/utils/test/message_queue_test.cc index fbae7a9e5e..8ce7196b07 100644 --- a/src/components/utils/test/message_queue_test.cc +++ b/src/components/utils/test/message_queue_test.cc @@ -77,7 +77,7 @@ void MessageQueueTest::add_one_element_to_queue() { // Thread function - removes 1 element from beginning of queue void MessageQueueTest::extract_from_queue() { test_queue.wait(); - test_line = test_queue.pop(); + test_queue.pop(test_line); pthread_exit(NULL); } |