瀏覽代碼

thread api: added support for platforms without TLS (Thread Local Storage) support (usually older OSX llvm versions ..)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@16226 54d463be-8e91-2dee-dedb-b68131a5f0ec
blacksirius 13 年之前
父節點
當前提交
b3481a4aaf
共有 4 個文件被更改,包括 110 次插入3 次删除
  1. 43 1
      configure
  2. 24 0
      configure.in
  3. 41 1
      src/common/thread.c
  4. 2 1
      src/common/thread.h

+ 43 - 1
configure

@@ -1,5 +1,5 @@
 #! /bin/sh
-# From configure.in Revision: 16203 .
+# From configure.in Revision: 16221 .
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.67.
 #
@@ -4708,6 +4708,48 @@ fi
 
 
 
+#
+# Check if CC supports __thread attribute (Thread Local Storage)
+# (Usually our OSX friends 're lacking support of it in older llvm versions ..)
+#
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports __thread specifier (TLS)" >&5
+$as_echo_n "checking whether $CC supports __thread specifier (TLS)... " >&6; }
+if test "$cross_compiling" = yes; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5 ; }
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+		__thread int g_Test = -1;
+
+		int main(int argc, char **argv){
+			g_Test = 0;
+			return g_Test;
+		}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		CFLAGS="$CFLAGS -DHAS_TLS"
+
+else
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wno-unused-parameter" >&5
 $as_echo_n "checking whether $CC supports -Wno-unused-parameter... " >&6; }
 OLD_CFLAGS="$CFLAGS"

+ 24 - 0
configure.in

@@ -363,6 +363,30 @@ AC_RUN_IFELSE(
 )
 
 
+# 
+# Check if CC supports __thread attribute (Thread Local Storage) 
+# (Usually our OSX friends 're lacking support of it in older llvm versions ..)
+# 
+AC_MSG_CHECKING([whether $CC supports __thread specifier (TLS)])
+AC_RUN_IFELSE(
+	[
+		__thread int g_Test = -1;
+
+		int main(int argc, char **argv){
+			g_Test = 0;
+			return g_Test;		
+		}
+	],
+	[
+		AC_MSG_RESULT([yes])
+		CFLAGS="$CFLAGS -DHAS_TLS"
+	],
+	[
+		AC_MSG_RESULT([no])
+	]
+)
+
+
 AC_MSG_CHECKING([whether $CC supports -Wno-unused-parameter])
 OLD_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS -Wno-unused-parameter"

+ 41 - 1
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()
 

+ 2 - 1
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
  */