@@ -80,29 +80,36 @@ struct FdQueue {
8080}
8181
8282impl FdQueue {
83- pub fn push_interest ( & mut self , user_data : usize , interest : Interest ) {
83+ pub fn push_back_interest ( & mut self , user_data : usize , interest : Interest ) {
8484 match interest {
8585 Interest :: Readable => self . read_queue . push_back ( user_data) ,
8686 Interest :: Writable => self . write_queue . push_back ( user_data) ,
8787 }
8888 }
8989
90+ pub fn push_front_interest ( & mut self , user_data : usize , interest : Interest ) {
91+ match interest {
92+ Interest :: Readable => self . read_queue . push_front ( user_data) ,
93+ Interest :: Writable => self . write_queue . push_front ( user_data) ,
94+ }
95+ }
96+
9097 pub fn event ( & self , key : usize ) -> Event {
9198 let mut event = Event :: all ( key) ;
9299 event. readable = !self . read_queue . is_empty ( ) ;
93100 event. writable = !self . write_queue . is_empty ( ) ;
94101 event
95102 }
96103
97- pub fn pop_interest ( & mut self , event : & Event ) -> usize {
104+ pub fn pop_interest ( & mut self , event : & Event ) -> ( usize , Interest ) {
98105 if event. readable {
99106 if let Some ( user_data) = self . read_queue . pop_front ( ) {
100- return user_data;
107+ return ( user_data, Interest :: Readable ) ;
101108 }
102109 }
103110 if event. writable {
104111 if let Some ( user_data) = self . write_queue . pop_front ( ) {
105- return user_data;
112+ return ( user_data, Interest :: Writable ) ;
106113 }
107114 }
108115 unreachable ! ( "should receive event when no interest" )
@@ -140,7 +147,7 @@ impl Driver {
140147 } else {
141148 let need_add = !self . registry . contains_key ( & arg. fd ) ;
142149 let queue = self . registry . entry ( arg. fd ) . or_default ( ) ;
143- queue. push_interest ( user_data, arg. interest ) ;
150+ queue. push_back_interest ( user_data, arg. interest ) ;
144151 // We use fd as the key.
145152 let event = queue. event ( arg. fd as usize ) ;
146153 unsafe {
@@ -205,23 +212,29 @@ impl Driver {
205212 . registry
206213 . get_mut ( & fd)
207214 . expect ( "the fd should be attached" ) ;
208- let user_data = queue. pop_interest ( & event) ;
209- let renew_event = queue. event ( fd as _ ) ;
210- unsafe {
211- let fd = BorrowedFd :: borrow_raw ( fd) ;
212- self . poll . modify ( fd, renew_event) ?;
213- }
215+ let ( user_data, interest) = queue. pop_interest ( & event) ;
214216 if self . cancelled . remove ( & user_data) {
215217 entries. extend ( Some ( entry_cancelled ( user_data) ) ) ;
216218 } else {
217219 let op = registry[ user_data] . as_pin ( ) ;
218220 let res = match op. on_event ( & event) {
219- Ok ( ControlFlow :: Continue ( _) ) => continue ,
220- Ok ( ControlFlow :: Break ( res) ) => Ok ( res) ,
221- Err ( err) => Err ( err) ,
221+ Ok ( ControlFlow :: Continue ( _) ) => {
222+ // The operation should go back to the front.
223+ queue. push_front_interest ( user_data, interest) ;
224+ None
225+ }
226+ Ok ( ControlFlow :: Break ( res) ) => Some ( Ok ( res) ) ,
227+ Err ( err) => Some ( Err ( err) ) ,
222228 } ;
223- let entry = Entry :: new ( user_data, res) ;
224- entries. extend ( Some ( entry) ) ;
229+ if let Some ( res) = res {
230+ let entry = Entry :: new ( user_data, res) ;
231+ entries. extend ( Some ( entry) ) ;
232+ }
233+ }
234+ let renew_event = queue. event ( fd as _ ) ;
235+ unsafe {
236+ let fd = BorrowedFd :: borrow_raw ( fd) ;
237+ self . poll . modify ( fd, renew_event) ?;
225238 }
226239 }
227240 Ok ( ( ) )
0 commit comments