Skip to content

Commit d9d9bc0

Browse files
committed
Merge branch 'fix-alloc'
2 parents 67da689 + 3a2d528 commit d9d9bc0

File tree

3 files changed

+42
-10
lines changed

3 files changed

+42
-10
lines changed

gix-features/src/zlib/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ impl Inflate {
4141
(self.state.total_out() - before_out) as usize,
4242
))
4343
}
44+
45+
/// Ready this instance for decoding another data stream.
46+
pub fn reset(&mut self) {
47+
self.state.reset(true);
48+
}
4449
}
4550

4651
///

gix-pack/src/cache/delta/traverse/resolve.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -405,11 +405,19 @@ fn set_len(v: &mut Vec<u8>, new_len: usize) {
405405

406406
fn decompress_all_at_once_with(b: &[u8], decompressed_len: usize, out: &mut Vec<u8>) -> Result<(), Error> {
407407
set_len(out, decompressed_len);
408-
zlib::Inflate::default()
409-
.once(b, out)
410-
.map_err(|err| Error::ZlibInflate {
408+
use std::cell::RefCell;
409+
thread_local! {
410+
pub static INFLATE: RefCell<zlib::Inflate> = RefCell::new(zlib::Inflate::default());
411+
}
412+
413+
INFLATE.with(|inflate| {
414+
let mut inflate = inflate.borrow_mut();
415+
inflate.reset();
416+
let res = inflate.once(b, out).map_err(|err| Error::ZlibInflate {
411417
source: err,
412418
message: "Failed to decompress entry",
413-
})?;
419+
});
420+
res
421+
})?;
414422
Ok(())
415423
}

gix-pack/src/data/file/decode/entry.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,18 @@ impl File {
126126
let offset: usize = data_offset.try_into().expect("offset representable by machine");
127127
assert!(offset < self.data.len(), "entry offset out of bounds");
128128

129-
zlib::Inflate::default()
130-
.once(&self.data[offset..], out)
131-
.map(|(_status, consumed_in, _consumed_out)| consumed_in)
129+
use std::cell::RefCell;
130+
thread_local! {
131+
pub static INFLATE: RefCell<zlib::Inflate> = RefCell::new(zlib::Inflate::default());
132+
}
133+
INFLATE.with(|inflate| {
134+
let mut inflate = inflate.borrow_mut();
135+
let res = inflate
136+
.once(&self.data[offset..], out)
137+
.map(|(_status, consumed_in, _consumed_out)| consumed_in);
138+
inflate.reset();
139+
res
140+
})
132141
}
133142

134143
/// Like `decompress_entry_from_data_offset`, but returns consumed input and output.
@@ -140,9 +149,19 @@ impl File {
140149
let offset: usize = data_offset.try_into().expect("offset representable by machine");
141150
assert!(offset < self.data.len(), "entry offset out of bounds");
142151

143-
zlib::Inflate::default()
144-
.once(&self.data[offset..], out)
145-
.map(|(_status, consumed_in, consumed_out)| (consumed_in, consumed_out))
152+
use std::cell::RefCell;
153+
thread_local! {
154+
pub static INFLATE: RefCell<zlib::Inflate> = RefCell::new(zlib::Inflate::default());
155+
}
156+
157+
INFLATE.with(|inflate| {
158+
let mut inflate = inflate.borrow_mut();
159+
let res = inflate
160+
.once(&self.data[offset..], out)
161+
.map(|(_status, consumed_in, consumed_out)| (consumed_in, consumed_out));
162+
inflate.reset();
163+
res
164+
})
146165
}
147166

148167
/// Decode an entry, resolving delta's as needed, while growing the `out` vector if there is not enough

0 commit comments

Comments
 (0)