summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2023-02-13 11:54:32 +0100
committerJuan Linietsky <reduzio@gmail.com>2023-02-13 11:54:32 +0100
commit6cd587c8f40aa952c0b988f537a48085e4776dbf (patch)
treec01eecf4f5b21fa8c3a71794988f956dfff115ca
parentb7723a01d957e6492a3f20bce8a47d3559afe5c5 (diff)
Prevent recursive importing (hack)
Prevents recursion when importing files due to the ill nature of EditorProgress. The progress dialog will have to be entirely rewritten after 4.0 is out due to it being a constant source of bugs. In the meantime, this fixes the problem. Fixes #53871. Supersedes #73159.
-rw-r--r--editor/editor_file_system.cpp24
1 files changed, 21 insertions, 3 deletions
diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp
index 88831e0c33..8a595be6e6 100644
--- a/editor/editor_file_system.cpp
+++ b/editor/editor_file_system.cpp
@@ -1237,10 +1237,23 @@ void EditorFileSystem::_notification(int p_what) {
case NOTIFICATION_PROCESS: {
if (use_threads) {
+ /** This hack exists because of the EditorProgress nature
+ * of processing events recursively. This needs to be rewritten
+ * at some point entirely, but in the meantime the following
+ * hack prevents deadlock on import.
+ */
+
+ static bool prevent_recursive_process_hack = false;
+ if (prevent_recursive_process_hack) {
+ break;
+ }
+
+ prevent_recursive_process_hack = true;
+
+ bool done_importing = false;
+
if (scanning_changes) {
if (scanning_changes_done) {
- scanning_changes = false;
-
set_process(false);
thread_sources.wait_to_finish();
@@ -1251,6 +1264,8 @@ void EditorFileSystem::_notification(int p_what) {
}
emit_signal(SNAME("sources_changed"), sources_changed.size() > 0);
first_scan = false;
+ scanning_changes = false; // Changed to false here to prevent recursive triggering of scan thread.
+ done_importing = true;
}
} else if (!scanning && thread.is_started()) {
set_process(false);
@@ -1268,10 +1283,12 @@ void EditorFileSystem::_notification(int p_what) {
first_scan = false;
}
- if (!is_processing() && scan_changes_pending) {
+ if (done_importing && scan_changes_pending) {
scan_changes_pending = false;
scan_changes();
}
+
+ prevent_recursive_process_hack = false;
}
} break;
}
@@ -2180,6 +2197,7 @@ void EditorFileSystem::_reimport_thread(uint32_t p_index, ImportThreadData *p_im
}
void EditorFileSystem::reimport_files(const Vector<String> &p_files) {
+ ERR_FAIL_COND_MSG(importing, "Attempted to call reimport_files() recursively, this is not allowed.");
importing = true;
Vector<String> reloads;