forked from Mirrorlandia_minetest/minetest
Fix multicaller support in RequestQueue
This commit is contained in:
parent
d419e4cbb6
commit
dc407e219f
@ -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;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user