diff --git a/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp b/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp index 1d8a6292f6..a4181bcc3d 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp @@ -52,7 +52,7 @@ namespace rsx { m_list_mutex.unlock_shared(); - if (!m_uids_to_remove.empty() || !m_type_ids_to_remove.empty()) + if (m_pending_removals_count > 0) { std::lock_guard lock(m_list_mutex); cleanup_internal(); @@ -78,18 +78,19 @@ namespace rsx { remove_uid(uid); m_list_mutex.unlock(); + return; } - else - { - m_uids_to_remove.push_back(uid); - } + + // Enqueue + m_uids_to_remove.push(uid); + m_pending_removals_count++; } void display_manager::dispose(const std::vector& uids) { std::lock_guard lock(m_list_mutex); - if (!m_uids_to_remove.empty() || !m_type_ids_to_remove.empty()) + if (m_pending_removals_count > 0) { cleanup_internal(); } @@ -144,18 +145,17 @@ namespace rsx void display_manager::cleanup_internal() { - for (const auto& uid : m_uids_to_remove) + for (auto&& uid : m_uids_to_remove.pop_all()) { remove_uid(uid); + m_pending_removals_count--; } - for (const auto& type_id : m_type_ids_to_remove) + for (auto&& type_id : m_type_ids_to_remove.pop_all()) { remove_type(type_id); + m_pending_removals_count--; } - - m_uids_to_remove.clear(); - m_type_ids_to_remove.clear(); } void display_manager::on_overlay_activated(const std::shared_ptr& /*item*/) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_manager.h b/rpcs3/Emu/RSX/Overlays/overlay_manager.h index 2ba509a6af..e746d25c0d 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_manager.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_manager.h @@ -24,8 +24,9 @@ namespace rsx std::vector> m_dirty_list; shared_mutex m_list_mutex; - std::vector m_uids_to_remove; - std::vector m_type_ids_to_remove; + lf_queue m_uids_to_remove; + lf_queue m_type_ids_to_remove; + atomic_t m_pending_removals_count = 0; bool remove_type(u32 type_id); @@ -92,11 +93,12 @@ namespace rsx { remove_type(type_id); m_list_mutex.unlock(); + return; } - else - { - m_type_ids_to_remove.push_back(type_id); - } + + // Enqueue + m_type_ids_to_remove.push(type_id); + m_pending_removals_count++; } // True if any visible elements to draw exist