@@ -11,6 +11,7 @@ use super::SocketAddr;
11
11
use crate :: io:: { self , Read , Write } ;
12
12
use crate :: os:: unix:: io:: { AsRawFd , FromRawFd , IntoRawFd , RawFd } ;
13
13
use crate :: path:: Path ;
14
+ use crate :: sync:: Arc ;
14
15
use crate :: task:: { Context , Poll } ;
15
16
16
17
/// A Unix stream socket.
@@ -36,8 +37,9 @@ use crate::task::{Context, Poll};
36
37
/// #
37
38
/// # Ok(()) }) }
38
39
/// ```
40
+ #[ derive( Clone ) ]
39
41
pub struct UnixStream {
40
- pub ( super ) watcher : Async < StdUnixStream > ,
42
+ pub ( super ) watcher : Arc < Async < StdUnixStream > > ,
41
43
}
42
44
43
45
impl UnixStream {
@@ -56,7 +58,7 @@ impl UnixStream {
56
58
/// ```
57
59
pub async fn connect < P : AsRef < Path > > ( path : P ) -> io:: Result < UnixStream > {
58
60
let path = path. as_ref ( ) . to_owned ( ) ;
59
- let stream = Async :: < StdUnixStream > :: connect ( path) . await ?;
61
+ let stream = Arc :: new ( Async :: < StdUnixStream > :: connect ( path) . await ?) ;
60
62
61
63
Ok ( UnixStream { watcher : stream } )
62
64
}
@@ -78,8 +80,12 @@ impl UnixStream {
78
80
/// ```
79
81
pub fn pair ( ) -> io:: Result < ( UnixStream , UnixStream ) > {
80
82
let ( a, b) = Async :: < StdUnixStream > :: pair ( ) ?;
81
- let a = UnixStream { watcher : a } ;
82
- let b = UnixStream { watcher : b } ;
83
+ let a = UnixStream {
84
+ watcher : Arc :: new ( a) ,
85
+ } ;
86
+ let b = UnixStream {
87
+ watcher : Arc :: new ( b) ,
88
+ } ;
83
89
Ok ( ( a, b) )
84
90
}
85
91
@@ -158,7 +164,7 @@ impl Read for &UnixStream {
158
164
cx : & mut Context < ' _ > ,
159
165
buf : & mut [ u8 ] ,
160
166
) -> Poll < io:: Result < usize > > {
161
- Pin :: new ( & mut & self . watcher ) . poll_read ( cx, buf)
167
+ Pin :: new ( & mut & * self . watcher ) . poll_read ( cx, buf)
162
168
}
163
169
}
164
170
@@ -186,15 +192,15 @@ impl Write for &UnixStream {
186
192
cx : & mut Context < ' _ > ,
187
193
buf : & [ u8 ] ,
188
194
) -> Poll < io:: Result < usize > > {
189
- Pin :: new ( & mut & self . watcher ) . poll_write ( cx, buf)
195
+ Pin :: new ( & mut & * self . watcher ) . poll_write ( cx, buf)
190
196
}
191
197
192
198
fn poll_flush ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < io:: Result < ( ) > > {
193
- Pin :: new ( & mut & self . watcher ) . poll_flush ( cx)
199
+ Pin :: new ( & mut & * self . watcher ) . poll_flush ( cx)
194
200
}
195
201
196
202
fn poll_close ( self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < io:: Result < ( ) > > {
197
- Pin :: new ( & mut & self . watcher ) . poll_close ( cx)
203
+ Pin :: new ( & mut & * self . watcher ) . poll_close ( cx)
198
204
}
199
205
}
200
206
@@ -219,7 +225,7 @@ impl From<StdUnixStream> for UnixStream {
219
225
/// Converts a `std::os::unix::net::UnixStream` into its asynchronous equivalent.
220
226
fn from ( stream : StdUnixStream ) -> UnixStream {
221
227
let stream = Async :: new ( stream) . expect ( "UnixStream is known to be good" ) ;
222
- UnixStream { watcher : stream }
228
+ UnixStream { watcher : Arc :: new ( stream) }
223
229
}
224
230
}
225
231
@@ -238,6 +244,6 @@ impl FromRawFd for UnixStream {
238
244
239
245
impl IntoRawFd for UnixStream {
240
246
fn into_raw_fd ( self ) -> RawFd {
241
- self . watcher . into_raw_fd ( )
247
+ self . as_raw_fd ( )
242
248
}
243
249
}
0 commit comments