mirror of
https://github.com/luanti-org/luanti.git
synced 2025-10-14 00:55:20 +02:00
Fix Result of processed Request was written to invalid (non existent) ResultQueue if requesting thread timed out before
This commit is contained in:
@@ -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)
|
||||
|
Reference in New Issue
Block a user