diff --git a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp index 491629d6f3..64f8f52fc5 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp @@ -232,14 +232,18 @@ namespace rsx std::scoped_lock lock(m_threadpool_mutex); if (!exit) { - m_workers.emplace_back([&] + m_workers.emplace_back([&]() { if (interactive) { + auto ref = g_fxo->get()->get(uid); + if (auto error = run_input_loop()) { rsx_log.error("Dialog input loop exited with error code=%d", error); } + + verify(HERE), ref.get() == static_cast(this); } else { diff --git a/rpcs3/Emu/RSX/Overlays/overlays.cpp b/rpcs3/Emu/RSX/Overlays/overlays.cpp index a9cd9f4de6..749fdbd0f4 100644 --- a/rpcs3/Emu/RSX/Overlays/overlays.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlays.cpp @@ -317,10 +317,26 @@ namespace rsx reader_lock lock(m_threadpool_mutex); for (auto& worker : m_workers) { - worker.join(); + if (std::this_thread::get_id() != worker.get_id() && worker.joinable()) + { + worker.join(); + } + else + { + worker.detach(); + } } } + pad::SetIntercepted(false); + + if (on_close && use_callback) + { + g_last_user_response = return_code; + on_close(return_code); + } + + // NOTE: Object removal should be the last step if (auto manager = g_fxo->get()) { if (auto dlg = manager->get()) @@ -331,14 +347,6 @@ namespace rsx manager->remove(uid); } - - pad::SetIntercepted(false); - - if (on_close && use_callback) - { - g_last_user_response = return_code; - on_close(return_code); - } } void overlay::refresh()