@@ -565,10 +565,9 @@ impl<'a> Read for &'a NamedPipe {
565
565
Ok ( n)
566
566
}
567
567
568
- // Schedule another read with a bigger buffer
569
- e @ State :: InsufficientBufferSize ( ..) => {
570
- state. read = e;
571
- Inner :: schedule_read ( & self . inner , & mut state, None ) ;
568
+ // We scheduled another read with a bigger buffer after the first read (see `read_done`)
569
+ // This is not possible in theory, just like `State::None` case, but return would block for now.
570
+ State :: InsufficientBufferSize ( ..) => {
572
571
Err ( would_block ( ) )
573
572
}
574
573
@@ -723,10 +722,11 @@ impl Inner {
723
722
/// scheduled.
724
723
fn schedule_read ( me : & Arc < Inner > , io : & mut Io , events : Option < & mut Vec < Event > > ) -> bool {
725
724
// Check to see if a read is already scheduled/completed
725
+
726
726
let mut buf = match mem:: replace ( & mut io. read , State :: None ) {
727
727
State :: None => me. get_buffer ( ) ,
728
728
State :: InsufficientBufferSize ( mut buf, rem) => {
729
- buf. reserve ( rem) ;
729
+ buf. reserve_exact ( rem) ;
730
730
buf
731
731
}
732
732
e @ _ => {
@@ -735,11 +735,12 @@ impl Inner {
735
735
}
736
736
} ;
737
737
738
+
738
739
// Allocate a buffer and schedule the read.
739
740
let e = unsafe {
740
741
let overlapped = me. read . as_ptr ( ) as * mut _ ;
741
742
let slice = slice:: from_raw_parts_mut ( buf. as_mut_ptr ( ) , buf. capacity ( ) ) ;
742
- me. read_overlapped ( slice, overlapped)
743
+ me. read_overlapped ( & mut slice[ buf . len ( ) .. ] , overlapped)
743
744
} ;
744
745
match e {
745
746
// See `NamedPipe::connect` above for the rationale behind `forget`
@@ -910,6 +911,8 @@ fn read_done(status: &OVERLAPPED_ENTRY, events: Option<&mut Vec<Event>>) {
910
911
Ok ( rem) => {
911
912
buf. set_len ( status. bytes_transferred ( ) as usize ) ;
912
913
io. read = State :: InsufficientBufferSize ( buf, rem) ;
914
+ Inner :: schedule_read ( & me, & mut io, None ) ;
915
+ return ;
913
916
}
914
917
Err ( e) => {
915
918
io. read = State :: Err ( e) ;
0 commit comments