Skip to content
Permalink
Browse files

Fix multicaller support in RequestQueue

  • Loading branch information
sapier authored and kwolekr committed Nov 17, 2013
1 parent d419e4c commit dc407e219f8b0394f3a4d10ea8379b8678d98d1c
Showing with 44 additions and 43 deletions.
  1. +3 −6 src/itemdef.cpp
  2. +1 −7 src/shader.cpp
  3. +1 −7 src/tile.cpp
  4. +39 −23 src/util/thread.h
@@ -638,12 +638,9 @@ class CItemDefManager: public IWritableItemDefManager
{
GetRequest<std::string, ClientCached*, u8, u8>
request = m_get_clientcached_queue.pop();
GetResult<std::string, ClientCached*, u8, u8>
result;
result.key = request.key;
result.callers = request.callers;
result.item = createClientCachedDirect(request.key, gamedef);
request.dest->push_back(result);

m_get_clientcached_queue.pushResult(request,
createClientCachedDirect(request.key, gamedef));
}
#endif
}
@@ -546,13 +546,7 @@ void ShaderSource::processQueue()
<<"name=\""<<request.key<<"\""
<<std::endl;*/

GetResult<std::string, u32, u8, u8>
result;
result.key = request.key;
result.callers = request.callers;
result.item = getShaderIdDirect(request.key);

request.dest->push_back(result);
m_get_shader_queue.pushResult(request,getShaderIdDirect(request.key));
}
}

@@ -786,13 +786,7 @@ void TextureSource::processQueue()
<<"name=\""<<request.key<<"\""
<<std::endl;*/

GetResult<std::string, u32, u8, u8>
result;
result.key = request.key;
result.callers = request.callers;
result.item = getTextureIdDirect(request.key);

request.dest->push_back(result);
m_get_texture_queue.pushResult(request,getTextureIdDirect(request.key));
}
}

@@ -106,53 +106,48 @@ class SimpleThread : public JThread
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>
class GetResult
{
public:
Key key;
T item;
std::list<CallerInfo<Caller, CallerData> > callers;
std::pair<Caller, CallerData> caller;
};

template<typename Key, typename T, typename Caller, typename CallerData>
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>
class GetRequest
{
public:
GetRequest()
{
dest = NULL;
}
GetRequest(ResultQueue<Key,T, Caller, CallerData> *a_dest)
{
dest = a_dest;
}
GetRequest(ResultQueue<Key,T, Caller, CallerData> *a_dest,
Key a_key)
GetRequest(Key a_key)
{
dest = a_dest;
key = a_key;
}
~GetRequest()
{
}

Key key;
ResultQueue<Key, T, Caller, CallerData> *dest;
std::list<CallerInfo<Caller, CallerData> > callers;
std::list<CallerInfo<Caller, CallerData, Key, T> > callers;
};

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

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.end(); ++i)
{
CallerInfo<Caller, CallerData> &ca = *i;
CallerInfo<Caller, CallerData, Key, T> &ca = *i;
if(ca.caller == caller)
{
ca.data = callerdata;
return;
}
}
CallerInfo<Caller, CallerData> ca;
CallerInfo<Caller, CallerData, Key, T> ca;
ca.caller = caller;
ca.data = callerdata;
ca.dest = dest;
request.callers.push_back(ca);
return;
}
@@ -205,11 +201,11 @@ class RequestQueue

GetRequest<Key, T, Caller, CallerData> request;
request.key = key;
CallerInfo<Caller, CallerData> ca;
CallerInfo<Caller, CallerData, Key, T> ca;
ca.caller = caller;
ca.data = callerdata;
ca.dest = dest;
request.callers.push_back(ca);
request.dest = dest;

m_queue.getList().push_back(request);
}
@@ -219,6 +215,26 @@ class RequestQueue
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:
MutexedQueue< GetRequest<Key, T, Caller, CallerData> > m_queue;
};

0 comments on commit dc407e2

Please sign in to comment.
You can’t perform that action at this time.