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;
+}