inflate: its context in a caller-owned record, allocation-free per block; the state-backed calls kept
ZInflate (z_inflate_new) holds the bit reader, the RFC tables and every table and scratch list a block builds, rebuilt in place: an inflate allocates nothing, and a worker thread inflates in a context of its own (made on the program's thread). z_inflate_in / z_uncompress_in / z_gunzip_in take it; z_inflate / z_uncompress / z_gunzip and every caller (image, atlas, tiled, render3d's png_decode) are unchanged and work in RtInflateState's one context. The old per-call lit/dist tables were also leaked on an error return; there are none now. Compiles: Maroon Lake headless, examples/library/tiled_p2 and tiled_p6. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
50ba7401fd
commit
7444638030
2 changed files with 153 additions and 125 deletions
8
changes/inflate-context.md
Normal file
8
changes/inflate-context.md
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
bump: minor
|
||||
type: feature
|
||||
**Inflate in a caller-owned context.** `ZInflate` holds everything one inflate works in - the bit reader,
|
||||
the RFC's length and distance tables, and every Huffman table and scratch list a block builds - made once
|
||||
by `z_inflate_new()` and rebuilt in place, so an inflate allocates nothing and each thread that inflates
|
||||
holds a context of its own. `z_inflate_in(z, src, len, out, cap)`, `z_uncompress_in` (zlib) and
|
||||
`z_gunzip_in` (gzip) take the context; `z_inflate` / `z_uncompress` / `z_gunzip` keep their signatures,
|
||||
working in the one context `RtInflateState` holds, so no caller changes.
|
||||
Loading…
Add table
Add a link
Reference in a new issue