diff options
| author | bushing <bushing@gmail.com> | 2009-01-09 12:10:02 +0000 |
|---|---|---|
| committer | bushing <bushing@gmail.com> | 2009-01-09 12:10:02 +0000 |
| commit | 969496d93b050bf2b97c3e8f6342d3c6f2b28225 (patch) | |
| tree | 83c43460551a435f90dda6ae854e7bc31cbd8f26 /Source/Core/Common/Src/Thread.cpp | |
| parent | 96f9e7a82e8e5862a906adbe786422226f51c341 (diff) | |
properly support POSIX threads kthx
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1838 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/Common/Src/Thread.cpp')
| -rw-r--r-- | Source/Core/Common/Src/Thread.cpp | 57 |
1 files changed, 37 insertions, 20 deletions
diff --git a/Source/Core/Common/Src/Thread.cpp b/Source/Core/Common/Src/Thread.cpp index 853918cf06..abe6fbaf8b 100644 --- a/Source/Core/Common/Src/Thread.cpp +++ b/Source/Core/Common/Src/Thread.cpp @@ -15,19 +15,10 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#include "Common.h" - -#ifdef _WIN32 -#include <windows.h> -#elif __GNUC__ -#include <unistd.h> -#include <pthread.h> -#else -#error unsupported platform -#endif - #include "Thread.h" +#define THREAD_DEBUG 1 + namespace Common { #ifdef _WIN32 @@ -205,10 +196,13 @@ LONG SyncInterlockedExchange(LONG *Dest, LONG Val) return InterlockedExchange(Dest, Val); } -#elif __GNUC__ +#else // !WIN32, so must be POSIX threads + +pthread_key_t threadname_key; + CriticalSection::CriticalSection(int spincount_unused) { - pthread_mutex_init(&mutex, 0); + pthread_mutex_init(&mutex, NULL); } @@ -220,7 +214,9 @@ CriticalSection::~CriticalSection() void CriticalSection::Enter() { - pthread_mutex_lock(&mutex); + int ret = pthread_mutex_lock(&mutex); + if (ret) fprintf(stderr, "%s: pthread_mutex_lock(%p) failed: %s\n", + __FUNCTION__, &mutex, strerror(ret)); } @@ -232,7 +228,9 @@ bool CriticalSection::TryEnter() void CriticalSection::Leave() { - pthread_mutex_unlock(&mutex); + int ret = pthread_mutex_unlock(&mutex); + if (ret) fprintf(stderr, "%s: pthread_mutex_unlock(%p) failed: %s\n", + __FUNCTION__, &mutex, strerror(ret)); } @@ -242,7 +240,13 @@ Thread::Thread(ThreadFunc function, void* arg) pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setstacksize(&attr, 1024 * 1024); - pthread_create(&thread_id, &attr, function, arg); + int ret = pthread_create(&thread_id, &attr, function, arg); + if (ret) fprintf(stderr, "%s: pthread_create(%p, %p, %p, %p) failed: %s\n", + __FUNCTION__, &thread_id, &attr, function, arg, strerror(ret)); + +#ifdef THREAD_DEBUG + fprintf(stderr, "created new thread %d (func=%p, arg=%p)\n", thread_id, function, arg); +#endif } @@ -257,9 +261,10 @@ void Thread::WaitForDeath() if (thread_id) { void* exit_status; - pthread_join(thread_id, &exit_status); - if (exit_status) - fprintf(stderr, "error %d joining thread\n", *(int *)exit_status); + int ret = pthread_join(thread_id, &exit_status); + if (ret) fprintf(stderr, "error joining thread %d: %s\n", thread_id, strerror(ret)); + if (exit_status) + fprintf(stderr, "thread %d exited with status %d\n", thread_id, *(int *)exit_status); thread_id = 0; } } @@ -297,6 +302,15 @@ void Thread::SetCurrentThreadAffinity(int mask) #endif } +void InitThreading() { + static int thread_init_done = 0; + if (thread_init_done) return; + thread_init_done++; + + if (pthread_key_create(&threadname_key, NULL/*free*/) != 0) + perror("Unable to create thread name key: "); + +} void SleepCurrentThread(int ms) { @@ -306,7 +320,10 @@ void SleepCurrentThread(int ms) void SetCurrentThreadName(const TCHAR* szThreadName) { - // noop + pthread_setspecific(threadname_key, strdup(szThreadName)); +#ifdef THREAD_DEBUG + fprintf(stderr, "%s(%s)\n", __FUNCTION__, szThreadName); +#endif } |
