From 1f4fe2a26e12718ce77d7e9f4a6b1df63267ac74 Mon Sep 17 00:00:00 2001 From: Snowiiii Date: Sun, 1 Sep 2024 23:14:53 +0200 Subject: [PATCH] Fix: Chunk loading dead lock --- pumpkin-world/src/level.rs | 4 ++++ pumpkin/src/main.rs | 12 ++++++++---- pumpkin/src/world/mod.rs | 5 +++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/pumpkin-world/src/level.rs b/pumpkin-world/src/level.rs index 3b63b58c4..9f3f9f403 100644 --- a/pumpkin-world/src/level.rs +++ b/pumpkin-world/src/level.rs @@ -145,8 +145,12 @@ impl Level { &self, chunks: &[Vector2], channel: mpsc::Sender, WorldError>>, + is_alive: bool, ) { chunks.into_par_iter().for_each(|at| { + if is_alive { + return; + } let channel = channel.clone(); // Check if chunks is already loaded diff --git a/pumpkin/src/main.rs b/pumpkin/src/main.rs index 79cd54053..8b9d8ef82 100644 --- a/pumpkin/src/main.rs +++ b/pumpkin/src/main.rs @@ -160,8 +160,10 @@ fn main() -> io::Result<()> { let done = if let Some(player) = players.get_mut(&token) { let mut player = player.lock().unwrap(); player.client.poll(event).await; - let mut server = server.lock().await; - player.process_packets(&mut server).await; + if !player.client.closed { + let mut server = server.lock().await; + player.process_packets(&mut server).await; + } player.client.closed } else { false @@ -179,8 +181,10 @@ fn main() -> io::Result<()> { // Maybe received an event for a TCP connection. let (done, make_player) = if let Some(client) = clients.get_mut(&token) { client.poll(event).await; - let mut server = server.lock().await; - client.process_packets(&mut server).await; + if !client.closed { + let mut server = server.lock().await; + client.process_packets(&mut server).await; + } (client.closed, client.make_player) } else { // Sporadic events happen, we can safely ignore them. diff --git a/pumpkin/src/world/mod.rs b/pumpkin/src/world/mod.rs index 0672e049f..0761acf0d 100644 --- a/pumpkin/src/world/mod.rs +++ b/pumpkin/src/world/mod.rs @@ -230,12 +230,13 @@ impl World { let (sender, mut chunk_receiver) = mpsc::channel(distance as usize); let level = self.level.clone(); + let closed = client.closed; 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 { - if client.closed { + if closed { return; } // dbg!(chunk_pos);