feat(compress): move parameter bundle orchestration into Rust

Move ZSTD_CCtx_setParams's check, frame-parameter, and compression-parameter
orchestration into the Rust projection. C retains callbacks for the existing
context-bound operations while Rust preserves the check -> frame -> compression
order and first-error propagation.

Test Plan:
- ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo test --manifest-path rust/Cargo.toml set_params -- --test-threads=1
- 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
- git diff --cached --check
This commit is contained in:
2026-07-19 13:09:08 +02:00
parent b4e37ad09f
commit 878e18a966
2 changed files with 228 additions and 7 deletions
+46 -7
View File
@@ -226,6 +226,27 @@ typedef char ZSTD_rust_set_fparams_state_layout[
&& offsetof(ZSTD_rust_setFParamsState, setParameter) == sizeof(void*)
&& sizeof(ZSTD_rust_setFParamsState) == 2 * sizeof(void*))
? 1 : -1];
typedef size_t (*ZSTD_rust_setParamsCheckCParams_f)(
void* context, ZSTD_compressionParameters cParams);
typedef size_t (*ZSTD_rust_setParamsSetFParams_f)(
void* context, ZSTD_frameParameters fParams);
typedef size_t (*ZSTD_rust_setParamsSetCParams_f)(
void* context, ZSTD_compressionParameters cParams);
typedef struct {
void* callbackContext;
ZSTD_rust_setParamsCheckCParams_f checkCParams;
ZSTD_rust_setParamsSetFParams_f setFParams;
ZSTD_rust_setParamsSetCParams_f setCParams;
} ZSTD_rust_setParamsState;
size_t ZSTD_rust_setParams(const ZSTD_rust_setParamsState* state,
ZSTD_parameters params);
typedef char ZSTD_rust_set_params_state_layout[
(offsetof(ZSTD_rust_setParamsState, callbackContext) == 0
&& offsetof(ZSTD_rust_setParamsState, checkCParams) == sizeof(void*)
&& offsetof(ZSTD_rust_setParamsState, setFParams) == 2 * sizeof(void*)
&& offsetof(ZSTD_rust_setParamsState, setCParams) == 3 * sizeof(void*)
&& sizeof(ZSTD_rust_setParamsState) == 4 * sizeof(void*))
? 1 : -1];
ZSTD_frameProgression ZSTD_rust_frameProgression(U64 consumedSrcSize,
size_t buffered,
U64 producedCSize);
@@ -1922,6 +1943,25 @@ static size_t ZSTD_rust_setFParams_setParameter(
return ZSTD_CCtx_setParameter((ZSTD_CCtx*)context, (ZSTD_cParameter)param, value);
}
static size_t ZSTD_rust_setParams_checkCParams(
void* context, ZSTD_compressionParameters cParams)
{
(void)context;
return ZSTD_checkCParams(cParams);
}
static size_t ZSTD_rust_setParams_setFParams(
void* context, ZSTD_frameParameters fParams)
{
return ZSTD_CCtx_setFParams((ZSTD_CCtx*)context, fParams);
}
static size_t ZSTD_rust_setParams_setCParams(
void* context, ZSTD_compressionParameters cParams)
{
return ZSTD_CCtx_setCParams((ZSTD_CCtx*)context, cParams);
}
size_t ZSTD_CCtx_setCParams(ZSTD_CCtx* cctx, ZSTD_compressionParameters cparams)
{
ZSTD_rust_setCParamsState state;
@@ -1945,14 +1985,13 @@ size_t ZSTD_CCtx_setFParams(ZSTD_CCtx* cctx, ZSTD_frameParameters fparams)
size_t ZSTD_CCtx_setParams(ZSTD_CCtx* cctx, ZSTD_parameters params)
{
ZSTD_rust_setParamsState state;
DEBUGLOG(4, "ZSTD_CCtx_setParams");
/* First check cParams, because we want to update all or none. */
FORWARD_IF_ERROR(ZSTD_checkCParams(params.cParams), "");
/* Next set fParams, because this could fail if the cctx isn't in init stage. */
FORWARD_IF_ERROR(ZSTD_CCtx_setFParams(cctx, params.fParams), "");
/* Finally set cParams, which should succeed. */
FORWARD_IF_ERROR(ZSTD_CCtx_setCParams(cctx, params.cParams), "");
return 0;
state.callbackContext = cctx;
state.checkCParams = ZSTD_rust_setParams_checkCParams;
state.setFParams = ZSTD_rust_setParams_setFParams;
state.setCParams = ZSTD_rust_setParams_setCParams;
return ZSTD_rust_setParams(&state, params);
}
size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize)