Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/SDK/app_close_blocker.cpp @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/SDK/app_close_blocker.cpp Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,72 @@ +#include "foobar2000-sdk-pch.h" +#include "app_close_blocker.h" + +bool app_close_blocker::g_query() +{ + for (auto ptr : enumerate()) { + if (!ptr->query()) return false; + } + return true; +} + +service_ptr async_task_manager::g_acquire() { +#if FOOBAR2000_TARGET_VERSION >= 80 + return get()->acquire(); +#else + ptr obj; + if ( tryGet(obj) ) return obj->acquire(); + return nullptr; +#endif +} + +void fb2k::splitTask( std::function<void ()> f) { + auto taskref = async_task_manager::g_acquire(); + pfc::splitThread( [f,taskref] { + f(); + (void)taskref; // retain until here + } ); +} + +void fb2k::splitTask( pfc::thread::arg_t const & arg, std::function<void ()> f) { + auto taskref = async_task_manager::g_acquire(); + pfc::splitThread( arg, [f,taskref] { + f(); + (void)taskref; // retain until here + } ); +} + +abort_callback& fb2k::mainAborter() { + return async_task_manager::get()->get_aborter(); +} + +app_close_blocking_task_impl::app_close_blocking_task_impl(const char * name) : m_name(name) { + PFC_ASSERT( core_api::is_main_thread() ); + app_close_blocking_task_manager::get()->register_task(this); +} +app_close_blocking_task_impl::app_close_blocking_task_impl(pfc::string8&& name) : m_name(std::move(name)) { + PFC_ASSERT(core_api::is_main_thread()); + app_close_blocking_task_manager::get()->register_task(this); +} + +app_close_blocking_task_impl::~app_close_blocking_task_impl() { + PFC_ASSERT( core_api::is_main_thread() ); + app_close_blocking_task_manager::get()->unregister_task(this); +} + +void app_close_blocking_task_impl::query_task_name(pfc::string_base & out) { + out = m_name; +} + +void app_close_blocking_task_impl_dynamic::toggle_blocking(bool state) { + PFC_ASSERT( core_api::is_main_thread() ); + if (state != m_taskActive) { + auto api = app_close_blocking_task_manager::get(); + if (state) api->register_task(this); + else api->unregister_task(this); + m_taskActive = state; + } +} + +void app_close_blocking_task_impl_dynamic::query_task_name(pfc::string_base& out) { + out = m_name; +}
