From 9406926f8bb75c2fa17a6e64906928daf3bde7d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20J=2E=20Est=C3=A9banez?= Date: Fri, 13 Dec 2024 12:49:10 +0100 Subject: [PATCH] Fix deadlock possibility in threaded load of materials --- scene/resources/canvas_item_material.cpp | 6 +++++- scene/resources/material.cpp | 6 +++++- scene/resources/particle_process_material.cpp | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/scene/resources/canvas_item_material.cpp b/scene/resources/canvas_item_material.cpp index 76e99aca929..54dd5465589 100644 --- a/scene/resources/canvas_item_material.cpp +++ b/scene/resources/canvas_item_material.cpp @@ -157,9 +157,13 @@ void CanvasItemMaterial::flush_changes() { } void CanvasItemMaterial::_queue_shader_change() { + if (!_is_initialized()) { + return; + } + MutexLock lock(material_mutex); - if (_is_initialized() && !element.in_list()) { + if (!element.in_list()) { dirty_materials.add(&element); } } diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp index 7d121c9d87f..288eb7ee7ac 100644 --- a/scene/resources/material.cpp +++ b/scene/resources/material.cpp @@ -1878,9 +1878,13 @@ void BaseMaterial3D::flush_changes() { } void BaseMaterial3D::_queue_shader_change() { + if (!_is_initialized()) { + return; + } + MutexLock lock(material_mutex); - if (_is_initialized() && !element.in_list()) { + if (!element.in_list()) { dirty_materials.add(&element); } } diff --git a/scene/resources/particle_process_material.cpp b/scene/resources/particle_process_material.cpp index ee986f5820d..1dd05ff4440 100644 --- a/scene/resources/particle_process_material.cpp +++ b/scene/resources/particle_process_material.cpp @@ -1164,9 +1164,13 @@ void ParticleProcessMaterial::flush_changes() { } void ParticleProcessMaterial::_queue_shader_change() { + if (!_is_initialized()) { + return; + } + MutexLock lock(material_mutex); - if (_is_initialized() && !element.in_list()) { + if (!element.in_list()) { dirty_materials.add(&element); } }