@@ -2,10 +2,12 @@ mod config;
22mod models;
33mod protocol;
44mod server;
5+ mod shutdown;
56
67use config:: Config ;
8+ use shutdown:: Shutdown ;
79use std:: { env, io} ;
8- use tokio:: net:: TcpListener ;
10+ use tokio:: { net:: TcpListener , select } ;
911use tracing:: { debug, info, info_span, Instrument } ;
1012use tracing_subscriber:: EnvFilter ;
1113
@@ -39,24 +41,37 @@ async fn main() -> io::Result<()> {
3941 let listener = TcpListener :: bind ( format ! ( "{}:{}" , config. host, config. port) ) . await ?;
4042 info ! ( "Server listening on port {}" , config. port) ;
4143
44+ let mut shutdown = Shutdown :: new ( ) ?;
45+
4246 loop {
43- match listener. accept ( ) . await {
44- Ok ( ( stream, addr) ) => {
45- debug ! ( "New connection from: {}" , addr) ;
46-
47- let config = config. clone ( ) ;
48- tokio:: spawn (
49- async move {
50- if let Err ( e) = server:: handle_client ( stream, config) . await {
51- debug ! ( "Error handling client: {}" , e) ;
52- }
47+ select ! {
48+ conn = listener. accept( ) => {
49+ match conn {
50+ Ok ( ( stream, addr) ) => {
51+ debug!( "New connection from: {}" , addr) ;
52+
53+ let config = config. clone( ) ;
54+ tokio:: spawn(
55+ async move {
56+ if let Err ( e) = server:: handle_client( stream, config) . await {
57+ debug!( "Error handling client: {}" , e) ;
58+ }
59+ }
60+ . instrument( info_span!( "client" , "{}" , addr) ) ,
61+ ) ;
62+ }
63+ Err ( e) => {
64+ debug!( "Error accepting connection: {}" , e) ;
5365 }
54- . instrument ( info_span ! ( "client" , "{}" , addr) ) ,
55- ) ;
66+ }
5667 }
57- Err ( e) => {
58- debug ! ( "Error accepting connection: {}" , e) ;
68+
69+ _ = shutdown. wait_for_shutdown( ) => {
70+ break ;
5971 }
6072 }
6173 }
74+
75+ info ! ( "Shutting down server..." ) ;
76+ Ok ( ( ) )
6277}
0 commit comments