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