diff --git a/core/templates/rid_owner.h b/core/templates/rid_owner.h index 3ff34c407e4..f8713409248 100644 --- a/core/templates/rid_owner.h +++ b/core/templates/rid_owner.h @@ -33,7 +33,7 @@ #include "core/os/memory.h" #include "core/os/mutex.h" #include "core/string/print_string.h" -#include "core/templates/list.h" +#include "core/templates/local_vector.h" #include "core/templates/rid.h" #include "core/templates/safe_refcount.h" @@ -382,19 +382,21 @@ public: _FORCE_INLINE_ uint32_t get_rid_count() const { return alloc_count; } - void get_owned_list(List *p_owned) const { + LocalVector get_owned_list() const { + LocalVector owned; if constexpr (THREAD_SAFE) { mutex.lock(); } for (size_t i = 0; i < max_alloc; i++) { uint64_t validator = chunks[i / elements_in_chunk][i % elements_in_chunk].validator; if (validator != 0xFFFFFFFF) { - p_owned->push_back(_make_from_id((validator << 32) | i)); + owned.push_back(_make_from_id((validator << 32) | i)); } } if constexpr (THREAD_SAFE) { mutex.unlock(); } + return owned; } //used for fast iteration in the elements or RIDs @@ -506,8 +508,8 @@ public: return alloc.get_rid_count(); } - _FORCE_INLINE_ void get_owned_list(List *p_owned) const { - return alloc.get_owned_list(p_owned); + _FORCE_INLINE_ LocalVector get_owned_list() const { + return alloc.get_owned_list(); } void fill_owned_buffer(RID *p_rid_buffer) const { @@ -562,8 +564,8 @@ public: return alloc.get_rid_count(); } - _FORCE_INLINE_ void get_owned_list(List *p_owned) const { - return alloc.get_owned_list(p_owned); + _FORCE_INLINE_ LocalVector get_owned_list() const { + return alloc.get_owned_list(); } void fill_owned_buffer(RID *p_rid_buffer) const { alloc.fill_owned_buffer(p_rid_buffer); diff --git a/drivers/gles3/shader_gles3.cpp b/drivers/gles3/shader_gles3.cpp index d7070d52f4a..2411cd3025e 100644 --- a/drivers/gles3/shader_gles3.cpp +++ b/drivers/gles3/shader_gles3.cpp @@ -841,13 +841,11 @@ bool ShaderGLES3::shader_cache_save_compressed_zstd = true; bool ShaderGLES3::shader_cache_save_debug = true; ShaderGLES3::~ShaderGLES3() { - List remaining; - version_owner.get_owned_list(&remaining); + LocalVector remaining = version_owner.get_owned_list(); if (remaining.size()) { ERR_PRINT(itos(remaining.size()) + " shaders of type " + name + " were never freed"); - while (remaining.size()) { - version_free(remaining.front()->get()); - remaining.pop_front(); + for (RID &rid : remaining) { + version_free(rid); } } } diff --git a/drivers/gles3/storage/texture_storage.cpp b/drivers/gles3/storage/texture_storage.cpp index b52b6a8f198..7035a79d5e5 100644 --- a/drivers/gles3/storage/texture_storage.cpp +++ b/drivers/gles3/storage/texture_storage.cpp @@ -1470,10 +1470,7 @@ void TextureStorage::texture_set_detect_roughness_callback(RID p_texture, RS::Te } void TextureStorage::texture_debug_usage(List *r_info) { - List textures; - texture_owner.get_owned_list(&textures); - - for (const RID &rid : textures) { + for (const RID &rid : texture_owner.get_owned_list()) { Texture *t = texture_owner.get_or_null(rid); if (!t) { continue; diff --git a/modules/navigation_2d/2d/godot_navigation_server_2d.cpp b/modules/navigation_2d/2d/godot_navigation_server_2d.cpp index 2b4f898dafd..048208f5e52 100644 --- a/modules/navigation_2d/2d/godot_navigation_server_2d.cpp +++ b/modules/navigation_2d/2d/godot_navigation_server_2d.cpp @@ -32,6 +32,7 @@ #include "core/os/mutex.h" #include "scene/main/node.h" +#include #ifdef CLIPPER2_ENABLED #include "nav_mesh_generator_2d.h" @@ -193,11 +194,12 @@ void GodotNavigationServer2D::add_command(SetCommand2D *p_command) { TypedArray GodotNavigationServer2D::get_maps() const { TypedArray all_map_rids; - List maps_owned; - map_owner.get_owned_list(&maps_owned); - if (maps_owned.size()) { - for (const RID &E : maps_owned) { - all_map_rids.push_back(E); + LocalVector maps_owned = map_owner.get_owned_list(); + uint32_t map_count = maps_owned.size(); + if (map_count) { + all_map_rids.resize(map_count); + for (uint32_t i = 0; i < map_count; i++) { + all_map_rids[i] = maps_owned[i]; } } return all_map_rids; diff --git a/modules/navigation_3d/3d/godot_navigation_server_3d.cpp b/modules/navigation_3d/3d/godot_navigation_server_3d.cpp index 498566a04e7..d4469d3c3ea 100644 --- a/modules/navigation_3d/3d/godot_navigation_server_3d.cpp +++ b/modules/navigation_3d/3d/godot_navigation_server_3d.cpp @@ -94,11 +94,12 @@ void GodotNavigationServer3D::add_command(SetCommand3D *command) { TypedArray GodotNavigationServer3D::get_maps() const { TypedArray all_map_rids; - List maps_owned; - map_owner.get_owned_list(&maps_owned); - if (maps_owned.size()) { - for (const RID &E : maps_owned) { - all_map_rids.push_back(E); + LocalVector maps_owned = map_owner.get_owned_list(); + uint32_t map_count = maps_owned.size(); + if (map_count) { + all_map_rids.resize(map_count); + for (uint32_t i = 0; i < map_count; i++) { + all_map_rids[i] = maps_owned[i]; } } return all_map_rids; diff --git a/modules/openxr/openxr_api.cpp b/modules/openxr/openxr_api.cpp index 4e0a0535c44..befc3ebe202 100644 --- a/modules/openxr/openxr_api.cpp +++ b/modules/openxr/openxr_api.cpp @@ -1415,9 +1415,7 @@ bool OpenXRAPI::on_state_synchronized() { print_verbose("On state synchronized"); // Just in case, see if we already have active trackers... - List trackers; - tracker_owner.get_owned_list(&trackers); - for (const RID &tracker : trackers) { + for (const RID &tracker : tracker_owner.get_owned_list()) { tracker_check_profile(tracker); } @@ -2066,9 +2064,7 @@ bool OpenXRAPI::poll_events() { XrEventDataInteractionProfileChanged *event = (XrEventDataInteractionProfileChanged *)&runtimeEvent; - List trackers; - tracker_owner.get_owned_list(&trackers); - for (const RID &tracker : trackers) { + for (const RID &tracker : tracker_owner.get_owned_list()) { tracker_check_profile(tracker, event->session); } @@ -2897,12 +2893,10 @@ XrPath OpenXRAPI::get_xr_path(const String &p_path) { } RID OpenXRAPI::get_tracker_rid(XrPath p_path) { - List current; - tracker_owner.get_owned_list(¤t); - for (const RID &E : current) { - Tracker *tracker = tracker_owner.get_or_null(E); + for (const RID &tracker_rid : tracker_owner.get_owned_list()) { + Tracker *tracker = tracker_owner.get_or_null(tracker_rid); if (tracker && tracker->toplevel_path == p_path) { - return E; + return tracker_rid; } } @@ -2910,12 +2904,10 @@ RID OpenXRAPI::get_tracker_rid(XrPath p_path) { } RID OpenXRAPI::find_tracker(const String &p_name) { - List current; - tracker_owner.get_owned_list(¤t); - for (const RID &E : current) { - Tracker *tracker = tracker_owner.get_or_null(E); + for (const RID &tracker_rid : tracker_owner.get_owned_list()) { + Tracker *tracker = tracker_owner.get_or_null(tracker_rid); if (tracker && tracker->name == p_name) { - return E; + return tracker_rid; } } @@ -3023,12 +3015,10 @@ RID OpenXRAPI::action_set_create(const String p_name, const String p_localized_n } RID OpenXRAPI::find_action_set(const String p_name) { - List current; - action_set_owner.get_owned_list(¤t); - for (const RID &E : current) { - ActionSet *action_set = action_set_owner.get_or_null(E); + for (const RID &action_set_rid : action_set_owner.get_owned_list()) { + ActionSet *action_set = action_set_owner.get_or_null(action_set_rid); if (action_set && action_set->name == p_name) { - return E; + return action_set_rid; } } @@ -3127,12 +3117,10 @@ void OpenXRAPI::action_set_free(RID p_action_set) { } RID OpenXRAPI::get_action_rid(XrAction p_action) { - List current; - action_owner.get_owned_list(¤t); - for (const RID &E : current) { - Action *action = action_owner.get_or_null(E); + for (const RID &action_rid : action_owner.get_owned_list()) { + Action *action = action_owner.get_or_null(action_rid); if (action && action->handle == p_action) { - return E; + return action_rid; } } @@ -3140,12 +3128,10 @@ RID OpenXRAPI::get_action_rid(XrAction p_action) { } RID OpenXRAPI::find_action(const String &p_name, const RID &p_action_set) { - List current; - action_owner.get_owned_list(¤t); - for (const RID &E : current) { - Action *action = action_owner.get_or_null(E); + for (const RID &action_rid : action_owner.get_owned_list()) { + Action *action = action_owner.get_or_null(action_rid); if (action && action->name == p_name && (p_action_set.is_null() || action->action_set_rid == p_action_set)) { - return E; + return action_rid; } } @@ -3257,12 +3243,10 @@ void OpenXRAPI::action_free(RID p_action) { } RID OpenXRAPI::get_interaction_profile_rid(XrPath p_path) { - List current; - interaction_profile_owner.get_owned_list(¤t); - for (const RID &E : current) { - InteractionProfile *ip = interaction_profile_owner.get_or_null(E); + for (const RID &ip_rid : interaction_profile_owner.get_owned_list()) { + InteractionProfile *ip = interaction_profile_owner.get_or_null(ip_rid); if (ip && ip->path == p_path) { - return E; + return ip_rid; } } diff --git a/servers/rendering/renderer_canvas_cull.cpp b/servers/rendering/renderer_canvas_cull.cpp index 03c347c3217..b7285e9d8e0 100644 --- a/servers/rendering/renderer_canvas_cull.cpp +++ b/servers/rendering/renderer_canvas_cull.cpp @@ -2670,16 +2670,15 @@ bool RendererCanvasCull::free(RID p_rid) { template void RendererCanvasCull::_free_rids(T &p_owner, const char *p_type) { - List owned; - p_owner.get_owned_list(&owned); + LocalVector owned = p_owner.get_owned_list(); if (owned.size()) { if (owned.size() == 1) { WARN_PRINT(vformat("1 RID of type \"%s\" was leaked.", p_type)); } else { WARN_PRINT(vformat("%d RIDs of type \"%s\" were leaked.", owned.size(), p_type)); } - for (const RID &E : owned) { - free(E); + for (const RID &rid : owned) { + free(rid); } } } diff --git a/servers/rendering/renderer_rd/shader_rd.cpp b/servers/rendering/renderer_rd/shader_rd.cpp index 8910876ffa1..7efe525df02 100644 --- a/servers/rendering/renderer_rd/shader_rd.cpp +++ b/servers/rendering/renderer_rd/shader_rd.cpp @@ -748,10 +748,8 @@ void ShaderRD::enable_group(int p_group) { group_enabled.write[p_group] = true; // Compile all versions again to include the new group. - List all_versions; - version_owner.get_owned_list(&all_versions); - for (const RID &E : all_versions) { - Version *version = version_owner.get_or_null(E); + for (const RID &version_rid : version_owner.get_owned_list()) { + Version *version = version_owner.get_or_null(version_rid); version->mutex->lock(); _compile_version_start(version, p_group); version->mutex->unlock(); @@ -907,13 +905,11 @@ bool ShaderRD::shader_cache_save_compressed_zstd = true; bool ShaderRD::shader_cache_save_debug = true; ShaderRD::~ShaderRD() { - List remaining; - version_owner.get_owned_list(&remaining); + LocalVector remaining = version_owner.get_owned_list(); if (remaining.size()) { ERR_PRINT(itos(remaining.size()) + " shaders of type " + name + " were never freed"); - while (remaining.size()) { - version_free(remaining.front()->get()); - remaining.pop_front(); + for (const RID &version_rid : remaining) { + version_free(version_rid); } } } diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp index 613114b8a99..259de53a37b 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp @@ -1640,10 +1640,7 @@ void TextureStorage::texture_set_detect_roughness_callback(RID p_texture, RS::Te } void TextureStorage::texture_debug_usage(List *r_info) { - List textures; - texture_owner.get_owned_list(&textures); - - for (const RID &rid : textures) { + for (const RID &rid : texture_owner.get_owned_list()) { Texture *t = texture_owner.get_or_null(rid); if (!t) { continue; diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp index d02fd95c1ed..18adea7ae94 100644 --- a/servers/rendering/rendering_device.cpp +++ b/servers/rendering/rendering_device.cpp @@ -6946,21 +6946,20 @@ void RenderingDevice::_save_pipeline_cache(void *p_data) { template void RenderingDevice::_free_rids(T &p_owner, const char *p_type) { - List owned; - p_owner.get_owned_list(&owned); + LocalVector owned = p_owner.get_owned_list(); if (owned.size()) { if (owned.size() == 1) { WARN_PRINT(vformat("1 RID of type \"%s\" was leaked.", p_type)); } else { WARN_PRINT(vformat("%d RIDs of type \"%s\" were leaked.", owned.size(), p_type)); } - for (const RID &E : owned) { + for (const RID &rid : owned) { #ifdef DEV_ENABLED - if (resource_names.has(E)) { - print_line(String(" - ") + resource_names[E]); + if (resource_names.has(rid)) { + print_line(String(" - ") + resource_names[rid]); } #endif - free(E); + free(rid); } } } @@ -7157,36 +7156,35 @@ void RenderingDevice::finalize() { _free_rids(sampler_owner, "Sampler"); { // For textures it's a bit more difficult because they may be shared. - List owned; - texture_owner.get_owned_list(&owned); + LocalVector owned = texture_owner.get_owned_list(); if (owned.size()) { if (owned.size() == 1) { WARN_PRINT("1 RID of type \"Texture\" was leaked."); } else { WARN_PRINT(vformat("%d RIDs of type \"Texture\" were leaked.", owned.size())); } + LocalVector owned_non_shared; // Free shared first. - for (List::Element *E = owned.front(); E;) { - List::Element *N = E->next(); - if (texture_is_shared(E->get())) { + for (const RID &texture_rid : owned) { + if (texture_is_shared(texture_rid)) { #ifdef DEV_ENABLED - if (resource_names.has(E->get())) { - print_line(String(" - ") + resource_names[E->get()]); + if (resource_names.has(texture_rid)) { + print_line(String(" - ") + resource_names[texture_rid]); } #endif - free(E->get()); - owned.erase(E); + free(texture_rid); + } else { + owned_non_shared.push_back(texture_rid); } - E = N; } // Free non shared second, this will avoid an error trying to free unexisting textures due to dependencies. - for (const RID &E : owned) { + for (const RID &texture_rid : owned_non_shared) { #ifdef DEV_ENABLED - if (resource_names.has(E)) { - print_line(String(" - ") + resource_names[E]); + if (resource_names.has(texture_rid)) { + print_line(String(" - ") + resource_names[texture_rid]); } #endif - free(E); + free(texture_rid); } } } diff --git a/servers/rendering/storage/compositor_storage.cpp b/servers/rendering/storage/compositor_storage.cpp index 102efbeea1d..06b6b4cbca2 100644 --- a/servers/rendering/storage/compositor_storage.cpp +++ b/servers/rendering/storage/compositor_storage.cpp @@ -57,9 +57,7 @@ void RendererCompositorStorage::compositor_effect_free(RID p_rid) { ERR_FAIL_NULL(effect); // Remove this RID from any compositor that uses it. - List compositor_rids; - compositor_owner.get_owned_list(&compositor_rids); - for (const RID &compositor_rid : compositor_rids) { + for (const RID &compositor_rid : compositor_owner.get_owned_list()) { Compositor *compositor = compositor_owner.get_or_null(compositor_rid); if (compositor) { compositor->compositor_effects.erase(p_rid);