From 46fd114e9a4e05b74576dce682e24357363298e7 Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Mon, 7 Mar 2016 16:55:32 -0500 Subject: [PATCH] Fix race on thread creation This often broke the threading tests on OSX. --- src/threading/thread.cpp | 12 +----------- src/threading/thread.h | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp index 8688c4cbf..ecf8563f1 100644 --- a/src/threading/thread.cpp +++ b/src/threading/thread.cpp @@ -116,9 +116,7 @@ bool Thread::start() #if USE_CPP11_THREADS try { - m_thread_obj = new std::thread(threadProc, this); - m_thread_id = m_thread_obj->get_id(); - m_thread_handle = m_thread_obj->native_handle(); + m_thread_obj = new std::thread(threadProc, this); } catch (const std::system_error &e) { return false; } @@ -135,8 +133,6 @@ bool Thread::start() if (status) return false; - m_thread_id = m_thread_handle; - #endif while (!m_running) @@ -234,12 +230,6 @@ bool Thread::getReturnValue(void **ret) } -bool Thread::isCurrentThread() -{ - return thr_is_current_thread(m_thread_id); -} - - #if USE_CPP11_THREADS || USE_POSIX_THREADS void *Thread::threadProc(void *param) #elif defined(_WIN32_WCE) diff --git a/src/threading/thread.h b/src/threading/thread.h index 6a24afffb..10732c442 100644 --- a/src/threading/thread.h +++ b/src/threading/thread.h @@ -90,12 +90,22 @@ public: /* * Returns true if the calling thread is this Thread object. */ - bool isCurrentThread(); + bool isCurrentThread() { return thr_is_current_thread(getThreadId()); } inline bool isRunning() { return m_running; } inline bool stopRequested() { return m_request_stop; } + +#if USE_CPP11_THREADS + inline threadid_t getThreadId() { return m_thread_obj->get_id(); } + inline threadhandle_t getThreadHandle() { return m_thread_obj->native_handle(); } +#else +# if USE_WIN_THREADS inline threadid_t getThreadId() { return m_thread_id; } +# else + inline threadid_t getThreadId() { return m_thread_handle; } +# endif inline threadhandle_t getThreadHandle() { return m_thread_handle; } +#endif /* * Gets the thread return value. @@ -147,8 +157,12 @@ private: Atomic m_running; Mutex m_mutex; - threadid_t m_thread_id; +#if !USE_CPP11_THREADS threadhandle_t m_thread_handle; +#if _WIN32 + threadid_t m_thread_id; +#endif +#endif static ThreadStartFunc threadProc;