overlays: Fixup

- Avoid calling join on self thread.
- Avoid use-after-free.
This commit is contained in:
kd-11 2020-02-07 19:02:01 +03:00 committed by kd-11
parent e45360de2b
commit 54da9ac7e5
2 changed files with 22 additions and 10 deletions

View File

@ -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<display_manager>()->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<overlay*>(this);
}
else
{

View File

@ -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<display_manager>())
{
if (auto dlg = manager->get<rsx::overlays::message_dialog>())
@ -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()