mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-06 23:11:25 +12:00
Emu: Run Qt events while calling Emu.Cleanup
This commit is contained in:
parent
cb5fd17635
commit
7cb2977ede
2 changed files with 46 additions and 2 deletions
|
@ -3895,6 +3895,40 @@ bool Emulator::Quit(bool force_quit)
|
||||||
|
|
||||||
void Emulator::CleanUp()
|
void Emulator::CleanUp()
|
||||||
{
|
{
|
||||||
|
// Signal threads
|
||||||
|
if (auto rsx = g_fxo->try_get<rsx::thread>())
|
||||||
|
{
|
||||||
|
*static_cast<cpu_thread*>(rsx) = thread_state::aborting;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto& [type, data] : *g_fxo)
|
||||||
|
{
|
||||||
|
if (type.thread_op)
|
||||||
|
{
|
||||||
|
type.thread_op(data, thread_state::aborting);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Join threads
|
||||||
|
qt_events_aware_op(50, [&]()
|
||||||
|
{
|
||||||
|
bool has_running = false;
|
||||||
|
|
||||||
|
for (const auto& [type, data] : *g_fxo)
|
||||||
|
{
|
||||||
|
if (type.thread_op)
|
||||||
|
{
|
||||||
|
if (type.thread_op(data, thread_state::aborting) != thread_state::finished)
|
||||||
|
{
|
||||||
|
has_running = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return has_running == false;
|
||||||
|
});
|
||||||
|
|
||||||
// Deinitialize object manager to prevent any hanging objects at program exit
|
// Deinitialize object manager to prevent any hanging objects at program exit
|
||||||
g_fxo->clear();
|
g_fxo->clear();
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,7 @@ namespace stx
|
||||||
struct typeinfo
|
struct typeinfo
|
||||||
{
|
{
|
||||||
bool(*create)(uchar* ptr, manual_typemap&, utils::serial*, std::string_view) noexcept = nullptr;
|
bool(*create)(uchar* ptr, manual_typemap&, utils::serial*, std::string_view) noexcept = nullptr;
|
||||||
void(*thread_op)(void* ptr, thread_state) noexcept = nullptr;
|
thread_state(*thread_op)(void* ptr, thread_state) noexcept = nullptr;
|
||||||
void(*save)(void* ptr, utils::serial&) noexcept = nullptr;
|
void(*save)(void* ptr, utils::serial&) noexcept = nullptr;
|
||||||
bool(*saveable)(bool) noexcept = nullptr;
|
bool(*saveable)(bool) noexcept = nullptr;
|
||||||
void(*destroy)(void* ptr) noexcept = nullptr;
|
void(*destroy)(void* ptr) noexcept = nullptr;
|
||||||
|
@ -137,10 +137,20 @@ namespace stx
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static void call_thread_op(void* ptr, thread_state state) noexcept
|
static thread_state call_thread_op(void* ptr, thread_state state) noexcept
|
||||||
{
|
{
|
||||||
// Abort and/or join (expected thread_state::aborting or thread_state::finished)
|
// Abort and/or join (expected thread_state::aborting or thread_state::finished)
|
||||||
*std::launder(static_cast<T*>(ptr)) = state;
|
*std::launder(static_cast<T*>(ptr)) = state;
|
||||||
|
|
||||||
|
if constexpr (std::is_convertible_v<const T&, thread_state>)
|
||||||
|
{
|
||||||
|
return *std::launder(static_cast<T*>(ptr));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
constexpr thread_state context_finished{3};
|
||||||
|
return context_finished;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue