Fix multicaller support in RequestQueue

This commit is contained in:
sapier 2013-11-13 21:46:14 +01:00 committed by kwolekr
parent d419e4cbb6
commit dc407e219f
4 changed files with 44 additions and 43 deletions

@ -638,12 +638,9 @@ public:
{ {
GetRequest<std::string, ClientCached*, u8, u8> GetRequest<std::string, ClientCached*, u8, u8>
request = m_get_clientcached_queue.pop(); request = m_get_clientcached_queue.pop();
GetResult<std::string, ClientCached*, u8, u8>
result; m_get_clientcached_queue.pushResult(request,
result.key = request.key; createClientCachedDirect(request.key, gamedef));
result.callers = request.callers;
result.item = createClientCachedDirect(request.key, gamedef);
request.dest->push_back(result);
} }
#endif #endif
} }

@ -546,13 +546,7 @@ void ShaderSource::processQueue()
<<"name=\""<<request.key<<"\"" <<"name=\""<<request.key<<"\""
<<std::endl;*/ <<std::endl;*/
GetResult<std::string, u32, u8, u8> m_get_shader_queue.pushResult(request,getShaderIdDirect(request.key));
result;
result.key = request.key;
result.callers = request.callers;
result.item = getShaderIdDirect(request.key);
request.dest->push_back(result);
} }
} }

@ -786,13 +786,7 @@ void TextureSource::processQueue()
<<"name=\""<<request.key<<"\"" <<"name=\""<<request.key<<"\""
<<std::endl;*/ <<std::endl;*/
GetResult<std::string, u32, u8, u8> m_get_texture_queue.pushResult(request,getTextureIdDirect(request.key));
result;
result.key = request.key;
result.callers = request.callers;
result.item = getTextureIdDirect(request.key);
request.dest->push_back(result);
} }
} }

@ -106,13 +106,7 @@ public:
A single worker thread - multiple client threads queue framework. A single worker thread - multiple client threads queue framework.
*/ */
template<typename Caller, typename Data>
class CallerInfo
{
public:
Caller caller;
Data data;
};
template<typename Key, typename T, typename Caller, typename CallerData> template<typename Key, typename T, typename Caller, typename CallerData>
class GetResult class GetResult
@ -120,7 +114,7 @@ class GetResult
public: public:
Key key; Key key;
T item; T item;
std::list<CallerInfo<Caller, CallerData> > callers; std::pair<Caller, CallerData> caller;
}; };
template<typename Key, typename T, typename Caller, typename CallerData> template<typename Key, typename T, typename Caller, typename CallerData>
@ -128,22 +122,24 @@ class ResultQueue: public MutexedQueue< GetResult<Key, T, Caller, CallerData> >
{ {
}; };
template<typename Caller, typename Data, typename Key, typename T>
class CallerInfo
{
public:
Caller caller;
Data data;
ResultQueue< Key, T, Caller, Data>* dest;
};
template<typename Key, typename T, typename Caller, typename CallerData> template<typename Key, typename T, typename Caller, typename CallerData>
class GetRequest class GetRequest
{ {
public: public:
GetRequest() GetRequest()
{ {
dest = NULL;
} }
GetRequest(ResultQueue<Key,T, Caller, CallerData> *a_dest) GetRequest(Key a_key)
{ {
dest = a_dest;
}
GetRequest(ResultQueue<Key,T, Caller, CallerData> *a_dest,
Key a_key)
{
dest = a_dest;
key = a_key; key = a_key;
} }
~GetRequest() ~GetRequest()
@ -151,8 +147,7 @@ public:
} }
Key key; Key key;
ResultQueue<Key, T, Caller, CallerData> *dest; std::list<CallerInfo<Caller, CallerData, Key, T> > callers;
std::list<CallerInfo<Caller, CallerData> > callers;
}; };
template<typename Key, typename T, typename Caller, typename CallerData> template<typename Key, typename T, typename Caller, typename CallerData>
@ -180,20 +175,21 @@ public:
if(request.key == key) if(request.key == key)
{ {
for(typename std::list< CallerInfo<Caller, CallerData> >::iterator for(typename std::list< CallerInfo<Caller, CallerData, Key, T> >::iterator
i = request.callers.begin(); i = request.callers.begin();
i != request.callers.end(); ++i) i != request.callers.end(); ++i)
{ {
CallerInfo<Caller, CallerData> &ca = *i; CallerInfo<Caller, CallerData, Key, T> &ca = *i;
if(ca.caller == caller) if(ca.caller == caller)
{ {
ca.data = callerdata; ca.data = callerdata;
return; return;
} }
} }
CallerInfo<Caller, CallerData> ca; CallerInfo<Caller, CallerData, Key, T> ca;
ca.caller = caller; ca.caller = caller;
ca.data = callerdata; ca.data = callerdata;
ca.dest = dest;
request.callers.push_back(ca); request.callers.push_back(ca);
return; return;
} }
@ -205,11 +201,11 @@ public:
GetRequest<Key, T, Caller, CallerData> request; GetRequest<Key, T, Caller, CallerData> request;
request.key = key; request.key = key;
CallerInfo<Caller, CallerData> ca; CallerInfo<Caller, CallerData, Key, T> ca;
ca.caller = caller; ca.caller = caller;
ca.data = callerdata; ca.data = callerdata;
ca.dest = dest;
request.callers.push_back(ca); request.callers.push_back(ca);
request.dest = dest;
m_queue.getList().push_back(request); m_queue.getList().push_back(request);
} }
@ -219,6 +215,26 @@ public:
return m_queue.pop_front(wait_if_empty); return m_queue.pop_front(wait_if_empty);
} }
void pushResult(GetRequest<Key, T, Caller, CallerData> req,
T res) {
for(typename std::list< CallerInfo<Caller, CallerData, Key, T> >::iterator
i = req.callers.begin();
i != req.callers.end(); ++i)
{
CallerInfo<Caller, CallerData, Key, T> &ca = *i;
GetResult<Key,T,Caller,CallerData> result;
result.key = req.key;
result.item = res;
result.caller.first = ca.caller;
result.caller.second = ca.data;
ca.dest->push_back(result);
}
}
private: private:
MutexedQueue< GetRequest<Key, T, Caller, CallerData> > m_queue; MutexedQueue< GetRequest<Key, T, Caller, CallerData> > m_queue;
}; };