From 4861ab4cfe59d791b2f97f20a4fcf576fe661685 Mon Sep 17 00:00:00 2001 From: jsjtxietian Date: Fri, 24 Nov 2023 14:58:41 +0800 Subject: [PATCH] Use mutex to protect max_index in ImportThreadData --- editor/editor_file_system.cpp | 11 ++++++----- editor/editor_file_system.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index e81f71e0e09..585ed15843b 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -2211,8 +2211,9 @@ void EditorFileSystem::reimport_file_with_custom_parameters(const String &p_file } void EditorFileSystem::_reimport_thread(uint32_t p_index, ImportThreadData *p_import_data) { - p_import_data->max_index = MAX(p_import_data->reimport_from + int(p_index), p_import_data->max_index); - _reimport_file(p_import_data->reimport_files[p_import_data->reimport_from + p_index].path); + int current_max = p_import_data->reimport_from + int(p_index); + p_import_data->max_index.exchange_if_greater(current_max); + _reimport_file(p_import_data->reimport_files[current_max].path); } void EditorFileSystem::reimport_files(const Vector &p_files) { @@ -2288,15 +2289,15 @@ void EditorFileSystem::reimport_files(const Vector &p_files) { importer->import_threaded_begin(); ImportThreadData tdata; - tdata.max_index = from; + tdata.max_index.set(from); tdata.reimport_from = from; tdata.reimport_files = reimport_files.ptr(); WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_template_group_task(this, &EditorFileSystem::_reimport_thread, &tdata, i - from + 1, -1, false, vformat(TTR("Import resources of type: %s"), reimport_files[from].importer)); int current_index = from - 1; do { - if (current_index < tdata.max_index) { - current_index = tdata.max_index; + if (current_index < tdata.max_index.get()) { + current_index = tdata.max_index.get(); pr.step(reimport_files[current_index].path.get_file(), current_index); } OS::get_singleton()->delay_usec(1); diff --git a/editor/editor_file_system.h b/editor/editor_file_system.h index 0d558c84c52..54160337595 100644 --- a/editor/editor_file_system.h +++ b/editor/editor_file_system.h @@ -282,7 +282,7 @@ class EditorFileSystem : public Node { struct ImportThreadData { const ImportFile *reimport_files; int reimport_from; - int max_index = 0; + SafeNumeric max_index; }; void _reimport_thread(uint32_t p_index, ImportThreadData *p_import_data);