@@ -5,8 +5,19 @@ use std::os::fd::AsRawFd;
55use std:: sync:: { Arc , Condvar , Mutex } ;
66use std:: time:: Duration ;
77
8- fn start_server < A : ToSocketAddrs > ( addr : A , server_finished : Arc < ( Mutex < bool > , Condvar ) > ) {
8+ fn start_server < A : ToSocketAddrs > (
9+ addr : A ,
10+ server_finished : Arc < ( Mutex < bool > , Condvar ) > ,
11+ server_started : Arc < ( Mutex < bool > , Condvar ) > ,
12+ ) {
913 let listener = TcpListener :: bind ( addr) . expect ( "start server failed" ) ;
14+ // Signal that server is ready to accept connections
15+ {
16+ let ( lock, cvar) = & * server_started;
17+ let mut started = lock. lock ( ) . unwrap ( ) ;
18+ * started = true ;
19+ cvar. notify_one ( ) ;
20+ }
1021 for stream in listener. incoming ( ) {
1122 let mut socket = stream. expect ( "accept new connection failed" ) ;
1223 let mut buffer1 = [ 0 ; 256 ] ;
@@ -71,7 +82,14 @@ fn start_server<A: ToSocketAddrs>(addr: A, server_finished: Arc<(Mutex<bool>, Co
7182 }
7283}
7384
74- fn start_client < A : ToSocketAddrs > ( addr : A ) {
85+ fn start_client < A : ToSocketAddrs > ( addr : A , server_started : Arc < ( Mutex < bool > , Condvar ) > ) {
86+ // Wait for server to be ready
87+ {
88+ let ( lock, cvar) = & * server_started;
89+ let _guard = cvar
90+ . wait_while ( lock. lock ( ) . unwrap ( ) , |started| !* started)
91+ . unwrap ( ) ;
92+ }
7593 let mut stream =
7694 open_coroutine:: connect_timeout ( addr, Duration :: from_secs ( 1 ) ) . expect ( "connect failed" ) ;
7795 let mut buffer1 = [ 0 ; 256 ] ;
@@ -148,13 +166,15 @@ pub fn main() -> std::io::Result<()> {
148166 let addr = "127.0.0.1:8888" ;
149167 let server_finished_pair = Arc :: new ( ( Mutex :: new ( true ) , Condvar :: new ( ) ) ) ;
150168 let server_finished = Arc :: clone ( & server_finished_pair) ;
169+ let server_started_pair = Arc :: new ( ( Mutex :: new ( false ) , Condvar :: new ( ) ) ) ;
170+ let server_started = Arc :: clone ( & server_started_pair) ;
151171 _ = std:: thread:: Builder :: new ( )
152172 . name ( "crate_server" . to_string ( ) )
153- . spawn ( move || start_server ( addr, server_finished_pair) )
173+ . spawn ( move || start_server ( addr, server_finished_pair, server_started_pair ) )
154174 . expect ( "failed to spawn thread" ) ;
155175 _ = std:: thread:: Builder :: new ( )
156176 . name ( "crate_client" . to_string ( ) )
157- . spawn ( move || start_client ( addr) )
177+ . spawn ( move || start_client ( addr, server_started ) )
158178 . expect ( "failed to spawn thread" ) ;
159179
160180 let ( lock, cvar) = & * server_finished;
0 commit comments