From 19656914a7f9007c9e54588939c85752e509376c Mon Sep 17 00:00:00 2001
From: Tobias Markmann <tm@ayena.de>
Date: Sun, 1 Feb 2015 16:34:51 +0100
Subject: Fix data race in PlatformDomainNameResolver reported by TSAN

Test-Information:

All tests still succeed on OS X and Linux.

Change-Id: I2c02252b646b539b960cad18b6f88807afd84d32

diff --git a/Swiften/Base/Atomic.h b/Swiften/Base/Atomic.h
new file mode 100644
index 0000000..bca3683
--- /dev/null
+++ b/Swiften/Base/Atomic.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <boost/thread.hpp>
+#include <boost/thread/locks.hpp>
+
+namespace Swift {
+
+/**
+ * This class template provides a read/write access synchronized wrapper for other types. 
+ */
+template <typename ValueType>
+class Atomic {
+	public:
+		Atomic(const ValueType& v) : value_(v) {
+		}
+
+		/**
+		 * Synchronized write access.
+		 */
+		Atomic<ValueType>& operator=(const ValueType& newValue) {
+			boost::lock_guard<boost::mutex> lock(valueMutex_);
+			value_ = newValue;
+			return *this;
+		}
+
+		/**
+		 * Synchronized read access.
+		 */
+		operator ValueType() {
+			boost::lock_guard<boost::mutex> lock(valueMutex_);
+			return value_;
+		}
+
+	private:
+		boost::mutex valueMutex_;
+		ValueType value_;
+};
+
+}
diff --git a/Swiften/Network/PlatformDomainNameResolver.h b/Swiften/Network/PlatformDomainNameResolver.h
index 95c866a..e2d28a9 100644
--- a/Swiften/Network/PlatformDomainNameResolver.h
+++ b/Swiften/Network/PlatformDomainNameResolver.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2013 Isode Limited.
+ * Copyright (c) 2010-2015 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -12,6 +12,7 @@
 #include <boost/thread/condition_variable.hpp>
 
 #include <Swiften/Base/API.h>
+#include <Swiften/Base/Atomic.h>
 #include <Swiften/Network/DomainNameResolver.h>
 #include <Swiften/Network/PlatformDomainNameQuery.h>
 #include <Swiften/Network/DomainNameServiceQuery.h>
@@ -38,7 +39,7 @@ namespace Swift {
 			friend class PlatformDomainNameAddressQuery;
 			IDNConverter* idnConverter;
 			EventLoop* eventLoop;
-			bool stopRequested;
+			Atomic<bool> stopRequested;
 			boost::thread* thread;
 			std::deque<PlatformDomainNameQuery::ref> queue;
 			boost::mutex queueMutex;
-- 
cgit v0.10.2-6-g49f6