refactor(ldm): expose parameter adjustment from Rust
Move the pure LDM parameter-defaulting policy behind the original ZSTD_ldm_adjustParameters() ABI symbol. Rust now receives the existing C parameter structs directly, applies the same 30/8/8 build constants, and keeps the ASAN-sensitive table-size projection in C. Test Plan: - `cc -fsyntax-only -Ilib -Ilib/common -Ilib/compress -Ilib/decompress -Ilib/dict -Ilib/legacy lib/compress/zstd_ldm.c` -- passed. - `cargo +nightly fmt --manifest-path rust/Cargo.toml --all -- --check` -- passed. - `git diff --check` and `git diff --cached --check` -- passed. - Heavy verification intentionally deferred until the combined seam set is ready.
This commit is contained in:
@@ -251,9 +251,6 @@ typedef char ZSTD_rust_ldm_rep_count[(ZSTD_REP_NUM == 3) ? 1 : -1];
|
|||||||
typedef char ZSTD_rust_ldm_strategy_values_check[
|
typedef char ZSTD_rust_ldm_strategy_values_check[
|
||||||
(ZSTD_fast == 1 && ZSTD_dfast == 2 && ZSTD_btultra2 == 9) ? 1 : -1];
|
(ZSTD_fast == 1 && ZSTD_dfast == 2 && ZSTD_btultra2 == 9) ? 1 : -1];
|
||||||
|
|
||||||
void ZSTD_rust_ldm_adjustParameters(
|
|
||||||
void* params, U32 windowLog, int strategy,
|
|
||||||
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);
|
||||||
void ZSTD_rust_ldm_fillHashTable(
|
void ZSTD_rust_ldm_fillHashTable(
|
||||||
@@ -336,14 +333,6 @@ void ZSTD_ldm_rust_setLdmSeqStore(void* blockContext, const void* rawSeqStore)
|
|||||||
context->ms->ldmSeqStore = (const RawSeqStore_t*)rawSeqStore;
|
context->ms->ldmSeqStore = (const RawSeqStore_t*)rawSeqStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZSTD_ldm_adjustParameters(ldmParams_t* params,
|
|
||||||
const ZSTD_compressionParameters* cParams)
|
|
||||||
{
|
|
||||||
ZSTD_rust_ldm_adjustParameters(
|
|
||||||
params, cParams->windowLog, (int)cParams->strategy,
|
|
||||||
ZSTD_HASHLOG_MAX, ZSTD_LDM_BUCKETSIZELOG_MAX, (int)ZSTD_btultra);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t ZSTD_ldm_getTableSize(ldmParams_t params)
|
size_t ZSTD_ldm_getTableSize(ldmParams_t params)
|
||||||
{
|
{
|
||||||
#if ZSTD_ADDRESS_SANITIZER && !defined(ZSTD_ASAN_DONT_POISON_WORKSPACE)
|
#if ZSTD_ADDRESS_SANITIZER && !defined(ZSTD_ASAN_DONT_POISON_WORKSPACE)
|
||||||
|
|||||||
+19
-14
@@ -12,6 +12,7 @@
|
|||||||
use crate::errors::{ERR_isError, ZstdErrorCode, ERROR};
|
use crate::errors::{ERR_isError, ZstdErrorCode, ERROR};
|
||||||
use crate::mem::{MEM_64bits, MEM_isLittleEndian, MEM_read16, MEM_read32, MEM_readST};
|
use crate::mem::{MEM_64bits, MEM_isLittleEndian, MEM_read16, MEM_read32, MEM_readST};
|
||||||
use crate::xxhash::XXH64;
|
use crate::xxhash::XXH64;
|
||||||
|
use crate::zstd_compress_params::ZSTD_compressionParameters;
|
||||||
use crate::zstd_fast::store_seq_opaque;
|
use crate::zstd_fast::store_seq_opaque;
|
||||||
use std::ffi::c_void;
|
use std::ffi::c_void;
|
||||||
use std::mem::size_of;
|
use std::mem::size_of;
|
||||||
@@ -651,17 +652,14 @@ unsafe fn generate_sequences_internal(
|
|||||||
unsafe { iend.offset_from(anchor) as usize }
|
unsafe { iend.offset_from(anchor) as usize }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Rust implementation called by the C ABI wrapper for parameter adjustment.
|
fn adjust_parameters(
|
||||||
#[no_mangle]
|
params: &mut LdmParams,
|
||||||
pub unsafe extern "C" fn ZSTD_rust_ldm_adjustParameters(
|
|
||||||
params: *mut c_void,
|
|
||||||
window_log: u32,
|
window_log: u32,
|
||||||
strategy: c_int,
|
strategy: c_int,
|
||||||
hash_log_max: u32,
|
hash_log_max: u32,
|
||||||
bucket_size_log_max: u32,
|
bucket_size_log_max: u32,
|
||||||
btultra: c_int,
|
btultra: c_int,
|
||||||
) {
|
) {
|
||||||
let params = unsafe { &mut *params.cast::<LdmParams>() };
|
|
||||||
params.window_log = window_log;
|
params.window_log = window_log;
|
||||||
if params.hash_rate_log == 0 {
|
if params.hash_rate_log == 0 {
|
||||||
if params.hash_log > 0 {
|
if params.hash_log > 0 {
|
||||||
@@ -691,6 +689,17 @@ pub unsafe extern "C" fn ZSTD_rust_ldm_adjustParameters(
|
|||||||
params.bucket_size_log = params.bucket_size_log.min(params.hash_log);
|
params.bucket_size_log = params.bucket_size_log.min(params.hash_log);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Adjust LDM parameters using the original C ABI.
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn ZSTD_ldm_adjustParameters(
|
||||||
|
params: *mut LdmParams,
|
||||||
|
c_params: *const ZSTD_compressionParameters,
|
||||||
|
) {
|
||||||
|
let params = unsafe { &mut *params };
|
||||||
|
let c_params = unsafe { &*c_params };
|
||||||
|
adjust_parameters(params, c_params.windowLog, c_params.strategy, 30, 8, 8);
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn ZSTD_rust_ldm_getTableSize(
|
pub unsafe extern "C" fn ZSTD_rust_ldm_getTableSize(
|
||||||
params: *const c_void,
|
params: *const c_void,
|
||||||
@@ -1069,16 +1078,12 @@ mod tests {
|
|||||||
hash_rate_log: 0,
|
hash_rate_log: 0,
|
||||||
window_log: 0,
|
window_log: 0,
|
||||||
};
|
};
|
||||||
unsafe {
|
let c_params = ZSTD_compressionParameters {
|
||||||
ZSTD_rust_ldm_adjustParameters(
|
windowLog: 20,
|
||||||
(&mut params as *mut LdmParams).cast::<c_void>(),
|
strategy: 3,
|
||||||
20,
|
..Default::default()
|
||||||
3,
|
|
||||||
30,
|
|
||||||
8,
|
|
||||||
8,
|
|
||||||
)
|
|
||||||
};
|
};
|
||||||
|
unsafe { ZSTD_ldm_adjustParameters(&mut params, &c_params) };
|
||||||
assert_eq!(params.window_log, 20);
|
assert_eq!(params.window_log, 20);
|
||||||
assert_eq!(params.hash_rate_log, 6);
|
assert_eq!(params.hash_rate_log, 6);
|
||||||
assert_eq!(params.hash_log, 14);
|
assert_eq!(params.hash_log, 14);
|
||||||
|
|||||||
Reference in New Issue
Block a user