summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorNolan Check <Nolan.Check@gmail.com>2009-07-10 20:22:25 +0000
committerNolan Check <Nolan.Check@gmail.com>2009-07-10 20:22:25 +0000
commit6800adf4dc168b50b7cb4fd53cac52bf6b7bfae4 (patch)
tree475cf55d43c04d5470a50ccf016d8c28b6863dd6 /Source
parent112b742d319f16ea77911136e2626ce769ca6d39 (diff)
Use _beginthreadex
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3736 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/AudioCommon/Src/DSoundStream.cpp2
-rw-r--r--Source/Core/Common/Src/Thread.cpp17
-rw-r--r--Source/Core/Common/Src/Thread.h37
-rw-r--r--Source/Plugins/Plugin_Wiimote/Src/wiimote_real.cpp12
4 files changed, 49 insertions, 19 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
};
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)
{