From b6539399f43698aee41d02aa5b8ef1423d6c7da1 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Thu, 1 Dec 2011 02:41:52 +0200 Subject: [PATCH] Fix deadlock if MeshUpdateThread asks new textures while it is being stopped (happened if texture data was transferred slowly) --- src/client.cpp | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) 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);