Fix deadlock if MeshUpdateThread asks new textures while it is being stopped (happened if texture data was transferred slowly)

This commit is contained in:
Perttu Ahola 2011-12-01 02:41:52 +02:00
parent 8b8ef8acc0
commit b6539399f4
1 changed files with 20 additions and 5 deletions

View 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);