From c668498a6f44d5b4dd70006e09afa5535d7387fb Mon Sep 17 00:00:00 2001 From: Nova Date: Sun, 12 Jun 2022 21:25:20 -0400 Subject: [PATCH] fix(event loop): handle UnexpectedEOF to remove client when disconnected --- src/core/eventloop.rs | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/core/eventloop.rs b/src/core/eventloop.rs index 5d045cc..88506b4 100644 --- a/src/core/eventloop.rs +++ b/src/core/eventloop.rs @@ -61,12 +61,14 @@ impl EventLoop { token => loop { match clients.get(token.0).unwrap().as_ref().unwrap().dispatch() { Ok(_) => continue, - Err(e) => { - if e.kind() == std::io::ErrorKind::WouldBlock { + Err(e) => match e.kind() { + std::io::ErrorKind::UnexpectedEof => { + clients.remove(token.0); break; } - return Err(e.into()); - } + std::io::ErrorKind::WouldBlock => break, + _ => return Err(e.into()), + }, } }, } @@ -86,11 +88,8 @@ impl Drop for EventLoop { fn drop(&mut self) { let buf: [u8; 1] = [1; 1]; let _ = self.stop_write.write(buf.as_slice()); - let _ = self - .join_handle - .take() - .and_then(|handle| handle.join().ok()) - .as_ref() - .expect("Couldn't join the event loop thread at drop"); + if let Some(handle) = self.join_handle.take() { + handle.join().unwrap().unwrap(); + } } }