mirror of
https://github.com/Pumpkin-MC/Pumpkin.git
synced 2026-08-30 20:14:23 +00:00
Fix: Chunk loading dead lock
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user