annotate foosdk/sdk/pfc/wait_queue.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 <list>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "synchro.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 pfc {
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 template<typename obj_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 class waitQueue {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 waitQueue() : m_eof() {}
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 template<typename arg_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 void put( arg_t && obj ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 mutexScope guard( m_mutex );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 m_list.push_back( std::forward<arg_t>(obj) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 if ( m_list.size() == 1 ) m_canRead.set_state( true );
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 void set_eof() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 mutexScope guard(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 m_eof = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 m_canRead.set_state(true);
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 bool wait_read( double timeout ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 return m_canRead.wait_for( timeout );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 eventHandle_t get_event_handle() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 return m_canRead.get_handle();
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 bool get( obj_t & out ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 for ( ;; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 m_canRead.wait_for(-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 mutexScope guard(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 auto i = m_list.begin();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 if ( i == m_list.end() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 if (m_eof) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 continue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 out = std::move(*i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 m_list.erase( i );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 didGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 bool get( obj_t & out, pfc::eventHandle_t hAbort, bool * didAbort = nullptr ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 if (didAbort != nullptr) * didAbort = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 for ( ;; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 if (pfc::event::g_twoEventWait( hAbort, m_canRead.get_handle(), -1) == 1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 if (didAbort != nullptr) * didAbort = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 return false;
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 mutexScope guard(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 auto i = m_list.begin();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 if ( i == m_list.end() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 if (m_eof) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 continue;
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 out = std::move(*i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 m_list.erase( i );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 didGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 return true;
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 void clear() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 mutexScope guard(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 m_eof = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 m_list.clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 m_canRead.set_state(false);
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 didGet() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 if (!m_eof && m_list.size() == 0) m_canRead.set_state(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 bool m_eof;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 std::list<obj_t> m_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 mutex m_mutex;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 event m_canRead;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 template<typename obj_t_>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 class waitQueue2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 typedef obj_t_ obj_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 typedef std::list<obj_t_> list_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 virtual bool canWriteCheck(list_t const &) { return true; }
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 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 void waitWrite() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 m_canWrite.wait_for(-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 bool waitWrite(pfc::eventHandle_t hAbort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 return event::g_twoEventWait( hAbort, m_canWrite.get_handle(), -1) == 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 eventHandle_t waitWriteHandle() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 return m_canWrite.get_handle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 waitQueue2() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 m_canWrite.set_state(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 template<typename arg_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 void put(arg_t && obj) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 mutexScope guard(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 m_list.push_back(std::forward<arg_t>(obj));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 if (m_list.size() == 1) m_canRead.set_state(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 refreshCanWrite();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 void set_eof() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 mutexScope guard(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 m_eof = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 m_canRead.set_state(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 m_canWrite.set_state(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 bool get(obj_t & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 for (;; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 m_canRead.wait_for(-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 mutexScope guard(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 auto i = m_list.begin();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 if (i == m_list.end()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 if (m_eof) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 continue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 out = std::move(*i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 m_list.erase(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 didGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 typedef std::function<bool(obj_t&)> receive_peek_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 // Block until there's something to return + return multiple objects at once.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 // Use peek function (optional) to stop reading / leave remaining items for the next call to pick up.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 std::list<obj_t> receive(pfc::eventHandle_t hAbort, receive_peek_t peek = nullptr , bool* didAbort = nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 if (didAbort != nullptr) *didAbort = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 std::list<obj_t> ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 for (bool retry = false; ; retry = true ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 // try without wait first, only place where this is really used can poll abort before/after without system calls
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 if (retry && pfc::event::g_twoEventWait(hAbort, m_canRead.get_handle(), -1) == 1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 if (didAbort != nullptr) *didAbort = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 mutexScope guard(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 auto i = m_list.begin();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 if (i == m_list.end()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 if (m_eof) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 continue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 bool bDidGet = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 do {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 if (peek && !peek(*i)) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 auto n = i; ++n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 ret.splice(ret.end(), m_list, i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 i = std::move(n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 bDidGet = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 } while (i != m_list.end());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 if ( bDidGet ) didGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 bool get(obj_t & out, pfc::eventHandle_t hAbort, bool * didAbort = nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 if (didAbort != nullptr) * didAbort = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 for (;; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 if (pfc::event::g_twoEventWait(hAbort, m_canRead.get_handle(), -1) == 1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 if (didAbort != nullptr) * didAbort = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 mutexScope guard(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 auto i = m_list.begin();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 if (i == m_list.end()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 if (m_eof) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 continue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 out = std::move(*i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 m_list.erase(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 didGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 void clear() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 mutexScope guard(m_mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 m_list.clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 m_eof = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 m_canRead.set_state(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 m_canWrite.set_state(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 void didGet() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 // mutex assumed locked
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 if (m_eof) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 if (m_list.empty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 m_canRead.set_state(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 m_canWrite.set_state(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 m_canWrite.set_state(canWriteCheck(m_list));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 void refreshCanWrite() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 // mutex assumed locked
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 m_canWrite.set_state( !m_eof && canWriteCheck(m_list));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 bool m_eof = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 std::list<obj_t> m_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 mutex m_mutex;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 event m_canRead, m_canWrite;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 }