ソースを参照

core/rthreads.h: use global ksr_tls_threads_mode to constrain thread
wrapping

- 0: run wrapped function directly
- 1: run wrapped function in thread for process#0 else run directly
- 2: always run wrapped function in thread

S-P Chan 1 年間 前
コミット
aa15489f0a
1 ファイル変更39 行追加0 行削除
  1. 39 0
      src/core/rthreads.h

+ 39 - 0
src/core/rthreads.h

@@ -27,6 +27,7 @@
  */
 #include <pthread.h>
 
+#include "./globals.h"
 /*
  * prototype: void *fn(void *arg) { ... }
  */
@@ -35,13 +36,21 @@ typedef void *(*_thread_proto)(void *);
 #ifndef KSR_RTHREAD_SKIP_P
 static void *run_threadP(_thread_proto fn, void *arg)
 {
+#ifdef USE_TLS
 	pthread_t tid;
 	void *ret;
 
+        if(likely(ksr_tls_threads_mode == 0 || (ksr_tls_threads_mode == 1 && process_no > 0))) {
+            return fn(arg);
+        }
+
 	pthread_create(&tid, NULL, fn, arg);
 	pthread_join(tid, &ret);
 
 	return ret;
+#else
+        fn(arg);
+#endif /* USE_TLS */
 }
 #endif
 
@@ -63,14 +72,22 @@ static void *run_thread_wrapPI(struct _thread_argsPI *args)
 
 static void *run_threadPI(_thread_protoPI fn, void *arg1, int arg2)
 {
+#ifdef USE_TLS
 	pthread_t tid;
 	void *ret;
 
+        if(likely(ksr_tls_threads_mode == 0 || (ksr_tls_threads_mode == 1 && process_no > 0))) {
+            return fn(arg1, arg2);
+        }
+
 	pthread_create(&tid, NULL, (_thread_proto)&run_thread_wrapPI,
 			&(struct _thread_argsPI){fn, arg1, arg2});
 	pthread_join(tid, &ret);
 
 	return ret;
+#else
+        return fn(arg1, arg2);
+#endif
 }
 #endif
 
@@ -91,11 +108,19 @@ static void *run_thread_wrapV(struct _thread_argsV *args)
 
 static void run_threadV(_thread_protoV fn)
 {
+#ifdef USE_TLS
 	pthread_t tid;
 
+        if(likely(ksr_tls_threads_mode == 0 || (ksr_tls_threads_mode == 1 && process_no > 0))) {
+            fn();
+        }
+
 	pthread_create(&tid, NULL, (_thread_proto)run_thread_wrapV,
 			&(struct _thread_argsV){fn});
 	pthread_join(tid, NULL);
+#else
+        fn();
+#endif
 }
 #endif
 
@@ -119,14 +144,21 @@ static void *run_thread_wrap4PP(struct _thread_args4PP *args)
 
 static int run_thread4PP(_thread_proto4PP fn, void *arg1, void *arg2)
 {
+#ifdef USE_TLS
 	pthread_t tid;
 	int ret;
 
+        if(likely(ksr_tls_threads_mode == 0 || (ksr_tls_threads_mode == 1 && process_no > 0))) {
+            return fn(arg1, arg2);
+        }
 	pthread_create(&tid, NULL, (_thread_proto)run_thread_wrap4PP,
 			&(struct _thread_args4PP){fn, arg1, arg2, &ret});
 	pthread_join(tid, NULL);
 
 	return ret;
+#else
+        return fn(arg1, arg2);
+#endif
 }
 #endif
 
@@ -148,10 +180,17 @@ static void *run_thread_wrap0P(struct _thread_args0P *args)
 
 static void run_thread0P(_thread_proto0P fn, void *arg1)
 {
+#ifdef USE_TLS
 	pthread_t tid;
 
+        if(likely(ksr_tls_threads_mode == 0 || (ksr_tls_threads_mode == 1 && process_no > 0))) {
+            fn(arg1);
+        }
 	pthread_create(&tid, NULL, (_thread_proto)run_thread_wrap0P,
 			&(struct _thread_args0P){fn, arg1});
 	pthread_join(tid, NULL);
+#else
+        fn(arg1)
+#endif
 }
 #endif