Merge pull request #2357 from senhuang42/fix_ldm_nd_behavior
Fix nondeterministic LDM behavior in multithreadingdev
commit
d380f803b9
|
@ -143,10 +143,10 @@ static void ZSTD_ldm_makeEntryAndInsertByTag(ldmState_t* ldmState,
|
||||||
* We count only bytes where pMatch >= pBase and pIn >= pAnchor. */
|
* We count only bytes where pMatch >= pBase and pIn >= pAnchor. */
|
||||||
static size_t ZSTD_ldm_countBackwardsMatch(
|
static size_t ZSTD_ldm_countBackwardsMatch(
|
||||||
const BYTE* pIn, const BYTE* pAnchor,
|
const BYTE* pIn, const BYTE* pAnchor,
|
||||||
const BYTE* pMatch, const BYTE* pBase)
|
const BYTE* pMatch, const BYTE* pMatchBase)
|
||||||
{
|
{
|
||||||
size_t matchLength = 0;
|
size_t matchLength = 0;
|
||||||
while (pIn > pAnchor && pMatch > pBase && pIn[-1] == pMatch[-1]) {
|
while (pIn > pAnchor && pMatch > pMatchBase && pIn[-1] == pMatch[-1]) {
|
||||||
pIn--;
|
pIn--;
|
||||||
pMatch--;
|
pMatch--;
|
||||||
matchLength++;
|
matchLength++;
|
||||||
|
@ -154,6 +154,27 @@ static size_t ZSTD_ldm_countBackwardsMatch(
|
||||||
return matchLength;
|
return matchLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** ZSTD_ldm_countBackwardsMatch_2segments() :
|
||||||
|
* Returns the number of bytes that match backwards from pMatch,
|
||||||
|
* even with the backwards match spanning 2 different segments.
|
||||||
|
*
|
||||||
|
* On reaching `pMatchBase`, start counting from mEnd */
|
||||||
|
static size_t ZSTD_ldm_countBackwardsMatch_2segments(
|
||||||
|
const BYTE* pIn, const BYTE* pAnchor,
|
||||||
|
const BYTE* pMatch, const BYTE* pMatchBase,
|
||||||
|
const BYTE* pExtDictStart, const BYTE* pExtDictEnd)
|
||||||
|
{
|
||||||
|
size_t matchLength = ZSTD_ldm_countBackwardsMatch(pIn, pAnchor, pMatch, pMatchBase);
|
||||||
|
if (pMatch - matchLength != pMatchBase || pMatchBase == pExtDictStart) {
|
||||||
|
/* If backwards match is entirely in the extDict or prefix, immediately return */
|
||||||
|
return matchLength;
|
||||||
|
}
|
||||||
|
DEBUGLOG(7, "ZSTD_ldm_countBackwardsMatch_2segments: found 2-parts backwards match (length in prefix==%zu)", matchLength);
|
||||||
|
matchLength += ZSTD_ldm_countBackwardsMatch(pIn - matchLength, pAnchor, pExtDictEnd, pExtDictStart);
|
||||||
|
DEBUGLOG(7, "final backwards match length = %zu", matchLength);
|
||||||
|
return matchLength;
|
||||||
|
}
|
||||||
|
|
||||||
/** ZSTD_ldm_fillFastTables() :
|
/** ZSTD_ldm_fillFastTables() :
|
||||||
*
|
*
|
||||||
* Fills the relevant tables for the ZSTD_fast and ZSTD_dfast strategies.
|
* Fills the relevant tables for the ZSTD_fast and ZSTD_dfast strategies.
|
||||||
|
@ -329,8 +350,9 @@ static size_t ZSTD_ldm_generateSequences_internal(
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
curBackwardMatchLength =
|
curBackwardMatchLength =
|
||||||
ZSTD_ldm_countBackwardsMatch(ip, anchor, pMatch,
|
ZSTD_ldm_countBackwardsMatch_2segments(ip, anchor,
|
||||||
lowMatchPtr);
|
pMatch, lowMatchPtr,
|
||||||
|
dictStart, dictEnd);
|
||||||
curTotalMatchLength = curForwardMatchLength +
|
curTotalMatchLength = curForwardMatchLength +
|
||||||
curBackwardMatchLength;
|
curBackwardMatchLength;
|
||||||
} else { /* !extDict */
|
} else { /* !extDict */
|
||||||
|
|
Loading…
Reference in New Issue