From 438acd7d09e1228e13adea39d3ca1b4462b5557a Mon Sep 17 00:00:00 2001 From: jD91mZM2 Date: Sun, 3 Jun 2018 17:09:56 +0200 Subject: [PATCH] Only send events that were asked for --- examples/event.rs | 24 ++++++++++++++++++++++-- src/scheme.rs | 30 ++++++++++++------------------ 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/examples/event.rs b/examples/event.rs index 561976f101..f6f1e11a74 100644 --- a/examples/event.rs +++ b/examples/event.rs @@ -22,8 +22,6 @@ fn dup(file: &File, buf: &str) -> io::Result { fn main() -> io::Result<()> { let server = File::create("chan:hello_world")?; - println!("Testing events..."); - nonblock(&server)?; let mut event_file = File::open("event:")?; @@ -37,6 +35,8 @@ fn main() -> io::Result<()> { time_file.write(&time)?; time.tv_sec += 2; time_file.write(&time)?; + time.tv_sec += 1; + time_file.write(&time)?; const TOKEN_TIMER: usize = 0; const TOKEN_STREAM: usize = 1; @@ -56,6 +56,8 @@ fn main() -> io::Result<()> { let mut event = syscall::Event::default(); + println!("Testing accept events..."); + event_file.read(&mut event)?; assert_eq!(event.data, TOKEN_TIMER); assert_eq!(event.flags, syscall::EVENT_READ); @@ -73,6 +75,8 @@ fn main() -> io::Result<()> { assert_eq!(event.flags, syscall::EVENT_WRITE); println!("-> Accept event"); + println!("Testing write events..."); + let mut stream = dup(&server, "listen")?; event_file.read(&mut event)?; @@ -96,6 +100,8 @@ fn main() -> io::Result<()> { assert_eq!(event.flags, syscall::EVENT_READ); println!("-> Timed out"); + println!("Testing read events..."); + client.write(b"a")?; let mut buf = [0; 5]; @@ -130,6 +136,20 @@ fn main() -> io::Result<()> { assert_eq!(event.data, TOKEN_TIMER); println!("-> Timed out"); + println!("Testing no events..."); + + event_file.write(&syscall::Event { + id: server.as_raw_fd(), + flags: 0, + data: TOKEN_SERVER + })?; + + let _client = File::open("chan:hello_world")?; + + event_file.read(&mut event)?; + assert_eq!(event.data, TOKEN_TIMER); + println!("-> Timed out"); + println!("Everything tested!"); Ok(()) } diff --git a/src/scheme.rs b/src/scheme.rs index 75892ef826..1066f8df5e 100644 --- a/src/scheme.rs +++ b/src/scheme.rs @@ -73,25 +73,19 @@ pub struct IpcScheme { impl IpcScheme { pub fn post_fevents(&mut self, file: &mut File) -> io::Result<()> { for (id, handle) in &mut self.handles { - match handle.extra { - Extra::Listener(_) => { - if let Connection::Open(_) = handle.remote { - // Send writable because that's what smolnetd does for TcpListener - if !handle.notified_write { - handle.notified_write = true; - post_fevent(file, *id, EVENT_WRITE)?; - } - } else { - handle.notified_write = false; - } - }, - Extra::Client(ref mut client) => { - if let Connection::Open(_) = handle.remote { - if !handle.notified_write { - handle.notified_write = true; - post_fevent(file, *id, EVENT_WRITE)?; - } + if handle.fevent & EVENT_WRITE == EVENT_WRITE { + if let Connection::Open(_) = handle.remote { + // Send writable even for listeners because that's what smolnetd does for TcpListener + if !handle.notified_write { + handle.notified_write = true; + post_fevent(file, *id, EVENT_WRITE)?; } + } else { + handle.notified_write = false; + } + } + if let Extra::Client(ref mut client) = handle.extra { + if handle.fevent & EVENT_READ == EVENT_READ { if !client.buffer.is_empty() || handle.remote == Connection::Closed { if !handle.notified_read { handle.notified_read = true;