diff options
author | sapier <Sapier at GMX dot net> | 2013-11-13 21:46:14 +0100 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2013-11-17 12:45:58 -0500 |
commit | dc407e219f8b0394f3a4d10ea8379b8678d98d1c (patch) | |
tree | a045995d5fd0ca91464ea3379738b055e7e61a42 /src | |
parent | d419e4cbb65d899239fafb5027b16fb9cb564adf (diff) | |
download | minetest-dc407e219f8b0394f3a4d10ea8379b8678d98d1c.tar.gz minetest-dc407e219f8b0394f3a4d10ea8379b8678d98d1c.tar.bz2 minetest-dc407e219f8b0394f3a4d10ea8379b8678d98d1c.zip |
Fix multicaller support in RequestQueue
Diffstat (limited to 'src')
-rw-r--r-- | src/itemdef.cpp | 9 | ||||
-rw-r--r-- | src/shader.cpp | 8 | ||||
-rw-r--r-- | src/tile.cpp | 8 | ||||
-rw-r--r-- | src/util/thread.h | 62 |
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; }; |