Fix deadlocks related to ClassDB queries about global classes #98963
+64
−43
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
ClassDB::can_instantiate()
and other reflection methods deadlock if the type is an script global class, when such script indirectly uses a not-yet-registered class. The reason is theClassDB
read lock is still held when invoking theResourceLoader
to load the class script, which may in turn need to lock for writing (for the class registration).In particular, this happens with some types related to animation tree, that aren't registered at engine startup, but can happen with others, especially ones from the user. Registration statements are also added for the animation-related types that were lacking them.
(Better reviewed disabling whitespace diff.)
Version for 4.3 submitted as #98964.