Add g_fxo->init_crtp to simplify thread construction

This commit is contained in:
Nekotekina 2020-02-25 11:51:41 +03:00
parent 7eebe06931
commit fa02a04baa
3 changed files with 14 additions and 11 deletions

View file

@ -498,7 +498,7 @@ namespace rsx
vblank_count = 0;
auto vblank_body = [this]()
g_fxo->init_crtp<named_thread>("VBlank Thread", [this]()
{
// See sys_timer_usleep for details
#ifdef __linux__
@ -562,11 +562,9 @@ namespace rsx
thread_ctrl::wait_for(100);
}
};
});
g_fxo->init<named_thread<decltype(vblank_body)>>("VBlank Thread", std::move(vblank_body));
auto decomp_body = [this]
g_fxo->init_crtp<named_thread>("RSX Decompiler Thread", [this]
{
if (g_cfg.video.disable_asynchronous_shader_compiler)
{
@ -597,9 +595,7 @@ namespace rsx
}
on_decompiler_exit();
};
g_fxo->init<named_thread<decltype(decomp_body)>>("RSX Decompiler Thread", std::move(decomp_body));
});
// Raise priority above other threads
thread_ctrl::set_native_priority(1);

View file

@ -868,7 +868,7 @@ void Emulator::Load(const std::string& title_id, bool add_only, bool force_globa
// Workaround for analyser glitches
vm::falloc(0x10000, 0xf0000, vm::main);
auto sprx_loader_body = [this]
g_fxo->init_crtp<named_thread>("SPRX Loader"sv, [this]
{
std::vector<std::string> dir_queue;
dir_queue.emplace_back(m_path + '/');
@ -983,9 +983,8 @@ void Emulator::Load(const std::string& title_id, bool add_only, bool force_globa
{
Emu.Stop();
});
};
});
g_fxo->init<named_thread<decltype(sprx_loader_body)>>("SPRX Loader"sv, std::move(sprx_loader_body));
return;
}

View file

@ -165,6 +165,14 @@ namespace stx
return obj;
}
// Special stuff
template <template <class...> typename CTAD, typename... Args>
auto init_crtp(Args&&... args) noexcept
{
using T = decltype(CTAD{std::forward<Args>(args)...});
return init<T>(std::forward<Args>(args)...);
}
// Obtain object pointer (the only thread safe function)
template <typename T>
T* get() const noexcept