Split Attach and Copy Reset Strategies into Separate Implementation Functions
This commit is contained in:
parent
a6d6bbeae1
commit
01ff945eae
@ -1334,35 +1334,27 @@ static int ZSTD_shouldAttachDict(ZSTD_CCtx* cctx,
|
|||||||
cdict->matchState.cParams);
|
cdict->matchState.cParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
|
static size_t ZSTD_resetCCtx_byAttachingCDict(ZSTD_CCtx* cctx,
|
||||||
const ZSTD_CDict* cdict,
|
const ZSTD_CDict* cdict,
|
||||||
ZSTD_CCtx_params params,
|
ZSTD_CCtx_params params,
|
||||||
U64 pledgedSrcSize,
|
U64 pledgedSrcSize,
|
||||||
ZSTD_buffered_policy_e zbuff)
|
ZSTD_buffered_policy_e zbuff)
|
||||||
{
|
{
|
||||||
/* We have a choice between copying the dictionary context into the working
|
{
|
||||||
* context, or referencing the dictionary context from the working context
|
|
||||||
* in-place. We decide here which strategy to use. */
|
|
||||||
const ZSTD_compressionParameters *cdict_cParams = &cdict->matchState.cParams;
|
const ZSTD_compressionParameters *cdict_cParams = &cdict->matchState.cParams;
|
||||||
const int attachDict = ZSTD_shouldAttachDict(cctx, cdict, params, pledgedSrcSize);
|
unsigned const windowLog = params.cParams.windowLog;
|
||||||
|
|
||||||
DEBUGLOG(4, "ZSTD_resetCCtx_usingCDict (pledgedSrcSize=%u)", (U32)pledgedSrcSize);
|
|
||||||
|
|
||||||
|
|
||||||
{ unsigned const windowLog = params.cParams.windowLog;
|
|
||||||
assert(windowLog != 0);
|
assert(windowLog != 0);
|
||||||
/* Copy only compression parameters related to tables. */
|
/* Copy only compression parameters related to tables. */
|
||||||
params.cParams = *cdict_cParams;
|
params.cParams = *cdict_cParams;
|
||||||
params.cParams.windowLog = windowLog;
|
params.cParams.windowLog = windowLog;
|
||||||
ZSTD_resetCCtx_internal(cctx, params, pledgedSrcSize,
|
ZSTD_resetCCtx_internal(cctx, params, pledgedSrcSize,
|
||||||
attachDict ? ZSTDcrp_continue : ZSTDcrp_noMemset,
|
ZSTDcrp_continue, zbuff);
|
||||||
zbuff);
|
|
||||||
assert(cctx->appliedParams.cParams.strategy == cdict_cParams->strategy);
|
assert(cctx->appliedParams.cParams.strategy == cdict_cParams->strategy);
|
||||||
assert(cctx->appliedParams.cParams.hashLog == cdict_cParams->hashLog);
|
assert(cctx->appliedParams.cParams.hashLog == cdict_cParams->hashLog);
|
||||||
assert(cctx->appliedParams.cParams.chainLog == cdict_cParams->chainLog);
|
assert(cctx->appliedParams.cParams.chainLog == cdict_cParams->chainLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attachDict) {
|
{
|
||||||
const U32 cdictEnd = (U32)( cdict->matchState.window.nextSrc
|
const U32 cdictEnd = (U32)( cdict->matchState.window.nextSrc
|
||||||
- cdict->matchState.window.base);
|
- cdict->matchState.window.base);
|
||||||
const U32 cdictLen = cdictEnd - cdict->matchState.window.dictLimit;
|
const U32 cdictLen = cdictEnd - cdict->matchState.window.dictLimit;
|
||||||
@ -1382,8 +1374,38 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
|
|||||||
}
|
}
|
||||||
cctx->blockState.matchState.loadedDictEnd = cctx->blockState.matchState.window.dictLimit;
|
cctx->blockState.matchState.loadedDictEnd = cctx->blockState.matchState.window.dictLimit;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
cctx->dictID = cdict->dictID;
|
||||||
|
|
||||||
|
/* copy block state */
|
||||||
|
memcpy(cctx->blockState.prevCBlock, &cdict->cBlockState, sizeof(cdict->cBlockState));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static size_t ZSTD_resetCCtx_byCopyingCDict(ZSTD_CCtx* cctx,
|
||||||
|
const ZSTD_CDict* cdict,
|
||||||
|
ZSTD_CCtx_params params,
|
||||||
|
U64 pledgedSrcSize,
|
||||||
|
ZSTD_buffered_policy_e zbuff)
|
||||||
|
{
|
||||||
|
const ZSTD_compressionParameters *cdict_cParams = &cdict->matchState.cParams;
|
||||||
|
|
||||||
DEBUGLOG(4, "copying dictionary into context");
|
DEBUGLOG(4, "copying dictionary into context");
|
||||||
|
|
||||||
|
{ unsigned const windowLog = params.cParams.windowLog;
|
||||||
|
assert(windowLog != 0);
|
||||||
|
/* Copy only compression parameters related to tables. */
|
||||||
|
params.cParams = *cdict_cParams;
|
||||||
|
params.cParams.windowLog = windowLog;
|
||||||
|
ZSTD_resetCCtx_internal(cctx, params, pledgedSrcSize,
|
||||||
|
ZSTDcrp_noMemset, zbuff);
|
||||||
|
assert(cctx->appliedParams.cParams.strategy == cdict_cParams->strategy);
|
||||||
|
assert(cctx->appliedParams.cParams.hashLog == cdict_cParams->hashLog);
|
||||||
|
assert(cctx->appliedParams.cParams.chainLog == cdict_cParams->chainLog);
|
||||||
|
}
|
||||||
|
|
||||||
/* copy tables */
|
/* copy tables */
|
||||||
{ size_t const chainSize = (cdict_cParams->strategy == ZSTD_fast) ? 0 : ((size_t)1 << cdict_cParams->chainLog);
|
{ size_t const chainSize = (cdict_cParams->strategy == ZSTD_fast) ? 0 : ((size_t)1 << cdict_cParams->chainLog);
|
||||||
size_t const hSize = (size_t)1 << cdict_cParams->hashLog;
|
size_t const hSize = (size_t)1 << cdict_cParams->hashLog;
|
||||||
@ -1409,7 +1431,6 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
|
|||||||
dstMatchState->nextToUpdate3= srcMatchState->nextToUpdate3;
|
dstMatchState->nextToUpdate3= srcMatchState->nextToUpdate3;
|
||||||
dstMatchState->loadedDictEnd= srcMatchState->loadedDictEnd;
|
dstMatchState->loadedDictEnd= srcMatchState->loadedDictEnd;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
cctx->dictID = cdict->dictID;
|
cctx->dictID = cdict->dictID;
|
||||||
|
|
||||||
@ -1419,6 +1440,27 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We have a choice between copying the dictionary context into the working
|
||||||
|
* context, or referencing the dictionary context from the working context
|
||||||
|
* in-place. We decide here which strategy to use. */
|
||||||
|
static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
|
||||||
|
const ZSTD_CDict* cdict,
|
||||||
|
ZSTD_CCtx_params params,
|
||||||
|
U64 pledgedSrcSize,
|
||||||
|
ZSTD_buffered_policy_e zbuff)
|
||||||
|
{
|
||||||
|
|
||||||
|
DEBUGLOG(4, "ZSTD_resetCCtx_usingCDict (pledgedSrcSize=%u)", (U32)pledgedSrcSize);
|
||||||
|
|
||||||
|
if (ZSTD_shouldAttachDict(cctx, cdict, params, pledgedSrcSize)) {
|
||||||
|
return ZSTD_resetCCtx_byAttachingCDict(
|
||||||
|
cctx, cdict, params, pledgedSrcSize, zbuff);
|
||||||
|
} else {
|
||||||
|
return ZSTD_resetCCtx_byCopyingCDict(
|
||||||
|
cctx, cdict, params, pledgedSrcSize, zbuff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*! ZSTD_copyCCtx_internal() :
|
/*! ZSTD_copyCCtx_internal() :
|
||||||
* Duplicate an existing context `srcCCtx` into another one `dstCCtx`.
|
* Duplicate an existing context `srcCCtx` into another one `dstCCtx`.
|
||||||
* Only works during stage ZSTDcs_init (i.e. after creation, but before first call to ZSTD_compressContinue()).
|
* Only works during stage ZSTDcs_init (i.e. after creation, but before first call to ZSTD_compressContinue()).
|
||||||
|
Loading…
x
Reference in New Issue
Block a user