added ZSTD_clampCParams()
now ZSTD_adjustCParams() is always successful, it always produces a valid CParams
This commit is contained in:
parent
aee916e37c
commit
381e66cfbd
@ -433,8 +433,8 @@ void ZSTD_CCtx_reset(ZSTD_CCtx* cctx)
|
|||||||
cctx->cdict = NULL;
|
cctx->cdict = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** ZSTD_checkParams() :
|
/** ZSTD_checkCParams() :
|
||||||
ensure param values remain within authorized range.
|
control CParam values remain within authorized range.
|
||||||
@return : 0, or an error code if one value is beyond authorized range */
|
@return : 0, or an error code if one value is beyond authorized range */
|
||||||
size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams)
|
size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams)
|
||||||
{
|
{
|
||||||
@ -448,6 +448,25 @@ size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** ZSTD_clampCParams() :
|
||||||
|
* make CParam values within valid range.
|
||||||
|
* @return : valid CParams */
|
||||||
|
static ZSTD_compressionParameters ZSTD_clampCParams(ZSTD_compressionParameters cParams)
|
||||||
|
{
|
||||||
|
# define CLAMP(val,min,max) { \
|
||||||
|
if (val<min) val=min; \
|
||||||
|
else if (val>max) val=max; \
|
||||||
|
}
|
||||||
|
CLAMP(cParams.windowLog, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX);
|
||||||
|
CLAMP(cParams.chainLog, ZSTD_CHAINLOG_MIN, ZSTD_CHAINLOG_MAX);
|
||||||
|
CLAMP(cParams.hashLog, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
|
||||||
|
CLAMP(cParams.searchLog, ZSTD_SEARCHLOG_MIN, ZSTD_SEARCHLOG_MAX);
|
||||||
|
CLAMP(cParams.searchLength, ZSTD_SEARCHLENGTH_MIN, ZSTD_SEARCHLENGTH_MAX);
|
||||||
|
CLAMP(cParams.targetLength, ZSTD_TARGETLENGTH_MIN, ZSTD_TARGETLENGTH_MAX);
|
||||||
|
if ((U32)(cParams.strategy) > (U32)ZSTD_btultra) cParams.strategy = ZSTD_btultra;
|
||||||
|
return cParams;
|
||||||
|
}
|
||||||
|
|
||||||
/** ZSTD_cycleLog() :
|
/** ZSTD_cycleLog() :
|
||||||
* condition for correct operation : hashLog > 1 */
|
* condition for correct operation : hashLog > 1 */
|
||||||
static U32 ZSTD_cycleLog(U32 hashLog, ZSTD_strategy strat)
|
static U32 ZSTD_cycleLog(U32 hashLog, ZSTD_strategy strat)
|
||||||
@ -456,14 +475,15 @@ static U32 ZSTD_cycleLog(U32 hashLog, ZSTD_strategy strat)
|
|||||||
return hashLog - btScale;
|
return hashLog - btScale;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** ZSTD_adjustCParams() :
|
/** ZSTD_adjustCParams_internal() :
|
||||||
optimize `cPar` for a given input (`srcSize` and `dictSize`).
|
optimize `cPar` for a given input (`srcSize` and `dictSize`).
|
||||||
mostly downsizing to reduce memory consumption and initialization.
|
mostly downsizing to reduce memory consumption and initialization.
|
||||||
Both `srcSize` and `dictSize` are optional (use 0 if unknown),
|
Both `srcSize` and `dictSize` are optional (use 0 if unknown),
|
||||||
but if both are 0, no optimization can be done.
|
but if both are 0, no optimization can be done.
|
||||||
Note : cPar is considered validated at this stage. Use ZSTD_checkParams() to ensure that. */
|
Note : cPar is considered validated at this stage. Use ZSTD_checkParams() to ensure that. */
|
||||||
ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize)
|
ZSTD_compressionParameters ZSTD_adjustCParams_internal(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize)
|
||||||
{
|
{
|
||||||
|
assert(ZSTD_checkCParams(cPar)==0);
|
||||||
if (srcSize+dictSize == 0) return cPar; /* no size information available : no adjustment */
|
if (srcSize+dictSize == 0) return cPar; /* no size information available : no adjustment */
|
||||||
|
|
||||||
/* resize params, to use less memory when necessary */
|
/* resize params, to use less memory when necessary */
|
||||||
@ -483,6 +503,12 @@ ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, u
|
|||||||
return cPar;
|
return cPar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize)
|
||||||
|
{
|
||||||
|
cPar = ZSTD_clampCParams(cPar);
|
||||||
|
return ZSTD_adjustCParams_internal(cPar, srcSize, dictSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t ZSTD_estimateCCtxSize(ZSTD_compressionParameters cParams)
|
size_t ZSTD_estimateCCtxSize(ZSTD_compressionParameters cParams)
|
||||||
{
|
{
|
||||||
@ -3989,8 +4015,7 @@ ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long l
|
|||||||
if (cp.chainLog > ZSTD_CHAINLOG_MAX) cp.chainLog = ZSTD_CHAINLOG_MAX;
|
if (cp.chainLog > ZSTD_CHAINLOG_MAX) cp.chainLog = ZSTD_CHAINLOG_MAX;
|
||||||
if (cp.hashLog > ZSTD_HASHLOG_MAX) cp.hashLog = ZSTD_HASHLOG_MAX;
|
if (cp.hashLog > ZSTD_HASHLOG_MAX) cp.hashLog = ZSTD_HASHLOG_MAX;
|
||||||
}
|
}
|
||||||
cp = ZSTD_adjustCParams(cp, srcSizeHint, dictSize);
|
return ZSTD_adjustCParams_internal(cp, srcSizeHint, dictSize); /* no need to ensure initial CParams validity */
|
||||||
return cp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! ZSTD_getParams() :
|
/*! ZSTD_getParams() :
|
||||||
|
@ -190,7 +190,7 @@ static ZSTDMT_CCtxPool* ZSTDMT_createCCtxPool(unsigned nbThreads,
|
|||||||
cctxPool->availCCtx = 1; /* at least one cctx for single-thread mode */
|
cctxPool->availCCtx = 1; /* at least one cctx for single-thread mode */
|
||||||
cctxPool->cctx[0] = ZSTD_createCCtx_advanced(cMem);
|
cctxPool->cctx[0] = ZSTD_createCCtx_advanced(cMem);
|
||||||
if (!cctxPool->cctx[0]) { ZSTDMT_freeCCtxPool(cctxPool); return NULL; }
|
if (!cctxPool->cctx[0]) { ZSTDMT_freeCCtxPool(cctxPool); return NULL; }
|
||||||
DEBUGLOG(1, "cctxPool created, with %u threads", nbThreads);
|
DEBUGLOG(3, "cctxPool created, with %u threads", nbThreads);
|
||||||
return cctxPool;
|
return cctxPool;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -458,7 +458,7 @@ size_t ZSTDMT_compressCCtx(ZSTDMT_CCtx* mtctx,
|
|||||||
size_t frameStartPos = 0, dstBufferPos = 0;
|
size_t frameStartPos = 0, dstBufferPos = 0;
|
||||||
|
|
||||||
DEBUGLOG(3, "windowLog : %2u => chunkTargetSize : %u bytes ", params.cParams.windowLog, (U32)chunkTargetSize);
|
DEBUGLOG(3, "windowLog : %2u => chunkTargetSize : %u bytes ", params.cParams.windowLog, (U32)chunkTargetSize);
|
||||||
DEBUGLOG(2, "nbChunks : %2u (chunkSize : %u bytes) ", nbChunks, (U32)avgChunkSize);
|
DEBUGLOG(3, "nbChunks : %2u (chunkSize : %u bytes) ", nbChunks, (U32)avgChunkSize);
|
||||||
params.fParams.contentSizeFlag = 1;
|
params.fParams.contentSizeFlag = 1;
|
||||||
|
|
||||||
if (nbChunks==1) { /* fallback to single-thread mode */
|
if (nbChunks==1) { /* fallback to single-thread mode */
|
||||||
|
Loading…
Reference in New Issue
Block a user