@@ -53,14 +53,15 @@ where
53
53
E : std:: error:: Error + Send + Sync + ' static ,
54
54
{
55
55
let mut decompressed_bytes_by_pack_offset = BTreeMap :: new ( ) ;
56
- let decompress_from_resolver = |slice : EntryRange , out : & mut Vec < u8 > | -> Result < ( data:: Entry , u64 ) , Error > {
56
+ let mut inflate = zlib:: Inflate :: default ( ) ;
57
+ let mut decompress_from_resolver = |slice : EntryRange , out : & mut Vec < u8 > | -> Result < ( data:: Entry , u64 ) , Error > {
57
58
let bytes = resolve ( slice. clone ( ) , resolve_data) . ok_or ( Error :: ResolveFailed {
58
59
pack_offset : slice. start ,
59
60
} ) ?;
60
61
let entry = data:: Entry :: from_bytes ( bytes, slice. start , hash_len) ;
61
62
let compressed = & bytes[ entry. header_size ( ) ..] ;
62
63
let decompressed_len = entry. decompressed_size as usize ;
63
- decompress_all_at_once_with ( compressed, decompressed_len, out) ?;
64
+ decompress_all_at_once_with ( & mut inflate , compressed, decompressed_len, out) ?;
64
65
Ok ( ( entry, slice. end ) )
65
66
} ;
66
67
@@ -235,15 +236,16 @@ where
235
236
move || -> Result < ( ) , Error > {
236
237
let mut fully_resolved_delta_bytes = Vec :: new ( ) ;
237
238
let mut delta_bytes = Vec :: new ( ) ;
238
- let decompress_from_resolver =
239
+ let mut inflate = zlib:: Inflate :: default ( ) ;
240
+ let mut decompress_from_resolver =
239
241
|slice : EntryRange , out : & mut Vec < u8 > | -> Result < ( data:: Entry , u64 ) , Error > {
240
242
let bytes = resolve ( slice. clone ( ) , resolve_data) . ok_or ( Error :: ResolveFailed {
241
243
pack_offset : slice. start ,
242
244
} ) ?;
243
245
let entry = data:: Entry :: from_bytes ( bytes, slice. start , hash_len) ;
244
246
let compressed = & bytes[ entry. header_size ( ) ..] ;
245
247
let decompressed_len = entry. decompressed_size as usize ;
246
- decompress_all_at_once_with ( compressed, decompressed_len, out) ?;
248
+ decompress_all_at_once_with ( & mut inflate , compressed, decompressed_len, out) ?;
247
249
Ok ( ( entry, slice. end ) )
248
250
} ;
249
251
@@ -407,31 +409,17 @@ fn set_len(v: &mut Vec<u8>, new_len: usize) {
407
409
}
408
410
}
409
411
410
- fn decompress_all_at_once_with ( b : & [ u8 ] , decompressed_len : usize , out : & mut Vec < u8 > ) -> Result < ( ) , Error > {
412
+ fn decompress_all_at_once_with (
413
+ inflate : & mut zlib:: Inflate ,
414
+ b : & [ u8 ] ,
415
+ decompressed_len : usize ,
416
+ out : & mut Vec < u8 > ,
417
+ ) -> Result < ( ) , Error > {
411
418
set_len ( out, decompressed_len) ;
412
- // TODO: try to put this back after the next zlib-ng upgrade.
413
- // This is from 3a2d5286084597d4c68549903709cda77dda4357 and it worked until zlib-ng-sys 1.1.9. Then it started to
414
- // fail with `incorrect data check` 25% of the time.
415
- // Note that thread_local! usage was also removed in two other places in `decode/entry.rs` for good measure.
416
- // use std::cell::RefCell;
417
- // thread_local! {
418
- // pub static INFLATE: RefCell<zlib::Inflate> = RefCell::new(zlib::Inflate::default());
419
- // }
420
- //
421
- // INFLATE.with(|inflate| {
422
- // let mut inflate = inflate.borrow_mut();
423
- // let res = inflate.once(b, out).map_err(|err| Error::ZlibInflate {
424
- // source: err,
425
- // message: "Failed to decompress entry",
426
- // });
427
- // inflate.reset();
428
- // res
429
- // })?;
430
- zlib:: Inflate :: default ( )
431
- . once ( b, out)
432
- . map_err ( |err| Error :: ZlibInflate {
433
- source : err,
434
- message : "Failed to decompress entry" ,
435
- } ) ?;
419
+ inflate. reset ( ) ;
420
+ inflate. once ( b, out) . map_err ( |err| Error :: ZlibInflate {
421
+ source : err,
422
+ message : "Failed to decompress entry" ,
423
+ } ) ?;
436
424
Ok ( ( ) )
437
425
}
0 commit comments