|
1
|
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 } |