diff options
author | blacksirius <blacksirius@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2012-06-03 20:09:39 +0000 |
---|---|---|
committer | blacksirius <blacksirius@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2012-06-03 20:09:39 +0000 |
commit | d6087662f5c19b693a000126d02ced43aad5d2f7 (patch) | |
tree | a0d47db14bdef86ae7c3a807a1bec1fe900fd82b /src/common | |
parent | 5f1c9ba7595827ee77b7d786a22177c13da4b001 (diff) | |
download | hercules-d6087662f5c19b693a000126d02ced43aad5d2f7.tar.gz hercules-d6087662f5c19b693a000126d02ced43aad5d2f7.tar.bz2 hercules-d6087662f5c19b693a000126d02ced43aad5d2f7.tar.xz hercules-d6087662f5c19b693a000126d02ced43aad5d2f7.zip |
thread api: added support for platforms without TLS (Thread Local Storage) support (usually older OSX llvm versions ..)
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@16226 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/thread.c | 42 | ||||
-rw-r--r-- | src/common/thread.h | 3 |
2 files changed, 43 insertions, 2 deletions
diff --git a/src/common/thread.c b/src/common/thread.c index 49accff4c..728c6c66a 100644 --- a/src/common/thread.c +++ b/src/common/thread.c @@ -17,6 +17,11 @@ #include "showmsg.h" #include "thread.h" +// When Compiling using MSC (on win32..) we know we have support in any case! +#ifdef _MSC_VER +#define HAS_TLS +#endif + #define RA_THREADS_MAX 64 @@ -35,7 +40,9 @@ struct rAthread { }; +#ifdef HAS_TLS __thread int g_rathread_ID = -1; +#endif /// @@ -52,7 +59,9 @@ void rathread_init(){ } // now lets init thread id 0, which represnts the main thread +#ifdef HAS_TLS g_rathread_ID = 0; +#endif l_threads[0].prio = RAT_PRIO_NORMAL; l_threads[0].proc = (rAthreadProc)0xDEADCAFE; @@ -100,7 +109,9 @@ static void *_raThreadMainRedirector( void *p ){ void *ret; // Update myID @ TLS to right id. +#ifdef HAS_TLS g_rathread_ID = ((rAthread)p)->myID; +#endif #ifndef WIN32 // When using posix threads @@ -216,18 +227,47 @@ void rathread_destroy ( rAthread handle ){ }//end: rathread_destroy() rAthread rathread_self( ){ +#ifdef HAS_TLS rAthread handle = &l_threads[g_rathread_ID]; if(handle->proc != NULL) // entry point set, so its used! return handle; +#else + // .. so no tls means we have to search the thread by its api-handle .. + int i; + + #ifdef WIN32 + HANDLE hSelf; + hSelf = GetCurrent = GetCurrentThread(); + #else + pthread_t hSelf; + hSelf = pthread_self(); + #endif + + for(i = 0; i < RA_THREADS_MAX; i++){ + if(l_threads[i].hThread == hSelf && l_threads[i].proc != NULL) + return &l_threads[i]; + } + +#endif return NULL; }//end: rathread_self() int rathread_get_tid(){ - + +#ifdef HAS_TLS return g_rathread_ID; +#else + // todo + #ifdef WIN32 + return (int)GetCurrentThreadId(); + #else + return (int)pthread_self(); + #endif + +#endif }//end: rathread_get_tid() diff --git a/src/common/thread.h b/src/common/thread.h index d4027811f..8d3441868 100644 --- a/src/common/thread.h +++ b/src/common/thread.h @@ -62,7 +62,8 @@ rAthread rathread_self( ); /** * Returns own thrad id (TID) * - * @note this is not the operating system THREAD ID! + * @note this is an unique identifier for the calling thread, and + * depends on platfrom / compiler, and may not be the systems Thread ID! * * @return -1 when fails, otherwise >= 0 */ |