Merge pull request #80752 from bitsawer/fix_thread_guard

Fix CanvasItem notification thread guard
This commit is contained in:
Rémi Verschelde 2023-10-03 17:13:08 +02:00
commit 3a990e36e6
No known key found for this signature in database
GPG Key ID: C3336907360768E1
3 changed files with 22 additions and 5 deletions

View File

@ -424,14 +424,17 @@ Point2 Node2D::to_global(Point2 p_local) const {
} }
void Node2D::_notification(int p_notification) { void Node2D::_notification(int p_notification) {
ERR_THREAD_GUARD;
switch (p_notification) { switch (p_notification) {
case NOTIFICATION_ENTER_TREE: { case NOTIFICATION_ENTER_TREE: {
ERR_MAIN_THREAD_GUARD;
if (get_viewport()) { if (get_viewport()) {
get_parent()->connect(SNAME("child_order_changed"), callable_mp(get_viewport(), &Viewport::gui_set_root_order_dirty), CONNECT_REFERENCE_COUNTED); get_parent()->connect(SNAME("child_order_changed"), callable_mp(get_viewport(), &Viewport::gui_set_root_order_dirty), CONNECT_REFERENCE_COUNTED);
} }
} break; } break;
case NOTIFICATION_EXIT_TREE: { case NOTIFICATION_EXIT_TREE: {
ERR_MAIN_THREAD_GUARD;
if (get_viewport()) { if (get_viewport()) {
get_parent()->disconnect(SNAME("child_order_changed"), callable_mp(get_viewport(), &Viewport::gui_set_root_order_dirty)); get_parent()->disconnect(SNAME("child_order_changed"), callable_mp(get_viewport(), &Viewport::gui_set_root_order_dirty));
} }

View File

@ -131,10 +131,9 @@ void Node3D::_propagate_transform_changed(Node3D *p_origin) {
} }
void Node3D::_notification(int p_what) { void Node3D::_notification(int p_what) {
ERR_THREAD_GUARD;
switch (p_what) { switch (p_what) {
case NOTIFICATION_ENTER_TREE: { case NOTIFICATION_ENTER_TREE: {
ERR_MAIN_THREAD_GUARD;
ERR_FAIL_NULL(get_tree()); ERR_FAIL_NULL(get_tree());
Node *p = get_parent(); Node *p = get_parent();
@ -163,6 +162,8 @@ void Node3D::_notification(int p_what) {
} break; } break;
case NOTIFICATION_EXIT_TREE: { case NOTIFICATION_EXIT_TREE: {
ERR_MAIN_THREAD_GUARD;
notification(NOTIFICATION_EXIT_WORLD, true); notification(NOTIFICATION_EXIT_WORLD, true);
if (xform_change.in_list()) { if (xform_change.in_list()) {
get_tree()->xform_change_list.remove(&xform_change); get_tree()->xform_change_list.remove(&xform_change);
@ -176,6 +177,8 @@ void Node3D::_notification(int p_what) {
} break; } break;
case NOTIFICATION_ENTER_WORLD: { case NOTIFICATION_ENTER_WORLD: {
ERR_MAIN_THREAD_GUARD;
data.inside_world = true; data.inside_world = true;
data.viewport = nullptr; data.viewport = nullptr;
Node *parent = get_parent(); Node *parent = get_parent();
@ -198,6 +201,8 @@ void Node3D::_notification(int p_what) {
} break; } break;
case NOTIFICATION_EXIT_WORLD: { case NOTIFICATION_EXIT_WORLD: {
ERR_MAIN_THREAD_GUARD;
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
clear_gizmos(); clear_gizmos();
#endif #endif
@ -211,6 +216,8 @@ void Node3D::_notification(int p_what) {
} break; } break;
case NOTIFICATION_TRANSFORM_CHANGED: { case NOTIFICATION_TRANSFORM_CHANGED: {
ERR_THREAD_GUARD;
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
for (int i = 0; i < data.gizmos.size(); i++) { for (int i = 0; i < data.gizmos.size(); i++) {
data.gizmos.write[i]->transform(); data.gizmos.write[i]->transform();

View File

@ -273,10 +273,9 @@ void CanvasItem::_exit_canvas() {
} }
void CanvasItem::_notification(int p_what) { void CanvasItem::_notification(int p_what) {
ERR_MAIN_THREAD_GUARD;
switch (p_what) { switch (p_what) {
case NOTIFICATION_ENTER_TREE: { case NOTIFICATION_ENTER_TREE: {
ERR_MAIN_THREAD_GUARD;
ERR_FAIL_COND(!is_inside_tree()); ERR_FAIL_COND(!is_inside_tree());
Node *parent = get_parent(); Node *parent = get_parent();
@ -336,6 +335,8 @@ void CanvasItem::_notification(int p_what) {
} break; } break;
case NOTIFICATION_EXIT_TREE: { case NOTIFICATION_EXIT_TREE: {
ERR_MAIN_THREAD_GUARD;
if (xform_change.in_list()) { if (xform_change.in_list()) {
get_tree()->xform_change_list.remove(&xform_change); get_tree()->xform_change_list.remove(&xform_change);
} }
@ -357,14 +358,20 @@ void CanvasItem::_notification(int p_what) {
} break; } break;
case NOTIFICATION_VISIBILITY_CHANGED: { case NOTIFICATION_VISIBILITY_CHANGED: {
ERR_MAIN_THREAD_GUARD;
emit_signal(SceneStringNames::get_singleton()->visibility_changed); emit_signal(SceneStringNames::get_singleton()->visibility_changed);
} break; } break;
case NOTIFICATION_WORLD_2D_CHANGED: { case NOTIFICATION_WORLD_2D_CHANGED: {
ERR_MAIN_THREAD_GUARD;
_exit_canvas(); _exit_canvas();
_enter_canvas(); _enter_canvas();
} break; } break;
case NOTIFICATION_PARENTED: { case NOTIFICATION_PARENTED: {
// The node is not inside the tree during this notification. // The node is not inside the tree during this notification.
ERR_MAIN_THREAD_GUARD;
_notify_transform(); _notify_transform();
} break; } break;
} }