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,
chunks: &[Vector2<i32>],
channel: mpsc::Sender<Result<Arc<ChunkData>, 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

View File

@@ -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.

View File

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