message: Fix select return value
diff: @@ -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 {
  + 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
  }
  