@@ -106,53 +106,48 @@ class SimpleThread : public JThread
106
106
A single worker thread - multiple client threads queue framework.
107
107
*/
108
108
109
- template <typename Caller, typename Data>
110
- class CallerInfo
111
- {
112
- public:
113
- Caller caller;
114
- Data data;
115
- };
109
+
116
110
117
111
template <typename Key, typename T, typename Caller, typename CallerData>
118
112
class GetResult
119
113
{
120
114
public:
121
115
Key key;
122
116
T item;
123
- std::list<CallerInfo< Caller, CallerData> > callers ;
117
+ std::pair< Caller, CallerData> caller ;
124
118
};
125
119
126
120
template <typename Key, typename T, typename Caller, typename CallerData>
127
121
class ResultQueue : public MutexedQueue < GetResult<Key, T, Caller, CallerData> >
128
122
{
129
123
};
130
124
125
+ template <typename Caller, typename Data, typename Key, typename T>
126
+ class CallerInfo
127
+ {
128
+ public:
129
+ Caller caller;
130
+ Data data;
131
+ ResultQueue< Key, T, Caller, Data>* dest;
132
+ };
133
+
131
134
template <typename Key, typename T, typename Caller, typename CallerData>
132
135
class GetRequest
133
136
{
134
137
public:
135
138
GetRequest ()
136
139
{
137
- dest = NULL ;
138
- }
139
- GetRequest (ResultQueue<Key,T, Caller, CallerData> *a_dest)
140
- {
141
- dest = a_dest;
142
140
}
143
- GetRequest (ResultQueue<Key,T, Caller, CallerData> *a_dest,
144
- Key a_key)
141
+ GetRequest (Key a_key)
145
142
{
146
- dest = a_dest;
147
143
key = a_key;
148
144
}
149
145
~GetRequest ()
150
146
{
151
147
}
152
148
153
149
Key key;
154
- ResultQueue<Key, T, Caller, CallerData> *dest;
155
- std::list<CallerInfo<Caller, CallerData> > callers;
150
+ std::list<CallerInfo<Caller, CallerData, Key, T> > callers;
156
151
};
157
152
158
153
template <typename Key, typename T, typename Caller, typename CallerData>
@@ -180,20 +175,21 @@ class RequestQueue
180
175
181
176
if (request.key == key)
182
177
{
183
- for (typename std::list< CallerInfo<Caller, CallerData> >::iterator
178
+ for (typename std::list< CallerInfo<Caller, CallerData, Key, T > >::iterator
184
179
i = request.callers .begin ();
185
180
i != request.callers .end (); ++i)
186
181
{
187
- CallerInfo<Caller, CallerData> &ca = *i;
182
+ CallerInfo<Caller, CallerData, Key, T > &ca = *i;
188
183
if (ca.caller == caller)
189
184
{
190
185
ca.data = callerdata;
191
186
return ;
192
187
}
193
188
}
194
- CallerInfo<Caller, CallerData> ca;
189
+ CallerInfo<Caller, CallerData, Key, T > ca;
195
190
ca.caller = caller;
196
191
ca.data = callerdata;
192
+ ca.dest = dest;
197
193
request.callers .push_back (ca);
198
194
return ;
199
195
}
@@ -205,11 +201,11 @@ class RequestQueue
205
201
206
202
GetRequest<Key, T, Caller, CallerData> request;
207
203
request.key = key;
208
- CallerInfo<Caller, CallerData> ca;
204
+ CallerInfo<Caller, CallerData, Key, T > ca;
209
205
ca.caller = caller;
210
206
ca.data = callerdata;
207
+ ca.dest = dest;
211
208
request.callers .push_back (ca);
212
- request.dest = dest;
213
209
214
210
m_queue.getList ().push_back (request);
215
211
}
@@ -219,6 +215,26 @@ class RequestQueue
219
215
return m_queue.pop_front (wait_if_empty);
220
216
}
221
217
218
+ void pushResult (GetRequest<Key, T, Caller, CallerData> req,
219
+ T res) {
220
+
221
+ for (typename std::list< CallerInfo<Caller, CallerData, Key, T> >::iterator
222
+ i = req.callers .begin ();
223
+ i != req.callers .end (); ++i)
224
+ {
225
+ CallerInfo<Caller, CallerData, Key, T> &ca = *i;
226
+
227
+ GetResult<Key,T,Caller,CallerData> result;
228
+
229
+ result.key = req.key ;
230
+ result.item = res;
231
+ result.caller .first = ca.caller ;
232
+ result.caller .second = ca.data ;
233
+
234
+ ca.dest ->push_back (result);
235
+ }
236
+ }
237
+
222
238
private:
223
239
MutexedQueue< GetRequest<Key, T, Caller, CallerData> > m_queue;
224
240
};
0 commit comments