@@ -164,7 +164,6 @@ impl MultiWriter {
164164 Ok ( 0 ) => return Ok ( ( ) ) , // end of file
165165 Ok ( received) => {
166166 self . write_all ( & buffer[ ..received] ) ?;
167- self . flush ( ) ?; // avoid buffering
168167 }
169168 Err ( e) if e. kind ( ) != ErrorKind :: Interrupted => return Err ( e) ,
170169 _ => { }
@@ -177,8 +176,6 @@ impl MultiWriter {
177176 Ok ( 0 ) => return Ok ( ( ) ) , // end of file
178177 Ok ( received) => {
179178 self . write_all ( & buffer[ ..received] ) ?;
180- // avoid buffering
181- self . flush ( ) ?;
182179 }
183180 Err ( e) if e. kind ( ) != ErrorKind :: Interrupted => return Err ( e) ,
184181 _ => { }
@@ -228,42 +225,37 @@ impl Write for MultiWriter {
228225 let mode = self . output_error_mode . clone ( ) ;
229226 let mut errors = 0 ;
230227 self . writers . retain_mut ( |writer| {
231- writer
232- . write_all ( buf)
233- . map_err ( |f| {
234- let _ = process_error ( mode. as_ref ( ) , f, writer, & mut errors)
235- . map_err ( |e| aborted. get_or_insert ( e) ) ;
236- } )
237- . is_ok ( )
228+ let res = ( || {
229+ writer. write_all ( buf) ?;
230+ writer. flush ( ) ?;
231+ Ok ( ( ) )
232+ } ) ( ) ;
233+ match res {
234+ Ok ( ( ) ) => true ,
235+ Err ( e) => {
236+ if let Err ( e) = process_error ( mode. as_ref ( ) , e, writer, & mut errors) {
237+ aborted. get_or_insert ( e) ;
238+ }
239+ false
240+ }
241+ }
238242 } ) ;
239243 self . ignored_errors += errors;
240- if let Some ( e) = aborted {
241- Err ( e)
242- } else if self . writers . is_empty ( ) {
243- // This error kind will never be raised by the standard
244- // library, so we can use it for early termination of
245- // `copy`
246- Err ( Error :: from ( ErrorKind :: Other ) )
247- } else {
248- Ok ( buf. len ( ) )
249- }
244+ aborted. map_or (
245+ if self . writers . is_empty ( ) {
246+ // This error kind will never be raised by the standard
247+ // library, so we can use it for early termination of
248+ // `copy`
249+ Err ( Error :: from ( ErrorKind :: Other ) )
250+ } else {
251+ Ok ( buf. len ( ) )
252+ } ,
253+ Err ,
254+ )
250255 }
251256
252257 fn flush ( & mut self ) -> Result < ( ) > {
253- let mut aborted = None ;
254- let mode = self . output_error_mode . clone ( ) ;
255- let mut errors = 0 ;
256- self . writers . retain_mut ( |writer| {
257- writer
258- . flush ( )
259- . map_err ( |e| {
260- let _ = process_error ( mode. as_ref ( ) , e, writer, & mut errors)
261- . map_err ( |e| aborted. get_or_insert ( e) ) ;
262- } )
263- . is_ok ( )
264- } ) ;
265- self . ignored_errors += errors;
266- aborted. map_or ( Ok ( ( ) ) , Err )
258+ Ok ( ( ) )
267259 }
268260}
269261
0 commit comments