浏览代码

Merge pull request #73793 from myaaaaaaaaa/init-race

Fix some race conditions that happen during initialization
Rémi Verschelde 2 年之前
父节点
当前提交
e80ab423ef
共有 3 个文件被更改,包括 8 次插入8 次删除
  1. 4 4
      core/io/ip.cpp
  2. 3 3
      core/os/thread.cpp
  3. 1 1
      core/os/thread.h

+ 4 - 4
core/io/ip.cpp

@@ -75,7 +75,7 @@ struct _IP_ResolverPrivate {
 	Semaphore sem;
 
 	Thread thread;
-	bool thread_abort = false;
+	SafeFlag thread_abort;
 
 	void resolve_queues() {
 		for (int i = 0; i < IP::RESOLVER_MAX_QUERIES; i++) {
@@ -111,7 +111,7 @@ struct _IP_ResolverPrivate {
 	static void _thread_function(void *self) {
 		_IP_ResolverPrivate *ipr = static_cast<_IP_ResolverPrivate *>(self);
 
-		while (!ipr->thread_abort) {
+		while (!ipr->thread_abort.is_set()) {
 			ipr->sem.wait();
 			ipr->resolve_queues();
 		}
@@ -343,12 +343,12 @@ IP::IP() {
 	singleton = this;
 	resolver = memnew(_IP_ResolverPrivate);
 
-	resolver->thread_abort = false;
+	resolver->thread_abort.clear();
 	resolver->thread.start(_IP_ResolverPrivate::_thread_function, resolver);
 }
 
 IP::~IP() {
-	resolver->thread_abort = true;
+	resolver->thread_abort.set();
 	resolver->sem.post();
 	resolver->thread.wait_to_finish();
 

+ 3 - 3
core/os/thread.cpp

@@ -50,8 +50,8 @@ void Thread::_set_platform_functions(const PlatformFunctions &p_functions) {
 	platform_functions = p_functions;
 }
 
-void Thread::callback(Thread *p_self, const Settings &p_settings, Callback p_callback, void *p_userdata) {
-	Thread::caller_id = _thread_id_hash(p_self->thread.get_id());
+void Thread::callback(ID p_caller_id, const Settings &p_settings, Callback p_callback, void *p_userdata) {
+	Thread::caller_id = p_caller_id;
 	if (platform_functions.set_priority) {
 		platform_functions.set_priority(p_settings.priority);
 	}
@@ -79,7 +79,7 @@ void Thread::start(Thread::Callback p_callback, void *p_user, const Settings &p_
 		std::thread empty_thread;
 		thread.swap(empty_thread);
 	}
-	std::thread new_thread(&Thread::callback, this, p_settings, p_callback, p_user);
+	std::thread new_thread(&Thread::callback, _thread_id_hash(thread.get_id()), p_settings, p_callback, p_user);
 	thread.swap(new_thread);
 	id = _thread_id_hash(thread.get_id());
 }

+ 1 - 1
core/os/thread.h

@@ -82,7 +82,7 @@ private:
 	static thread_local ID caller_id;
 	std::thread thread;
 
-	static void callback(Thread *p_self, const Settings &p_settings, Thread::Callback p_callback, void *p_userdata);
+	static void callback(ID p_caller_id, const Settings &p_settings, Thread::Callback p_callback, void *p_userdata);
 
 	static PlatformFunctions platform_functions;