From 6800adf4dc168b50b7cb4fd53cac52bf6b7bfae4 Mon Sep 17 00:00:00 2001 From: Nolan Check Date: Fri, 10 Jul 2009 20:22:25 +0000 Subject: [PATCH] Use _beginthreadex git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3736 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/AudioCommon/Src/DSoundStream.cpp | 2 +- Source/Core/Common/Src/Thread.cpp | 17 ++++---- Source/Core/Common/Src/Thread.h | 41 +++++++++++++++++-- .../Plugin_Wiimote/Src/wiimote_real.cpp | 12 +----- 4 files changed, 51 insertions(+), 21 deletions(-) diff --git a/Source/Core/AudioCommon/Src/DSoundStream.cpp b/Source/Core/AudioCommon/Src/DSoundStream.cpp index 251e892647..382ad67150 100644 --- a/Source/Core/AudioCommon/Src/DSoundStream.cpp +++ b/Source/Core/AudioCommon/Src/DSoundStream.cpp @@ -94,7 +94,7 @@ bool DSound::WriteDataToBuffer(DWORD dwOffset, // Our own write } // The audio thread. -DWORD WINAPI soundThread(void* args) +THREAD_RETURN soundThread(void* args) { (reinterpret_cast(args))->SoundLoop(); return 0; diff --git a/Source/Core/Common/Src/Thread.cpp b/Source/Core/Common/Src/Thread.cpp index 1921e5719d..c6ff629e5a 100644 --- a/Source/Core/Common/Src/Thread.cpp +++ b/Source/Core/Common/Src/Thread.cpp @@ -18,6 +18,11 @@ #include "Setup.h" #include "Thread.h" #include "Log.h" + +#ifdef USE_BEGINTHREADEX +#include +#endif + #ifdef SETUP_TIMER_WAITING #include #include "ConsoleWindow.h" @@ -68,13 +73,11 @@ void CriticalSection::Leave() Thread::Thread(ThreadFunc function, void* arg) : m_hThread(NULL), m_threadId(0) { - m_hThread = CreateThread( - 0, // Security attributes - 0, // Stack size - function, - arg, - 0, - &m_threadId); +#ifdef USE_BEGINTHREADEX + m_hThread = (HANDLE)_beginthreadex(NULL, 0, function, arg, 0, &m_threadId); +#else + m_hThread = CreateThread(NULL, 0, function, arg, 0, &m_threadId); +#endif } Thread::~Thread() diff --git a/Source/Core/Common/Src/Thread.h b/Source/Core/Common/Src/Thread.h index 509c5fe7af..76e51f83c1 100644 --- a/Source/Core/Common/Src/Thread.h +++ b/Source/Core/Common/Src/Thread.h @@ -19,9 +19,23 @@ #define _THREAD_H_ #ifdef _WIN32 + +#if defined(_MSC_VER) && defined(_MT) +// When linking with LIBCMT (the multithreaded C library), Microsoft recommends +// using _beginthreadex instead of CreateThread. +#define USE_BEGINTHREADEX +#endif + #include -#define THREAD_RETURN DWORD WINAPI + +#ifdef USE_BEGINTHREADEX +#define THREAD_RETURN unsigned __stdcall #else +#define THREAD_RETURN DWORD WINAPI +#endif + +#else + #define THREAD_RETURN void* #include #ifdef _POSIX_THREADS @@ -31,6 +45,7 @@ #else #error unsupported platform (no pthreads?) #endif + #endif // Don't include common.h here as it will break LogManager @@ -75,9 +90,17 @@ public: }; #ifdef _WIN32 -typedef DWORD (WINAPI * ThreadFunc)(void* arg); + +#ifdef USE_BEGINTHREADEX +typedef unsigned (__stdcall *ThreadFunc)(void* arg); #else +typedef DWORD (WINAPI *ThreadFunc)(void* arg); +#endif + +#else + typedef void* (*ThreadFunc)(void* arg); + #endif class Thread @@ -97,12 +120,20 @@ public: private: #ifdef _WIN32 + HANDLE m_hThread; - DWORD m_threadId; +#ifdef USE_BEGINTHREADEX + unsigned m_threadId; #else + DWORD m_threadId; +#endif + +#else + #ifdef _POSIX_THREADS pthread_t thread_id; #endif + #endif }; @@ -137,6 +168,7 @@ public: private: #ifdef _WIN32 + HANDLE m_hEvent; /* If we have waited more than five seconds we can be pretty sure that the thread is deadlocked. So then we can just as well continue and hope for the best. I could try several times that @@ -144,12 +176,15 @@ private: start another game without any noticable problems). But several times it failed to, and ended with a crash. But it's better than an infinite deadlock. */ static const int THREAD_WAIT_TIMEOUT = 5000; // INFINITE or 5000 for example + #else + bool is_set_; #ifdef _POSIX_THREADS pthread_cond_t event_; pthread_mutex_t mutex_; #endif + #endif }; diff --git a/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.cpp b/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.cpp index aaeeb45800..d0d8b3a4b9 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.cpp @@ -44,11 +44,7 @@ namespace WiiMoteReal class CWiiMote; -#ifdef _WIN32 - DWORD WINAPI ReadWiimote_ThreadFunc(void* arg); -#else - void* ReadWiimote_ThreadFunc(void* arg); -#endif +THREAD_RETURN ReadWiimote_ThreadFunc(void* arg); // Variable declarations @@ -433,11 +429,7 @@ void Update() occurs in Update(). If we are not currently using the real Wiimote we allow the separate ReadWiimote() function to run. Wo don't use them at the same time to avoid a potential collision. */ -#ifdef _WIN32 - DWORD WINAPI ReadWiimote_ThreadFunc(void* arg) -#else - void *ReadWiimote_ThreadFunc(void* arg) -#endif +THREAD_RETURN ReadWiimote_ThreadFunc(void* arg) { while (!g_Shutdown) {