Make the IoEvents type to more complete and robust
This commit is contained in:
		
							parent
							
								
									4260a8defc
								
							
						
					
					
						commit
						7133315f46
					
				| @ -2,13 +2,37 @@ use crate::events::{Event, EventFilter, Notifier, Observer}; | |||||||
| use crate::prelude::*; | use crate::prelude::*; | ||||||
| 
 | 
 | ||||||
| bitflags! { | bitflags! { | ||||||
|  |     /// I/O Events
 | ||||||
|  |     #[rustfmt::skip] | ||||||
|     pub struct IoEvents: u32 { |     pub struct IoEvents: u32 { | ||||||
|         const IN = 0x001; // = POLLIN
 |         const IN    = 0x0001; // = POLLIN
 | ||||||
|         const OUT = 0x004; // = POLLOUT
 |         const PRI   = 0x0002; // = POLLPRI
 | ||||||
|         const PRI = 0x002; // = POLLPRI
 |         const OUT   = 0x0004; // = POLLOUT
 | ||||||
|         const ERR = 0x008; // = POLLERR
 |         const ERR   = 0x0008; // = POLLERR
 | ||||||
|  |         const HUP   = 0x0010; // = POLLHUP
 | ||||||
|  |         const NVAL  = 0x0020; // = POLLNVAL
 | ||||||
|         const RDHUP = 0x2000; // = POLLRDHUP
 |         const RDHUP = 0x2000; // = POLLRDHUP
 | ||||||
|         const HUP = 0x010; // = POLLHUP
 |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl IoEvents { | ||||||
|  |     pub fn from_raw(raw: u32) -> Self { | ||||||
|  |         if Self::contains_unrecognizable_bits(raw) { | ||||||
|  |             warn!("contain unknow flags: {:#x}", raw); | ||||||
|  |         } | ||||||
|  |         Self::from_bits_truncate(raw) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn contains_unrecognizable_bits(raw: u32) -> bool { | ||||||
|  |         // Help to detect four valid but mostly useless flags that we do not
 | ||||||
|  |         // handle, yet: POLLRDNORM, POLLRDBAND, POLLWRNORM, annd POLLWRBAND.
 | ||||||
|  | 
 | ||||||
|  |         let all_raw = Self::all().to_raw(); | ||||||
|  |         (raw & !all_raw) != 0 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn to_raw(&self) -> u32 { | ||||||
|  |         self.bits() | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -156,7 +156,7 @@ impl HostFileEpoller { | |||||||
|         let mut host_files = self.host_files.lock().unwrap(); |         let mut host_files = self.host_files.lock().unwrap(); | ||||||
|         for raw_event in &raw_events[..count] { |         for raw_event in &raw_events[..count] { | ||||||
|             let raw_event = unsafe { raw_event.assume_init() }; |             let raw_event = unsafe { raw_event.assume_init() }; | ||||||
|             let io_events = IoEvents::from_bits_truncate(raw_event.events as u32); |             let io_events = IoEvents::from_raw(raw_event.events as u32); | ||||||
|             let host_fd = raw_event.u64 as u32; |             let host_fd = raw_event.u64 as u32; | ||||||
| 
 | 
 | ||||||
|             let host_file = match host_files.get(&host_fd) { |             let host_file = match host_files.get(&host_fd) { | ||||||
|  | |||||||
| @ -55,7 +55,7 @@ impl EpollEvent { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn from_c(c_event: &libc::epoll_event) -> Self { |     pub fn from_c(c_event: &libc::epoll_event) -> Self { | ||||||
|         let mask = IoEvents::from_bits_truncate(c_event.events as u32); |         let mask = IoEvents::from_raw(c_event.events as u32); | ||||||
|         let user_data = c_event.u64; |         let user_data = c_event.u64; | ||||||
|         Self { mask, user_data } |         Self { mask, user_data } | ||||||
|     } |     } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user