refactor(ldm): expose max sequence bound from Rust

The LDM sequence-space helper was already implemented in Rust, but C still
owned the public symbol and forwarded through a pointer-based Rust bridge.
Make the Rust parameter representation public and ABI-compatible for the
original by-value `ldmParams_t` call, then have Rust compare `enableLdm`
directly with `ZSTD_ps_enable` before applying the sequence bound. Remove only
the redundant C bridge declaration and wrapper; table sizing, state, and
sequence generation remain unchanged.

Test Plan:
- `git diff --check` -- passed.
- `git diff --cached --check` -- passed.
- `cc -std=c99 -Ilib -Ilib/common -Ilib/compress -Ilib/decompress -Ilib/dict -fsyntax-only lib/compress/zstd_ldm.c` -- passed.
- `cargo +nightly fmt --manifest-path rust/Cargo.toml --all -- --check` -- passed.
- Cargo build/test, make, and other heavy checks were intentionally not run per the requested lightweight-only scope.
This commit is contained in:
2026-07-20 13:16:26 +02:00
parent 66a163a78c
commit 7174d2ec71
2 changed files with 27 additions and 16 deletions
-8
View File
@@ -256,8 +256,6 @@ void ZSTD_rust_ldm_adjustParameters(
U32 hashLogMax, U32 bucketSizeLogMax, int btultra); U32 hashLogMax, U32 bucketSizeLogMax, int btultra);
size_t ZSTD_rust_ldm_getTableSize( size_t ZSTD_rust_ldm_getTableSize(
const void* params, int enableLdm, size_t redzoneSize); const void* params, int enableLdm, size_t redzoneSize);
size_t ZSTD_rust_ldm_getMaxNbSeq(
const void* params, int enableLdm, size_t maxChunkSize);
void ZSTD_rust_ldm_fillHashTable( void ZSTD_rust_ldm_fillHashTable(
void* hashTable, BYTE* bucketOffsets, const BYTE* base, void* hashTable, BYTE* bucketOffsets, const BYTE* base,
const BYTE* ip, const BYTE* iend, const void* params); const BYTE* ip, const BYTE* iend, const void* params);
@@ -357,12 +355,6 @@ size_t ZSTD_ldm_getTableSize(ldmParams_t params)
&params, params.enableLdm == ZSTD_ps_enable, redzoneSize); &params, params.enableLdm == ZSTD_ps_enable, redzoneSize);
} }
size_t ZSTD_ldm_getMaxNbSeq(ldmParams_t params, size_t maxChunkSize)
{
return ZSTD_rust_ldm_getMaxNbSeq(
&params, params.enableLdm == ZSTD_ps_enable, maxChunkSize);
}
void ZSTD_ldm_fillHashTable( void ZSTD_ldm_fillHashTable(
ldmState_t* ldmState, const BYTE* ip, ldmState_t* ldmState, const BYTE* ip,
const BYTE* iend, ldmParams_t const* params) const BYTE* iend, ldmParams_t const* params)
+27 -8
View File
@@ -27,6 +27,7 @@ const ZSTD_FAST_STRATEGY: c_int = 1;
const ZSTD_DFAST_STRATEGY: c_int = 2; const ZSTD_DFAST_STRATEGY: c_int = 2;
const ZSTD_STRATEGY_MAX: c_int = 9; const ZSTD_STRATEGY_MAX: c_int = 9;
const ZSTD_BTOPT: c_int = 7; const ZSTD_BTOPT: c_int = 7;
const ZSTD_PS_ENABLE: c_int = 1;
const LDM_FAST_TABLES_NONE: c_int = 0; const LDM_FAST_TABLES_NONE: c_int = 0;
const LDM_FAST_TABLES_FAST: c_int = 1; const LDM_FAST_TABLES_FAST: c_int = 1;
@@ -58,7 +59,7 @@ struct RawSeqStore {
} }
#[repr(C)] #[repr(C)]
struct LdmParams { pub struct LdmParams {
enable_ldm: c_int, enable_ldm: c_int,
hash_log: u32, hash_log: u32,
bucket_size_log: u32, bucket_size_log: u32,
@@ -715,13 +716,8 @@ pub unsafe extern "C" fn ZSTD_rust_ldm_getTableSize(
} }
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn ZSTD_rust_ldm_getMaxNbSeq( pub extern "C" fn ZSTD_ldm_getMaxNbSeq(params: LdmParams, max_chunk_size: usize) -> usize {
params: *const c_void, if params.enable_ldm == ZSTD_PS_ENABLE {
enable_ldm: c_int,
max_chunk_size: usize,
) -> usize {
let params = unsafe { &*params.cast::<LdmParams>() };
if enable_ldm != 0 {
max_chunk_size / params.min_match_length as usize max_chunk_size / params.min_match_length as usize
} else { } else {
0 0
@@ -1090,6 +1086,29 @@ mod tests {
assert_eq!(params.min_match_length, 64); assert_eq!(params.min_match_length, 64);
} }
#[test]
fn max_nb_seq_only_applies_when_ldm_is_enabled() {
let params = LdmParams {
enable_ldm: ZSTD_PS_ENABLE,
hash_log: 0,
bucket_size_log: 0,
min_match_length: 64,
hash_rate_log: 0,
window_log: 0,
};
assert_eq!(ZSTD_ldm_getMaxNbSeq(params, 640), 10);
let params = LdmParams {
enable_ldm: 0,
hash_log: 0,
bucket_size_log: 0,
min_match_length: 64,
hash_rate_log: 0,
window_log: 0,
};
assert_eq!(ZSTD_ldm_getMaxNbSeq(params, 640), 0);
}
#[test] #[test]
fn optimal_parser_starts_at_btopt_strategy() { fn optimal_parser_starts_at_btopt_strategy() {
assert!(!use_optimal_parser(ZSTD_BTOPT - 1)); assert!(!use_optimal_parser(ZSTD_BTOPT - 1));