feat(compress): move window update policy into Rust
Move the shared prefix and external-dictionary window transition into Rust through a five-field projection. Preserve wrapping pointer-address arithmetic, contiguous detection, short-dictionary clamping, and overlap clipping while C retains the private match-state container and copies the projected fields back. Test Plan: - ulimit -v 41943040; CARGO_BUILD_JOBS=1; cargo test --manifest-path rust/Cargo.toml - ulimit -v 41943040; CARGO_BUILD_JOBS=1; cargo clippy --manifest-path rust/Cargo.toml --all-targets -- -D warnings - ulimit -v 41943040; make -B -C programs -j1 zstd - ulimit -v 41943040; make -C tests -j1 test-zstream ZSTREAM_TESTTIME=-T1s
This commit is contained in:
@@ -655,6 +655,23 @@ size_t ZSTD_rust_noCompressBlock(void* dst, size_t dstCapacity,
|
||||
const void* src, size_t srcSize, U32 lastBlock);
|
||||
size_t ZSTD_rust_rleCompressBlock(void* dst, size_t dstCapacity, BYTE src,
|
||||
size_t srcSize, U32 lastBlock);
|
||||
typedef struct {
|
||||
const void* nextSrc;
|
||||
const void* base;
|
||||
const void* dictBase;
|
||||
U32 dictLimit;
|
||||
U32 lowLimit;
|
||||
} ZSTD_rust_windowUpdateState;
|
||||
typedef char ZSTD_rust_window_update_state_layout[
|
||||
(offsetof(ZSTD_rust_windowUpdateState, nextSrc) == 0
|
||||
&& offsetof(ZSTD_rust_windowUpdateState, base) == sizeof(void*)
|
||||
&& offsetof(ZSTD_rust_windowUpdateState, dictBase) == 2 * sizeof(void*)
|
||||
&& offsetof(ZSTD_rust_windowUpdateState, dictLimit) == 3 * sizeof(void*)
|
||||
&& offsetof(ZSTD_rust_windowUpdateState, lowLimit) == 3 * sizeof(void*) + sizeof(U32)
|
||||
&& sizeof(ZSTD_rust_windowUpdateState) == 3 * sizeof(void*) + 2 * sizeof(U32)) ? 1 : -1];
|
||||
U32 ZSTD_rust_windowUpdate(ZSTD_rust_windowUpdateState* state,
|
||||
const void* src, size_t srcSize,
|
||||
int forceNonContiguous);
|
||||
void ZSTD_rust_windowClear(size_t endT, U32* lowLimit, U32* dictLimit);
|
||||
U32 ZSTD_rust_windowCorrectOverflow(U32 curr, U32 cycleLog, U32 maxDist);
|
||||
U32 ZSTD_rust_windowCanOverflowCorrect(U32 curr, U32 cycleLog, U32 maxDist,
|
||||
@@ -1311,37 +1328,21 @@ U32 ZSTD_window_update(ZSTD_window_t* window,
|
||||
const void* src, size_t srcSize,
|
||||
int forceNonContiguous)
|
||||
{
|
||||
BYTE const* const ip = (BYTE const*)src;
|
||||
U32 contiguous = 1;
|
||||
ZSTD_rust_windowUpdateState state;
|
||||
U32 contiguous;
|
||||
DEBUGLOG(5, "ZSTD_window_update");
|
||||
if (srcSize == 0)
|
||||
return contiguous;
|
||||
assert(window->base != NULL);
|
||||
assert(window->dictBase != NULL);
|
||||
/* Check if blocks follow each other */
|
||||
if (src != window->nextSrc || forceNonContiguous) {
|
||||
/* not contiguous */
|
||||
size_t const distanceFromBase = (size_t)(window->nextSrc - window->base);
|
||||
DEBUGLOG(5, "Non contiguous blocks, new segment starts at %u", window->dictLimit);
|
||||
window->lowLimit = window->dictLimit;
|
||||
assert(distanceFromBase == (size_t)(U32)distanceFromBase); /* should never overflow */
|
||||
window->dictLimit = (U32)distanceFromBase;
|
||||
window->dictBase = window->base;
|
||||
window->base = ip - distanceFromBase;
|
||||
/* ms->nextToUpdate = window->dictLimit; */
|
||||
if (window->dictLimit - window->lowLimit < HASH_READ_SIZE) window->lowLimit = window->dictLimit; /* too small extDict */
|
||||
contiguous = 0;
|
||||
}
|
||||
window->nextSrc = ip + srcSize;
|
||||
/* if input and dictionary overlap : reduce dictionary (area presumed modified by input) */
|
||||
if ( (ip+srcSize > window->dictBase + window->lowLimit)
|
||||
& (ip < window->dictBase + window->dictLimit)) {
|
||||
size_t const highInputIdx = (size_t)((ip + srcSize) - window->dictBase);
|
||||
U32 const lowLimitMax = (highInputIdx > (size_t)window->dictLimit) ? window->dictLimit : (U32)highInputIdx;
|
||||
assert(highInputIdx < UINT_MAX);
|
||||
window->lowLimit = lowLimitMax;
|
||||
DEBUGLOG(5, "Overlapping extDict and input : new lowLimit = %u", window->lowLimit);
|
||||
}
|
||||
state.nextSrc = window->nextSrc;
|
||||
state.base = window->base;
|
||||
state.dictBase = window->dictBase;
|
||||
state.dictLimit = window->dictLimit;
|
||||
state.lowLimit = window->lowLimit;
|
||||
contiguous = ZSTD_rust_windowUpdate(&state, src, srcSize,
|
||||
forceNonContiguous);
|
||||
window->nextSrc = (BYTE const*)state.nextSrc;
|
||||
window->base = (BYTE const*)state.base;
|
||||
window->dictBase = (BYTE const*)state.dictBase;
|
||||
window->dictLimit = state.dictLimit;
|
||||
window->lowLimit = state.lowLimit;
|
||||
return contiguous;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user