@@ -124,6 +124,18 @@ impl AsyncWrite for DuplexStream {
124
124
Pin :: new ( & mut * self . write . lock ( ) ) . poll_write ( cx, buf)
125
125
}
126
126
127
+ fn poll_write_vectored (
128
+ self : Pin < & mut Self > ,
129
+ cx : & mut task:: Context < ' _ > ,
130
+ bufs : & [ std:: io:: IoSlice < ' _ > ] ,
131
+ ) -> Poll < Result < usize , std:: io:: Error > > {
132
+ Pin :: new ( & mut * self . write . lock ( ) ) . poll_write_vectored ( cx, bufs)
133
+ }
134
+
135
+ fn is_write_vectored ( & self ) -> bool {
136
+ true
137
+ }
138
+
127
139
#[ allow( unused_mut) ]
128
140
fn poll_flush (
129
141
mut self : Pin < & mut Self > ,
@@ -224,6 +236,37 @@ impl Pipe {
224
236
}
225
237
Poll :: Ready ( Ok ( len) )
226
238
}
239
+
240
+ fn poll_write_vectored_internal (
241
+ mut self : Pin < & mut Self > ,
242
+ cx : & mut task:: Context < ' _ > ,
243
+ bufs : & [ std:: io:: IoSlice < ' _ > ] ,
244
+ ) -> Poll < Result < usize , std:: io:: Error > > {
245
+ if self . is_closed {
246
+ return Poll :: Ready ( Err ( std:: io:: ErrorKind :: BrokenPipe . into ( ) ) ) ;
247
+ }
248
+ let avail = self . max_buf_size - self . buffer . len ( ) ;
249
+ if avail == 0 {
250
+ self . write_waker = Some ( cx. waker ( ) . clone ( ) ) ;
251
+ return Poll :: Pending ;
252
+ }
253
+
254
+ let mut rem = avail;
255
+ for buf in bufs {
256
+ if rem == 0 {
257
+ break ;
258
+ }
259
+
260
+ let len = buf. len ( ) . min ( rem) ;
261
+ self . buffer . extend_from_slice ( & buf[ ..len] ) ;
262
+ rem -= len;
263
+ }
264
+
265
+ if let Some ( waker) = self . read_waker . take ( ) {
266
+ waker. wake ( ) ;
267
+ }
268
+ Poll :: Ready ( Ok ( avail - rem) )
269
+ }
227
270
}
228
271
229
272
impl AsyncRead for Pipe {
@@ -285,6 +328,38 @@ impl AsyncWrite for Pipe {
285
328
}
286
329
}
287
330
331
+ cfg_coop ! {
332
+ fn poll_write_vectored(
333
+ self : Pin <& mut Self >,
334
+ cx: & mut task:: Context <' _>,
335
+ bufs: & [ std:: io:: IoSlice <' _>] ,
336
+ ) -> Poll <Result <usize , std:: io:: Error >> {
337
+ ready!( crate :: trace:: trace_leaf( cx) ) ;
338
+ let coop = ready!( crate :: runtime:: coop:: poll_proceed( cx) ) ;
339
+
340
+ let ret = self . poll_write_vectored_internal( cx, bufs) ;
341
+ if ret. is_ready( ) {
342
+ coop. made_progress( ) ;
343
+ }
344
+ ret
345
+ }
346
+ }
347
+
348
+ cfg_not_coop ! {
349
+ fn poll_write_vectored(
350
+ self : Pin <& mut Self >,
351
+ cx: & mut task:: Context <' _>,
352
+ bufs: & [ std:: io:: IoSlice <' _>] ,
353
+ ) -> Poll <Result <usize , std:: io:: Error >> {
354
+ ready!( crate :: trace:: trace_leaf( cx) ) ;
355
+ self . poll_write_vectored_internal( cx, bufs)
356
+ }
357
+ }
358
+
359
+ fn is_write_vectored ( & self ) -> bool {
360
+ true
361
+ }
362
+
288
363
fn poll_flush ( self : Pin < & mut Self > , _: & mut task:: Context < ' _ > ) -> Poll < std:: io:: Result < ( ) > > {
289
364
Poll :: Ready ( Ok ( ( ) ) )
290
365
}
0 commit comments