Skip to content
Snippets Groups Projects
Verified Commit 2a8bc833 authored by jD91mZM2's avatar jD91mZM2
Browse files

Fix select return value

parent b4329964
No related branches found
No related tags found
No related merge requests found
......@@ -635,9 +635,26 @@ impl Pal for Sys {
return false;
}
let mask = 1 << (fd & (8 * mem::size_of::<c_ulong>() - 1));
let mask = 1 << (fd & 8 * mem::size_of::<c_ulong>() - 1);
unsafe { (*set).fds_bits[fd / (8 * mem::size_of::<c_ulong>())] & mask == mask }
}
fn clearset(set: *mut fd_set) {
if set.is_null() {
return;
}
for i in unsafe { &mut (*set).fds_bits } {
*i = 0;
}
}
fn set(set: *mut fd_set, fd: usize) {
if set.is_null() {
return;
}
let mask = 1 << (fd & 8 * mem::size_of::<c_ulong>() - 1);
unsafe { (*set).fds_bits[fd / (8 * mem::size_of::<c_ulong>())] |= mask; }
}
let event_path = unsafe { CStr::from_bytes_with_nul_unchecked(b"event:\0") };
let event_file = match RawFile::open(event_path, fcntl::O_RDWR | fcntl::O_CLOEXEC, 0) {
......@@ -645,8 +662,6 @@ impl Pal for Sys {
Err(_) => return -1,
};
let mut total = 0;
for fd in 0..nfds as usize {
macro_rules! register {
($fd:expr, $flags:expr) => {
......@@ -665,14 +680,9 @@ impl Pal for Sys {
}
if isset(readfds, fd) {
register!(fd, syscall::EVENT_READ);
total += 1;
}
if isset(writefds, fd) {
register!(fd, syscall::EVENT_WRITE);
total += 1;
}
if isset(exceptfds, fd) {
total += 1;
}
}
......@@ -725,17 +735,40 @@ impl Pal for Sys {
Some(timeout_file)
};
let mut event = syscall::Event::default();
if Self::read(*event_file, &mut event) < 0 {
return -1;
}
let mut events = [syscall::Event::default(); 32];
let read = {
let mut events = unsafe { slice::from_raw_parts_mut(
&mut events as *mut _ as *mut u8,
mem::size_of::<syscall::Event>() * events.len()
) };
let read = Self::read(*event_file, &mut events);
if read < 0 {
return -1;
}
read as usize / mem::size_of::<syscall::Event>()
};
if timeout_file.is_some() && event.data == TIMEOUT_TOKEN {
return 0;
let mut total = 0;
clearset(readfds);
clearset(writefds);
clearset(exceptfds);
for event in &events[..read] {
if event.data == TIMEOUT_TOKEN {
continue;
}
if event.flags & syscall::EVENT_READ == syscall::EVENT_READ {
set(readfds, event.id);
total += 1;
}
if event.flags & syscall::EVENT_WRITE == syscall::EVENT_WRITE {
set(writefds, event.id);
total += 1;
}
}
// I really don't get why, but select wants me to return the total number
// of file descriptors that was inputted. I'm confused.
total
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment