Fix race on thread creation
authorShadowNinja <shadowninja@minetest.net>
Mon, 7 Mar 2016 21:55:32 +0000 (16:55 -0500)
committerShadowNinja <shadowninja@minetest.net>
Thu, 28 Apr 2016 17:21:46 +0000 (13:21 -0400)
This often broke the threading tests on OSX.

src/threading/thread.cpp
src/threading/thread.h

index 8688c4cbf0079ab047ace82d18c8d8a2e86b3570..ecf8563f135605b9ee4405bc829e75a1c73a2940 100644 (file)
@@ -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)
index 6a24afffb72ea9b1299c7df3239f7c5cef4caabe..10732c44201ab7171a79d48769fc7db15a25d073 100644 (file)
@@ -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<bool> 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;