Fix: Chunk loading dead lock
This commit is contained in:
parent
5c0dffbf9d
commit
1f4fe2a26e
@ -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
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user