From 2f0107f4a7e82019a68ae3c0572886622d9d49bf Mon Sep 17 00:00:00 2001
From: Loic Blot <loic.blot@unix-experience.fr>
Date: Thu, 5 Mar 2015 20:54:36 +0100
Subject: [PATCH] MutexedQueue inherits must use std::deque instead of
 std::list

---
 src/util/container.h | 69 ++++++++++++++++----------------------------
 src/util/thread.h    |  6 ++--
 2 files changed, 28 insertions(+), 47 deletions(-)

diff --git a/src/util/container.h b/src/util/container.h
index 7945df54b..936c46d61 100644
--- a/src/util/container.h
+++ b/src/util/container.h
@@ -200,12 +200,12 @@ class MutexedQueue
 	bool empty()
 	{
 		JMutexAutoLock lock(m_mutex);
-		return (m_size.GetValue() == 0);
+		return (m_queue.size() == 0);
 	}
 	void push_back(T t)
 	{
 		JMutexAutoLock lock(m_mutex);
-		m_list.push_back(t);
+		m_queue.push_back(t);
 		m_size.Post();
 	}
 
@@ -214,34 +214,28 @@ class MutexedQueue
 	*/
 	T pop_frontNoEx(u32 wait_time_max_ms)
 	{
-		if (m_size.Wait(wait_time_max_ms))
-		{
+		if (m_size.Wait(wait_time_max_ms)) {
 			JMutexAutoLock lock(m_mutex);
 
-			typename std::list<T>::iterator begin = m_list.begin();
-			T t = *begin;
-			m_list.erase(begin);
+			T t = m_queue.front();
+			m_queue.pop_front();
 			return t;
 		}
-		else
-		{
+		else {
 			return T();
 		}
 	}
 
 	T pop_front(u32 wait_time_max_ms)
 	{
-		if (m_size.Wait(wait_time_max_ms))
-		{
+		if (m_size.Wait(wait_time_max_ms)) {
 			JMutexAutoLock lock(m_mutex);
 
-			typename std::list<T>::iterator begin = m_list.begin();
-			T t = *begin;
-			m_list.erase(begin);
+			T t = m_queue.front();
+			m_queue.pop_front();
 			return t;
 		}
-		else
-		{
+		else {
 			throw ItemNotFoundException("MutexedQueue: queue is empty");
 		}
 	}
@@ -252,26 +246,21 @@ class MutexedQueue
 
 		JMutexAutoLock lock(m_mutex);
 
-		typename std::list<T>::iterator begin = m_list.begin();
-		T t = *begin;
-		m_list.erase(begin);
+		T t = m_queue.front();
+		m_queue.pop_front();
 		return t;
 	}
 
 	T pop_back(u32 wait_time_max_ms=0)
 	{
-		if (m_size.Wait(wait_time_max_ms))
-		{
+		if (m_size.Wait(wait_time_max_ms)) {
 			JMutexAutoLock lock(m_mutex);
 
-			typename std::list<T>::iterator last = m_list.end();
-			last--;
-			T t = *last;
-			m_list.erase(last);
+			T t = m_queue.back();
+			m_queue.pop_back();
 			return t;
 		}
-		else
-		{
+		else {
 			throw ItemNotFoundException("MutexedQueue: queue is empty");
 		}
 	}
@@ -281,18 +270,14 @@ class MutexedQueue
 	*/
 	T pop_backNoEx(u32 wait_time_max_ms=0)
 	{
-		if (m_size.Wait(wait_time_max_ms))
-		{
+		if (m_size.Wait(wait_time_max_ms)) {
 			JMutexAutoLock lock(m_mutex);
 
-			typename std::list<T>::iterator last = m_list.end();
-			last--;
-			T t = *last;
-			m_list.erase(last);
+			T t = m_queue.back();
+			m_queue.pop_back();
 			return t;
 		}
-		else
-		{
+		else {
 			return T();
 		}
 	}
@@ -303,10 +288,8 @@ class MutexedQueue
 
 		JMutexAutoLock lock(m_mutex);
 
-		typename std::list<T>::iterator last = m_list.end();
-		last--;
-		T t = *last;
-		m_list.erase(last);
+		T t = m_queue.back();
+		m_queue.pop_back();
 		return t;
 	}
 
@@ -316,15 +299,13 @@ class MutexedQueue
 		return m_mutex;
 	}
 
-	// NEVER EVER modify the >>list<< you got by using this function!
-	// You may only modify it's content
-	std::list<T> & getList()
+	std::deque<T> & getQueue()
 	{
-		return m_list;
+		return m_queue;
 	}
 
+	std::deque<T> m_queue;
 	JMutex m_mutex;
-	std::list<T> m_list;
 	JSemaphore m_size;
 };
 
diff --git a/src/util/thread.h b/src/util/thread.h
index 8b3c33621..eda9c0ca2 100644
--- a/src/util/thread.h
+++ b/src/util/thread.h
@@ -130,9 +130,9 @@ class RequestQueue
 			/*
 				If the caller is already on the list, only update CallerData
 			*/
-			for(typename std::list< GetRequest<Key, T, Caller, CallerData> >::iterator
-					i = m_queue.getList().begin();
-					i != m_queue.getList().end(); ++i)
+			for(typename std::deque< GetRequest<Key, T, Caller, CallerData> >::iterator
+					i = m_queue.getQueue().begin();
+					i != m_queue.getQueue().end(); ++i)
 			{
 				GetRequest<Key, T, Caller, CallerData> &request = *i;
 
-- 
GitLab