From 5f6dedd7d3056dd7d282dc6e50a61d8bf036bb9a Mon Sep 17 00:00:00 2001 From: Joe Wilm Date: Fri, 6 Jan 2017 08:21:00 -0800 Subject: Handle EINTR in I/O loop This fixes an issue where encountering some signals panicked the event loop thread. Resolves #76 --- src/event_loop.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/event_loop.rs b/src/event_loop.rs index d1c52367..eb0b24b8 100644 --- a/src/event_loop.rs +++ b/src/event_loop.rs @@ -222,6 +222,7 @@ impl EventLoop }, Err(err) => { match err.kind() { + ErrorKind::Interrupted | ErrorKind::WouldBlock => break, _ => panic!("unexpected read err: {:?}", err), } @@ -251,6 +252,7 @@ impl EventLoop Err(err) => { state.set_current(Some(current)); match err.kind() { + ErrorKind::Interrupted | ErrorKind::WouldBlock => break 'write_many, // TODO _ => panic!("unexpected err: {:?}", err), @@ -289,7 +291,12 @@ impl EventLoop }; 'event_loop: loop { - self.poll.poll(&mut events, None).expect("poll ok"); + if let Err(err) = self.poll.poll(&mut events, None) { + match err.kind() { + ErrorKind::Interrupted => continue, + _ => panic!("EventLoop polling error: {:?}", err) + } + } for event in events.iter() { match event.token() { -- cgit