feat(compress): move static CDict gating into Rust
Move public ZSTD_initStaticCDict alignment, null, workspace-size, and callback dispatch into Rust. Keep C static workspace construction and dictionary initialization behind a private callback. Test Plan: - ulimit -v 41943040; CARGO_BUILD_JOBS=1 cargo test --manifest-path rust/Cargo.toml --release init_static_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:
@@ -387,6 +387,27 @@ typedef char ZSTD_rust_free_cdict_state_layout[
|
||||
== 3 * sizeof(void*)
|
||||
&& sizeof(ZSTD_rust_freeCDictState) == 4 * sizeof(void*))
|
||||
? 1 : -1];
|
||||
typedef void* (*ZSTD_rust_initStaticCDictInit_f)(void* context);
|
||||
typedef struct {
|
||||
void* callbackContext;
|
||||
void* workspace;
|
||||
size_t workspaceSize;
|
||||
size_t neededSize;
|
||||
ZSTD_rust_initStaticCDictInit_f init;
|
||||
} ZSTD_rust_initStaticCDictState;
|
||||
void* ZSTD_rust_initStaticCDict(const ZSTD_rust_initStaticCDictState* state);
|
||||
typedef char ZSTD_rust_init_static_cdict_state_layout[
|
||||
(offsetof(ZSTD_rust_initStaticCDictState, callbackContext) == 0
|
||||
&& offsetof(ZSTD_rust_initStaticCDictState, workspace)
|
||||
== sizeof(void*)
|
||||
&& offsetof(ZSTD_rust_initStaticCDictState, workspaceSize)
|
||||
== 2 * sizeof(void*)
|
||||
&& offsetof(ZSTD_rust_initStaticCDictState, neededSize)
|
||||
== 3 * sizeof(void*)
|
||||
&& offsetof(ZSTD_rust_initStaticCDictState, init)
|
||||
== 4 * sizeof(void*)
|
||||
&& sizeof(ZSTD_rust_initStaticCDictState) == 5 * sizeof(void*))
|
||||
? 1 : -1];
|
||||
typedef void (*ZSTD_rust_resetCCtxClearAllDicts_f)(void* context);
|
||||
typedef size_t (*ZSTD_rust_resetCCtxResetParams_f)(void* context);
|
||||
typedef struct {
|
||||
@@ -5602,6 +5623,47 @@ size_t ZSTD_freeCDict(ZSTD_CDict* cdict)
|
||||
* Note : there is no corresponding "free" function.
|
||||
* Since workspace was allocated externally, it must be freed externally.
|
||||
*/
|
||||
typedef struct {
|
||||
void* workspace;
|
||||
size_t workspaceSize;
|
||||
const void* dict;
|
||||
size_t dictSize;
|
||||
ZSTD_dictLoadMethod_e dictLoadMethod;
|
||||
ZSTD_dictContentType_e dictContentType;
|
||||
ZSTD_compressionParameters cParams;
|
||||
ZSTD_ParamSwitch_e useRowMatchFinder;
|
||||
} ZSTD_rust_initStaticCDictContext;
|
||||
|
||||
static void* ZSTD_rust_initStaticCDict_init(void* opaque)
|
||||
{
|
||||
ZSTD_rust_initStaticCDictContext* const context =
|
||||
(ZSTD_rust_initStaticCDictContext*)opaque;
|
||||
ZSTD_cwksp ws;
|
||||
ZSTD_CDict* cdict;
|
||||
ZSTD_CCtx_params params;
|
||||
|
||||
ZSTD_cwksp_init(&ws, context->workspace, context->workspaceSize,
|
||||
ZSTD_cwksp_static_alloc);
|
||||
cdict = (ZSTD_CDict*)ZSTD_cwksp_reserve_object(&ws, sizeof(ZSTD_CDict));
|
||||
if (cdict == NULL) return NULL;
|
||||
ZSTD_cwksp_move(&cdict->workspace, &ws);
|
||||
|
||||
ZSTD_CCtxParams_init(¶ms, 0);
|
||||
params.cParams = context->cParams;
|
||||
params.useRowMatchFinder = context->useRowMatchFinder;
|
||||
cdict->useRowMatchFinder = context->useRowMatchFinder;
|
||||
cdict->compressionLevel = ZSTD_NO_CLEVEL;
|
||||
|
||||
if (ZSTD_isError( ZSTD_initCDict_internal(cdict,
|
||||
context->dict, context->dictSize,
|
||||
context->dictLoadMethod,
|
||||
context->dictContentType,
|
||||
params) ))
|
||||
return NULL;
|
||||
|
||||
return cdict;
|
||||
}
|
||||
|
||||
const ZSTD_CDict* ZSTD_initStaticCDict(
|
||||
void* workspace, size_t workspaceSize,
|
||||
const void* dict, size_t dictSize,
|
||||
@@ -5617,35 +5679,24 @@ const ZSTD_CDict* ZSTD_initStaticCDict(
|
||||
: ZSTD_cwksp_alloc_size(ZSTD_cwksp_align(dictSize, sizeof(void*))))
|
||||
+ ZSTD_cwksp_alloc_size(HUF_WORKSPACE_SIZE)
|
||||
+ matchStateSize;
|
||||
ZSTD_CDict* cdict;
|
||||
ZSTD_CCtx_params params;
|
||||
ZSTD_rust_initStaticCDictContext context;
|
||||
ZSTD_rust_initStaticCDictState state;
|
||||
|
||||
DEBUGLOG(4, "ZSTD_initStaticCDict (dictSize==%u)", (unsigned)dictSize);
|
||||
if ((size_t)workspace & 7) return NULL; /* 8-aligned */
|
||||
|
||||
{
|
||||
ZSTD_cwksp ws;
|
||||
ZSTD_cwksp_init(&ws, workspace, workspaceSize, ZSTD_cwksp_static_alloc);
|
||||
cdict = (ZSTD_CDict*)ZSTD_cwksp_reserve_object(&ws, sizeof(ZSTD_CDict));
|
||||
if (cdict == NULL) return NULL;
|
||||
ZSTD_cwksp_move(&cdict->workspace, &ws);
|
||||
}
|
||||
|
||||
if (workspaceSize < neededSize) return NULL;
|
||||
|
||||
ZSTD_CCtxParams_init(¶ms, 0);
|
||||
params.cParams = cParams;
|
||||
params.useRowMatchFinder = useRowMatchFinder;
|
||||
cdict->useRowMatchFinder = useRowMatchFinder;
|
||||
cdict->compressionLevel = ZSTD_NO_CLEVEL;
|
||||
|
||||
if (ZSTD_isError( ZSTD_initCDict_internal(cdict,
|
||||
dict, dictSize,
|
||||
dictLoadMethod, dictContentType,
|
||||
params) ))
|
||||
return NULL;
|
||||
|
||||
return cdict;
|
||||
context.workspace = workspace;
|
||||
context.workspaceSize = workspaceSize;
|
||||
context.dict = dict;
|
||||
context.dictSize = dictSize;
|
||||
context.dictLoadMethod = dictLoadMethod;
|
||||
context.dictContentType = dictContentType;
|
||||
context.cParams = cParams;
|
||||
context.useRowMatchFinder = useRowMatchFinder;
|
||||
state.callbackContext = &context;
|
||||
state.workspace = workspace;
|
||||
state.workspaceSize = workspaceSize;
|
||||
state.neededSize = neededSize;
|
||||
state.init = ZSTD_rust_initStaticCDict_init;
|
||||
return (const ZSTD_CDict*)ZSTD_rust_initStaticCDict(&state);
|
||||
}
|
||||
|
||||
ZSTD_compressionParameters ZSTD_getCParamsFromCDict(const ZSTD_CDict* cdict)
|
||||
|
||||
Reference in New Issue
Block a user