diff options
| author | Nolan Check <Nolan.Check@gmail.com> | 2009-07-10 20:22:25 +0000 |
|---|---|---|
| committer | Nolan Check <Nolan.Check@gmail.com> | 2009-07-10 20:22:25 +0000 |
| commit | 6800adf4dc168b50b7cb4fd53cac52bf6b7bfae4 (patch) | |
| tree | 475cf55d43c04d5470a50ccf016d8c28b6863dd6 /Source/Core | |
| parent | 112b742d319f16ea77911136e2626ce769ca6d39 (diff) | |
Use _beginthreadex
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3736 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/AudioCommon/Src/DSoundStream.cpp | 2 | ||||
| -rw-r--r-- | Source/Core/Common/Src/Thread.cpp | 17 | ||||
| -rw-r--r-- | Source/Core/Common/Src/Thread.h | 37 |
3 files changed, 47 insertions, 9 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<DSound *>(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 <process.h> +#endif + #ifdef SETUP_TIMER_WAITING #include <windows.h> #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 <windows.h> + +#ifdef USE_BEGINTHREADEX +#define THREAD_RETURN unsigned __stdcall +#else #define THREAD_RETURN DWORD WINAPI +#endif + #else + #define THREAD_RETURN void* #include <unistd.h> #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; +#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 }; |
