@@ -123,10 +123,16 @@ impl FdQueue {
123123 }
124124 }
125125
126- pub fn event ( & self , key : usize ) -> Event {
127- let mut event = Event :: all ( key) ;
128- event. readable = !self . read_queue . is_empty ( ) ;
129- event. writable = !self . write_queue . is_empty ( ) ;
126+ pub fn event ( & self ) -> Event {
127+ let mut event = Event :: none ( 0 ) ;
128+ if let Some ( & key) = self . read_queue . front ( ) {
129+ event. readable = true ;
130+ event. key = key;
131+ }
132+ if let Some ( & key) = self . write_queue . front ( ) {
133+ event. writable = true ;
134+ event. key = key;
135+ }
130136 event
131137 }
132138
@@ -199,7 +205,7 @@ impl Driver {
199205 let need_add = !self . registry . contains_key ( & arg. fd ) ;
200206 let queue = self . registry . entry ( arg. fd ) . or_default ( ) ;
201207 queue. push_back_interest ( user_data, arg. interest ) ;
202- let event = queue. event ( user_data ) ;
208+ let event = queue. event ( ) ;
203209 if need_add {
204210 self . poll . add ( arg. fd , event) ?;
205211 } else {
@@ -331,14 +337,16 @@ impl Driver {
331337 let user_data = event. key ;
332338 trace ! ( "receive {} for {:?}" , user_data, event) ;
333339 let mut op = Key :: < dyn crate :: sys:: OpCode > :: new_unchecked ( user_data) ;
334- let mut op = op. as_op_pin ( ) ;
335- match op. as_mut ( ) . op_type ( ) {
340+ let op = op. as_op_pin ( ) ;
341+ match op. op_type ( ) {
336342 None => {
337343 // On epoll, multiple event may be received even if it is registered as
338344 // one-shot. It is safe to ignore it.
339345 trace ! ( "op {} is completed" , user_data) ;
340346 }
341347 Some ( OpType :: Fd ( fd) ) => {
348+ // If it's an FD op, the returned user_data is only for calling `op_type`. We
349+ // need to pop the real user_data from the queue.
342350 let queue = self
343351 . registry
344352 . get_mut ( & fd)
@@ -347,6 +355,8 @@ impl Driver {
347355 if self . cancelled . remove ( & user_data) {
348356 entry_cancelled ( user_data) . notify ( ) ;
349357 } else {
358+ let mut op = Key :: < dyn crate :: sys:: OpCode > :: new_unchecked ( user_data) ;
359+ let op = op. as_op_pin ( ) ;
350360 let res = match op. operate ( ) {
351361 Poll :: Pending => {
352362 // The operation should go back to the front.
@@ -360,7 +370,7 @@ impl Driver {
360370 }
361371 }
362372 }
363- let renew_event = queue. event ( user_data ) ;
373+ let renew_event = queue. event ( ) ;
364374 let borrowed_fd = BorrowedFd :: borrow_raw ( fd) ;
365375 if !renew_event. readable && !renew_event. writable {
366376 self . poll . delete ( borrowed_fd) ?;
0 commit comments