11use std:: io:: { IoSlice , IoSliceMut , Read as _, Write as _} ;
22use std:: net:: SocketAddr ;
33use std:: pin:: Pin ;
4+ use std:: sync:: Arc ;
45
56use crate :: future;
67use crate :: io:: { self , Read , Write } ;
@@ -44,9 +45,9 @@ use crate::task::{Context, Poll};
4445/// #
4546/// # Ok(()) }) }
4647/// ```
47- #[ derive( Debug ) ]
48+ #[ derive( Debug , Clone ) ]
4849pub struct TcpStream {
49- pub ( super ) watcher : Watcher < mio:: net:: TcpStream > ,
50+ pub ( super ) watcher : Arc < Watcher < mio:: net:: TcpStream > > ,
5051}
5152
5253impl TcpStream {
@@ -71,9 +72,7 @@ impl TcpStream {
7172 /// ```
7273 pub async fn connect < A : ToSocketAddrs > ( addrs : A ) -> io:: Result < TcpStream > {
7374 let mut last_err = None ;
74- let addrs = addrs
75- . to_socket_addrs ( )
76- . await ?;
75+ let addrs = addrs. to_socket_addrs ( ) . await ?;
7776
7877 for addr in addrs {
7978 // mio's TcpStream::connect is non-blocking and may just be in progress
@@ -84,16 +83,20 @@ impl TcpStream {
8483 Ok ( s) => Watcher :: new ( s) ,
8584 Err ( e) => {
8685 last_err = Some ( e) ;
87- continue
86+ continue ;
8887 }
8988 } ;
9089
9190 future:: poll_fn ( |cx| watcher. poll_write_ready ( cx) ) . await ;
9291
9392 match watcher. get_ref ( ) . take_error ( ) {
94- Ok ( None ) => return Ok ( TcpStream { watcher } ) ,
93+ Ok ( None ) => {
94+ return Ok ( TcpStream {
95+ watcher : Arc :: new ( watcher) ,
96+ } ) ;
97+ }
9598 Ok ( Some ( e) ) => last_err = Some ( e) ,
96- Err ( e) => last_err = Some ( e)
99+ Err ( e) => last_err = Some ( e) ,
97100 }
98101 }
99102
@@ -369,7 +372,7 @@ impl From<std::net::TcpStream> for TcpStream {
369372 fn from ( stream : std:: net:: TcpStream ) -> TcpStream {
370373 let mio_stream = mio:: net:: TcpStream :: from_stream ( stream) . unwrap ( ) ;
371374 TcpStream {
372- watcher : Watcher :: new ( mio_stream) ,
375+ watcher : Arc :: new ( Watcher :: new ( mio_stream) ) ,
373376 }
374377 }
375378}
@@ -391,7 +394,10 @@ cfg_unix! {
391394
392395 impl IntoRawFd for TcpStream {
393396 fn into_raw_fd( self ) -> RawFd {
394- self . watcher. into_inner( ) . into_raw_fd( )
397+ // TODO(stjepang): This does not mean `RawFd` is now the sole owner of the file
398+ // descriptor because it's possible that there are other clones of this `TcpStream`
399+ // using it at the same time. We should probably document that behavior.
400+ self . as_raw_fd( )
395401 }
396402 }
397403}
0 commit comments