From: Perttu Ahola Date: Thu, 1 Dec 2011 00:41:52 +0000 (+0200) Subject: Fix deadlock if MeshUpdateThread asks new textures while it is being stopped (happene... X-Git-Url: http://81.2.79.47:8989/gitweb/?a=commitdiff_plain;h=b6539399f43698aee41d02aa5b8ef1423d6c7da1;p=zefram%2Fminetest%2Fminetest_engine.git Fix deadlock if MeshUpdateThread asks new textures while it is being stopped (happened if texture data was transferred slowly) --- diff --git a/src/client.cpp b/src/client.cpp index 0f28087d..fee21994 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -1519,7 +1519,12 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) std::istringstream is(datastring, std::ios_base::binary); // Stop threads while updating content definitions - m_mesh_update_thread.stop(); + m_mesh_update_thread.setRun(false); + // Process the remaining TextureSource queue to let MeshUpdateThread + // get it's remaining textures and thus let it stop + while(m_mesh_update_thread.IsRunning()){ + m_tsrc->processQueue(); + } /* u16 command @@ -1595,8 +1600,13 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) m_tooldef_received = true; // Stop threads while updating content definitions - m_mesh_update_thread.stop(); - + m_mesh_update_thread.setRun(false); + // Process the remaining TextureSource queue to let MeshUpdateThread + // get it's remaining textures and thus let it stop + while(m_mesh_update_thread.IsRunning()){ + m_tsrc->processQueue(); + } + std::istringstream tmp_is(deSerializeLongString(is), std::ios::binary); m_tooldef->deSerialize(tmp_is); @@ -1644,8 +1654,13 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) m_craftitemdef_received = true; // Stop threads while updating content definitions - m_mesh_update_thread.stop(); - + m_mesh_update_thread.setRun(false); + // Process the remaining TextureSource queue to let MeshUpdateThread + // get it's remaining textures and thus let it stop + while(m_mesh_update_thread.IsRunning()){ + m_tsrc->processQueue(); + } + std::istringstream tmp_is(deSerializeLongString(is), std::ios::binary); m_craftitemdef->deSerialize(tmp_is);