@@ -364,16 +364,18 @@ fn unpack_without_first_dir<'a, R: Read>(
364
364
continue ;
365
365
}
366
366
367
+ struct SenderEntry < ' a , ' b , R : std:: io:: Read > {
368
+ sender : Box < dyn FnMut ( Vec < u8 > ) -> bool + ' a > ,
369
+ entry : tar:: Entry < ' b , R > ,
370
+ }
371
+
367
372
/// true if either no sender_entry was provided, or the incremental file
368
373
/// has been fully dispatched.
369
374
fn flush_ios < ' a , R : std:: io:: Read , P : AsRef < Path > > (
370
375
mut budget : & mut MemoryBudget ,
371
376
io_executor : & dyn Executor ,
372
377
mut directories : & mut HashMap < PathBuf , DirStatus > ,
373
- mut sender_entry : Option < & mut (
374
- Box < dyn FnMut ( Vec < u8 > ) -> bool + ' a > ,
375
- & mut tar:: Entry < ' _ , R > ,
376
- ) > ,
378
+ mut sender_entry : Option < & mut SenderEntry < ' a , ' _ , R > > ,
377
379
full_path : P ,
378
380
) -> Result < bool > {
379
381
let mut result = sender_entry. is_none ( ) ;
@@ -384,16 +386,20 @@ fn unpack_without_first_dir<'a, R: Read>(
384
386
trigger_children ( & * io_executor, & mut directories, & mut budget, op) ?;
385
387
}
386
388
// Maybe stream a file incrementally
387
- if let Some ( ( sender, entry ) ) = sender_entry. as_mut ( ) {
389
+ if let Some ( sender) = sender_entry. as_mut ( ) {
388
390
if budget. available ( ) as u64 >= IO_CHUNK_SIZE {
389
391
let mut v = vec ! [ 0 ; IO_CHUNK_SIZE as usize ] ;
390
- let len = entry. read ( & mut v) ?;
392
+ let len = sender
393
+ . entry
394
+ . by_ref ( )
395
+ . take ( IO_CHUNK_SIZE )
396
+ . read_to_end ( & mut v) ?;
391
397
if len == 0 {
392
398
result = true ;
393
399
}
394
400
v. resize ( len, 0 ) ;
395
401
budget. claim_chunk ( len) ;
396
- if !sender ( v) {
402
+ if !( sender. sender ) ( v) {
397
403
bail ! ( format!(
398
404
"IO receiver for '{}' disconnected" ,
399
405
full_path. as_ref( ) . display( )
@@ -519,8 +525,11 @@ fn unpack_without_first_dir<'a, R: Read>(
519
525
}
520
526
}
521
527
522
- let mut incremental_file_sender = incremental_file_sender
523
- . map ( |incremental_file_sender| ( incremental_file_sender, & mut entry) ) ;
528
+ let mut incremental_file_sender =
529
+ incremental_file_sender. map ( |incremental_file_sender| SenderEntry {
530
+ sender : incremental_file_sender,
531
+ entry,
532
+ } ) ;
524
533
525
534
// monitor io queue and feed in the content of the file (if needed)
526
535
while !flush_ios (
0 commit comments