summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorblacksirius <blacksirius@54d463be-8e91-2dee-dedb-b68131a5f0ec>2012-06-03 20:09:39 +0000
committerblacksirius <blacksirius@54d463be-8e91-2dee-dedb-b68131a5f0ec>2012-06-03 20:09:39 +0000
commitd6087662f5c19b693a000126d02ced43aad5d2f7 (patch)
treea0d47db14bdef86ae7c3a807a1bec1fe900fd82b /src/common
parent5f1c9ba7595827ee77b7d786a22177c13da4b001 (diff)
downloadhercules-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.c42
-rw-r--r--src/common/thread.h3
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
*/