Optimize updateFastFaceRow processing by removing some TileSpec copy (#5678)
[oweals/minetest.git] / src / threads.h
index bc3bf571d2d8a44aafdadd2b6b6f3dfa6a86e5c7..ce98593cd2771501bd274d6e4fc851906e2ca0ab 100644 (file)
@@ -20,22 +20,91 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #ifndef THREADS_HEADER
 #define THREADS_HEADER
 
-#include "threading/mutex.h"
+//
+// Determine which threading APIs we will use
+//
+#if __cplusplus >= 201103L
+       #define USE_CPP11_THREADS 1
+#elif defined(_WIN32)
+       #define USE_WIN_THREADS 1
+#else
+       #define USE_POSIX_THREADS 1
+#endif
+
+#if defined(_WIN32)
+       // Prefer critical section API because std::mutex is much slower on Windows
+       #define USE_WIN_MUTEX 1
+#elif __cplusplus >= 201103L
+       #define USE_CPP11_MUTEX 1
+#else
+       #define USE_POSIX_MUTEX 1
+#endif
 
-#if defined(WIN32) || defined(_WIN32_WCE)
-typedef DWORD threadid_t;
+///////////////
+
+
+#if USE_CPP11_THREADS
+       #include <thread>
+#elif USE_POSIX_THREADS
+       #include <pthread.h>
 #else
-typedef pthread_t threadid_t;
+       #ifndef WIN32_LEAN_AND_MEAN
+               #define WIN32_LEAN_AND_MEAN
+       #endif
+       #include <windows.h>
+#endif
+
+#include "threading/mutex.h"
+
+//
+// threadid_t, threadhandle_t
+//
+#if USE_CPP11_THREADS
+       typedef std::thread::id threadid_t;
+       typedef std::thread::native_handle_type threadhandle_t;
+#elif USE_WIN_THREADS
+       typedef DWORD threadid_t;
+       typedef HANDLE threadhandle_t;
+#elif USE_POSIX_THREADS
+       typedef pthread_t threadid_t;
+       typedef pthread_t threadhandle_t;
 #endif
 
-inline threadid_t get_current_thread_id()
+//
+// ThreadStartFunc
+//
+#if USE_CPP11_THREADS || USE_POSIX_THREADS
+       typedef void *ThreadStartFunc(void *param);
+#elif defined(_WIN32_WCE)
+       typedef DWORD ThreadStartFunc(LPVOID param);
+#elif defined(_WIN32)
+       typedef DWORD WINAPI ThreadStartFunc(LPVOID param);
+#endif
+
+
+inline threadid_t thr_get_current_thread_id()
 {
-#if defined(WIN32) || defined(_WIN32_WCE)
+#if USE_CPP11_THREADS
+       return std::this_thread::get_id();
+#elif USE_WIN_THREADS
        return GetCurrentThreadId();
-#else
+#elif USE_POSIX_THREADS
        return pthread_self();
 #endif
 }
 
+inline bool thr_compare_thread_id(threadid_t thr1, threadid_t thr2)
+{
+#if USE_POSIX_THREADS
+       return pthread_equal(thr1, thr2);
+#else
+       return thr1 == thr2;
 #endif
+}
 
+inline bool thr_is_current_thread(threadid_t thr)
+{
+       return thr_compare_thread_id(thr_get_current_thread_id(), thr);
+}
+
+#endif