Skip to content

Commit dc407e2

Browse files
sapierkwolekr
sapier
authored andcommittedNov 17, 2013
Fix multicaller support in RequestQueue
1 parent d419e4c commit dc407e2

File tree

4 files changed

+44
-43
lines changed

4 files changed

+44
-43
lines changed
 

‎src/itemdef.cpp

+3-6
Original file line numberDiff line numberDiff line change
@@ -638,12 +638,9 @@ class CItemDefManager: public IWritableItemDefManager
638638
{
639639
GetRequest<std::string, ClientCached*, u8, u8>
640640
request = m_get_clientcached_queue.pop();
641-
GetResult<std::string, ClientCached*, u8, u8>
642-
result;
643-
result.key = request.key;
644-
result.callers = request.callers;
645-
result.item = createClientCachedDirect(request.key, gamedef);
646-
request.dest->push_back(result);
641+
642+
m_get_clientcached_queue.pushResult(request,
643+
createClientCachedDirect(request.key, gamedef));
647644
}
648645
#endif
649646
}

‎src/shader.cpp

+1-7
Original file line numberDiff line numberDiff line change
@@ -546,13 +546,7 @@ void ShaderSource::processQueue()
546546
<<"name=\""<<request.key<<"\""
547547
<<std::endl;*/
548548

549-
GetResult<std::string, u32, u8, u8>
550-
result;
551-
result.key = request.key;
552-
result.callers = request.callers;
553-
result.item = getShaderIdDirect(request.key);
554-
555-
request.dest->push_back(result);
549+
m_get_shader_queue.pushResult(request,getShaderIdDirect(request.key));
556550
}
557551
}
558552

‎src/tile.cpp

+1-7
Original file line numberDiff line numberDiff line change
@@ -786,13 +786,7 @@ void TextureSource::processQueue()
786786
<<"name=\""<<request.key<<"\""
787787
<<std::endl;*/
788788

789-
GetResult<std::string, u32, u8, u8>
790-
result;
791-
result.key = request.key;
792-
result.callers = request.callers;
793-
result.item = getTextureIdDirect(request.key);
794-
795-
request.dest->push_back(result);
789+
m_get_texture_queue.pushResult(request,getTextureIdDirect(request.key));
796790
}
797791
}
798792

‎src/util/thread.h

+39-23
Original file line numberDiff line numberDiff line change
@@ -106,53 +106,48 @@ class SimpleThread : public JThread
106106
A single worker thread - multiple client threads queue framework.
107107
*/
108108

109-
template<typename Caller, typename Data>
110-
class CallerInfo
111-
{
112-
public:
113-
Caller caller;
114-
Data data;
115-
};
109+
116110

117111
template<typename Key, typename T, typename Caller, typename CallerData>
118112
class GetResult
119113
{
120114
public:
121115
Key key;
122116
T item;
123-
std::list<CallerInfo<Caller, CallerData> > callers;
117+
std::pair<Caller, CallerData> caller;
124118
};
125119

126120
template<typename Key, typename T, typename Caller, typename CallerData>
127121
class ResultQueue: public MutexedQueue< GetResult<Key, T, Caller, CallerData> >
128122
{
129123
};
130124

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+
131134
template<typename Key, typename T, typename Caller, typename CallerData>
132135
class GetRequest
133136
{
134137
public:
135138
GetRequest()
136139
{
137-
dest = NULL;
138-
}
139-
GetRequest(ResultQueue<Key,T, Caller, CallerData> *a_dest)
140-
{
141-
dest = a_dest;
142140
}
143-
GetRequest(ResultQueue<Key,T, Caller, CallerData> *a_dest,
144-
Key a_key)
141+
GetRequest(Key a_key)
145142
{
146-
dest = a_dest;
147143
key = a_key;
148144
}
149145
~GetRequest()
150146
{
151147
}
152148

153149
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;
156151
};
157152

158153
template<typename Key, typename T, typename Caller, typename CallerData>
@@ -180,20 +175,21 @@ class RequestQueue
180175

181176
if(request.key == key)
182177
{
183-
for(typename std::list< CallerInfo<Caller, CallerData> >::iterator
178+
for(typename std::list< CallerInfo<Caller, CallerData, Key, T> >::iterator
184179
i = request.callers.begin();
185180
i != request.callers.end(); ++i)
186181
{
187-
CallerInfo<Caller, CallerData> &ca = *i;
182+
CallerInfo<Caller, CallerData, Key, T> &ca = *i;
188183
if(ca.caller == caller)
189184
{
190185
ca.data = callerdata;
191186
return;
192187
}
193188
}
194-
CallerInfo<Caller, CallerData> ca;
189+
CallerInfo<Caller, CallerData, Key, T> ca;
195190
ca.caller = caller;
196191
ca.data = callerdata;
192+
ca.dest = dest;
197193
request.callers.push_back(ca);
198194
return;
199195
}
@@ -205,11 +201,11 @@ class RequestQueue
205201

206202
GetRequest<Key, T, Caller, CallerData> request;
207203
request.key = key;
208-
CallerInfo<Caller, CallerData> ca;
204+
CallerInfo<Caller, CallerData, Key, T> ca;
209205
ca.caller = caller;
210206
ca.data = callerdata;
207+
ca.dest = dest;
211208
request.callers.push_back(ca);
212-
request.dest = dest;
213209

214210
m_queue.getList().push_back(request);
215211
}
@@ -219,6 +215,26 @@ class RequestQueue
219215
return m_queue.pop_front(wait_if_empty);
220216
}
221217

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+
222238
private:
223239
MutexedQueue< GetRequest<Key, T, Caller, CallerData> > m_queue;
224240
};

0 commit comments

Comments
 (0)
Please sign in to comment.