annotate foosdk/sdk/foobar2000/helpers/fb2k_threads.h @ 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 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 inline static t_size GetOptimalWorkerThreadCount() throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 return pfc::getOptimalWorkerThreadCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 }
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 //! IMPORTANT: all classes derived from CVerySimpleThread must call WaitTillThreadDone() in their destructor, to avoid object destruction during a virtual function call!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 class CVerySimpleThread : private pfc::thread {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 void StartThread(int winPriority) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 StartThread(pfc::thread::argWinPriority(winPriority));
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 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 void StartThread( pfc::thread::arg_t const & arg = pfc::thread::argCurrentThread() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 pfc::thread::start( arg );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 bool IsThreadActive() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 return this->pfc::thread::isActive();
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 WaitTillThreadDone() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 this->pfc::thread::waitTillDone();
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 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 CVerySimpleThread() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 virtual void ThreadProc() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 private:
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 threadProc() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 this->ThreadProc();
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 PFC_CLASS_NOT_COPYABLE_EX(CVerySimpleThread)
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 //! IMPORTANT: all classes derived from CSimpleThread must call AbortThread()/WaitTillThreadDone() in their destructors, to avoid object destruction during a virtual function call!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 class CSimpleThread : private completion_notify_receiver, private pfc::thread {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 void StartThread(int winPriority) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 StartThread(pfc::thread::argWinPriority(winPriority));
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 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 void StartThread(pfc::thread::arg_t const & arg = pfc::thread::argCurrentThread() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 AbortThread();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 m_abort.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 m_ownNotify = create_task(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 this->pfc::thread::start( arg );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 void AbortThread() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 m_abort.abort();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 CloseThread();
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 bool IsThreadActive() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 return this->pfc::thread::isActive();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 void WaitTillThreadDone() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 CloseThread();
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 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 CSimpleThread() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 ~CSimpleThread() {AbortThread();}
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 virtual unsigned ThreadProc(abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 //! Called when the thread has completed normally, with p_code equal to ThreadProc retval. Not called when AbortThread() or WaitTillThreadDone() was used to abort the thread / wait for the thread to finish.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 virtual void ThreadDone(unsigned p_code) {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 void CloseThread() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 this->pfc::thread::waitTillDone();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 orphan_all_tasks();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 void on_task_completion(unsigned p_id,unsigned p_status) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 if (IsThreadActive()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 CloseThread();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 ThreadDone(p_status);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 void threadProc() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 unsigned code = ~0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 code = ThreadProc(m_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 } catch(...) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 if (!m_abort.is_aborting()) m_ownNotify->on_completion_async(code);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 abort_callback_impl m_abort;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 completion_notify_ptr m_ownNotify;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 PFC_CLASS_NOT_COPYABLE_EX(CSimpleThread);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92