diff options
| author | MaxVerevkin <maxxverrr@gmail.com> | 2023-12-08 21:40:04 +0200 |
|---|---|---|
| committer | MaxVerevkin <maxxverrr@gmail.com> | 2023-12-08 21:40:04 +0200 |
| commit | 4db1a28c651e909f2c71e331b71dae7cab3322b0 (patch) | |
| tree | 45c5fa87c9fcb48d912bdfd3c8a7b134fa8bd2eb /src/event_loop.rs | |
| parent | d0b6e97064a36bc902ea43c65fa529c8d77ebab3 (diff) | |
| download | i3bar-mango-4db1a28c651e909f2c71e331b71dae7cab3322b0.tar.gz | |
update event_loop.rs
Diffstat (limited to 'src/event_loop.rs')
| -rw-r--r-- | src/event_loop.rs | 58 |
1 files changed, 28 insertions, 30 deletions
diff --git a/src/event_loop.rs b/src/event_loop.rs index 3b02624..ec0d65c 100644 --- a/src/event_loop.rs +++ b/src/event_loop.rs @@ -14,6 +14,7 @@ pub struct EventLoopCtx<'a> { pub state: &'a mut State, } +/// Simple callback-based event loop. Implemented using `poll`. pub struct EventLoop { pollfds: Vec<libc::pollfd>, cbs: HashMap<RawFd, Callback>, @@ -40,44 +41,41 @@ impl EventLoop { } pub fn run(&mut self, conn: &mut Connection<State>, state: &mut State) -> Result<()> { - if self.cbs.is_empty() { - return Ok(()); - } - - self.pollfds.clear(); - for &fd in self.cbs.keys() { - self.pollfds.push(libc::pollfd { - fd, - events: libc::POLLIN, - revents: 0, - }); - } + while !self.cbs.is_empty() { + self.pollfds.clear(); + for &fd in self.cbs.keys() { + self.pollfds.push(libc::pollfd { + fd, + events: libc::POLLIN, + revents: 0, + }); + } - loop { - let result = - unsafe { libc::poll(self.pollfds.as_mut_ptr(), self.pollfds.len() as _, -1) }; - if result == -1 { - let err = io::Error::last_os_error(); - if err.kind() == io::ErrorKind::Interrupted { - continue; + loop { + let result = + unsafe { libc::poll(self.pollfds.as_mut_ptr(), self.pollfds.len() as _, -1) }; + if result == -1 { + let err = io::Error::last_os_error(); + if err.kind() == io::ErrorKind::Interrupted { + continue; + } + return Err(err.into()); } - return Err(err.into()); + break; } - break; - } - for fd in &self.pollfds { - if fd.revents != 0 { - let mut cb = self.cbs.remove(&fd.fd).unwrap(); - match cb(EventLoopCtx { conn, state })? { - Action::Keep => { - self.cbs.insert(fd.fd, cb); + for fd in &self.pollfds { + if fd.revents != 0 { + let mut cb = self.cbs.remove(&fd.fd).unwrap(); + match cb(EventLoopCtx { conn, state })? { + Action::Keep => { + self.cbs.insert(fd.fd, cb); + } + Action::Unregister => (), } - Action::Unregister => (), } } } - Ok(()) } } |
