Merge pull request #1050 from terrelln/restore-loadedDictEnd
Restore setting loadedDictEnd
This commit is contained in:
@@ -1931,8 +1931,9 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx,
|
|||||||
ZSTD_reduceIndex(cctx, correction);
|
ZSTD_reduceIndex(cctx, correction);
|
||||||
if (ms->nextToUpdate < correction) ms->nextToUpdate = 0;
|
if (ms->nextToUpdate < correction) ms->nextToUpdate = 0;
|
||||||
else ms->nextToUpdate -= correction;
|
else ms->nextToUpdate -= correction;
|
||||||
|
ms->loadedDictEnd = 0;
|
||||||
}
|
}
|
||||||
ZSTD_window_enforceMaxDist(&ms->window, ip + blockSize, ms->loadedDictEnd + maxDist);
|
ZSTD_window_enforceMaxDist(&ms->window, ip + blockSize, maxDist, &ms->loadedDictEnd);
|
||||||
if (ms->nextToUpdate < ms->window.lowLimit) ms->nextToUpdate = ms->window.lowLimit;
|
if (ms->nextToUpdate < ms->window.lowLimit) ms->nextToUpdate = ms->window.lowLimit;
|
||||||
|
|
||||||
{ size_t cSize = ZSTD_compressBlock_internal(cctx,
|
{ size_t cSize = ZSTD_compressBlock_internal(cctx,
|
||||||
@@ -2118,6 +2119,7 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, ZSTD_CCtx_params
|
|||||||
ZSTD_compressionParameters const* cParams = ¶ms->cParams;
|
ZSTD_compressionParameters const* cParams = ¶ms->cParams;
|
||||||
|
|
||||||
ZSTD_window_update(&ms->window, src, srcSize);
|
ZSTD_window_update(&ms->window, src, srcSize);
|
||||||
|
ms->loadedDictEnd = params->forceWindow ? 0 : (U32)(iend - ms->window.base);
|
||||||
|
|
||||||
if (srcSize <= HASH_READ_SIZE) return 0;
|
if (srcSize <= HASH_READ_SIZE) return 0;
|
||||||
|
|
||||||
|
|||||||
@@ -562,15 +562,24 @@ MEM_STATIC U32 ZSTD_window_correctOverflow(ZSTD_window_t* window, U32 cycleLog,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* ZSTD_window_enforceMaxDist():
|
* ZSTD_window_enforceMaxDist():
|
||||||
* Sets lowLimit such that indices earlier than (srcEnd - base) - lowLimit are
|
* Updates lowLimit so that:
|
||||||
* invalid. This allows a simple check index >= lowLimit to see if it is valid.
|
* (srcEnd - base) - lowLimit == maxDist + loadedDictEnd
|
||||||
* Source pointers past srcEnd are not guaranteed to be valid.
|
* This allows a simple check that index >= lowLimit to see if index is valid.
|
||||||
|
* This must be called before a block compression call, with srcEnd as the block
|
||||||
|
* source end.
|
||||||
|
* If loadedDictEndPtr is not NULL, we set it to zero once we update lowLimit.
|
||||||
|
* This is because dictionaries are allowed to be referenced as long as the last
|
||||||
|
* byte of the dictionary is in the window, but once they are out of range,
|
||||||
|
* they cannot be referenced. If loadedDictEndPtr is NULL, we use
|
||||||
|
* loadedDictEnd == 0.
|
||||||
*/
|
*/
|
||||||
MEM_STATIC void ZSTD_window_enforceMaxDist(ZSTD_window_t* window,
|
MEM_STATIC void ZSTD_window_enforceMaxDist(ZSTD_window_t* window,
|
||||||
void const* srcEnd, U32 maxDist)
|
void const* srcEnd, U32 maxDist,
|
||||||
|
U32* loadedDictEndPtr)
|
||||||
{
|
{
|
||||||
U32 const current = (U32)((BYTE const*)srcEnd - window->base);
|
U32 const current = (U32)((BYTE const*)srcEnd - window->base);
|
||||||
if (current > maxDist) {
|
U32 loadedDictEnd = loadedDictEndPtr != NULL ? *loadedDictEndPtr : 0;
|
||||||
|
if (current > maxDist + loadedDictEnd) {
|
||||||
U32 const newLowLimit = current - maxDist;
|
U32 const newLowLimit = current - maxDist;
|
||||||
if (window->lowLimit < newLowLimit) window->lowLimit = newLowLimit;
|
if (window->lowLimit < newLowLimit) window->lowLimit = newLowLimit;
|
||||||
if (window->dictLimit < window->lowLimit) {
|
if (window->dictLimit < window->lowLimit) {
|
||||||
@@ -578,6 +587,8 @@ MEM_STATIC void ZSTD_window_enforceMaxDist(ZSTD_window_t* window,
|
|||||||
window->lowLimit);
|
window->lowLimit);
|
||||||
window->dictLimit = window->lowLimit;
|
window->dictLimit = window->lowLimit;
|
||||||
}
|
}
|
||||||
|
if (loadedDictEndPtr)
|
||||||
|
*loadedDictEndPtr = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -514,7 +514,7 @@ size_t ZSTD_ldm_generateSequences(
|
|||||||
* * Try invalidation after the sequence generation and test the
|
* * Try invalidation after the sequence generation and test the
|
||||||
* the offset against maxDist directly.
|
* the offset against maxDist directly.
|
||||||
*/
|
*/
|
||||||
ZSTD_window_enforceMaxDist(&ldmState->window, chunkEnd, maxDist);
|
ZSTD_window_enforceMaxDist(&ldmState->window, chunkEnd, maxDist, NULL);
|
||||||
/* 3. Generate the sequences for the chunk, and get newLeftoverSize. */
|
/* 3. Generate the sequences for the chunk, and get newLeftoverSize. */
|
||||||
newLeftoverSize = ZSTD_ldm_generateSequences_internal(
|
newLeftoverSize = ZSTD_ldm_generateSequences_internal(
|
||||||
ldmState, sequences, params, chunkStart, chunkSize);
|
ldmState, sequences, params, chunkStart, chunkSize);
|
||||||
|
|||||||
Reference in New Issue
Block a user