annotate foosdk/sdk/foobar2000/helpers/CSingleThreadWrapper.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 #include "ThreadUtils.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "rethrow.h"
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 namespace ThreadUtils {
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 // OLD single thread wrapper class used only by old WMA input
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 // Modern code should use cmdThread which is all kinds of prettier
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 template<typename TBase, bool processMsgs = false>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 class CSingleThreadWrapper : protected CVerySimpleThread {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 class command {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 command() : m_abort(), m_completionEvent() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 virtual void executeImpl(TBase &) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 virtual ~command() {}
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 void execute(TBase & obj) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 m_rethrow.exec( [this, &obj] {executeImpl(obj); } );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 SetEvent(m_completionEvent);
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 void rethrow() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 m_rethrow.rethrow();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 CRethrow m_rethrow;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 HANDLE m_completionEvent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 abort_callback * m_abort;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 };
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 typedef std::function<void (TBase&) > func_t;
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 class command2 : public command {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 command2( func_t f ) : m_func(f) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 void executeImpl(TBase & obj) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 m_func(obj);
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 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 func_t m_func;
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 typedef pfc::rcptr_t<command> command_ptr;
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 CSingleThreadWrapper() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 m_completionEvent.create(true,false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 this->StartThread();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 //start();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 ~CSingleThreadWrapper() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 m_threadAbort.abort();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 this->WaitTillThreadDone();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 void invokeCommand2( func_t f, abort_callback & abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 auto c = pfc::rcnew_t<command2>(f);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 invokeCommand( c, abort );
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 void invokeCommand(command_ptr cmd, abort_callback & abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 abort.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 m_completionEvent.set_state(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 pfc::vartoggle_t<abort_callback*> abortToggle(cmd->m_abort, &abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 pfc::vartoggle_t<HANDLE> eventToggle(cmd->m_completionEvent, m_completionEvent.get() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 m_commands.Add(cmd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 m_completionEvent.wait_for(-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 //WaitAbortable(m_completionEvent.get(), abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 cmd->rethrow();
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 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 void ThreadProc() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 TRACK_CALL_TEXT("CSingleThreadWrapper entry");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 TBase instance;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 command_ptr cmd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 if (processMsgs) m_commands.Get_MsgLoop(cmd, m_threadAbort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 else m_commands.Get(cmd, m_threadAbort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 cmd->execute(instance);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 }
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 (processMsgs) ProcessPendingMessages();
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 win32_event m_completionEvent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 CObjectQueue<command_ptr> m_commands;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 abort_callback_impl m_threadAbort;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 }