From 969496d93b050bf2b97c3e8f6342d3c6f2b28225 Mon Sep 17 00:00:00 2001 From: bushing Date: Fri, 9 Jan 2009 12:10:02 +0000 Subject: [PATCH] properly support POSIX threads kthx git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1838 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Common/Src/Thread.cpp | 57 ++++++++++++++++++++----------- Source/Core/Common/Src/Thread.h | 22 ++++++------ 2 files changed, 48 insertions(+), 31 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 -#elif __GNUC__ -#include -#include -#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 } diff --git a/Source/Core/Common/Src/Thread.h b/Source/Core/Common/Src/Thread.h index e1cc4895b8..fa91d9197d 100644 --- a/Source/Core/Common/Src/Thread.h +++ b/Source/Core/Common/Src/Thread.h @@ -18,28 +18,27 @@ #ifndef _THREAD_H #define _THREAD_H -#ifdef _WIN32 -#include -#else -#include -#endif - #ifdef _WIN32 #define THREAD_RETURN DWORD WINAPI #else #define THREAD_RETURN void* +#include +#ifdef _POSIX_THREADS +#include +#else +#error unsupported platform (no pthreads?) +#endif #endif #include "Common.h" - namespace Common { class CriticalSection { #ifdef _WIN32 CRITICAL_SECTION section; -#elif __GNUC__ +#else pthread_mutex_t mutex; #endif public: @@ -53,7 +52,7 @@ public: #ifdef _WIN32 typedef DWORD (WINAPI * ThreadFunc)(void* arg); -#elif __GNUC__ +#else typedef void* (*ThreadFunc)(void* arg); #endif @@ -73,7 +72,7 @@ private: #ifdef _WIN32 HANDLE m_hThread; DWORD m_threadId; -#elif __GNUC__ +#else pthread_t thread_id; #endif }; @@ -96,13 +95,14 @@ class Event #ifdef _WIN32 HANDLE m_hEvent; -#elif __GNUC__ +#else bool is_set_; pthread_cond_t event_; pthread_mutex_t mutex_; #endif }; +void InitThreading(void); void SleepCurrentThread(int ms); void SetCurrentThreadName(const char *name);