Fix: Chunk loading dead lock

This commit is contained in:
Snowiiii 2024-09-01 23:14:53 +02:00
parent 5c0dffbf9d
commit 1f4fe2a26e
3 changed files with 15 additions and 6 deletions

View File

@ -145,8 +145,12 @@ impl Level {
&self, &self,
chunks: &[Vector2<i32>], chunks: &[Vector2<i32>],
channel: mpsc::Sender<Result<Arc<ChunkData>, WorldError>>, channel: mpsc::Sender<Result<Arc<ChunkData>, WorldError>>,
is_alive: bool,
) { ) {
chunks.into_par_iter().for_each(|at| { chunks.into_par_iter().for_each(|at| {
if is_alive {
return;
}
let channel = channel.clone(); let channel = channel.clone();
// Check if chunks is already loaded // Check if chunks is already loaded

View File

@ -160,8 +160,10 @@ fn main() -> io::Result<()> {
let done = if let Some(player) = players.get_mut(&token) { let done = if let Some(player) = players.get_mut(&token) {
let mut player = player.lock().unwrap(); let mut player = player.lock().unwrap();
player.client.poll(event).await; player.client.poll(event).await;
let mut server = server.lock().await; if !player.client.closed {
player.process_packets(&mut server).await; let mut server = server.lock().await;
player.process_packets(&mut server).await;
}
player.client.closed player.client.closed
} else { } else {
false false
@ -179,8 +181,10 @@ fn main() -> io::Result<()> {
// Maybe received an event for a TCP connection. // Maybe received an event for a TCP connection.
let (done, make_player) = if let Some(client) = clients.get_mut(&token) { let (done, make_player) = if let Some(client) = clients.get_mut(&token) {
client.poll(event).await; client.poll(event).await;
let mut server = server.lock().await; if !client.closed {
client.process_packets(&mut server).await; let mut server = server.lock().await;
client.process_packets(&mut server).await;
}
(client.closed, client.make_player) (client.closed, client.make_player)
} else { } else {
// Sporadic events happen, we can safely ignore them. // Sporadic events happen, we can safely ignore them.

View File

@ -230,12 +230,13 @@ impl World {
let (sender, mut chunk_receiver) = mpsc::channel(distance as usize); let (sender, mut chunk_receiver) = mpsc::channel(distance as usize);
let level = self.level.clone(); let level = self.level.clone();
let closed = client.closed;
tokio::spawn(async move { tokio::spawn(async move {
level.lock().unwrap().fetch_chunks(&chunks, sender); level.lock().unwrap().fetch_chunks(&chunks, sender, closed);
}); });
while let Some(chunk_data) = chunk_receiver.recv().await { while let Some(chunk_data) = chunk_receiver.recv().await {
if client.closed { if closed {
return; return;
} }
// dbg!(chunk_pos); // dbg!(chunk_pos);