[Bf-blender-cvs] [bc3a55c3439] master: Cycles: don't require pthreads as dependency on Windows.

Jeff Witthuhn noreply at git.blender.org
Wed Mar 28 12:14:15 CEST 2018


Commit: bc3a55c3439c29a85af334c289ac2dcb35f08e07
Author: Jeff Witthuhn
Date:   Wed Mar 28 11:31:51 2018 +0200
Branches: master
https://developer.blender.org/rBbc3a55c3439c29a85af334c289ac2dcb35f08e07

Cycles: don't require pthreads as dependency on Windows.

Use C++11 threads when available, and native critical section on Windows.
Later on we can remove pthread code when C+11 becomes required.

Differential Revision: https://developer.blender.org/D3116

===================================================================

M	intern/cycles/util/util_thread.cpp
M	intern/cycles/util/util_thread.h

===================================================================

diff --git a/intern/cycles/util/util_thread.cpp b/intern/cycles/util/util_thread.cpp
index 3dcb09804b0..c66aa484264 100644
--- a/intern/cycles/util/util_thread.cpp
+++ b/intern/cycles/util/util_thread.cpp
@@ -26,7 +26,11 @@ thread::thread(function<void(void)> run_cb, int group)
     joined_(false),
 	group_(group)
 {
+#if (__cplusplus > 199711L) || (defined(_MSC_VER) && _MSC_VER >= 1800)
+	thread_ = std::thread(&thread::run, this);
+#else
 	pthread_create(&pthread_id_, NULL, run, (void*)this);
+#endif
 }
 
 thread::~thread()
@@ -60,7 +64,17 @@ void *thread::run(void *arg)
 bool thread::join()
 {
 	joined_ = true;
+#if (__cplusplus > 199711L) || (defined(_MSC_VER) && _MSC_VER >= 1800)
+	try {
+		thread_.join();
+		return true;
+	}
+	catch (const std::system_error&) {
+		return false;
+	}
+#else
 	return pthread_join(pthread_id_, NULL) == 0;
+#endif
 }
 
 CCL_NAMESPACE_END
diff --git a/intern/cycles/util/util_thread.h b/intern/cycles/util/util_thread.h
index 1e91fb8a706..4d8f464359c 100644
--- a/intern/cycles/util/util_thread.h
+++ b/intern/cycles/util/util_thread.h
@@ -24,10 +24,16 @@
 #  include <functional>
 #else
 #  include <boost/thread.hpp>
+#  include <pthread.h>
 #endif
-#include <pthread.h>
 #include <queue>
 
+#ifdef _WIN32
+#  include "util_windows.h"
+#else
+#  include <pthread.h>
+#endif
+
 #ifdef __APPLE__
 #  include <libkern/OSAtomic.h>
 #endif
@@ -60,7 +66,11 @@ public:
 
 protected:
 	function<void(void)> run_cb_;
+#if (__cplusplus > 199711L) || (defined(_MSC_VER) && _MSC_VER >= 1800)
+	std::thread thread_;
+#else
 	pthread_t pthread_id_;
+#endif
 	bool joined_;
 	int group_;
 };
@@ -81,7 +91,24 @@ public:
 	inline void unlock() {
 		OSSpinLockUnlock(&spin_);
 	}
-#else  /* __APPLE__ */
+#elif defined(_WIN32)
+	inline thread_spin_lock() {
+		const DWORD SPIN_COUNT = 50000;
+		InitializeCriticalSectionAndSpinCount(&cs_, SPIN_COUNT);
+	}
+
+	inline ~thread_spin_lock() {
+		DeleteCriticalSection(&cs_);
+	}
+
+	inline void lock() {
+		EnterCriticalSection(&cs_);
+	}
+
+	inline void unlock() {
+		LeaveCriticalSection(&cs_);
+	}
+#else
 	inline thread_spin_lock() {
 		pthread_spin_init(&spin_, 0);
 	}
@@ -97,10 +124,12 @@ public:
 	inline void unlock() {
 		pthread_spin_unlock(&spin_);
 	}
-#endif  /* __APPLE__ */
+#endif
 protected:
 #ifdef __APPLE__
 	OSSpinLock spin_;
+#elif defined(_WIN32)
+	CRITICAL_SECTION cs_;
 #else
 	pthread_spinlock_t spin_;
 #endif



More information about the Bf-blender-cvs mailing list