Fix deadlock if MeshUpdateThread asks new textures while it is being stopped (happene...
authorPerttu Ahola <celeron55@gmail.com>
Thu, 1 Dec 2011 00:41:52 +0000 (02:41 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Thu, 1 Dec 2011 00:41:52 +0000 (02:41 +0200)
src/client.cpp

index 0f28087d4ca791c47db92a316d7ac3a73bf898d8..fee219942da13240ff80f1c5c4af42b2a798f6fa 100644 (file)
@@ -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);