|
@@ -40,7 +40,12 @@
|
|
|
#include <stdio.h>
|
|
|
|
|
|
void Resource::emit_changed() {
|
|
|
- emit_signal(CoreStringName(changed));
|
|
|
+ if (ResourceLoader::is_within_load() && MessageQueue::get_main_singleton() != MessageQueue::get_singleton() && !MessageQueue::get_singleton()->is_flushing()) {
|
|
|
+ // Let the connection happen on the call queue, later, since signals are not thread-safe.
|
|
|
+ call_deferred("emit_signal", CoreStringName(changed));
|
|
|
+ } else {
|
|
|
+ emit_signal(CoreStringName(changed));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void Resource::_resource_path_changed() {
|
|
@@ -161,12 +166,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() && MessageQueue::get_main_singleton() != MessageQueue::get_singleton() && !MessageQueue::get_singleton()->is_flushing()) {
|
|
|
+ // Let the check and connection happen on the call queue, later, since signals are not thread-safe.
|
|
|
+ callable_mp(this, &Resource::connect_changed).call_deferred(p_callable, p_flags);
|
|
|
+ return;
|
|
|
+ }
|
|
|
if (!is_connected(CoreStringName(changed), p_callable) || p_flags & CONNECT_REFERENCE_COUNTED) {
|
|
|
connect(CoreStringName(changed), p_callable, p_flags);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void Resource::disconnect_changed(const Callable &p_callable) {
|
|
|
+ if (ResourceLoader::is_within_load() && MessageQueue::get_main_singleton() != MessageQueue::get_singleton() && !MessageQueue::get_singleton()->is_flushing()) {
|
|
|
+ // Let the check and disconnection happen on the call queue, later, since signals are not thread-safe.
|
|
|
+ callable_mp(this, &Resource::disconnect_changed).call_deferred(p_callable);
|
|
|
+ return;
|
|
|
+ }
|
|
|
if (is_connected(CoreStringName(changed), p_callable)) {
|
|
|
disconnect(CoreStringName(changed), p_callable);
|
|
|
}
|