sys_ppu: Hotfix for detached threads

This commit is contained in:
Nekotekina 2020-03-01 18:30:16 +03:00
parent ffd5a9e91c
commit b05b16aedc

View File

@ -41,27 +41,24 @@ void _sys_ppu_thread_exit(ppu_thread& ppu, u64 errorcode)
if (jid == umax)
{
// Detach detached thread, id will be removed on cleanup
static thread_local struct cleanup_t
// Simple structure to cleanup previous thread, because can't remove its own thread
struct ppu_thread_cleaner
{
const u32 id;
atomic_t<u32> id = 0;
};
cleanup_t(u32 id)
: id(id)
{
}
auto cleaner = g_fxo->get<ppu_thread_cleaner>();
cleanup_t(const cleanup_t&) = delete;
~cleanup_t()
if (cleaner->id || !cleaner->id.compare_and_swap_test(0, ppu.id)) [[likely]]
{
if (!idm::remove<named_thread<ppu_thread>>(id))
if (u32 old_id = cleaner->id.exchange(ppu.id))
{
sys_ppu_thread.fatal("Failed to remove detached thread! (id=0x%x)", id);
if (!idm::remove<named_thread<ppu_thread>>(old_id))
{
sys_ppu_thread.fatal("Failed to remove detached thread 0x%x", old_id);
}
}
}
to_cleanup(ppu.id);
}
else if (jid != 0)
{