summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/error/error_macros.cpp7
-rw-r--r--editor/editor_toaster.cpp17
-rw-r--r--editor/editor_toaster.h2
3 files changed, 21 insertions, 5 deletions
diff --git a/core/error/error_macros.cpp b/core/error/error_macros.cpp
index 61bb949ed4..c236f30945 100644
--- a/core/error/error_macros.cpp
+++ b/core/error/error_macros.cpp
@@ -37,9 +37,16 @@
static ErrorHandlerList *error_handler_list = nullptr;
void add_error_handler(ErrorHandlerList *p_handler) {
+ // If p_handler is already in error_handler_list
+ // we'd better remove it first then we can add it.
+ // This prevent cyclic redundancy.
+ remove_error_handler(p_handler);
+
_global_lock();
+
p_handler->next = error_handler_list;
error_handler_list = p_handler;
+
_global_unlock();
}
diff --git a/editor/editor_toaster.cpp b/editor/editor_toaster.cpp
index 0d9a546b8e..05b895519d 100644
--- a/editor/editor_toaster.cpp
+++ b/editor/editor_toaster.cpp
@@ -173,11 +173,7 @@ void EditorToaster::_error_handler(void *p_self, const char *p_func, const char
}
Severity severity = (p_type == ERR_HANDLER_WARNING) ? SEVERITY_WARNING : SEVERITY_ERROR;
- if (Thread::get_caller_id() != Thread::get_main_id()) {
- EditorToaster::get_singleton()->call_deferred(SNAME("popup_str"), err_str, severity, tooltip_str);
- } else {
- EditorToaster::get_singleton()->popup_str(err_str, severity, tooltip_str);
- }
+ EditorToaster::get_singleton()->popup_str(err_str, severity, tooltip_str);
}
}
@@ -387,6 +383,12 @@ Control *EditorToaster::popup(Control *p_control, Severity p_severity, double p_
}
void EditorToaster::popup_str(String p_message, Severity p_severity, String p_tooltip) {
+ // 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.
+ call_deferred(SNAME("_popup_str"), p_message, p_severity, p_tooltip);
+}
+
+void EditorToaster::_popup_str(String p_message, Severity p_severity, String p_tooltip) {
// Check if we already have a popup with the given message.
Control *control = nullptr;
for (KeyValue<Control *, Toast> element : toasts) {
@@ -440,6 +442,11 @@ EditorToaster *EditorToaster::get_singleton() {
return singleton;
}
+void EditorToaster::_bind_methods() {
+ // Binding method to make it defer-able.
+ ClassDB::bind_method(D_METHOD("_popup_str", "message", "severity", "tooltip"), &EditorToaster::_popup_str);
+}
+
EditorToaster::EditorToaster() {
set_notify_transform(true);
set_process_internal(true);
diff --git a/editor/editor_toaster.h b/editor/editor_toaster.h
index aac80d8fb1..502498986a 100644
--- a/editor/editor_toaster.h
+++ b/editor/editor_toaster.h
@@ -94,9 +94,11 @@ private:
void _set_notifications_enabled(bool p_enabled);
void _repop_old();
+ void _popup_str(String p_message, Severity p_severity, String p_tooltip);
protected:
static EditorToaster *singleton;
+ static void _bind_methods();
void _notification(int p_what);