aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsapier <Sapier at GMX dot net>2013-11-13 21:46:14 +0100
committerkwolekr <kwolekr@minetest.net>2013-11-17 12:45:58 -0500
commitdc407e219f8b0394f3a4d10ea8379b8678d98d1c (patch)
treea045995d5fd0ca91464ea3379738b055e7e61a42 /src
parentd419e4cbb65d899239fafb5027b16fb9cb564adf (diff)
downloadminetest-dc407e219f8b0394f3a4d10ea8379b8678d98d1c.tar.gz
minetest-dc407e219f8b0394f3a4d10ea8379b8678d98d1c.tar.bz2
minetest-dc407e219f8b0394f3a4d10ea8379b8678d98d1c.zip
Fix multicaller support in RequestQueue
Diffstat (limited to 'src')
-rw-r--r--src/itemdef.cpp9
-rw-r--r--src/shader.cpp8
-rw-r--r--src/tile.cpp8
-rw-r--r--src/util/thread.h62
4 files changed, 44 insertions, 43 deletions
diff --git a/src/itemdef.cpp b/src/itemdef.cpp
index 83a70f1d7..c520ea902 100644
--- a/src/itemdef.cpp
+++ b/src/itemdef.cpp
@@ -638,12 +638,9 @@ public:
{
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
}
diff --git a/src/shader.cpp b/src/shader.cpp
index ed8cc5b73..122cbea19 100644
--- a/src/shader.cpp
+++ b/src/shader.cpp
@@ -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));
}
}
diff --git a/src/tile.cpp b/src/tile.cpp
index 3c4989ea8..5dec79a10 100644
--- a/src/tile.cpp
+++ b/src/tile.cpp
@@ -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));
}
}
diff --git a/src/util/thread.h b/src/util/thread.h
index 678d9cf9b..70d41aeb9 100644
--- a/src/util/thread.h
+++ b/src/util/thread.h
@@ -106,13 +106,7 @@ public:
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
@@ -120,7 +114,7 @@ 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>
@@ -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>
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()
@@ -151,8 +147,7 @@ public:
}
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 @@ public:
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 @@ public:
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 @@ public:
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;
};