@@ -16,6 +16,7 @@ use crate::service::Routes;
16
16
pub use conn:: { Connected , TcpConnectInfo } ;
17
17
use hyper_util:: {
18
18
rt:: { TokioExecutor , TokioIo , TokioTimer } ,
19
+ server:: graceful:: GracefulShutdown ,
19
20
service:: TowerToHyperService ,
20
21
} ;
21
22
#[ cfg( feature = "tls" ) ]
@@ -561,10 +562,7 @@ impl<L> Server<L> {
561
562
builder
562
563
} ;
563
564
564
- let ( signal_tx, signal_rx) = tokio:: sync:: watch:: channel ( ( ) ) ;
565
- let signal_tx = Arc :: new ( signal_tx) ;
566
-
567
- let graceful = signal. is_some ( ) ;
565
+ let graceful = signal. is_some ( ) . then ( GracefulShutdown :: new) ;
568
566
let mut sig = pin ! ( Fuse { inner: signal } ) ;
569
567
let mut incoming = pin ! ( incoming) ;
570
568
@@ -601,21 +599,13 @@ impl<L> Server<L> {
601
599
let hyper_io = TokioIo :: new( io) ;
602
600
let hyper_svc = TowerToHyperService :: new( req_svc) ;
603
601
604
- serve_connection( hyper_io, hyper_svc, server. clone( ) , graceful. then ( || signal_rx . clone( ) ) ) ;
602
+ serve_connection( hyper_io, hyper_svc, server. clone( ) , graceful. clone( ) ) ;
605
603
}
606
604
}
607
605
}
608
606
609
- if graceful {
610
- let _ = signal_tx. send ( ( ) ) ;
611
- drop ( signal_rx) ;
612
- trace ! (
613
- "waiting for {} connections to close" ,
614
- signal_tx. receiver_count( )
615
- ) ;
616
-
617
- // Wait for all connections to close
618
- signal_tx. closed ( ) . await ;
607
+ if let Some ( graceful) = graceful {
608
+ graceful. shutdown ( ) . await ;
619
609
}
620
610
621
611
Ok ( ( ) )
@@ -628,7 +618,7 @@ fn serve_connection<IO, S>(
628
618
hyper_io : IO ,
629
619
hyper_svc : S ,
630
620
builder : ConnectionBuilder ,
631
- mut watcher : Option < tokio :: sync :: watch :: Receiver < ( ) > > ,
621
+ graceful : Option < GracefulShutdown > ,
632
622
) where
633
623
IO : hyper:: rt:: Read + hyper:: rt:: Write + Unpin + Send + ' static ,
634
624
S : HyperService < Request < Incoming > , Response = Response < BoxBody > > + Clone + Send + ' static ,
@@ -637,28 +627,20 @@ fn serve_connection<IO, S>(
637
627
{
638
628
tokio:: spawn ( async move {
639
629
{
640
- let mut sig = pin ! ( Fuse {
641
- inner: watcher. as_mut( ) . map( |w| w. changed( ) ) ,
642
- } ) ;
630
+ let conn = builder. serve_connection ( hyper_io, hyper_svc) ;
643
631
644
- let mut conn = pin ! ( builder. serve_connection( hyper_io, hyper_svc) ) ;
632
+ let result = if let Some ( graceful) = graceful {
633
+ let conn = graceful. watch ( conn) ;
634
+ conn. await
635
+ } else {
636
+ conn. await
637
+ } ;
645
638
646
- loop {
647
- tokio:: select! {
648
- rv = & mut conn => {
649
- if let Err ( err) = rv {
650
- debug!( "failed serving connection: {:#}" , err) ;
651
- }
652
- break ;
653
- } ,
654
- _ = & mut sig => {
655
- conn. as_mut( ) . graceful_shutdown( ) ;
656
- }
657
- }
639
+ if let Err ( err) = result {
640
+ debug ! ( "failed serving connection: {:#}" , err) ;
658
641
}
659
642
}
660
643
661
- drop ( watcher) ;
662
644
trace ! ( "connection closed" ) ;
663
645
} ) ;
664
646
}
0 commit comments