annotate foosdk/sdk/foobar2000/helpers/fb2kWorkerTool.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 #include <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <list>
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 #include <SDK/threadPool.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 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 class workerTool {
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 struct work_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 std::function<void()> work, done;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 };
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 void operator+=(work_t && work) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 m_workQueue.push_back( std::make_shared< work_t> ( std::move(work) ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 kickWork();
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 void flush() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 if ( m_working ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 m_abort->set();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 m_abort = std::make_shared<abort_callback_impl>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 m_working = false;
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 m_workQueue.clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 }
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 void workDone() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 m_working = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 kickWork();
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 void kickWork() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 PFC_ASSERT( core_api::is_main_thread() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 if (!m_working && !m_workQueue.empty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 m_working = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 auto iter = m_workQueue.begin();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 auto work = std::move(*iter); m_workQueue.erase(iter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 auto pThis = this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 auto a = m_abort;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 fb2k::inCpuWorkerThread( [ work, pThis, a] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 // release lambdas early, synchronously from same context as they're executed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 { auto f = std::move(work->work); if (f) f(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 a->check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 fb2k::inMainThread( [work, pThis, a] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 if ( ! a->is_set() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 // release lambdas early, synchronously from same context as they're executed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 { auto f = std::move(work->done); if (f) f(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 pThis->workDone();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
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 } catch(exception_aborted const &) {}
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 }
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 workerTool() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 ~workerTool() { m_abort->set(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 workerTool(const workerTool&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 void operator=(const workerTool&) = delete;
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 std::shared_ptr<abort_callback_impl> aborter() const { return m_abort; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 std::shared_ptr<abort_callback_impl> m_abort = std::make_shared<abort_callback_impl>();
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 bool m_working = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 std::list< std::shared_ptr<work_t> > m_workQueue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 };
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 }