diff options
author | sapier <Sapier at GMX dot net> | 2013-11-14 18:30:43 +0100 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2013-11-17 12:46:54 -0500 |
commit | b2d9205796eef23fd5d9a436d438fa2ca31ec21a (patch) | |
tree | 01940565ac2cf70f6e1d70c7a38227fbd17c2e7d /src/shader.cpp | |
parent | eadc9431592f1e21a9211c3487334cd31ed54db1 (diff) | |
download | minetest-b2d9205796eef23fd5d9a436d438fa2ca31ec21a.tar.gz minetest-b2d9205796eef23fd5d9a436d438fa2ca31ec21a.tar.bz2 minetest-b2d9205796eef23fd5d9a436d438fa2ca31ec21a.zip |
Fix Result of processed Request was written to invalid (non existent) ResultQueue if requesting thread timed out before
Diffstat (limited to 'src/shader.cpp')
-rw-r--r-- | src/shader.cpp | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/src/shader.cpp b/src/shader.cpp index 122cbea19..4bf10ce31 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -417,29 +417,31 @@ u32 ShaderSource::getShaderId(const std::string &name) if(get_current_thread_id() == m_main_thread){ return getShaderIdDirect(name); } else { - infostream<<"getShaderId(): Queued: name=\""<<name<<"\""<<std::endl; + /*errorstream<<"getShaderId(): Queued: name=\""<<name<<"\""<<std::endl;*/ // We're gonna ask the result to be put into here - ResultQueue<std::string, u32, u8, u8> result_queue; + + static ResultQueue<std::string, u32, u8, u8> result_queue; // Throw a request in m_get_shader_queue.add(name, 0, 0, &result_queue); - infostream<<"Waiting for shader from main thread, name=\"" - <<name<<"\""<<std::endl; + /* infostream<<"Waiting for shader from main thread, name=\"" + <<name<<"\""<<std::endl;*/ try{ - // Wait result for a second - GetResult<std::string, u32, u8, u8> + while(true) { + // Wait result for a second + GetResult<std::string, u32, u8, u8> result = result_queue.pop_front(1000); - // Check that at least something worked OK - assert(result.key == name); - - return result.item; + if (result.key == name) { + return result.item; + } + } } catch(ItemNotFoundException &e){ - infostream<<"Waiting for shader timed out."<<std::endl; + errorstream<<"Waiting for shader " << name << " timed out."<<std::endl; return 0; } } @@ -541,10 +543,10 @@ void ShaderSource::processQueue() GetRequest<std::string, u32, u8, u8> request = m_get_shader_queue.pop(); - /*infostream<<"ShaderSource::processQueue(): " + /**errorstream<<"ShaderSource::processQueue(): " <<"got shader request with " <<"name=\""<<request.key<<"\"" - <<std::endl;*/ + <<std::endl;**/ m_get_shader_queue.pushResult(request,getShaderIdDirect(request.key)); } @@ -594,7 +596,7 @@ void ShaderSource::onSetConstants(video::IMaterialRendererServices *services, setter->onSetConstants(services, is_highlevel); } } - + ShaderInfo generate_shader(std::string name, IrrlichtDevice *device, video::IShaderConstantSetCallBack *callback, SourceShaderCache *sourcecache) |