소스 검색

Improve custom thread numbering for POSIX

We lazily assign new IDs to threads that do not have one. This is the case for threads not created by the Godot API.
Ignacio Etcheverry 6 년 전
부모
커밋
6de04cf04c
2개의 변경된 파일28개의 추가작업 그리고 6개의 파일을 삭제
  1. 14 3
      drivers/unix/thread_posix.cpp
  2. 14 3
      platform/android/thread_jandroid.cpp

+ 14 - 3
drivers/unix/thread_posix.cpp

@@ -40,9 +40,13 @@
 #include "core/os/memory.h"
 #include "core/safe_refcount.h"
 
+static void _thread_id_key_destr_callback(void *p_value) {
+	memdelete(static_cast<Thread::ID *>(p_value));
+}
+
 static pthread_key_t _create_thread_id_key() {
 	pthread_key_t key;
-	pthread_key_create(&key, NULL);
+	pthread_key_create(&key, &_thread_id_key_destr_callback);
 	return key;
 }
 
@@ -63,7 +67,7 @@ void *ThreadPosix::thread_callback(void *userdata) {
 
 	ThreadPosix *t = reinterpret_cast<ThreadPosix *>(userdata);
 	t->id = atomic_increment(&next_thread_id);
-	pthread_setspecific(thread_id_key, (void *)t->id);
+	pthread_setspecific(thread_id_key, (void *)memnew(ID(t->id)));
 
 	ScriptServer::thread_enter(); //scripts may need to attach a stack
 
@@ -89,7 +93,14 @@ Thread *ThreadPosix::create_func_posix(ThreadCreateCallback p_callback, void *p_
 }
 Thread::ID ThreadPosix::get_thread_id_func_posix() {
 
-	return (ID)pthread_getspecific(thread_id_key);
+	void *value = pthread_getspecific(thread_id_key);
+
+	if (value)
+		return *static_cast<ID *>(value);
+
+	ID new_id = atomic_increment(&next_thread_id);
+	pthread_setspecific(thread_id_key, (void *)memnew(ID(new_id)));
+	return new_id;
 }
 void ThreadPosix::wait_to_finish_func_posix(Thread *p_thread) {
 

+ 14 - 3
platform/android/thread_jandroid.cpp

@@ -34,9 +34,13 @@
 #include "core/safe_refcount.h"
 #include "core/script_language.h"
 
+static void _thread_id_key_destr_callback(void *p_value) {
+	memdelete(static_cast<Thread::ID *>(p_value));
+}
+
 static pthread_key_t _create_thread_id_key() {
 	pthread_key_t key;
-	pthread_key_create(&key, NULL);
+	pthread_key_create(&key, &_thread_id_key_destr_callback);
 	return key;
 }
 
@@ -59,7 +63,7 @@ void *ThreadAndroid::thread_callback(void *userdata) {
 	setup_thread();
 	ScriptServer::thread_enter(); //scripts may need to attach a stack
 	t->id = atomic_increment(&next_thread_id);
-	pthread_setspecific(thread_id_key, (void *)t->id);
+	pthread_setspecific(thread_id_key, (void *)memnew(ID(t->id)));
 	t->callback(t->user);
 	ScriptServer::thread_exit();
 	return NULL;
@@ -80,7 +84,14 @@ Thread *ThreadAndroid::create_func_jandroid(ThreadCreateCallback p_callback, voi
 
 Thread::ID ThreadAndroid::get_thread_id_func_jandroid() {
 
-	return (ID)pthread_getspecific(thread_id_key);
+	void *value = pthread_getspecific(thread_id_key);
+
+	if (value)
+		return *static_cast<ID *>(value);
+
+	ID new_id = atomic_increment(&next_thread_id);
+	pthread_setspecific(thread_id_key, (void *)memnew(ID(new_id)));
+	return new_id;
 }
 
 void ThreadAndroid::wait_to_finish_func_jandroid(Thread *p_thread) {