Skip to content

Commit

Permalink
Improve thread safety of resource loading
Browse files Browse the repository at this point in the history
  • Loading branch information
RandomShaper committed Feb 28, 2024
1 parent fb10e67 commit 84b85d8
Showing 1 changed file with 16 additions and 1 deletion.
17 changes: 16 additions & 1 deletion core/io/resource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,12 @@
#include <stdio.h>

void Resource::emit_changed() {
emit_signal(CoreStringNames::get_singleton()->changed);
if (ResourceLoader::is_within_load() && !Thread::is_main_thread()) {
// Let the connection happen on the main thread, later, since signals are not thread-safe.
call_deferred("emit_signal", CoreStringNames::get_singleton()->changed);
} else {
emit_signal(CoreStringNames::get_singleton()->changed);
}
}

void Resource::_resource_path_changed() {
Expand Down Expand Up @@ -152,12 +157,22 @@ bool Resource::editor_can_reload_from_file() {
}

void Resource::connect_changed(const Callable &p_callable, uint32_t p_flags) {
if (ResourceLoader::is_within_load() && !Thread::is_main_thread()) {
// Let the check and connection happen on the main thread, later, since signals are not thread-safe.
callable_mp(this, &Resource::connect_changed).call_deferred(p_callable, p_flags);
return;
}
if (!is_connected(CoreStringNames::get_singleton()->changed, p_callable) || p_flags & CONNECT_REFERENCE_COUNTED) {
connect(CoreStringNames::get_singleton()->changed, p_callable, p_flags);
}
}

void Resource::disconnect_changed(const Callable &p_callable) {
if (ResourceLoader::is_within_load() && !Thread::is_main_thread()) {
// Let the check and disconnection happen on the main thread, later, since signals are not thread-safe.
callable_mp(this, &Resource::disconnect_changed).call_deferred(p_callable);
return;
}
if (is_connected(CoreStringNames::get_singleton()->changed, p_callable)) {
disconnect(CoreStringNames::get_singleton()->changed, p_callable);
}
Expand Down

0 comments on commit 84b85d8

Please sign in to comment.