From: x2048 Date: Thu, 19 Jan 2023 20:44:27 +0000 (+0100) Subject: Fix concurrency in texture source (#13150) X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=ca13c510245c695294edc7f78eced6a044e064d6;p=minetest.git Fix concurrency in texture source (#13150) --- diff --git a/src/client/tile.cpp b/src/client/tile.cpp index 582219bb8..d36459bb2 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -405,7 +405,7 @@ class TextureSource : public IWritableTextureSource std::mutex m_textureinfo_cache_mutex; // Queued texture fetches (to be processed by the main thread) - RequestQueue m_get_texture_queue; + RequestQueue m_get_texture_queue; // Textures that have been overwritten with other ones // but can't be deleted because the ITexture* might still be used @@ -491,16 +491,16 @@ u32 TextureSource::getTextureId(const std::string &name) infostream<<"getTextureId(): Queued: name=\""< result_queue; + static thread_local ResultQueue result_queue; // Throw a request in - m_get_texture_queue.add(name, 0, 0, &result_queue); + m_get_texture_queue.add(name, std::this_thread::get_id(), 0, &result_queue); try { while(true) { - // Wait for result for up to 4 seconds (empirical value) - GetResult - result = result_queue.pop_front(4000); + // Wait for result for up to 1 seconds (empirical value) + GetResult + result = result_queue.pop_front(1000); if (result.key == name) { return result.item; @@ -726,10 +726,10 @@ void TextureSource::processQueue() /* Fetch textures */ - //NOTE this is only thread safe for ONE consumer thread! - if (!m_get_texture_queue.empty()) + // NOTE: process outstanding requests from all mesh generation threads + while (!m_get_texture_queue.empty()) { - GetRequest + GetRequest request = m_get_texture_queue.pop(); /*infostream<<"TextureSource::processQueue(): "