From bc3a55c3439c29a85af334c289ac2dcb35f08e07 Mon Sep 17 00:00:00 2001 From: Jeff Witthuhn Date: Wed, 28 Mar 2018 11:31:51 +0200 Subject: 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 --- intern/cycles/util/util_thread.cpp | 14 ++++++++++++++ intern/cycles/util/util_thread.h | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 46 insertions(+), 3 deletions(-) (limited to 'intern/cycles/util') 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 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 #else # include +# include #endif -#include #include +#ifdef _WIN32 +# include "util_windows.h" +#else +# include +#endif + #ifdef __APPLE__ # include #endif @@ -60,7 +66,11 @@ public: protected: function 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 -- cgit v1.2.3