Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorJeff Witthuhn <witthuhn>2018-03-28 12:31:51 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-03-28 13:13:04 +0300
commitbc3a55c3439c29a85af334c289ac2dcb35f08e07 (patch)
tree51aa9bc67cd0f82134cac1d1b2d816b8baf38655 /intern
parente49d66f22cf7ac14e7254150387eb8e07114f20c (diff)
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
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/util/util_thread.cpp14
-rw-r--r--intern/cycles/util/util_thread.h35
2 files changed, 46 insertions, 3 deletions
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