annotate foosdk/sdk/pfc/event_std.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 // Alternate lightweight implementation of pfc::event, with similar method sigantures but no support for multi-event-wait-for-any.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 // It's a safe drop-in replacement for the regular event - code trying to use unsupported methods will fail to compile rather than behave incorrectly.
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 // Rationale:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 // Mac/Linux multi-wait-capable pipe-backed event is relatively expensive, in terms of CPU, memory and file descriptors opened.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 // On Windows, event_std still outperforms regular win32 event but the difference is mostly insignificant in real life use cases.
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 #include <mutex>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 #include <condition_variable>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 class event_std {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 void set_state(bool v = true) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 std::scoped_lock lock(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 if (m_state != v) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 m_state = v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 if (v) m_condition.notify_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 }
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 bool is_set() const { return m_state; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 void wait() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 std::unique_lock lock(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 m_condition.wait(lock, [this] { return this->m_state; });
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 bool wait_for(double timeout) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 if (timeout < 0) { wait(); return true; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 std::unique_lock lock(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 return m_condition.wait_for(lock, std::chrono::duration<double>(timeout), [this] { return this->m_state; });
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 void wait_and_clear() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 std::unique_lock lock(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 m_condition.wait(lock, [this] { return this->m_state; });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 m_state = false;
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 bool wait_for_and_clear(double timeout) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 if ( timeout < 0 ) {wait_and_clear(); return true;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 std::unique_lock lock(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 bool rv = m_condition.wait_for(lock, std::chrono::duration<double>(timeout), [this] { return this->m_state; });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 if ( rv ) m_state = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 return rv;
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 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 volatile bool m_state = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 std::condition_variable m_condition;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 std::mutex m_mutex;
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 }