feat(compress): move CDict constructor policy into Rust

Move regular and by-reference CDict parameter selection and default-level
normalization behind a Rust-owned boundary. Keep advanced allocation, private
workspace setup, and CDict scalar publication in C callbacks.

Test Plan:
- ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo test --manifest-path rust/Cargo.toml --release create_cdict -- --nocapture
- ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo test --manifest-path rust/Cargo.toml --release
- ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo clippy --manifest-path rust/Cargo.toml --release --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:
2026-07-19 16:14:34 +02:00
parent 778a7406ad
commit 9f4d92808b
2 changed files with 240 additions and 15 deletions
+60 -14
View File
@@ -344,6 +344,30 @@ typedef char ZSTD_rust_create_cctx_state_layout[
== 4 * sizeof(void*)
&& sizeof(ZSTD_rust_createCCtxState) == 5 * sizeof(void*))
? 1 : -1];
typedef void* (*ZSTD_rust_createCDictCreate_f)(
void* context, const void* dict, size_t dictSize,
int dictLoadMethod, int dictContentType,
const ZSTD_compressionParameters* cParams);
typedef void (*ZSTD_rust_createCDictSetCompressionLevel_f)(
void* context, void* cdict, int compressionLevel);
typedef struct {
void* callbackContext;
const U32* exclusionMask;
ZSTD_rust_createCDictCreate_f create;
ZSTD_rust_createCDictSetCompressionLevel_f setCompressionLevel;
} ZSTD_rust_createCDictState;
void* ZSTD_rust_createCDict(
const ZSTD_rust_createCDictState* state,
const void* dict, size_t dictSize,
int compressionLevel, int dictLoadMethod);
typedef char ZSTD_rust_create_cdict_state_layout[
(offsetof(ZSTD_rust_createCDictState, callbackContext) == 0
&& offsetof(ZSTD_rust_createCDictState, exclusionMask) == sizeof(void*)
&& offsetof(ZSTD_rust_createCDictState, create) == 2 * sizeof(void*)
&& offsetof(ZSTD_rust_createCDictState, setCompressionLevel)
== 3 * sizeof(void*)
&& sizeof(ZSTD_rust_createCDictState) == 4 * sizeof(void*))
? 1 : -1];
typedef void (*ZSTD_rust_resetCCtxClearAllDicts_f)(void* context);
typedef size_t (*ZSTD_rust_resetCCtxResetParams_f)(void* context);
typedef struct {
@@ -5479,26 +5503,48 @@ ZSTD_CDict* ZSTD_createCDict_advanced2(
return cdict;
}
static void* ZSTD_rust_createCDict_create(
void* context, const void* dict, size_t dictSize,
int dictLoadMethod, int dictContentType,
const ZSTD_compressionParameters* cParams)
{
(void)context;
return ZSTD_createCDict_advanced(
dict, dictSize,
(ZSTD_dictLoadMethod_e)dictLoadMethod,
(ZSTD_dictContentType_e)dictContentType,
*cParams, ZSTD_defaultCMem);
}
static void ZSTD_rust_createCDict_setCompressionLevel(
void* context, void* cdict, int compressionLevel)
{
(void)context;
((ZSTD_CDict*)cdict)->compressionLevel = compressionLevel;
}
ZSTD_CDict* ZSTD_createCDict(const void* dict, size_t dictSize, int compressionLevel)
{
ZSTD_compressionParameters cParams = ZSTD_getCParams_internal(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, dictSize, ZSTD_cpm_createCDict);
ZSTD_CDict* const cdict = ZSTD_createCDict_advanced(dict, dictSize,
ZSTD_dlm_byCopy, ZSTD_dct_auto,
cParams, ZSTD_defaultCMem);
if (cdict)
cdict->compressionLevel = (compressionLevel == 0) ? ZSTD_CLEVEL_DEFAULT : compressionLevel;
return cdict;
ZSTD_rust_createCDictState state;
U32 const exclusionMask = ZSTD_getCParamsExclusionMask();
state.callbackContext = NULL;
state.exclusionMask = &exclusionMask;
state.create = ZSTD_rust_createCDict_create;
state.setCompressionLevel = ZSTD_rust_createCDict_setCompressionLevel;
return (ZSTD_CDict*)ZSTD_rust_createCDict(
&state, dict, dictSize, compressionLevel, ZSTD_dlm_byCopy);
}
ZSTD_CDict* ZSTD_createCDict_byReference(const void* dict, size_t dictSize, int compressionLevel)
{
ZSTD_compressionParameters cParams = ZSTD_getCParams_internal(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, dictSize, ZSTD_cpm_createCDict);
ZSTD_CDict* const cdict = ZSTD_createCDict_advanced(dict, dictSize,
ZSTD_dlm_byRef, ZSTD_dct_auto,
cParams, ZSTD_defaultCMem);
if (cdict)
cdict->compressionLevel = (compressionLevel == 0) ? ZSTD_CLEVEL_DEFAULT : compressionLevel;
return cdict;
ZSTD_rust_createCDictState state;
U32 const exclusionMask = ZSTD_getCParamsExclusionMask();
state.callbackContext = NULL;
state.exclusionMask = &exclusionMask;
state.create = ZSTD_rust_createCDict_create;
state.setCompressionLevel = ZSTD_rust_createCDict_setCompressionLevel;
return (ZSTD_CDict*)ZSTD_rust_createCDict(
&state, dict, dictSize, compressionLevel, ZSTD_dlm_byRef);
}
size_t ZSTD_freeCDict(ZSTD_CDict* cdict)