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()); | ||||
|     } | ||||
| 
 | ||||
|     // Map poll_fds to FileRef's
 | ||||
|     // Map valid and non-negative poll_fds to FileRef's
 | ||||
|     let thread = current!(); | ||||
|     let mut invalid_fd_count = 0; | ||||
|     let files: Vec<FileRef> = poll_fds | ||||
|     let files_and_expected_events: Vec<Option<(FileRef, IoEvents)>> = poll_fds | ||||
|         .iter() | ||||
|         .filter_map(|poll_fd| { | ||||
|         .map(|poll_fd| { | ||||
|             if (poll_fd.fd as i32) < 0 { | ||||
|                 // If poll_fd is negative, ignore the events.
 | ||||
|                 return None; | ||||
| @ -37,7 +37,7 @@ pub fn do_poll_new(poll_fds: &[PollFd], mut timeout: Option<&mut Duration>) -> R | ||||
|                 invalid_fd_count += 1; | ||||
|             } | ||||
| 
 | ||||
|             file | ||||
|             Some((file.unwrap(), poll_fd.events)) | ||||
|         }) | ||||
|         .collect(); | ||||
| 
 | ||||
| @ -46,12 +46,17 @@ pub fn do_poll_new(poll_fds: &[PollFd], mut timeout: Option<&mut Duration>) -> R | ||||
|         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
 | ||||
|     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); | ||||
|         for (file, poll_fd) in files.into_iter().zip(poll_fds.iter()) { | ||||
|             builder.add_file(file, poll_fd.events); | ||||
|         for file_and_expect_event in files_and_expected_events.iter() { | ||||
|             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() | ||||
|     }; | ||||
| @ -62,8 +67,13 @@ pub fn do_poll_new(poll_fds: &[PollFd], mut timeout: Option<&mut Duration>) -> R | ||||
| 
 | ||||
|         // Poll each and every interesting file
 | ||||
|         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 file = &file_and_event.as_ref().unwrap().0; | ||||
|             let events = file.poll_new() & mask; | ||||
|             if !events.is_empty() { | ||||
|                 poll_fd.revents.set(events); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user