Mercurial > foo_out_sdl
comparison foosdk/sdk/foobar2000/SDK/main_thread_callback.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 |
comparison
equal
deleted
inserted
replaced
| 0:e9bb126753e7 | 1:20d02a178406 |
|---|---|
| 1 #include "foobar2000-sdk-pch.h" | |
| 2 #include "main_thread_callback.h" | |
| 3 #include "abort_callback.h" | |
| 4 #include <memory> | |
| 5 #include <pfc/synchro.h> | |
| 6 | |
| 7 | |
| 8 void main_thread_callback::callback_enqueue() { | |
| 9 main_thread_callback_manager::get()->add_callback(this); | |
| 10 } | |
| 11 | |
| 12 void main_thread_callback_add(main_thread_callback::ptr ptr) { | |
| 13 main_thread_callback_manager::get()->add_callback(ptr); | |
| 14 } | |
| 15 | |
| 16 namespace { | |
| 17 typedef std::function<void ()> func_t; | |
| 18 class mtcallback_func : public main_thread_callback { | |
| 19 public: | |
| 20 mtcallback_func(func_t const& f) : m_f(f) {} | |
| 21 | |
| 22 void callback_run() noexcept override { | |
| 23 m_f(); | |
| 24 } | |
| 25 private: | |
| 26 func_t m_f; | |
| 27 }; | |
| 28 } | |
| 29 | |
| 30 void fb2k::inMainThread( std::function<void () > f ) { | |
| 31 main_thread_callback_add( new service_impl_t<mtcallback_func>(f)); | |
| 32 } | |
| 33 | |
| 34 void fb2k::inMainThread(std::function<void() > f, abort_callback& a) { | |
| 35 auto abort = std::make_shared< abort_callback_clone >(a); | |
| 36 inMainThread([f, abort] { | |
| 37 if (!abort->is_set()) f(); | |
| 38 }); | |
| 39 } | |
| 40 | |
| 41 void fb2k::inMainThread2( std::function<void () > f ) { | |
| 42 if ( core_api::is_main_thread() ) { | |
| 43 f(); | |
| 44 } else { | |
| 45 inMainThread(f); | |
| 46 } | |
| 47 } | |
| 48 | |
| 49 void fb2k::inMainThreadSynchronous(std::function<void() > f, abort_callback & abort) { | |
| 50 abort.check(); | |
| 51 | |
| 52 if (core_api::is_main_thread()) { | |
| 53 f(); return; | |
| 54 } | |
| 55 | |
| 56 auto evt = std::make_shared<pfc::event>(); | |
| 57 auto f2 = [f, evt] { | |
| 58 f(); | |
| 59 evt->set_state(true); | |
| 60 }; | |
| 61 inMainThread(f2); | |
| 62 abort.waitForEvent(*evt); | |
| 63 } | |
| 64 | |
| 65 void fb2k::inMainThreadSynchronous2(std::function<void() > f) { | |
| 66 // Have new API? | |
| 67 auto api = main_thread_callback_manager_v2::tryGet(); | |
| 68 if (api.is_valid()) { | |
| 69 api->run_synchronously( fb2k::service_new<mtcallback_func>(f) ); | |
| 70 return; | |
| 71 } | |
| 72 | |
| 73 inMainThreadSynchronous(f, fb2k::noAbort); | |
| 74 } |
