@@ -80,6 +80,7 @@ enum DispatcherError<S, U> {
8080
8181enum PollService < U : Encoder + Decoder > {
8282 Item ( DispatchItem < U > ) ,
83+ ItemWait ( DispatchItem < U > ) ,
8384 Continue ,
8485 Ready ,
8586}
@@ -203,30 +204,30 @@ where
203204 loop {
204205 match slf. st {
205206 DispatcherState :: Processing => {
206- let item = match ready ! ( slf. poll_service( cx) ) {
207+ let ( item, nowait ) = match ready ! ( slf. poll_service( cx) ) {
207208 PollService :: Ready => {
208209 // decode incoming bytes if buffer is ready
209210 match slf. shared . io . poll_recv_decode ( & slf. shared . codec , cx) {
210211 Ok ( decoded) => {
211212 slf. update_timer ( & decoded) ;
212213 if let Some ( el) = decoded. item {
213- DispatchItem :: Item ( el)
214+ ( DispatchItem :: Item ( el) , true )
214215 } else {
215216 return Poll :: Pending ;
216217 }
217218 }
218219 Err ( RecvError :: KeepAlive ) => {
219220 if let Err ( err) = slf. handle_timeout ( ) {
220221 slf. st = DispatcherState :: Stop ;
221- err
222+ ( err, true )
222223 } else {
223224 continue ;
224225 }
225226 }
226227 Err ( RecvError :: WriteBackpressure ) => {
227228 // instruct write task to notify dispatcher when data is flushed
228229 slf. st = DispatcherState :: Backpressure ;
229- DispatchItem :: WBackPressureEnabled
230+ ( DispatchItem :: WBackPressureEnabled , true )
230231 }
231232 Err ( RecvError :: Decoder ( err) ) => {
232233 log:: trace!(
@@ -235,7 +236,7 @@ where
235236 err
236237 ) ;
237238 slf. st = DispatcherState :: Stop ;
238- DispatchItem :: DecoderError ( err)
239+ ( DispatchItem :: DecoderError ( err) , true )
239240 }
240241 Err ( RecvError :: PeerGone ( err) ) => {
241242 log:: trace!(
@@ -244,21 +245,23 @@ where
244245 err
245246 ) ;
246247 slf. st = DispatcherState :: Stop ;
247- DispatchItem :: Disconnect ( err)
248+ ( DispatchItem :: Disconnect ( err) , true )
248249 }
249250 }
250251 }
251- PollService :: Item ( item) => item,
252+ PollService :: Item ( item) => ( item, true ) ,
253+ PollService :: ItemWait ( item) => ( item, false ) ,
252254 PollService :: Continue => continue ,
253255 } ;
254256
255- slf. call_service ( cx, item) ;
257+ slf. call_service ( cx, item, nowait ) ;
256258 }
257259 // handle write back-pressure
258260 DispatcherState :: Backpressure => {
259261 match ready ! ( slf. poll_service( cx) ) {
260262 PollService :: Ready => ( ) ,
261- PollService :: Item ( item) => slf. call_service ( cx, item) ,
263+ PollService :: Item ( item) => slf. call_service ( cx, item, true ) ,
264+ PollService :: ItemWait ( item) => slf. call_service ( cx, item, false ) ,
262265 PollService :: Continue => continue ,
263266 } ;
264267
@@ -270,7 +273,7 @@ where
270273 slf. st = DispatcherState :: Processing ;
271274 DispatchItem :: WBackPressureDisabled
272275 } ;
273- slf. call_service ( cx, item) ;
276+ slf. call_service ( cx, item, false ) ;
274277 }
275278 // drain service responses and shutdown io
276279 DispatcherState :: Stop => {
@@ -335,8 +338,12 @@ where
335338 S : Service < DispatchItem < U > , Response = Option < Response < U > > > + ' static ,
336339 U : Decoder + Encoder + ' static ,
337340{
338- fn call_service ( & mut self , cx : & mut Context < ' _ > , item : DispatchItem < U > ) {
339- let mut fut = self . shared . service . call_nowait ( item) ;
341+ fn call_service ( & mut self , cx : & mut Context < ' _ > , item : DispatchItem < U > , nowait : bool ) {
342+ let mut fut = if nowait {
343+ self . shared . service . call_nowait ( item)
344+ } else {
345+ self . shared . service . call ( item)
346+ } ;
340347 let inflight = self . shared . inflight . get ( ) + 1 ;
341348 self . shared . inflight . set ( inflight) ;
342349 if inflight == 1 {
@@ -405,7 +412,7 @@ where
405412 self . shared. io. tag( )
406413 ) ;
407414 self . st = DispatcherState :: Stop ;
408- Poll :: Ready ( PollService :: Item ( DispatchItem :: KeepAliveTimeout ) )
415+ Poll :: Ready ( PollService :: ItemWait ( DispatchItem :: KeepAliveTimeout ) )
409416 }
410417 IoStatusUpdate :: PeerGone ( err) => {
411418 log:: trace!(
@@ -414,11 +421,13 @@ where
414421 err
415422 ) ;
416423 self . st = DispatcherState :: Stop ;
417- Poll :: Ready ( PollService :: Item ( DispatchItem :: Disconnect ( err) ) )
424+ Poll :: Ready ( PollService :: ItemWait ( DispatchItem :: Disconnect ( err) ) )
418425 }
419426 IoStatusUpdate :: WriteBackpressure => {
420427 self . st = DispatcherState :: Backpressure ;
421- Poll :: Ready ( PollService :: Item ( DispatchItem :: WBackPressureEnabled ) )
428+ Poll :: Ready ( PollService :: ItemWait (
429+ DispatchItem :: WBackPressureEnabled ,
430+ ) )
422431 }
423432 }
424433 }
@@ -431,7 +440,7 @@ where
431440 self . st = DispatcherState :: Stop ;
432441 self . error = Some ( err) ;
433442 self . shared . insert_flags ( Flags :: READY_ERR ) ;
434- Poll :: Ready ( PollService :: Item ( DispatchItem :: Disconnect ( None ) ) )
443+ Poll :: Ready ( PollService :: Continue )
435444 }
436445 }
437446 }
@@ -618,7 +627,7 @@ mod tests {
618627 }
619628
620629 #[ ntex:: test]
621- async fn test_basic ( ) {
630+ async fn basics ( ) {
622631 let ( client, server) = IoTest :: create ( ) ;
623632 client. remote_buffer_cap ( 1024 ) ;
624633 client. write ( "GET /test HTTP/1\r \n \r \n " ) ;
@@ -654,7 +663,7 @@ mod tests {
654663 }
655664
656665 #[ ntex:: test]
657- async fn test_sink ( ) {
666+ async fn sink ( ) {
658667 let ( client, server) = IoTest :: create ( ) ;
659668 client. remote_buffer_cap ( 1024 ) ;
660669 client. write ( "GET /test HTTP/1\r \n \r \n " ) ;
@@ -693,7 +702,7 @@ mod tests {
693702 }
694703
695704 #[ ntex:: test]
696- async fn test_err_in_service ( ) {
705+ async fn err_in_service ( ) {
697706 let ( client, server) = IoTest :: create ( ) ;
698707 client. remote_buffer_cap ( 0 ) ;
699708 client. write ( "GET /test HTTP/1\r \n \r \n " ) ;
@@ -730,7 +739,7 @@ mod tests {
730739 }
731740
732741 #[ ntex:: test]
733- async fn test_err_in_service_ready ( ) {
742+ async fn err_in_service_ready ( ) {
734743 let ( client, server) = IoTest :: create ( ) ;
735744 client. remote_buffer_cap ( 0 ) ;
736745 client. write ( "GET /test HTTP/1\r \n \r \n " ) ;
@@ -787,7 +796,7 @@ mod tests {
787796 }
788797
789798 #[ ntex:: test]
790- async fn test_write_backpressure ( ) {
799+ async fn write_backpressure ( ) {
791800 let ( client, server) = IoTest :: create ( ) ;
792801 // do not allow to write to socket
793802 client. remote_buffer_cap ( 0 ) ;
@@ -862,7 +871,7 @@ mod tests {
862871 }
863872
864873 #[ ntex:: test]
865- async fn test_disconnect_during_read_backpressure ( ) {
874+ async fn disconnect_during_read_backpressure ( ) {
866875 let ( client, server) = IoTest :: create ( ) ;
867876 client. remote_buffer_cap ( 0 ) ;
868877
@@ -911,7 +920,7 @@ mod tests {
911920 }
912921
913922 #[ ntex:: test]
914- async fn test_keepalive ( ) {
923+ async fn keepalive ( ) {
915924 let ( client, server) = IoTest :: create ( ) ;
916925 client. remote_buffer_cap ( 1024 ) ;
917926 client. write ( "GET /test HTTP/1\r \n \r \n " ) ;
@@ -961,7 +970,7 @@ mod tests {
961970 }
962971
963972 #[ ntex:: test]
964- async fn test_keepalive2 ( ) {
973+ async fn keepalive2 ( ) {
965974 let ( client, server) = IoTest :: create ( ) ;
966975 client. remote_buffer_cap ( 1024 ) ;
967976
@@ -1012,7 +1021,7 @@ mod tests {
10121021
10131022 /// Update keep-alive timer after receiving frame
10141023 #[ ntex:: test]
1015- async fn test_keepalive3 ( ) {
1024+ async fn keepalive3 ( ) {
10161025 let ( client, server) = IoTest :: create ( ) ;
10171026 client. remote_buffer_cap ( 1024 ) ;
10181027
@@ -1069,7 +1078,7 @@ mod tests {
10691078 }
10701079
10711080 #[ ntex:: test]
1072- async fn test_read_timeout ( ) {
1081+ async fn read_timeout ( ) {
10731082 let ( client, server) = IoTest :: create ( ) ;
10741083 client. remote_buffer_cap ( 1024 ) ;
10751084
@@ -1129,7 +1138,7 @@ mod tests {
11291138 }
11301139
11311140 #[ ntex:: test]
1132- async fn test_idle_timeout ( ) {
1141+ async fn idle_timeout ( ) {
11331142 let ( client, server) = IoTest :: create ( ) ;
11341143 client. remote_buffer_cap ( 1024 ) ;
11351144
@@ -1181,7 +1190,7 @@ mod tests {
11811190 }
11821191
11831192 #[ ntex:: test]
1184- async fn test_unhandled_data ( ) {
1193+ async fn unhandled_data ( ) {
11851194 let handled = Arc :: new ( AtomicBool :: new ( false ) ) ;
11861195 let handled2 = handled. clone ( ) ;
11871196
0 commit comments