@@ -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,36 @@ 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+ } ) ( ) ;
232+ match res {
233+ Ok ( ( ) ) => true ,
234+ Err ( e) => {
235+ if let Err ( e) = process_error ( mode. as_ref ( ) , e, writer, & mut errors) {
236+ aborted. get_or_insert ( e) ;
237+ }
238+ false
239+ }
240+ }
238241 } ) ;
239242 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- }
243+ aborted. map_or (
244+ if self . writers . is_empty ( ) {
245+ // This error kind will never be raised by the standard
246+ // library, so we can use it for early termination of
247+ // `copy`
248+ Err ( Error :: from ( ErrorKind :: Other ) )
249+ } else {
250+ Ok ( buf. len ( ) )
251+ } ,
252+ Err ,
253+ )
250254 }
251255
252256 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 )
257+ Ok ( ( ) )
267258 }
268259}
269260
0 commit comments