@@ -28,13 +28,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
28
28
#include " log.h"
29
29
30
30
template <typename T>
31
- class MutexedVariable
32
- {
31
+ class MutexedVariable {
33
32
public:
34
33
MutexedVariable (T value):
35
34
m_value (value)
36
- {
37
- }
35
+ {}
38
36
39
37
T get ()
40
38
{
@@ -47,13 +45,13 @@ class MutexedVariable
47
45
JMutexAutoLock lock (m_mutex);
48
46
m_value = value;
49
47
}
50
-
48
+
51
49
// You'll want to grab this in a SharedPtr
52
- JMutexAutoLock * getLock ()
50
+ JMutexAutoLock *getLock ()
53
51
{
54
52
return new JMutexAutoLock (m_mutex);
55
53
}
56
-
54
+
57
55
// You pretty surely want to grab the lock when accessing this
58
56
T m_value;
59
57
@@ -65,43 +63,35 @@ class MutexedVariable
65
63
A single worker thread - multiple client threads queue framework.
66
64
*/
67
65
template <typename Key, typename T, typename Caller, typename CallerData>
68
- class GetResult
69
- {
66
+ class GetResult {
70
67
public:
71
68
Key key;
72
69
T item;
73
70
std::pair<Caller, CallerData> caller;
74
71
};
75
72
76
73
template <typename Key, typename T, typename Caller, typename CallerData>
77
- class ResultQueue : public MutexedQueue < GetResult<Key, T, Caller, CallerData> >
78
- {
74
+ class ResultQueue : public MutexedQueue <GetResult<Key, T, Caller, CallerData> > {
79
75
};
80
76
81
77
template <typename Caller, typename Data, typename Key, typename T>
82
- class CallerInfo
83
- {
78
+ class CallerInfo {
84
79
public:
85
80
Caller caller;
86
81
Data data;
87
- ResultQueue< Key, T, Caller, Data>* dest;
82
+ ResultQueue<Key, T, Caller, Data> * dest;
88
83
};
89
84
90
85
template <typename Key, typename T, typename Caller, typename CallerData>
91
- class GetRequest
92
- {
86
+ class GetRequest {
93
87
public:
94
- GetRequest ()
95
- {
96
- }
97
- GetRequest (Key a_key)
98
- {
88
+ GetRequest () {}
89
+ ~GetRequest () {}
90
+
91
+ GetRequest (Key a_key) {
99
92
key = a_key;
100
93
}
101
- ~GetRequest ()
102
- {
103
- }
104
-
94
+
105
95
Key key;
106
96
std::list<CallerInfo<Caller, CallerData, Key, T> > callers;
107
97
};
@@ -114,49 +104,44 @@ class GetRequest
114
104
* @param CallerData data passed back to caller
115
105
*/
116
106
template <typename Key, typename T, typename Caller, typename CallerData>
117
- class RequestQueue
118
- {
107
+ class RequestQueue {
119
108
public:
120
109
bool empty ()
121
110
{
122
111
return m_queue.empty ();
123
112
}
124
113
125
114
void add (Key key, Caller caller, CallerData callerdata,
126
- ResultQueue<Key, T, Caller, CallerData> *dest)
115
+ ResultQueue<Key, T, Caller, CallerData> *dest)
127
116
{
117
+ typename std::deque<GetRequest<Key, T, Caller, CallerData> >::iterator i;
118
+ typename std::list<CallerInfo<Caller, CallerData, Key, T> >::iterator j;
119
+
128
120
{
129
121
JMutexAutoLock lock (m_queue.getMutex ());
130
122
131
123
/*
132
124
If the caller is already on the list, only update CallerData
133
125
*/
134
- for (typename std::deque< GetRequest<Key, T, Caller, CallerData> >::iterator
135
- i = m_queue.getQueue ().begin ();
136
- i != m_queue.getQueue ().end (); ++i)
137
- {
126
+ for (i = m_queue.getQueue ().begin (); i != m_queue.getQueue ().end (); ++i) {
138
127
GetRequest<Key, T, Caller, CallerData> &request = *i;
139
-
140
- if (request.key == key)
141
- {
142
- for (typename std::list< CallerInfo<Caller, CallerData, Key, T> >::iterator
143
- i = request.callers .begin ();
144
- i != request.callers .end (); ++i)
145
- {
146
- CallerInfo<Caller, CallerData, Key, T> &ca = *i;
147
- if (ca.caller == caller)
148
- {
149
- ca.data = callerdata;
150
- return ;
151
- }
128
+ if (request.key != key)
129
+ continue ;
130
+
131
+ for (j = request.callers .begin (); j != request.callers .end (); ++j) {
132
+ CallerInfo<Caller, CallerData, Key, T> &ca = *j;
133
+ if (ca.caller == caller) {
134
+ ca.data = callerdata;
135
+ return ;
152
136
}
153
- CallerInfo<Caller, CallerData, Key, T> ca;
154
- ca.caller = caller;
155
- ca.data = callerdata;
156
- ca.dest = dest;
157
- request.callers .push_back (ca);
158
- return ;
159
137
}
138
+
139
+ CallerInfo<Caller, CallerData, Key, T> ca;
140
+ ca.caller = caller;
141
+ ca.data = callerdata;
142
+ ca.dest = dest;
143
+ request.callers .push_back (ca);
144
+ return ;
160
145
}
161
146
}
162
147
@@ -171,7 +156,7 @@ class RequestQueue
171
156
ca.data = callerdata;
172
157
ca.dest = dest;
173
158
request.callers .push_back (ca);
174
-
159
+
175
160
m_queue.push_back (request);
176
161
}
177
162
@@ -185,13 +170,11 @@ class RequestQueue
185
170
return m_queue.pop_frontNoEx ();
186
171
}
187
172
188
- void pushResult (GetRequest<Key, T, Caller, CallerData> req,
189
- T res) {
190
-
191
- for (typename std::list< CallerInfo<Caller, CallerData, Key, T> >::iterator
173
+ void pushResult (GetRequest<Key, T, Caller, CallerData> req, T res)
174
+ {
175
+ for (typename std::list<CallerInfo<Caller, CallerData, Key, T> >::iterator
192
176
i = req.callers .begin ();
193
- i != req.callers .end (); ++i)
194
- {
177
+ i != req.callers .end (); ++i) {
195
178
CallerInfo<Caller, CallerData, Key, T> &ca = *i;
196
179
197
180
GetResult<Key,T,Caller,CallerData> result;
@@ -206,24 +189,13 @@ class RequestQueue
206
189
}
207
190
208
191
private:
209
- MutexedQueue< GetRequest<Key, T, Caller, CallerData> > m_queue;
192
+ MutexedQueue<GetRequest<Key, T, Caller, CallerData> > m_queue;
210
193
};
211
194
212
- class UpdateThread : public JThread
213
- {
214
- private:
215
- JSemaphore m_update_sem;
216
-
217
- protected:
218
- virtual void doUpdate () = 0;
219
- virtual const char *getName () = 0;
220
-
195
+ class UpdateThread : public JThread {
221
196
public:
222
- UpdateThread ()
223
- {
224
- }
225
- ~UpdateThread ()
226
- {}
197
+ UpdateThread () {}
198
+ virtual ~UpdateThread () {}
227
199
228
200
void deferUpdate ()
229
201
{
@@ -243,30 +215,36 @@ class UpdateThread : public JThread
243
215
ThreadStarted ();
244
216
245
217
const char *thread_name = getName ();
246
-
247
218
log_register_thread (thread_name);
219
+ porting::setThreadName (thread_name);
248
220
249
221
DSTACK (__FUNCTION_NAME);
250
-
251
222
BEGIN_DEBUG_EXCEPTION_HANDLER
252
223
253
- porting::setThreadName (thread_name);
254
-
255
224
while (!StopRequested ()) {
256
-
257
225
m_update_sem.Wait ();
258
226
259
227
// Empty the queue, just in case doUpdate() is expensive
260
- while (m_update_sem.GetValue ()) m_update_sem.Wait ();
228
+ while (m_update_sem.GetValue ())
229
+ m_update_sem.Wait ();
261
230
262
- if (StopRequested ()) break ;
231
+ if (StopRequested ())
232
+ break ;
263
233
264
234
doUpdate ();
265
235
}
236
+
266
237
END_DEBUG_EXCEPTION_HANDLER (errorstream)
267
238
268
239
return NULL ;
269
240
}
241
+
242
+ protected:
243
+ virtual void doUpdate () = 0;
244
+ virtual const char *getName () = 0;
245
+
246
+ private:
247
+ JSemaphore m_update_sem;
270
248
};
271
249
272
250
#endif
0 commit comments