annotate foosdk/sdk/foobar2000/SDK/completion_notify.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 "completion_notify.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "main_thread_callback.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 void completion_notify::g_signal_completion_async(completion_notify_ptr p_notify,unsigned p_code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 if (p_notify.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 fb2k::inMainThread([p_notify, p_code] { p_notify->on_completion(p_code); });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 }
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 void completion_notify::on_completion_async(unsigned p_code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 g_signal_completion_async(this, p_code);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 }
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 completion_notify::ptr completion_notify_receiver::create_or_get_task(unsigned p_id) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 completion_notify_orphanable_ptr ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 if (!m_tasks.query(p_id,ptr)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 ptr = completion_notify_create(this,p_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 m_tasks.set(p_id,ptr);
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 return ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 }
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 completion_notify_ptr completion_notify_receiver::create_task(unsigned p_id) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 completion_notify_orphanable_ptr ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 if (m_tasks.query(p_id,ptr)) ptr->orphan();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 ptr = completion_notify_create(this,p_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 m_tasks.set(p_id,ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 return ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 }
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 bool completion_notify_receiver::have_task(unsigned p_id) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 return m_tasks.have_item(p_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 void completion_notify_receiver::orphan_task(unsigned p_id) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 completion_notify_orphanable_ptr ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 if (m_tasks.query(p_id,ptr)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 ptr->orphan();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 m_tasks.remove(p_id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 completion_notify_receiver::~completion_notify_receiver() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 orphan_all_tasks();
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 completion_notify_receiver::orphan_all_tasks() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 m_tasks.enumerate(orphanfunc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 m_tasks.remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 using namespace fb2k;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 class completion_notify_func : public completion_notify {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 void on_completion(unsigned p_code) noexcept override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 m_func(p_code);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 completionNotifyFunc_t m_func;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 completion_notify::ptr makeCompletionNotify( completionNotifyFunc_t func ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 auto n = fb2k::service_new< completion_notify_func >();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 n->m_func = func;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 return n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 }