summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorArtem Nosach <ANosach@luxoft.com>2015-08-03 21:28:03 +0300
committerArtem Nosach <ANosach@luxoft.com>2015-10-04 18:08:49 +0300
commitcbe8c0c4efe065c211141a76dc016efd7ceb5d31 (patch)
tree32b1fefbe8fe8f9bac1e228f5d99ddef1b1bd6be /src
parent065c5b6508b59e08b758fef58d770b828dab11f8 (diff)
downloadsdl_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')
-rw-r--r--src/components/application_manager/include/application_manager/application_manager_impl.h4
-rw-r--r--src/components/hmi_message_handler/include/hmi_message_handler/hmi_message_handler_impl.h6
-rw-r--r--src/components/include/transport_manager/transport_adapter/transport_adapter_event.h1
-rw-r--r--src/components/include/utils/message_queue.h29
-rw-r--r--src/components/include/utils/threads/message_loop_thread.h5
-rw-r--r--src/components/media_manager/src/streamer_adapter.cc6
-rw-r--r--src/components/protocol_handler/include/protocol_handler/protocol_handler_impl.h2
-rw-r--r--src/components/security_manager/include/security_manager/security_manager_impl.h1
-rw-r--r--src/components/time_tester/src/time_manager.cc5
-rw-r--r--src/components/utils/test/message_queue_test.cc2
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);
}