Refine poll handle negative poll_fds
This commit is contained in:
parent
b89fa9dd5c
commit
0fef286df2
@ -18,12 +18,12 @@ pub fn do_poll_new(poll_fds: &[PollFd], mut timeout: Option<&mut Duration>) -> R
|
|||||||
poll_fd.revents.set(IoEvents::empty());
|
poll_fd.revents.set(IoEvents::empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map poll_fds to FileRef's
|
// Map valid and non-negative poll_fds to FileRef's
|
||||||
let thread = current!();
|
let thread = current!();
|
||||||
let mut invalid_fd_count = 0;
|
let mut invalid_fd_count = 0;
|
||||||
let files: Vec<FileRef> = poll_fds
|
let files_and_expected_events: Vec<Option<(FileRef, IoEvents)>> = poll_fds
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|poll_fd| {
|
.map(|poll_fd| {
|
||||||
if (poll_fd.fd as i32) < 0 {
|
if (poll_fd.fd as i32) < 0 {
|
||||||
// If poll_fd is negative, ignore the events.
|
// If poll_fd is negative, ignore the events.
|
||||||
return None;
|
return None;
|
||||||
@ -37,7 +37,7 @@ pub fn do_poll_new(poll_fds: &[PollFd], mut timeout: Option<&mut Duration>) -> R
|
|||||||
invalid_fd_count += 1;
|
invalid_fd_count += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
file
|
Some((file.unwrap(), poll_fd.events))
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
@ -46,12 +46,17 @@ pub fn do_poll_new(poll_fds: &[PollFd], mut timeout: Option<&mut Duration>) -> R
|
|||||||
return Ok(invalid_fd_count);
|
return Ok(invalid_fd_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
debug_assert!(files_and_expected_events.len() == poll_fds.len());
|
||||||
|
|
||||||
// Now that all fds are valid, we set up a monitor for the set of files
|
// Now that all fds are valid, we set up a monitor for the set of files
|
||||||
let mut monitor = {
|
let mut monitor = {
|
||||||
let expected_num_files = files.len();
|
let expected_num_files = files_and_expected_events.len();
|
||||||
let mut builder = EventMonitorBuilder::new(expected_num_files);
|
let mut builder = EventMonitorBuilder::new(expected_num_files);
|
||||||
for (file, poll_fd) in files.into_iter().zip(poll_fds.iter()) {
|
for file_and_expect_event in files_and_expected_events.iter() {
|
||||||
builder.add_file(file, poll_fd.events);
|
if let Some((file_and_event)) = file_and_expect_event {
|
||||||
|
builder.add_file(file_and_event.0.clone(), file_and_event.1);
|
||||||
|
}
|
||||||
|
// Ignore negative poll_fds
|
||||||
}
|
}
|
||||||
builder.build()
|
builder.build()
|
||||||
};
|
};
|
||||||
@ -62,8 +67,13 @@ pub fn do_poll_new(poll_fds: &[PollFd], mut timeout: Option<&mut Duration>) -> R
|
|||||||
|
|
||||||
// Poll each and every interesting file
|
// Poll each and every interesting file
|
||||||
let mut count = 0;
|
let mut count = 0;
|
||||||
for (file, poll_fd) in monitor.files().zip(poll_fds.iter()) {
|
for (file_and_event, poll_fd) in files_and_expected_events.iter().zip(poll_fds.iter()) {
|
||||||
|
// Ignore negative poll_fds
|
||||||
|
if file_and_event.is_none() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
let mask = poll_fd.events;
|
let mask = poll_fd.events;
|
||||||
|
let file = &file_and_event.as_ref().unwrap().0;
|
||||||
let events = file.poll_new() & mask;
|
let events = file.poll_new() & mask;
|
||||||
if !events.is_empty() {
|
if !events.is_empty() {
|
||||||
poll_fd.revents.set(events);
|
poll_fd.revents.set(events);
|
||||||
|
Loading…
Reference in New Issue
Block a user