Browse Source

Merge pull request #92426 from RandomShaper/fix_ed_toast_mt

Avoid editor error reporting using resource loader thread's call queues
Rémi Verschelde 1 year ago
parent
commit
ef886b0a41
3 changed files with 4 additions and 3 deletions
  1. 2 2
      core/io/resource_loader.h
  2. 1 0
      core/object/message_queue.h
  3. 1 1
      editor/gui/editor_toaster.cpp

+ 2 - 2
core/io/resource_loader.h

@@ -226,7 +226,7 @@ public:
 	// Loaders can safely use this regardless which thread they are running on.
 	static void notify_load_error(const String &p_err) {
 		if (err_notify) {
-			callable_mp_static(err_notify).call_deferred(p_err);
+			MessageQueue::get_main_singleton()->push_callable(callable_mp_static(err_notify).bind(p_err));
 		}
 	}
 	static void set_error_notify_func(ResourceLoadErrorNotify p_err_notify) {
@@ -239,7 +239,7 @@ public:
 			if (Thread::get_caller_id() == Thread::get_main_id()) {
 				dep_err_notify(p_path, p_dependency, p_type);
 			} else {
-				callable_mp_static(dep_err_notify).call_deferred(p_path, p_dependency, p_type);
+				MessageQueue::get_main_singleton()->push_callable(callable_mp_static(dep_err_notify).bind(p_path, p_dependency, p_type));
 			}
 		}
 	}

+ 1 - 0
core/object/message_queue.h

@@ -164,6 +164,7 @@ class MessageQueue : public CallQueue {
 
 public:
 	_FORCE_INLINE_ static CallQueue *get_singleton() { return thread_singleton ? thread_singleton : main_singleton; }
+	_FORCE_INLINE_ static CallQueue *get_main_singleton() { return main_singleton; }
 
 	static void set_thread_singleton_override(CallQueue *p_thread_singleton);
 

+ 1 - 1
editor/gui/editor_toaster.cpp

@@ -406,7 +406,7 @@ void EditorToaster::popup_str(const String &p_message, Severity p_severity, cons
 	// Since "_popup_str" adds nodes to the tree, and since the "add_child" method is not
 	// thread-safe, it's better to defer the call to the next cycle to be thread-safe.
 	is_processing_error = true;
-	callable_mp(this, &EditorToaster::_popup_str).call_deferred(p_message, p_severity, p_tooltip);
+	MessageQueue::get_main_singleton()->push_callable(callable_mp(this, &EditorToaster::_popup_str).bind(p_message, p_severity, p_tooltip));
 	is_processing_error = false;
 }